电子时钟的硬件与软件设计毕业论文目录1绪论1.1课题背景及意义 (5)1.2课题容 (5)2方案论证2.1功能要求 (7)2.2数字时钟方案论证与比较 (7)2.3数码管显示方案论证与比较 (8)3.电子时钟的硬件设计3.1电子时钟的组成 (9)3.2单片机最小系统图 (9)3.3STC89C52引脚功能 (10)3.4数码显示模块 (11)3.5闹铃部分 (11)3.6按键模块 (12)4电子时钟的软件设计4.1电子时钟程序流程框图 (14)4.2按键调整流程图 (16)4.3子程序的设计 (17)4.4.1数码管显示模块 (17)4.4.2按键子模块 (18)4.4.3 主程序 (34)5硬件的制作与测试分析5.1电子时钟的硬件制作 (37)5.2硬件测试 (37)4.3软件调试 (37)5.4测试结果分析与结论 (38)5.4.1 数码管测试结果分析 (38)5.4.2按键测试结论 (38)5.4.3测试结论 (39)结论 (40)参考文献 (42)1论述1.1课题背景及意义二十一世纪的今天,电子时钟已经融入到千千万万户家庭中,它已经成为了人们生活中不可或缺的一部分。
电子时钟通过数码管显示,使其直观明了,更能实现整点报时,遥控控制等功能,使其更符合当今人们的生活需求,电子时钟的出现使人们的生活更加的有条不紊。
目前市场上的电子时钟很多,为了迎合市场的需要,满足广大的消费人群,人们通过自己的DIY设计让电子时钟富有创意。
电子时钟通过不断地改进,使其更具有市场。
本次设计的电子时钟利用单片机STC89C52进行控制的,利用单片机自身的定时器功能,外加遥控器进行控制,采用数码管显示,可对电子时钟进行调整校准。
电子时钟既可广泛应用于家庭,也可应用于银行、邮电、宾馆、医院、学校、企业、商店等相关行业的大厅,以及单位会议室、门卫等场所。
因而,此设计具有相当重要的现实意义和实用价值。
1.2课题容本次设计的题目是:基于51单片机的电子时钟设计与制作。
利用单片机的计时、校时等功能,设计并制作出一个以单片机STC89C52为核心组件,采用数码管显示“时“分“秒”的电子时钟,要求能正常显示,并可用按键进行调整校准以及用遥控器进行相同操作。
此次设计与传统的机械表相比,它具有走的更精准,显示更直观等特点,同时具有不同的操作方式,让此次设计更符合现代生活的需求,而且单片机的数字时钟具有编程灵活,便于功能扩充等特点。
本次设计可分为两部分:软件部分、硬件部分。
硬件部分包括: STC89C52单片机模块,数码管模块,蜂鸣器模块,按键模块,闹铃模块。
通过正确连接电路以及单片机的编程来实现上述要求。
软件部分的主程序包括:数码管显示程序,按键控制程序,遥控器操作程序。
使其实现时分秒正常显示,并可通过按键以及遥控器进行调试功能。
2方案论证2.1功能要求1、能显示时、分、秒2、通过按键可以对电子时钟进行调整校准3、通过遥控器可对电子时钟进行调整校准4、可实现设定闹钟并报警功能5、上电后,电子钟显示“14-00-00”,蜂鸣器同时发出声音2.2数字时钟方案论证与比较在本次设计中,数字时钟是最主要的部分,根据此次设计的需要,可利用两种方案实现。
方案一:采用时钟芯片DS12887A进行控制时,由于该芯片具有完备的时钟闹钟功能,所以可以直接用它来进行显示或设置,这样可以让软件的编程相对简单。
而且为了保证时钟在电网电压不足或突然断电的情况下仍能正常工作,芯片部本身就包含锂电池,当电网电压不足或者突然掉电的时候,系统会自动转换到部锂电池供电系统,而且即使系统不上电,程序不执行时,锂电池也能保证芯片的正常运行,以备随时提供正确的时间。
方案二:采用单片机本身的定时器进行计时,来实现数字时钟功能。
原理为:在单片机部存储器设三个字节分别存放时钟的时、分、秒信息。
利用定时器与软件结合实现1秒定时中断,每产生一次中断,存储器相应的秒值加1;若秒值达到60,则将其清零,并将相应的分字节值加1;若分值达到60,则清零分字节,并将时字节值加1;若时值达到24,则将十字节清零。
该方案具有硬件电路简单的特点。
但由于每次执行程序时,定时器都要重新赋初值,所以该时钟精度不高。
而且,由于是软件实现,当单片机不上电,程序不执行时,时钟将不工作。
基于硬件电路的考虑,本设计采用方案二完成数字时钟的功能。
2.3数码管显示方案论证与比较方案一:采用静态显示。
所谓静态显示,就是当显示器显示某一字符时,相应的发光二极管恒定的导通或截止。
该方式每一位都需要一个8位输出口控制。
静态显示时较小的电流能获得较高的亮度,且字符不闪烁。
但当所显示的位数较多时,静态显示所需的I/O口太多,造成了资源的浪费。
方案二:采用动态显示。
所谓动态显示就是一位一位的轮流点亮各个位,对于显示器的每一位来说,每隔一段时间点亮一次。
利用人的视觉暂留功能可以看到整个显示,但必须保证扫描速度足够快,字符才不闪烁。
显示器的亮度既与导通电流有关,也于点亮时间与间隔时间的比例有关。
调整参数可以实现较高稳定度的显示。
动态显示节省了I/O口,降低了能耗。
从节省I/O口和降低能耗出发,本设计采用方案二。
综上所诉:我们采用单片机完成数字时钟的功能,采用数码管的动态显示来完成显示部分。
3.电子时钟的硬件设计3.1 电子时钟的组成本次设计制作的电子时钟组成部分为:STC89C52主控制模块,按键模块,复位电路,数码管显示模块,闹铃模块。
组成图如图3-1所示图3-1 电子时钟系统组成3.2 单片机最小系统图单片机最小系统又称为最小应用系统,即用最少的元器件组成单片机可以工作的系统。
一般应包括:电源、单片机、晶振电路、复位电路等。
如图3-2所示为单片机最小系统图。
图 3-2 单片机最小系统图3.3 STC89C52引脚功能图3-3 STC89C52引脚如图3-3所示,STC89C52主要管脚有:XTAL1(19 脚)和XTAL2(18 脚)为振荡器输入输出端口,外接12MHz 晶振。
RST/Vpd(9 脚)为复位输入端口,外接电阻电容组成的复位电路。
VCC(40 脚)和VSS(20 脚)为供电端口,分别接+5V电源的正负端。
P0~P3 为可编程通用I/O 脚,其功能用途由软件定义,在本设计中,P0 端口(32~39 脚)被定义为功能控制端口,分别与其相应功能管脚相连接,13 脚定义为IR输入端。
3.4 数码管显示模块图3-4 数码管显示模块如图3-4所示,在这次的设计中,数码管接在单片机的P0和P2口,P0控制段选信号,P2控制位选信号。
通过位选信号依次点亮各个数码管,由于人眼有视觉暂留的特性,因此如果第一个数码管灭和第二个数码管亮之间的时间足够短,人眼是感觉不出数码管的变化的。
3.5 闹铃部分闹铃如下图3-5所示,主要由8550三极管和蜂鸣器构成,可通过手动设置来实现闹铃功能。
图3-5 闹铃图3.6 按键模块如图3-6所示,本次设计是采用四个独立式按键,分别为“时间设置”键,“闹钟设置”键,“+”键,“-”键,,通过这四个按键来调整电子时钟的时间显示和闹钟响应。
“时间设置”“闹钟设置“+”“—”图3-6按键图4电子时钟的软件设计本次设计主要是对单片机,数码管,红外遥控器,按键和闹铃部分进行编写的。
4.1电子时钟程序流程框图图4-1 系统程序流程框图本次的设计主程序是根据每个模块的特性来进行编写,先对各个模块进行初始化,然后再按照各自不同来分模块编写,最后得出总的流程图。
进入程序后,先将单片机,数码管,按键等进行初始化,数码管显示固定数值“14-00-00”,程序开始等待按键按下,当有按键按下,单片机检测一次,确定按下,单片机调用程序,同时数码管刷新一次,显示当前操作结果。
完后,程序返回按键等待,如此循环执行4.2按键调整流程图图4-2 按键调整流程图4.4子程序的设计4.4.1数码管显示模块4位独立数码管显示,电路相对简单,主要特点,简单易用,显示清晰,性价比高。
数码管显示程序:void display(void){P0=led[hour/10]; //p0口送数据拆数显示P2=0xFE; //片选delay(); //延时P2=0xFF; //片选关P0=led[hour%10];P2=0xFD;delay();P2=0xFF;P0=0x40;P2=0xFB;delay();P2=0xFF;P0=led[minit/10];P2=0xF7;delay();P2=0xFF;P0=led[minit%10];P2=0xEF;delay();P2=0xFF;P0=0x40;P2=0xDF;delay();P2=0xFF;P0=led[second/10];P2=0xBF;delay();P2=0xFF;P0=led[second%10];P2=0x7F;delay();P2=0xFF;}4.4.2按键子模块本次设计是采用四个独立式按键,分别为“设置”键,“+”键,“-”键,“复位”键,通过这四个按键来调整电子时钟的时间显示和闹钟响应。
按键操作子程序:void Keykonzhi(){if(time==0) //键盘时间设定键按下{delay();delay();if(time==0){while(!time);timenum1++; //标记++TR1=0;f2=0;}}if(timenum1==1) //如果timenum1==1 调时{dsflg=0;st=0;if(add==0) //加键按下{delay();delay();if(add==0){while(!add); //松手检测hour++; //小时++ }}if(dec==0) //减键按下{delay();delay();if(dec==0){while(!dec); //松手检测hour--; //小时-- }}if(hour>23) //限位{hour=0;}P0=led[hour/10];//显示小时函数P2=0xFE;delay();P2=0xFF;P0=led[hour%10]; //显示小时函数P2=0xFD;delay();P2=0xFF;}if(timenum1==2) ////如果timenum1==2 调分 //以下也是和调时一样的方法{dsflg=0;st=0;if(add==0){delay();delay();if(add==0){while(!add);minit++;}}if(dec==0){delay();delay();if(dec==0){while(!dec);minit--;}}if(minit>60){minit=0;}P0=led[minit/10];P2=0xF7;delay();P2=0xFF;P0=led[minit%10];P2=0xEF;delay();P2=0xFF;}if(timenum1==3) ////如果timenum1==3 调秒{dsflg=0;st=0;if(add==0){delay();delay();if(add==0){while(!add);second++;}}if(dec==0){delay();delay();if(dec==0){while(!dec);second--;}}if(second>60){second=0;}P0=led[second/10];P2=0xBF;delay();P2=0xFF;P0=led[second%10];P2=0x7F;delay();P2=0xFF;}if(timenum1==4) ////如果timenum1==4 退出{TR1=1;timenum1=0;dsflg=1;f2=1;st=1;}}void almset(){timenum1=0;if(timer==0) //键盘上的闹钟键按下{delay();delay();if(timer==0){while(!timer); //松手timenum2++; //标记++f1=0;}}if(timenum2==1) //如果timenum2=1设定脑钟的小时{dsflg=0;st=0;if(add==0) //加键按下{delay();delay();if(add==0){while(!add);//松手hour1++; //小时++}}if(dec==0) //减键按下{delay();delay();if(dec==0){while(!dec);//松手hour1--; //小时-- }}if(hour1>23) //限位{hour1=0;}P0=led[hour1/10];//小时显示P2=0xFE;delay();P2=0xFF;P0=led[hour1%10];P2=0xFD;delay();P2=0xFF;P0=0x77; //显示一P2=0xBF;delay();P2=0xFF; //显示一P0=0x38;P2=0x7F;delay();P2=0xFF;}if(timenum2==2) //如果timenum2=1设定脑钟的分钟和上面小时一样{dsflg=0;st=0;if(add==0){delay();delay();if(add==0){while(!add);minit1++;}}if(dec==0){delay();delay();if(dec==0){while(!dec);minit1--;}}if(minit1>60){minit1=0;}P0=led[minit1/10]; P2=0xF7;delay();P2=0xFF;P0=led[minit1%10];P2=0xEF;delay();P2=0xFF;P0=0x77;P2=0xBF;delay();P2=0xFF;P0=0x38;P2=0x7F;delay();P2=0xFF;}if(timenum2==3) //如果timenum2=3退出{timenum2=0;dsflg=1;f1=1;st=1;}}当用手按下一个键时,如图3-4所示,往往按键在闭合位置和断开位置之间跳几下才稳定到闭合状态的情况;在释放一个键时,也回会出现类似的情况。