单片机LCD定时闹钟程序
- 格式:doc
- 大小:17.46 KB
- 文档页数:6
单片机电子闹钟程序(亲自编写-可用)————————————————————————————————作者:————————————————————————————————日期:学校电子钟,有闹钟功能,按键可调时间,可调打铃时间,打铃时间长短显示,每个模块有功能注释。
其中正常时间显示和闹钟时间显示可用一个开关来调整。
芯片选择STC89C52程序:#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//定义显示段码uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};uchar codebbtime[]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar clock[]={0,0,0,0};uchar clock1[]={12,30,0};uchar weikong[6];uchar bbduration=4;uchar lingtime=9;//学校打铃时间组uchar shangwu1[]={8,30};uchar shangwu2[]={10,0};uchar shangwu3[]={10,20};uchar shangwu4[]={11,50};uchar xiawu1[]={13,30};uchar xiawu2[]={15,00};uchar xiawu3[]={15,15};uchar xiawu4[]={16,45};//按键定义sbit mode=P1^7;sbit sec_clr=P1^0;sbit min_set_add=P1^3;sbit min_set_sub=P1^4;sbit hour_set_add=P1^1;sbit hour_set_sub=P1^2;sbit bb_set_add=P1^5;sbit bb_set_sub=P1^6;sbit speaker=P2^6;//延时函数void delay(unsigned int t){while(t--);//时钟进位函数void clockjinwei(){clock[0]++;if(clock[0]==20){clock[1]++;clock[0]=0;if(clock[1]==60){clock[2]++;clock[1]=0;if(clock[2]==60){clock[3]++;clock[2]=0;if(clock[3]==24)clock[3]=0;}}}}//定时器0中断服务函数void timer0(void) interrupt 1 using 1 {TMOD=0x01;TH0=0x3c;TL0=0xb0;clockjinwei();}//时钟分位显示函数void fenwei(){weikong[0]=clock[3]/10;weikong[1]=clock[3]%10;weikong[2]=clock[2]/10;weikong[3]=clock[2]%10;weikong[4]=clock[1]/10;weikong[5]=clock[1]%10;}//闹钟分位显示函数void naofen(){weikong[0]=clock1[0]/10;weikong[1]=clock1[0]%10;weikong[2]=clock1[1]/10;weikong[3]=clock1[1]%10;weikong[4]=clock1[2]/10;weikong[5]=clock1[2]%10; }//闹钟定时显示函数void naozhongdisplay(){uchar z,s;uchar x=0x01;naofen();for(z=0;z<6;z++){P2=0;P0=table[weikong[z]];P2=x;x=_crol_(x,1);for(s=0;s<255;s++);}}//时钟显示函数void display(){uchar i,j;uchar x=0x01;fenwei();for(i=0;i<6;i++){P2=0;P0=table[weikong[i]];P2=x;x=_crol_(x,1);for(j=0;j<255;j++);}}//总显示函数void zhongxian(){if(mode==1)delay(100);if(mode==1)display();if(mode==0)delay(100);if(mode==0)naozhongdisplay();}//按键处理程序void key_set(){zhongxian();P1=0xff;if(min_set_add==0){delay(100);if(min_set_add==0){if(mode==1){clock[2]++;if(clock[2]==60){clock[2]=0;}while(min_set_add==0)zhongxian();}}if(mode==0){clock1[1]++;if(clock1[1]==60){clock1[1]=0;}while(min_set_add==0)zhongxian();}}//if(min_set_sub==0){delay(100);if(min_set_sub==0){if(mode==1){clock[2]--;if(clock[2]==0)clock[2]=59;}while(min_set_sub==0)zhongxian();if(mode==0){clock1[1]--;if(clock1[1]==0)clock1[1]=59;}while(min_set_sub==0)zhongxian();}}//if(hour_set_add==0){delay(100);if(hour_set_add==0){if(mode==1){clock[3]++;if(clock[3]==24){clock[3]=0;}while(hour_set_add==0)zhongxian();}if(mode==0){clock1[0]++;if(clock1[0]==24){clock1[0]=0;}while(hour_set_add==0)zhongxian();}}}//if(hour_set_sub==0){delay(100);if(hour_set_sub==0){if(mode==1){clock[3]--;if(clock[3]==0)clock[3]=23;}while(hour_set_sub==0)zhongxian();if(mode==0){clock1[0]--;if(clock1[0]==0)clock1[0]=23;}while(hour_set_sub==0)zhongxian();}}//if(sec_clr==0){delay(100);if(sec_clr==0){clock[1]=0;}while(sec_clr==0)zhongxian();}}//闹钟响铃函数void bb(){if(clock[1]<=bbduration){speaker=1;delay(100);speaker=0;}else speaker=0;}//打铃函数void daling(){if(clock[1]<=lingtime){speaker=1;delay(100);speaker=0;}else speaker=0;}//时间比较函数void bijiao(){if(clock[3]==shangwu1[0]){if(clock[2]==shangwu1[1])daling();}if(clock[3]==shangwu2[0]){if(clock[2]==shangwu2[1])daling();}if(clock[3]==shangwu3[0]){if(clock[2]==shangwu3[1])daling();}if(clock[3]==shangwu4[0]){if(clock[2]==shangwu4[1])daling();}if(clock[3]==xiawu1[0]){if(clock[2]==xiawu1[1])daling();}if(clock[3]==xiawu2[0]){if(clock[2]==xiawu2[1])daling();}if(clock[3]==xiawu3[0]){if(clock[2]==xiawu3[1])daling();}if(clock[3]==xiawu4[0]){if(clock[2]==xiawu4[1])daling();}}//闹钟比较void naobijiao(){if(clock[3]==clock1[0]){if(clock[2]==clock1[1]||clock[2]==clock1[1]+1||clock[2]==clock1[1]+2) bb();}}//响铃时长显示函数void bbtimeshow(){P3=bbtime[bbduration];if(bbduration>15)bbduration=0;}//响铃按键处理函数void bbtime_set(){bbtimeshow();if(bb_set_add==0){delay(100);if(bb_set_add==0)bbduration++;while(bb_set_add==0)bbtimeshow();}if(bb_set_sub==0){delay(100);if(bb_set_sub==0)bbduration--;while(bb_set_sub==0)bbtimeshow();}}//主程序void main(){EA=1;ET0=1;TR0=1;while(1){key_set();bijiao();bbtime_set();naobijiao();}}电路图:分四部分显示:如果在学习这个程序过程中有什么问题,可以发邮件到询问。
西南科技大学单片机原理及接口技术课程设计报告课题名称LCD显示的定时闹钟姓名刘XX学号2011XXXX学院制造科学与工程学院班级机械11XX指导教师张XX2014年 06 月 12 日目录1.设计要求 (1)2.设计方案 (1)2.1原理 (1)2.2系统总框图 (2)2.3原理及工作过程说明 (2)3.元器件介绍 (2)3.1AT89C51 (2)3.2 1602LCD液晶显示器 (5)3.3 其他重要元件 (6)4.软件设计 (8)4.1系统流程图 (8)4.2 源代码 (10)5.系统仿真 (20)5.1系统总图 (20)5.2设定时间时LCD显示 (20)5.3设定闹钟时LCD显示 (21)5.4显示闹钟时LCD显示 (21)5.5待机时LCD显示 (21)6.实物图 (22)7.实验总结及心得体会 (22)8.参考资料 (24)1.设计要求使用AT89C51单片机结合字符型LCD显示器设计一个简易的定时闹钟LCD 时钟,若LCD选择有背光显示的模块,在夜晚或黑暗的场合中也可使用。
定时闹钟的基本功能如下:⏹显示格式为“时时:分分”。
⏹由LED闪动来做秒计数表示。
⏹一旦时间到则发出声响,同时继电器启动,可以扩充控制家电开启和关闭。
⏹程序执行后工作指示灯LED闪动,表示程序开始执行,LCD显示“00:00”,按下操作键K1~K4动作如下:(1) K1—设置现在的时间。
(2) K2—显示闹钟设置的时间。
(3) K3—设置闹铃的时间。
(4) K4—闹铃ON/OFF的状态设置,设置为ON时连续三次发出“哗”的一声,设置为OFF发出“哗”的一声。
设置当前时间或闹铃时间如下。
(1) K1—时调整。
(2) K2—分调整。
(3) K3—设置完成。
(4) K4—闹铃时间到时,发出一阵声响,按下本键可以停止声响。
本项目的难点在于4个按键每个都具有两个功能,以最终实现菜单化的输入功能。
采用通过逐层嵌套的循环扫描,实现嵌套式的键盘输入。
摘要时间是现代社会中不可缺少的一项参数,无论是平时生活还是社会生产都需要对时间进行控制,有的场合对其精确性还有很高的要求。
本设计采用单片机芯片进行计时,由于AT89C51系列单片机的体积小,成本低,控制器运算能力强,处理速度快,可以精确计时,对于社会生产有着十分重要的作用。
在此次设计中,AT89C51单片机芯片是主要的元器件,通过它来控制电路的LCD、晶振、电阻、电容、发光二极管、开关、喇叭等元件组成的硬件电路,再利用软件来执行一定的程序来实现LCD电子定时闹钟计时功能和定时闹铃的设置和控制。
由于系统所用元器件较少,单片机所被占用的I/O口不多,因此系统具有一定的可扩展性。
关键词:单片机计时AT89C51ABSTRACTTime is the indispensable in the modern society, whether a parameter normally live or social production all need to control over time, some occasions to its accuracy and high requirements. This design USES the monolithic integrated circuit chips for timing, due to the volume of the series microcontroller AT89C51 is small, low cost, operation ability, controller processing speed, can accurate timing for social production, plays a very important role.In this design, AT89C51 chip is the main components, by which it can control circuit of LCD, crystals, resistor, capacitor, light-emitting diodes, switch, loudspeaker elements such as hardware circuit, reuse of software to perform certain procedures to achieve LCD electronic timing alarm clock function and regular alarm Settings and control. Because the system which is less, SCM used components is occupied I/O mouth not much, so system has certain expansibility.Key word:SCM Timing AT89C51目录1 引言 (1)1.1 LCD电子定时闹钟研究现状和发展趋势 (1)1.2 设计本电子定时闹钟的目的和意义 (1)1.3 本LCD电子闹钟的特点和功能介绍 (2)1.3.1 数字钟介绍 (2)1.3.2 本电子钟设计特点 (2)1.3.3 本电子钟的主要功能 (2)2 总体方案设计 (3)2.1 总体设计方案 (3)2.2 AT89C51芯片介绍 (3)2.2.1 单片机介绍 (3)2.2.2 MCS–51单片机内部总体结构 (6)2.2.3 MCS-51单片机的引脚 (6)3 硬件设计 (17)3.1 主控芯片AT89C51的设计 (17)3.2 时钟电路部分设计 (18)3.3 LCD显示电路部分 (19)3.4 喇叭部分的电路 (20)4 软件设计 (23)4.1 软件设计概述 (23)4.2 主函数的设计 (23)4.3 部分设计思想的说明 (25)4.3.1 程序初始化 (25)4.3.2 闹钟的实现 (25)4.3.3 显示程序 (26)结束语 (27)致谢 (28)参考文献 (29)附录 (30)1 引言1.1 LCD电子定时闹钟研究现状和发展趋势现在是一个高度发达的高科技的时代,目前单片机正朝向高性能和多品种方向发展,而且进一步向低功耗,小体积,大容量,高性能,低价格和外围电路内装化等几个方向发展。
基于单片机定时闹钟的设计随着科技的快速发展,嵌入式系统已经深入到我们生活的各个角落。
其中,单片机以其高效性、灵活性和低成本性,广泛应用于各种设备的设计中。
本文将探讨如何基于单片机设计一个定时闹钟。
一、硬件需求1、单片机:选择一个适合你项目的单片机。
比如Arduino UNO,它具有丰富的IO口和易于使用的开发环境。
2、显示模块:为了能直观地展示时间,你需要一个LCD显示屏。
可以选择常见的16x2字符型LCD显示屏。
3、按键模块:用于设定时间和闹钟功能。
一般可以选择4个按键,分别代表功能设置、小时加、小时减和分钟加。
4、蜂鸣器:当到达设定时间时,蜂鸣器会发出声音提醒。
二、软件需求1、开发环境:你需要一个适用于你单片机的开发环境,例如Arduino IDE。
2、编程语言:一般使用C或C++进行编程。
3、程序设计:你需要编写一个程序来控制单片机,让其根据设定时间准时唤醒。
程序应包括初始化和设定时间的功能,以及到达设定时间后的闹钟提醒功能。
三、设计流程1、硬件连接:将单片机、显示模块、按键模块和蜂鸣器按照要求连接起来。
2、初始化:在程序中初始化所有的硬件设备。
3、时间设定:通过按键模块设定时间。
你需要编写一个函数来处理按键输入,并在LCD显示屏上显示当前时间。
4、闹钟提醒:在程序中加入一个计时器,当到达设定时间时,程序会唤醒并触发蜂鸣器发出声音。
5、循环检测:在主循环中不断检测时间是否到达设定时间,如果到达则触发闹钟提醒,然后继续检测。
四、注意事项1、时钟源:你需要一个稳定的时钟源来保证闹钟的准确性。
可以考虑使用网络时钟或者GPS模块。
2、功耗优化:如果你的设备需要长时间运行,那么需要考虑到功耗的问题,比如使用低功耗的单片机或者在不需要闹钟提醒的时候关闭蜂鸣器等。
3、人机交互:考虑增加更多的功能以满足用户的需求,如设置多个闹钟、调整闹钟的音量等。
4、安全性:保证设备的电源稳定,避免在突然断电的情况下数据丢失或设备损坏。
单片机实验报告姓名学号时间 2013.1.9实验题目电子数字钟一、实验目的与要求1.电子数字钟必须具有显示年、月、日和显示时、分、秒的功能。
(用LCD显示)。
2.具有按键时间校正功能。
3.具备设定闹钟和定时闹钟功能。
二、实验环境(硬件环境、软件环境)1.硬件环境:单片机开发板一个,计算机一台,单片机主机电源线及与计算机的连接线各一条。
2.软件环境:软件Keil C51和软件Flash Magic。
三、实验电路(P2口输入、P1口输出实验原理图)本次实验主要使用了开发板的4个板块,分别是单片机STC89C52(如图2所示)、矩阵键盘(如图2所示)、1206LCD显示器和蜂鸣器(如图3所示)。
其中单片机芯片通过P0口把总线和矩阵键盘连接;通过P2.2和蜂鸣器间接相连,因为蜂鸣器所在的电路已经连芯片ULN2003,因此用一根杜邦线把P2.2和芯片ULN2003的第一个输入口IN1连起来。
而键盘显示这一块,由于内部已经把键盘显示的电路和单片机芯片连接起来了,所以不需要借助杜邦线了。
图1为实物连线图。
图1 实物连线图图2 单片机机座和矩阵键盘图3 蜂鸣器和1602液晶显示器四、程序流程图主要算法:主函数中先定时中断初始化,利用定时器中断实现走时,调用LCD显示程序和按键处理子函数,再调用显示时间函数显示初始时间值。
同时,在主函数中判断当前的小时和分钟值是否等于闹钟设定的时间,若等于则让蜂鸣器响。
主函数算法的框图如图4所示。
按键处理函数算法:通过键盘扫描函数得到确定哪个键盘按下,得到键盘值,如果键0按下则暂停时钟走时;键1按下则在当前的光标所在的时间单元加1;键2按下则开闹钟;键3按下则实现当前的时间单元左移一位的功能;键4按下则在当前的光标所在的时间单元减1。
时间的年月日算法:通过定时器实现时钟的走时,秒满60,分钟加1;分满60,小时加1;小时满24,日加1;至于每个月的天数根据闰年和非闰年的表格确定当月天数。
摘要本设计是定时闹钟的设计,由单片机AT89C51芯片和LED数码管为核心,辅以必要的电路,构成的一个单片机电子定时闹钟。
电子钟设计可采用数字电路实现,也可以采用单片机来完成。
数字电子钟是用数字集成电路构成的,用数码管显示“时”,“分”,“秒”的现代计时装置。
若用数字电路完成,所设计的电路相当复杂,大概需要十几片数字集成块,其功能也主要依赖于数字电路的各功能模块的组合来实现,焊接的过程比较复杂,成本也非常高。
若用单片机来设计制作完成,由于其功能的实现主要通过软件编程来完成,那么就降低了硬件电路的复杂性,而且其成本也有所降低,所以在该设计中采用单片机利用AT89C51,它是低功耗、高性能的CMOS型8位单片机。
片内带有4KB的Flash存储器,且允许在系统内改写或用编程器编程。
另外, AT89C51的指令系统和引脚与8051完全兼容,片内有128B 的RAM、32条I/O口线、2个16位定时计数器、5个中断源、一个全双工串行口等。
AT89C51单片机结合七段显示器设计的简易定时闹铃时钟,可以设置现在的时间及显示闹铃设置时间,若时间到则发出一阵声响,进—步可以扩充控制电器的启停。
设计内容包括了秒信号发生器、时间显示电路、按键电路、供电电源以及闹铃指示电路等几部分的设计。
采用四个开关来控制定时闹钟的工作状态,分别为:K1、设置时间和闹钟的小时;K2、设置小时以及设置闹钟的开关;K3、设置分钟和闹钟的分钟;K4、设置完成退出。
课设准备中我根据具体的要求,查找资料,然后按要求根据已学过的时钟程序编写定时闹钟的程序,依据程序利用proteus软件进行了仿真试验,对出现的问题进行分析和反复修改源程序,最终得到正确并符合要求的结果。
设计完成的定时闹钟达到课程设计的要求,在到达定时的时间便立即发出蜂鸣声音,持续一分钟。
显示采用的六位数码管电路,如果亮度感觉不够,可以通过提升电阻来调节,控制程序中延迟时间的长短,可以获得不同的效果。
单片机课程设计报告学号:xxx姓名:xxx指导老师:xxx题目:定时闹铃LCD目的:通过本课程设计可以学习8051定时器时间计时处理,按键扫描及LCD显示的设计方法。
功能说明:定时闹铃的基本功能如下:1,文字型LCD(16x2)显示。
2,显示格式为“时时分分”。
3,由LED闪动来做秒计数表示。
4,具有4个按键来做功能设置,可以设置现在的时间及显示闹铃设置时间。
程序执行后工作指示灯LED闪动,表示程序开始执行,LCD显示“00 00”,按下操作键K1~K4动作如下:1,操作键K1:设置现在的时间。
2,操作键K2:显示闹铃设置时间。
3,操作键K3:设置闹铃时间。
4,操作键K4:闹铃ON/OFF的状态设置,设为ON时连续三次发出哔的一声,设为OFF时发出哔的一声。
设置现在的时间或是闹铃时间设置如下:1,操作键K1:调整时。
2,操作键K2:调整分。
3,操作键K3:设置完成。
时间到时发出一阵声响,按下K4键可以停止声响。
控制电路:定时闹铃的控制电路分为以下几部分:♫单片机8051♫LCD显示器♫按键控制♫压电喇叭完整的控制电路图如下:LCD接口设计:•LCD接口可以分为8位及4位控制方式,本课程设计使用的是4位控制方式,使用D4~D7数据线来传送控制命令及数据。
使用4位数据线做控制时需分两次来传送,先送出高4位数据,再送出低4位数据。
•4为控制电路如图所示:••以8051 P0的6条输出控制线来实现控制,P0还接有提升电阻以增加其驱动能力,控制信号说明如下:•(1)R/W LCD读写控制线•直接接地,由于R/W=0时,LCD执行写入的动作,R/W=1时则执行读取的动作。
因此简化设计后,则无法对LCD实现读取动作。
所有控制数据的写入需加入适当的延迟,以配合LCD内部控制信号的执行•(2)RS 寄存器选择控制线•由P0.0控制,当RS=0时,可以写入指令寄存器,如果RS=1则写入数据寄存器。
•(3)EN 启用控制线•由P0.1控制,高电平动作。
#include<reg52.h>#define uint unsigned int#define uchar unsigned charuintmiao,fen,fen1,shi,shi1,flag1,flag2,flag3,aa,K1num,K2num,K3num,K4num,N;//K1num-K1按键被按下的标记变量,K2num-K2按键被按下的标记变量,K3num=0-K3按键被按下的标记变量uchar code table[]=" TIMING CLOCK"; //定义初始上电时液晶默认显示状态sbit K1=P1^0; //四个按键sbit K2=P1^1;sbit K3=P1^2;sbit K4=P1^3;sbit rs=P2^6;sbit lcden=P2^7;sbit led=P2^3; //发光二极管控制端sbit beep=P1^5; //蜂鸣器控制端sbit relay=P2^5; //继电器控制端void delay(uint z) //延时函数{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com) //液晶写命令函数{rs=0;lcden=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;}void write_date(uchar date) //液晶写数据函数{rs=1;lcden=0;P0=date;delay(5);lcden=1;delay(5);lcden=0;}void write_sfm(uchar add,uchar date) //液晶写时分秒函数{uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+add);write_date(0x30+shi);write_date(0x30+ge);}void init() //初始化函数{uint num; //写液晶的循环控制变量aa=0; //中断次数标志K1num=0; //K1按键被按下的标记变量K2num=0; //K2按键被按下的标记变量K3num=0; //K3按键被按下的标记变量K4num=0;flag1=1; //控制lcd屏刷新的变量flag2=1; //控制闹钟响闹和继电器开启关闭的标记flag3=1; //控制闹钟响起时,按下K4停止闹钟响闹的标记led=1; //发光二极管初始化relay=0; //继电器初始化N=100; //系统启动时,闹钟时间到发出的声音为连续三次发出“哗”的一声miao=0; //系统初始化时间fen=0;shi=0;fen1=1; //初始化闹钟的时间shi1=0;beep=0; //蜂鸣器初始化lcden=0; //液晶使能端初始化//1602液晶初始化,设置16*2显示。
基于单片机的多功能LCD时钟
该时钟的设计思路是通过单片机控制液晶显示器,实时更新时间、日期、温度等信息;同时,结合外部输入信号,实现闹钟功能。
首先,该时钟通过单片机内部定时器实现时间的计时。
通过精确定时器,可以实现秒、分、时的显示和更新。
单片机内部具有RTC(Real-
Time Clock)模块,可实现对日期和时间的实时监控。
其次,该时钟通过温度传感器获取环境温度,并通过单片机控制液晶
屏实时显示。
温度传感器可以是热敏电阻、热敏电容等。
另外,该时钟具有闹钟功能,用户可以设置闹钟时间。
当时间到达设
定的闹钟时间时,时钟会发出报警声音,提醒用户。
此外,该时钟还可以显示日历。
通过单片机计算当前日期,并显示在
液晶屏上。
时钟基于单片机的控制,具有灵活性高、功能强大、可靠性较好等优点。
其通过外设接口与用户进行交互,使得用户操作简单、方便。
整个时钟的设计和制作过程分为硬件设计和软件设计两个部分。
其中,硬件设计包括电路原理图设计、PCB布局设计、外设选型等;软件设计则
包括单片机程序设计、液晶显示程序设计、闹钟功能实现等。
总结起来,基于单片机的多功能LCD时钟是一种功能强大的电子时钟,通过单片机控制液晶显示器实现时间、日期和温度的显示和更新,同时结
合闹钟功能,提供给用户全方位的时间与日期信息。
片机万年历汇编闹钟时间可调程序(LCD1602,DS18B20,DS1302,MAX810L)说明:0该程序全部是用汇编语言编写1.该程序附带有温度显示,并且带有闹铃功能2.正常时间和闹钟时间都可以用键盘设置3.该程序是使用LCD1602显示年月日,格式为TIME XX-XX-XX XX,由于屏幕的关系,所以就不显示周的数据,其中闹铃调整的上界面是“BELLADJUST”4.该程序的时间是由时钟芯片DS1302提供的,据说很精准,目前看起来确实是这样的,刚开始我是使用定时器计时的,但是不怎么精准,可能是我的汇编技术有限才导致,所以本人就把这个版本呈上,希望诸位多多斧正5.该程序的温度是通过DS18B20提取的,这个模块是我从别人那里COPY过来的,O(∩_∩)O~,显示是肯定没问题的6.该程序也有用MAX810l的复位功能,但是好像这一点还没被体现出来7.烧程序我使用的是MAX232外加几个极性电容,还有一个RS232,不幸的是我的PCB板的RS232的封装画错啦!!~~~~(>_<)~~~~8.该万年历是由五个按键控制的,SW5复位,SW1调时间,调年月日时分秒,除秒可以加减调节之外其余的调节都是只能加不能减(自我觉得如果增加减的功能会觉得程序复杂,所以免!), SW4 是用来调节闹钟的时分秒的,和SW1按键不同的是时分秒都能加减,当闹钟设置的时间和正常显示时间的时分秒相同时,闹铃十秒钟,期间你可以按SW4键终止响铃,SW2 和SW3 分别是用来加减时间的!9.说了这么多,最后说说自我认为的缺陷,行家应该都一眼就看出一些破绽了,那就是按键消抖的问题,这个我觉得有点麻烦所以本人就把这个问题留给阅览资料的你吧!10.废话说了这么多,最后把我的程序,ORCAD电路原理图,PADS软件的PCB图,以及一张实物图献上,希望你能喜欢,页脚有我的Email(prettyboy2009@),欢迎随时交流!程序:;*************************************************************** ;***************************************************************RS BIT P2.5RW BIT P2.6E BIT P2.7SU BIT P1.6 ;1302串行口数据端RST BIT P1.5CLK BIT P1.7ALARM BIT P2.3JIAN BIT P2.2 ;减JIA BIT P2.1 ;加MOSHI BIT P2.0 ;模式DQ BIT P1.0SOUND BIT P1.3NIAN EQU 7FHYUE EQU 7DHDAY EQU 7CHHHH EQU 7EHSHI EQU 7BHFEN EQU 7AHMIAO EQU 79HASHI EQU 78HAFEN EQU 77HAMIAO EQU 76HGEW EQU 75HA_BIT EQU 70H ;18B20B_BIT EQU 6FHFLAG EQU 6EHDS1302_ADDR EQU 6DHDS1302_DATA EQU 6CHORG 0000HLJMP STARTORG 0030H ;***************************************************************; 初始化开机时间 &&&&&&& 初始化闹铃时间;***************************************************************START:MOV DPTR,#TABMOV SHI,#16HMOV ASHI,#17MOV FEN,#58HMOV AFEN,#30MOV MIAO,#00HMOV AMIAO,#00MOV NIAN,#11HMOV YUE,#12HMOV DAY,#13HMOV HHH,#00H;***************************************************************; 初始化LCD1602 &&&&&&& 初始化DS1302 ;***************************************************************MOV P0,#01H ; 显示清屏数据指针清零所有显示清零LCALL WR_CODEMOV P0,#02H ; 显示回车数据指针清零LCALL WR_CODEMOV P0,#38H ;设置16*2显示 5*7 点阵 8位数据接口LCALL WR_CODEMOV P0,#06H ; 当写或写一个数据时地址指针自动加一光标自动加一LCALL WR_CODEMOV P0,#0cH ; 开显示不显光标 0fh开显示开光标光标闪烁LCALL WR_CODELCALL XIAN1;***************************************************************; 主函数(这个大家都懂的);*************************************************************** MAIN:lcall RD_DS1302LCALL XIANSHIlcall keyLCALL AKEYLCALL RE_TEMPLCALL CONVERLCALL DISPLAY_INTLJMP BELLRING;***************************************************************; 读1302子程序;***************************************************************RD_DS1302:MOV DS1302_ADDR,#8DH ;读DS1302中的年LCALL READ ;调用读DS1302子程序MOV NIAN, DS1302_DATA ;把读出的年数据存入年寄存器中MOV DS1302_ADDR,#89H ;读DS1302中的月LCALL READMOV YUE, DS1302_DATA ;把读出的月数据存入月寄存器中MOV DS1302_ADDR,#87H ;读DS1302中的天LCALL READMOV DAY, DS1302_DATA ;把读出的天数据存入天寄存器中MOV DS1302_ADDR,#85H ;读DS1302中的小时LCALL READMOV SHI, DS1302_DATA ;把读出的天数据存入小时寄存器中MOV FEN, DS1302_DATA ;把读出的天数据存入分钟寄存器中MOV DS1302_ADDR,#81H ;读DS1302中的秒钟LCALL READMOV MIAO, DS1302_DATA ;把读出的天数据存入秒钟寄存器中RET ;***************************************************************; 写1302子程序;***************************************************************WR_DS1302:MOV DS1302_ADDR, #8EH ;写DS1302控制指令MOV DS1302_DATA, #00H ;写数据到DS1302的8E控制寄存器中,允许对其进行写操作LCALL WRITE ;调用写DS1302子程序MOV DS1302_ADDR,#8CH ;写DS1302中的年MOV DS1302_DATA , NIAN ;把写出的年数据存入年寄存器中LCALL WRITEMOV DS1302_ADDR,#88H ;写DS1302中的月MOV DS1302_DATA ,YUE ;把写出的月数据存入月寄存器中LCALL WRITEMOV DS1302_ADDR,#86H ;写DS1302中的天MOV DS1302_DATA ,DAY ;把写出的天数据存入天寄存器中LCALL WRITEMOV DS1302_ADDR,#84H ;写DS1302中的小时MOV DS1302_DATA , SHI ;把写出的天数据存入小时寄存器中LCALL WRITEMOV DS1302_ADDR,#82H ;写DS1302中的分钟MOV DS1302_DATA , FEN ;把写出的天数据存入分钟寄存器中LCALL WRITEMOV DS1302_ADDR,#80H ;写DS1302中的秒钟MOV DS1302_DATA , MIAO ;把写出的天数据存入秒钟寄存器中LCALL WRITEMOV DS1302_ADDR, #90H ;写DS1302控制指令MOV DS1302_DATA,#0A6H ;写数据到DS1302的90控制寄存器中,对电池涓流充电,充电电流为1.1mARET;***************************************************************; 写1302程序;***************************************************************WRITE:CLR CLKNOPSETB RSTNOPMOV A,DS1302_ADDRMOV R4,#8 WRITE1:RRC A ;送地址给1302NOPNOPCLR CLKNOPNOPNOPMOV SU,CSETB CLK ;送入地址在时钟上升沿有效NOPNOPNOPNOPDJNZ R4,WRITE1CLR CLKNOPMOV A,DS1302_DATAMOV R4,#8 WRITE2:RRC ANOP ;送数据给1302,时钟上升沿,数据输入CLR CLKNOPNOPMOV SU,CNOPNOPNOPSETB CLKDJNZ R4,WRITE2CLR RSTCLR ARET ;***************************************************************; 读1302程序;***************************************************************READ:CLR CLKNOPNOPSETB RSTNOPMOV A,DS1302_ADDRMOV R4,#8 READ1:RRC ANOPMOV SU,CNOPNOPNOPSETB CLK ;送入地址在时钟上升沿有效NOPNOPNOPCLR CLKNOPNOPDJNZ R4,READ1 ;判断8位数据是否传送完?MOV R4,#8 READ2:CLR CLKNOPNOPNOPMOV C,SUNOPNOPNOPNOPNOP ;从ds1302中读取数据,时钟下降沿有效NOPNOPNOPSETB CLKNOPDJNZ R4,READ2 ;判断8位数据是否传送完?MOV DS1302_DATA,ACLR RSTRET;***************************************************************; 固定显示显示TIME ,'-',:;***************************************************************XIAN1:MOV P0,#84HLCALL WR_CODEMOV A,#'-' ;1602有字库可以直接调用不用查表LCALL WR_DATAMOV P0,#87HLCALL WR_CODEMOV A,#'-'LCALL WR_DATAMOV P0,#80HLCALL WR_CODEMOV A,#'2' ;计时100年所以20XX 20是固定的LCALL WR_DATAMOV P0,#81HLCALL WR_CODEMOV A,#'0'LCALL WR_DATAMOV P0,#0C1HLCALL WR_CODEMOV A,#'T'LCALL WR_DATAMOV P0,#0C2HLCALL WR_CODEMOV A,#'I'LCALL WR_DATAMOV P0,#0C3HLCALL WR_CODEMOV A,#'M'LCALL WR_DATAMOV P0,#0C4HLCALL WR_DATAMOV P0,#0CCHLCALL WR_CODEMOV A,#':'LCALL WR_DATAMOV P0,#0C9HLCALL WR_CODEMOV A,#':'LCALL WR_DATAMOV P0,#08EHLCALL WR_CODEMOV A,#0DFHLCALL WR_DATAMOV P0,#08FHLCALL WR_CODEMOV A,#'C'LCALL WR_DATARET;*************************************************************** ; 显示数据时分秒年月日周地址数据都在变化没用循环体;***************************************************************XIANSHI:MOV HHH,MIAOLCALL HEXMOV P0,#0CDHLCALL WR_CODEMOVC A,@A+DPTRLCALL WR_DATAMOV A,BMOV P0,#0CEHLCALL WR_CODEMOVC A,@A+DPTRLCALL WR_DATAMOV HHH,FENLCALL HEXMOV P0,#0CAHLCALL WR_CODEMOVC A,@A+DPTRLCALL WR_DATALCALL WR_CODE MOVC A,@A+DPTR LCALL WR_DATAMOV HHH,SHI LCALL HEXMOV P0,#0C7H LCALL WR_CODE MOVC A,@A+DPTR LCALL WR_DATA MOV A,BMOV P0,#0C8H LCALL WR_CODE MOVC A,@A+DPTR LCALL WR_DATAMOV HHH,DAY LCALL HEXMOV P0,#088H LCALL WR_CODE MOVC A,@A+DPTR LCALL WR_DATA MOV A,BMOV P0,#089H LCALL WR_CODE MOVC A,@A+DPTR LCALL WR_DATAMOV HHH,YUE LCALL HEXMOV P0,#085H LCALL WR_CODE MOVC A,@A+DPTR LCALL WR_DATA MOV A,BMOV P0,#086H LCALL WR_CODE MOVC A,@A+DPTR LCALL WR_DATAMOV HHH,NIAN LCALL HEXMOV P0,#082HMOVC A,@A+DPTRLCALL WR_DATAMOV A,BMOV P0,#083HLCALL WR_CODEMOVC A,@A+DPTRLCALL WR_DATARET;***************************************************************; 判键子程按一次模式键后就一直判断下一次按键是P2.1还是P2.2;判断进入下一模式还是加1(按下模式键第一次加1需要按两次);MO1加分 MO2加时 MO3加月 MO4加日 MO5加年,除秒可以加减调节外,;时间只能通过加分时日月年调节;***************************************************************KEY:JNB MOSHI,MORET MO:JNB MOSHI,$MOV P0,#0DH ; 开显示不显光标 0fh开显示开光标光标闪烁LCALL WR_CODE MO1:MOV P0,#0CBHLCALL WR_CODEJNB JIA,JIAFFJNB JIAN,JIANFFJNB MOSHI,MO11LJMP MO1 MO11:JNB MOSHI,$;MO2:MOV P0,#0C8HLCALL WR_CODEJNB JIA,JIASSJNB MOSHI,MO21LJMP MO2 MO21:JNB MOSHI,$; ;MO4:MOV P0,#089HLCALL WR_CODELJMP MO4 MO41:JNB MOSHI,$MO3:MOV P0,#086HLCALL WR_CODEJNB JIA,JIAMMJNB MOSHI,MO31LJMP MO3 MO31:JNB moshi,$;MO5:MOV P0,#083HLCALL WR_CODEJNB JIA,JIAYYJNB MOSHI,MO51LJMP MO5 MO51:JNB MOSHI,$MOV P0,#0CH ; 开显示不显光标 0fh开显示开光标光标闪烁LCALL WR_CODElcall XIAN1RET;***************************************************************; 跳转出范围中转;***************************************************************JIAFF:LJMP JIAFJIANFF:LJMP JIANFJIADD:LJMP JIADJIAMM:LJMP JIAMJIAYY:LJMP JIAYJIASS:LJMP JIAS;***************************************************************;判断加1 以及跳转到另一模式(模式是指加分还是加时加月等);***************************************************************JIAF:MOV P0,#0CBHLCALL WR_CODEJNB JIAN,JIANFJB JIA,JIAF2JNB JIA,$mov A,FENADD A , #01HDA Amov FEN,ACJNE A , #60H ,JIAF3MOV FEN ,#00H JIAF3:LCALL WR_DS1302LCALL XIANSHILJMP JIAF JIAF1:JNB MOSHI,$LJMP MO11JIANF:MOV P0,#0CBHLCALL WR_CODEJNB MOSHI,JIANF1JNB JIA,JIAFJB JIAN,JIANFJNB JIAN,$MOV A,FENCJNE A,#00,JIANF2MOV FEN,#59HLJMP JIANF3 JIANF2:CLR CSUBB A,#01DA AMOV FEN,A JIANF3:LCALL WR_DS1302LCALL XIANSHILJMP JIANF JIANF1:JNB MOSHI,$LJMP MO11JIAS:MOV P0,#0C8HJIAS2:JNB MOSHI,JIAS1JB JIA,JIAS2JNB JIA,$MOV A,SHIADD A,#01HDA AMOV SHI,ACJNE A,#24H,JIAS3MOV SHI,#00 JIAS3:LCALL WR_DS1302LCALL XIANSHILJMP JIAS JIAS1:JNB MOSHI,$LJMP MO21JIAD:MOV P0,#089HLCALL WR_CODEJIAD2:JNB MOSHI,JIAD1JB JIA,JIAD2JNB JIA,$MOV A,DAYADD A,#01HDA AMOV DAY,AMOV A,YUECJNE A,#01H,SS1LJMP JIAD4 SS1:CJNE A,#03H,SS2 LJMP JIAD4 SS2:CJNE A,#05H,SS3LJMP JIAD4 SS3:CJNE A,#07H,SS4LJMP JIAD4 SS4:SS5:CJNE A,#10H,SS6LJMP JIAD4 SS6:CJNE A,#12H,SSS JIAD4:MOV A,DAYCJNE A,#32H,JIAD3MOV DAY,#01H JIAD3:LCALL WR_DS1302LCALL XIANSHILJMP JIAD JIAD1:JNB MOSHI,$LJMP MO41 SSS:CJNE A,#02H,S30MOV A,NIANANL A,#0FHMOV GEW,AMOV A,NIANANL A,#0F0HSWAP AMOV B,#10MUL ABADD A,GEWMOV B,#04HDIV ABMOV A,BCJNE A,#00H,S29LJMP S28 S30:MOV A,DAYCJNE A,#31H,JIAD3MOV DAY,#01HLJMP JIAD3 S29:MOV A,DAYCJNE A,#29H,JIAD3MOV DAY,#01HLJMP JIAD3 S28:MOV DAY,#01HLJMP JIAD3;***************************************************************;;判断月的天数判断闰年的方法先将年的数据有十六进制BCD码转换成正常的十六进制;再除以4 判断余数是否为0 为零则为闰年不为零不是;***************************************************************JIAM:MOV P0,#086HLCALL WR_CODE JIAM2:JNB MOSHI,JIAM1JB JIA,JIAM2JNB JIA,$MOV A,YUEADD A,#01HDA AMOV YUE,ACJNE A,#13H,JIAM3MOV YUE,#01 JIAM3:LCALL WR_DS1302LCALL XIANSHI JIAM1:JNB MOSHI,$LJMP MO31 JIAY:MOV P0,#083HLCALL WR_CODE JIAY2:JNB MOSHI,JIAY1JB JIA,JIAY2JNB JIA,$MOV A,NIANADD A,#01HDA AMOV NIAN,ACJNE A,#99H,JIAY3MOV NIAN,#00 JIAY3:LCALL WR_DS1302LCALL XIANSHILJMP JIAY;***************************************************************;温度读取;***************************************************************RE_TEMP:SETB DQACALL INIT_18B20JB FLAG, STRET ST:MOV A, #0CCHACALL WRITE_18B20MOV A, #44HACALL WRITE_18B20ACALL INIT_18B20MOV A, #0CCHACALL WRITE_18B20MOV A, #0BEHACALL WRITE_18B20ACALL READ_18B20RET;***************************************************************;初始化DS18B20;***************************************************************INIT_18B20:SETB DQNOPCLR DQMOV R1, #3 DLY:MOV R0, #107DJNZ R0, $DJNZ R1, DLYSETB DQNOPNOPNOPMOV R0, #25H T2:JNB DQ, T3DJNZ R0, T2JMP T4 T3:SETB FLAGJMP T5JMP T7 T5:MOV R0, #117 T6:DJNZ R0, T6 T7:SETB DQRET ;***************************************************************;写DS18B20;***************************************************************WRITE_18B20:MOV R2, #8CLR C WR1:CLR DQMOV R3, #6DJNZ R3, $RRC AMOV DQ, CMOV R3, #23DJNZ R3, $SETB DQNOPDJNZ R2, WR1SETB DQRET;***************************************************************;读DS18B20;***************************************************************READ_18B20:MOV R4, #2MOV R1, #21H RE0:MOV R2, #8 RE1:CLR CSETB DQNOPNOPCLR DQNOPNOPMOV R3, #9 RE2:DJNZ R3, RE2MOV C, DQMOV R3, #23 RE3:DJNZ R3, RE3RRC ADJNZ R2, RE1MOV @R1, ADEC R1DJNZ R4, RE0RET;***************************************************************;温度转换;***************************************************************CONVER:MOV A, 21HMOV C, 20H.0RRC AMOV C, 20H.1RRC AMOV C, 20H.2RRC AMOV C, 20H.3RRC AMOV 21H, ARET;***************************************************************;显示温度整数部分;***************************************************************DISPLAY_INT:MOV A, 21HMOV B, #10DIV ABMOV B_BIT, AMOV A_BIT, BMOV DPTR, #TABMOV P0,#08cHLCALL WR_CODELCALL WR_DATAMOV P0,#08DHLCALL WR_CODEMOV A, A_BITMOVC A, @A+DPTRLCALL WR_DATARET;***************************************************************; 1602的写数据读指令判忙程序;***************************************************************WR_DATA:MOV P0,ASETB RS ;RS=1选择数据寄存器CLR RW ;RW=0 ;准备CLR E ;E=0 ;执行显示命令LCALL BUSY ;判断液晶模块是否忙?SETB E ;E=1 ;显示完成,程序停车RET WR_CODE:CLR RS ;写入控制命令的子程序CLR RWCLR ELCALL BUSYSETB ERET BUSY:MOV P0,#0FFH ;判断液晶显示器是否忙的子程序CLR RSSETB RWCLR ENOP ;nop一定要有SETB EJB P0.7,BUSY ;如果P0.7为高电平表示忙就循环等待RET ;***************************************************************; 判键子程按一次模式键后就一直判断下一次按键是P3.4还是P3.5 判断进入下一模式还是加1(按下模式键第一次加1需要按两次);MO1加分 MO2加时 MO3加月 MO4加日 MO5加年AKEY:JNB ALARM, XIANGUANGRET XIANGUANG:JNB ALARM,$MOV P0,#01H ; 显示清屏数据指针清零所有显示清零LCALL WR_CODEMOV P0,#02H ; 显示回车数据指针清零LCALL WR_CODEMOV P0,#038H ;设置16*2显示 5*7 点阵 8位数据接口LCALL WR_CODEMOV P0,#04H ; 当读或写一个数据时地址指针自动加一光标自动加一LCALL WR_CODEMOV P0,#0DH ; 开显示不显光标 0fh开显示开光标光标闪烁LCALL WR_CODELCALL AXIANLCALL AXIANSHIMOMIAO: MOV P0,#0CBHLCALL WR_CODEJNB JIA,INCMJNB JIAN,DECMJNB ALARM ,BACKMIAOLJMP MOMIAO BACKMIAO:JNB ALARM,$LJMP MOFENINCM:MOV P0,#0CBHLCALL WR_CODE INCM2:JNB ALARM,INCM1JNB JIAN,DECMJB JIA,INCM2JNB JIA,$INC AMIAOMOV A,AMIAOCJNE A,#60,INCM3MOV AMIAO,#00 INCM3:LCALL AXIANSHILJMP INCMINCM1:JNB ALARM ,BACKMIAODECM:MOV P0,#0CBHLCALL WR_CODEJNB ALARM,DECM1JNB JIA,INCMJB JIAN,DECMJNB JIAN,$MOV A,AMIAOCJNE A,#00,DECM2MOV AMIAO,#59LJMP DECM3 DECM2:CLR CSUBB A,#01MOV AMIAO,A DECM3:LCALL AXIANSHILJMP DECM DECM1:JNB ALARM,BACKMIAOMOFEN:MOV P0,#0C8HLCALL WR_CODEJNB JIA,INCFJNB JIAN,DECFJNB ALARM ,BACKFENLJMP MOFEN BACKFEN:JNB ALARM,$LJMP AMOSHIINCF:MOV P0,#0C8HLCALL WR_CODEINCF2:JNB ALARM,INCF1JNB JIAN,DECFJB JIA,INCF2JNB JIA,$INC AFENMOV A,AFENCJNE A,#60,INCF3MOV AFEN,#00INCF3:LCALL AXIANSHILJMP INCFINCF1:JNB ALARM ,BACKFENDECF:MOV P0,#0C8HLCALL WR_CODEJNB ALARM,DECF1JNB JIA,INCFJB JIAN,DECFJNB JIAN,$MOV A,AFENCJNE A,#00,DECF2MOV AFEN,#59LJMP DECF3DECF2:CLR C;DEC ASUBB A,#01;DA AMOV AFEN,ADECF3:LCALL AXIANSHILJMP DECFDECF1:JNB ALARM,BACKFENAMOSHI:MOV P0,#0C5HLCALL WR_CODEJNB JIA,INCSJNB JIAN,DECSJNB ALARM ,BACKSHI LJMP AMOSHIINCS:MOV P0,#0C5HLCALL WR_CODEINCS2:JNB ALARM,INCS1JNB JIAN,DECSJB JIA,INCS2JNB JIA,$INC ASHIMOV A,ASHICJNE A,#24,INCS3MOV ASHI,#00INCS3:LCALL AXIANSHILJMP INCSINCS1:JNB ALARM ,BACKSHIBACKSHI:JNB ALARM,$MOV P0,#01HLCALL WR_CODEMOV P0,#0CHLCALL WR_CODELCALL XIAN1LJMP MAINDECS:MOV P0,#0C5HLCALL WR_CODEJNB ALARM,DECS1JNB JIA,INCSJB JIAN,DECSJNB JIAN,$MOV A,ASHICJNE A,#00,DECS2MOV ASHI,#23LJMP DECS3 DECS2:CLR CSUBB A,#01MOV ASHI,ADECS3:LCALL AXIANSHILJMP DECS DECS1:JNB ALARM,BACKSHI;***************************************************************; 闹钟部分固定显示显示TIME ADJUST;***************************************************************AXIAN:MOV P0,#82HLCALL WR_CODEMOV A,#'B'LCALL WR_DATAMOV P0,#83HLCALL WR_CODEMOV A,#'E'LCALL WR_DATAMOV P0,#84HLCALL WR_CODEMOV A,#'L' ;LCALL WR_DATAMOV P0,#85HLCALL WR_CODEMOV A,#'L'LCALL WR_DATAMOV P0,#088HLCALL WR_CODEMOV A,#'A'LCALL WR_DATAMOV P0,#089HLCALL WR_CODEMOV A,#'D'LCALL WR_DATAMOV P0,#08AHLCALL WR_CODEMOV A,#'J'LCALL WR_DATAMOV P0,#08BHLCALL WR_CODEMOV A,#'U'LCALL WR_DATAMOV P0,#08CHLCALL WR_CODEMOV A,#'S'LCALL WR_DATAMOV P0,#08DHLCALL WR_CODEMOV A,#'T'LCALL WR_DATAMOV P0,#0C6HLCALL WR_CODEMOV A,#':'LCALL WR_DATAMOV P0,#0C9HLCALL WR_CODEMOV A,#':'LCALL WR_DATARET;*************************************************************** ; 显示数据时分秒年月日周地址数据都在变化没用循环体;*************************************************************** AXIANSHI:MOV HHH,AMIAOLCALL AHEXMOV P0,#0CAHLCALL WR_CODEMOVC A,@A+DPTRLCALL WR_DATAMOV A,BMOV P0,#0CBHLCALL WR_CODEMOVC A,@A+DPTRLCALL WR_DATAMOV HHH,AFENLCALL AHEXMOV P0,#0C7HLCALL WR_CODEMOVC A,@A+DPTRLCALL WR_DATAMOV A,BMOV P0,#0C8HLCALL WR_CODEMOVC A,@A+DPTRLCALL WR_DATAMOV HHH,ASHILCALL AHEXMOV P0,#0C4HLCALL WR_CODEMOVC A,@A+DPTRLCALL WR_DATAMOV A,BMOV P0,#0C5HLCALL WR_CODEMOVC A,@A+DPTRLCALL WR_DATARET;***************************************************************; 分离十进制BCD码中的十位和个位;***************************************************************AHEX: MOV A,HHHMOV B,#10DIV ABRET;***************************************************************; 闹钟模块;***************************************************************;==========================条件符合响铃1分钟============================ BELLRING:MOV HHH,SHILCALL HEXMOV R2,BMOV B,#10MUL ABADD A,R2CJNE A ,ASHI, AAAMOV HHH,FENLCALL HEXMOV R2,BMOV B,#10MUL ABADD A,R2CJNE A ,AFEN,AAAMOV HHH,MIAOLCALL HEXMOV R2,BMOV B,#10MUL ABADD A,R2CJNE A ,AMIAO,AAALCALL BELLRAAA:LJMP MAIN;==========================闹钟响铃10秒钟============================BELLR:MOV COUNT,#10ZZZ:SETB SOUNDLCALL DELAY500MSCLR SOUNDLCALL DELAY500MSlcall RD_DS1302LCALL XIANSHIJNB ALARM ,BBBDJNZ COUNT ,ZZZBBB:JNB ALARM ,$SETB SOUNDRET;==========================设置闹铃延时500MS响一次=================== DELAY500MS:MOV R7,#17HDL1:MOV R6,#98HDL0:MOV R5,#46HDJNZ R5,$DJNZ R6,DL0DJNZ R7,DL1RET;*************************************************************** ; 转换成BCD码;*************************************************************** ZHUAN:MOV A,HHHADD A,#00HDA ARET;*************************************************************** ; 分离BCD码中的十位和个位;*************************************************************** HEX:MOV A,HHHMOV B,#16DIV ABRET;*************************************************************** ; 数据查表;*************************************************************** TAB: DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39HENDORCAD电路原理图PADS软件的PCB图实物图。
/****************************************************************************/ //头文件#include <AT89X52.h>#include <string.h>/*****************************************************************************/ //灯与蜂鸣器定义sbit led_b = P2^7;sbit led_r = P1^4;sbit led_g1 = P1^3;sbit led_g2 = P1^2;sbit led_g3 = P1^0;sbit led_g4 = P1^1;sbit beep = P3^1;/*****************************************************************************/ //温度传感器定义sbit DQ = P3 ^ 0;//ds18B20/*****************************************************************************/ //键盘引脚定义sbit KEY_1 = P2^3; //左上sbit KEY_2 = P2^4; //左下sbit KEY_3 = P2^6; //右上sbit KEY_4 = P2^5; //右下sbit KEY_I = P3^2; //常0/****************************************************************************/ //引脚定义sbit SID = P2^1; //数据sbit SCLK = P2^2; //时钟/*****************************************************************************/ //定义DS1302时钟接口sbit clock_clk = P3 ^ 5;//ds1302_clk(时钟线)sbit clock_dat = P3 ^ 4;//ds1302_dat(数据线)sbit clock_Rst = P3 ^ 3;//ds1302_Rst(复位线)/*****************************************************************************/ //定义累加器A中的各位sbit a0 = ACC ^ 0;sbit a1 = ACC ^ 1;sbit a2 = ACC ^ 2;sbit a3 = ACC ^ 3;sbit a4 = ACC ^ 4;sbit a5 = ACC ^ 5;sbit a6 = ACC ^ 6;sbit a7 = ACC ^ 7;/****************************************************************************/ //定义全局变量unsigned char yy,mo,dd,xq,hh,mm,ss;//定义时间映射全局变量(专用寄存器)bit w = 0; //调时标志位static unsigned char menu = 0;//定义静态小时更新用数据变量static unsigned char keys = 0;//定义静态小时更新用数据变量static unsigned char timecount = 0;//定义静态软件计数器变量/****************************************************************************/ void DelayM(unsigned int a){//延时函数1MS/次unsigned char i;while( --a != 0){for(i = 0; i < 125; i++); //一个; 表示空语句,CPU空转。
单片机课程设计定时闹钟-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN一、任务说明本设计师定时闹钟的设计,由单片机AT89C51芯片和LCD、LED显示器,辅以必要的的电路,构成一个单片机定时闹钟。
电子钟可采用数字电路实现,也可以采用单片机来完成。
LCD显示“时”,“分”,LED闪动来做秒计数,定时时间到能发出警报声或者启动继电器,从而控制电器的启停。
现在是自动化高度发达的时代,特别是电子类产品都是靠内部的控制电路来实现对产品的控制,达到自动运行的目的,这就需要我们这里要做的设计中的电器元件及电路的支持。
在这次设计中主要是用AT89S51来进行定时,也结合着其他辅助电路实施控制,在定时的时候,按一下控制小时的键对小时加一;按一下控制分钟的键对分钟加一;到达预设的时间,此电路就会发出报警声音提示已经到点。
二、原理图绘制说明1、原理及工作过程说明(1)定时闹钟的基本功能如下:(a)使用LCD液晶显示器来显示现在的时间。
(b)程序执行之后显示“Time:00:00”;并且LED闪烁,表示开始已经计时。
(c)由LED闪动来做秒计数表示。
(2)按键功能如下:按键K1设置现在的时间和时调整;按键K2显示闹钟设置的时间和分调整;按键K3设置闹铃的时间和设置完成;按键K4闹铃ON/OFF的状态设置,设置为ON时连续三次发出“哗”的一声,设置为OFF发出“哗”的一声和闹铃时间到时,发出一阵声响,按下本键可以停止声响。
(3)调整计时器时间如下:按下K1键,然后按K1调整小时,K2调整分钟,按下K3表示时间设置完成。
(4)调整闹钟时间设置如下 :再次按下K3开始闹中设置,LCD下一行显示“Alarm:00:00”按下K1设置小时,按一下K2设置分钟,再次按下K3设置完成,并且设置时间消失,当再次按一下K2时“Alarm:00:00再次显示并马上消失。
按一下K4关闭闹钟,再次按下打开闹钟。
2、原理总框图图1 总原理图3、元器件功能说明AT89C51单片机引脚功能说明本设计的核心硬件就是8051芯片,这里选择了AT89C51,AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。
中南大学《自动化工程训练》设计题目 LCD时钟程序设计指导老师设计者专业班级自动化级班号设计日期2016年9月目录一、设计任务要求分析 (1)1.1设计总体方案及其方案论证 (1)二、组成电路介绍 (1)2.1 复位电路: (1)2.2晶振电路: (1)2.3键盘控制系统设计: (2)2.4闹钟部分: (3)2.5显示电路设计 (3)2.5.1 LCD1602简介 (3)三、软件设计 (4)3.1程序主流程图 (5)3.2初始化流程图 (5)3.3延时中断子程序 (6)3.4时间设置子程序 (7)四、系统测试 (7)4.1 测试方法 (7)4.2 测试结果 (7)4.3 结果分析 (8)五、源程序 (8)一、设计任务要求分析本设计要实现的功能是:实时显示当前的时钟,并且可以设定闹铃,以蜂鸣器鸣响5秒的方式作为闹铃。
1.1设计总体方案及其方案论证按照系统的设计功能所要求的,液晶显示电子时钟原理图如图所示。
液晶显示电子时钟原理图本系统以AT89C51单片机为核心,该单片机可把数据进行处理,从而把数据传输到显示模块LCD1602液晶显示器,实现时间及日期的显示。
以LCD 液晶显示器为显示模块,把单片机传来的数据显示出来,并且显示多样化,还可以对时间和日期进行设置,主要靠按键来实现。
二、组成电路介绍2.1 复位电路:复位电路复位电路有两种方式:上电复位和按钮复位,我们主要用按钮复位方式。
如图所示:2.2晶振电路:晶振电路如图所示:晶振模块原理图选取原则:电容选取22pF,晶振为12MHz。
1)电源:AT89S51单片机的供电电源是5V的直流电。
2)EA非/Vpp脚:我们没有用外部扩展ROM,因此EA非/Vpp为高电平,即接+5V电源。
2.3键盘控制系统设计:按键需要4个,分别实现为时间调整、时间的加、时间的减、闹钟调整四个功能。
用单片机的4个I/O口接收控制信号,其电路如图所示:按键调时电路通过控制键来控制所要调节的是时、分、还是秒。
#include<reg51.h> // 包括单片机寄存器的头文件#include<intrins.h> //包括 _nop_() 函数定义的头文件//1602 端口定义sbit RS=P2^0; // 寄存器选择位,将RS 位定义为P2.0 引脚sbit RW=P2^1; //读写选择位,将RW 位定义为P2.1 引脚sbit E=P2^2; // 使能信号位,将 E 位定义为 P2.2 引脚sbit BF=P1^7; // 忙碌标记位,,将 BF 位定义为P0.7 引脚//AD 端口定义sbit CLK=P2^3;sbit start=P2^4;sbitoe=P2^5;sbiteoc=P2^7;sbitout_pulse=P2^6;//5us 脉冲sbit p30=P3^0;#define uchar unsigned char#define uint unsigned intuchar n=0;uchar flag=0;//1s 标记位/*****************************************************函数功能:延时1ms***************************************************/void delay1ms(){unsigned char i,j;for(i=0;i<10;i++)for(j=0;j<33;j++);}/*****************************************************函数功能:延时若干毫秒进口参数: n***************************************************/void delay(unsigned int n){unsignedinti;for(i=0;i<n;i++)delay1ms();}/*****************************************************函数功能:判断液晶模块的忙碌状态返回值: result。
设计总说明这次课程设计的任务是是利用MCS51系列单片外加必要的辅助电路从而设计一个带有LCD显示的定时闹钟。
该闹钟应具有的功能是:当定时闹钟到了人为设定好的时间后,它就发出声音,并且在LCD显示器上显示出你所设定的闹钟时间以及当前时间,并能够随时调整时间。
本课设所用器件有:AT89C52单片机、LCD显示器(LM016L)、上拉电阻(Respack-8)、晶振电路、复位电路(带有复位键)以及四个控制键。
1、在控制时分电路设计中,分别设置了四个键:K1键-用来设置当前时间以及在设置中用来设置时钟K2键-显示闹钟时间以及在设置中用来设置分钟K3键-设置闹钟时间K4键-控制闹铃的开关2、在控制时分秒电路的设计中,分别设置了五个键,即在1的基础上增加了一个控制秒的按键。
当然本课程设计中所用到的元器件还可以应用其他的一些器件。
比如AT89C52完全可以用AT89C51来代替,LM016L型号的LCD显示器可以用LM017L 型号的LCD显示器来代替(其他一些显示器也可以用),上来电阻也可以用分电阻来表示。
初次做课程设计,肯定会有许多不足之处,希望老师们指点!关键字: AT89C52单片机 LCD显示器闹钟目录1、主要内容 (3)2、目的和意义 (3)3、基本要求 (3)、显示时-分功能 (3)、显示时-分-秒功能 (3)4、系统设计AT89C52单片机简介 (4)电路总体设计 (6)主程序流程图 (7)5、详细设计设计电路图 (7)程序代码 (12)5.2.1 时-分程序代码 (12)5.2.2 时-分-秒程序代码 (23)6、结论结果分析 (33)心得体会 (33)7、设计总结 (34)8、参考文献 (34)1、主要内容:本次课程设计的内容为设计一个以MCS51单片机为核心的带有LCD显示的定时闹钟,完成原理图设计,软件编制及设计报告。
设使用AT89C52单片机结合字符型LCD显示器设计一个简易的定时闹钟LCD时钟,若LCD 选择有背光显示的模块,在夜晚或黑暗的场合中也可以使用。
#include<reg51.h> //包含单片机寄存器的头文件#include<intrins.h> //包含_nop_()函数定义的头文件//1602端口定义sbit RS=P2^0; //寄存器选择位,将RS位定义为P2.0引脚sbit RW=P2^1; //读写选择位,将RW位定义为P2.1引脚sbit E=P2^2; //使能信号位,将E位定义为P2.2引脚sbit BF=P1^7; //忙碌标志位,,将BF位定义为P0.7引脚//AD端口定义sbit CLK=P2^3;sbit start=P2^4;sbit oe=P2^5;sbit eoc=P2^7;sbit out_pulse=P2^6;//5us脉冲sbit p30=P3^0;#define uchar unsigned char#define uint unsigned intuchar n=0;uchar flag=0;//1s标志位/***************************************************** 函数功能:延时1ms***************************************************/ void delay1ms(){unsigned char i,j;for(i=0;i<10;i++)for(j=0;j<33;j++);}/***************************************************** 函数功能:延时若干毫秒入口参数:n***************************************************/ void delay(unsigned int n){unsigned int i;for(i=0;i<n;i++)delay1ms();}/***************************************************** 函数功能:判断液晶模块的忙碌状态返回值:result。
result=1,忙碌;result=0,不忙***************************************************/bit BusyTest(void){bit result;RS=0; //根据规定,RS为低电平,RW为高电平时,可以读状态RW=1;E=1; //E=1,才允许读写_nop_(); //空操作_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间result=BF; //将忙碌标志电平赋给resultE=0;return result;}/*****************************************************函数功能:将模式设置指令或显示地址写入液晶模块入口参数:dictate***************************************************/void Write_com (unsigned char dictate){while(BusyTest()==1); //如果忙就等待RS=0; //根据规定,RS和R/W同时为低电平时,可以写入指令RW=0;E=0; //E置低电平(写指令时,// 就是让E从0到1发生正跳变,所以应先置"0"_nop_();_nop_(); //空操作两个机器周期,给硬件反应时间P1=dictate; //将数据送入P0口,即写入指令或地址_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=1; //E置高电平_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令}/*****************************************************函数功能:指定字符显示的实际地址入口参数:x***************************************************/void WriteAddress(unsigned char x){Write_com(x|0x80); //显示位置的确定方法规定为"80H+地址码x"}/*****************************************************函数功能:将数据(字符的标准ASCII码)写入液晶模块入口参数:y(为字符常量)***************************************************/void WriteData(unsigned char y){while(BusyTest()==1);RS=1; //RS为高电平,RW为低电平时,可以写入数据RW=0;E=0; //E置低电平(写指令时,,// 就是让E从0到1发生正跳变,所以应先置"0"P1=y; //将数据送入P0口,即将数据写入液晶模块_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=1; //E置高电平_nop_();_nop_();_nop_();_nop_(); //空操作四个机器周期,给硬件反应时间E=0; //当E由高电平跳变成低电平时,液晶模块开始执行命令}/*****************************************************函数功能:对LCD的显示模式进行初始化设置***************************************************/void LcdInt(void){delay(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间Write_com(0x38); //显示模式设置:16×2显示,5×7点阵,8位数据接口delay(5); //延时5msWrite_com(0x0c); //显示模式设置:显示开,有光标,光标闪烁delay(5);Write_com(0x06);delay(5);Write_com(0x01); //清屏幕指令,将以前的显示内容清除delay(5);}/*********初始化***********/void sysinit(){TMOD = 0x21; //设定定时器T1工作方式T0 工作方式1TH1=0xfd; //利用T1中断产生CLK信号TL1=0xfd;//50khzEA = 1; //开总中断ET1=1;TR1=1; //启动定时器T1TH0=0x45;TL0=0x00;//50MS定时ET0=1;TR0=1;start=0; // START:A/D转换启动信号,输入,高电平有效。
oe=0; //数据输出允许信号,输入,高电平有效。
当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。
}/***********T0中断服务程序************/void t0(void) interrupt 1{ET0=0;TH0=0X45;//46TL0=0X00;//50MS定时n++;if(n==20) {flag=1;n=0;}ET0=1;}void t1(void) interrupt 3{ET1=0;CLK=~CLK;ET1=1;}//0808数据采集unsigned char adc(){unsigned char Temp;start=1;// delay(1);//do not delaystart=0; //启动信号while (!eoc);// A/D转换结束信号P0=0xff;// delay(1);oe=1;Temp=P0;//读取采集数据oe=0;// delay(4);return(Temp);//返回采集数据}void display(uint a)//显示子函数{uint bai,shi,ge;bai=a/100;shi=(a-bai*100)/10;ge=a%10;WriteAddress(2);WriteData(0x30+bai);//显示百位WriteData(0x30+shi);//显示十位WriteData(0x30+ge);//显示个位}void main(){uint temp1,temp2;uchar f=0;LcdInt();delay(5);sysinit();CLK=0;WriteAddress(0);//从第0行开始显示WriteData('f');//显示fWriteData(':');//显示:WriteAddress(5);//从第5行开始显示WriteData('H'); //显示HWriteData('z');//显示zwhile(1){temp2=temp1;temp1=adc();//ad采集if(((temp1>=128)&&(temp2<=128))||((temp1<=128)&&(temp2>=128))){f++;//out_pulse=1;_nop_();_nop_();_nop_();_nop_();_nop_();out_pulse=0;//产生5us的脉冲信号}if(flag==1)//到达1s后计算频率{flag=0;f=f/2;display(f);//显示频率f=0;}}}。