单片机智能电子钟设计模板
- 格式:doc
- 大小:527.85 KB
- 文档页数:17
单片机电子闹钟程序(亲自编写-可用)————————————————————————————————作者:————————————————————————————————日期:学校电子钟,有闹钟功能,按键可调时间,可调打铃时间,打铃时间长短显示,每个模块有功能注释。
其中正常时间显示和闹钟时间显示可用一个开关来调整。
芯片选择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();}}电路图:分四部分显示:如果在学习这个程序过程中有什么问题,可以发邮件到询问。
(2023)单片机电子时钟课程设计报告2(一)(2023)单片机电子时钟课程设计报告2项目简介本项目是一款基于单片机的电子时钟,具有时间显示、闹钟、定时等功能。
主要硬件为STC89C52单片机和LCD12864液晶显示屏。
硬件设计•CPU:STC89C52单片机•显示屏:LCD12864液晶显示屏•晶振:11.0592MHZ•动态RAM:24C02 EEPROM•按键:4个,分别为模式切换、时间调整、闹钟调整、确定键•电源:220V AC/9V DC电源适配器软件设计主要功能模块•时间显示:采用DS1302时钟芯片定时,单片机通过SPI通讯读取当前时间,并在液晶屏上显示。
•闹钟:通过按键调整,设置闹钟时间,并在设定时间响铃。
•定时:通过按键调整,设置定时时间,在设定时间完成特定操作(如开关灯、控制电器等)。
软件工具•Keil uVision5:C语言编程软件•Proteus 8:电路仿真软件实现效果经过测试,本项目能够准确地显示时间,并能够响应用户的设定,完成指定的功能要求。
同时,通过调整代码和电路连接方式,还可以实现更多功能的扩展,如调整亮度、自定义显示内容等。
总结本项目完成了基于单片机的电子时钟设计,实现了时间显示、闹钟、定时等功能,并且实现效果稳定可靠。
在项目中,我们不仅掌握了单片机的基本原理和编程技能,还提高了对电路设计和仿真的操作能力,是一次非常有益的学习和实践。
改进方向在项目完善过程中,可以考虑以下方向进行改进:•加入天气显示功能,通过网络或传感器获取当地天气信息,与时间一起显示。
•优化UI界面,考虑加入图像、背光等元素,提升用户体验。
•采用更高性能的单片机,提升系统稳定性和响应速度。
总体评价本项目难度适中,能够较全面地考察学生在单片机原理、编程能力和电路设计等方面的知识掌握程度,是一次有益的实践。
同时,项目具有一定的功能性和实用性,能够满足用户的基本需求。
因此,本项目是一次成功的课程设计。
基于单片机电子时钟的设计一、设计背景随着科技的不断进步,电子设备在我们的生活中扮演着越来越重要的角色。
时钟作为时间的测量工具,也从传统的机械时钟逐渐发展为电子时钟。
单片机作为一种集成度高、功能强大的微控制器,为电子时钟的设计提供了高效、可靠的解决方案。
基于单片机的电子时钟具有精度高、易于编程、成本低等优点,能够满足人们对时间测量和显示的各种需求。
二、系统设计方案1、硬件设计单片机选择:选择合适的单片机是整个系统设计的关键。
常见的单片机如STM32、AT89C51 等,具有不同的性能和特点。
根据系统需求,我们选择了 AT89C51 单片机,其具有成本低、性能稳定等优点。
时钟芯片:为了保证时间的准确性,需要选择高精度的时钟芯片。
DS1302 是一款常用的实时时钟芯片,具有低功耗、高精度等特点,能够为系统提供准确的时间信息。
显示模块:显示模块用于显示时间。
常见的显示模块有液晶显示屏(LCD)和数码管。
考虑到显示效果和成本,我们选择了 1602 液晶显示屏,能够清晰地显示时间、日期等信息。
按键模块:按键模块用于设置时间和调整功能。
通过按键可以实现时间的校准、闹钟的设置等功能。
电源模块:为整个系统提供稳定的电源。
可以选择电池供电或外部电源供电,根据实际使用场景进行选择。
2、软件设计编程语言:选择合适的编程语言进行软件编程。
C 语言是单片机编程中常用的语言,具有语法简单、可读性强等优点。
主程序流程:主程序首先进行系统初始化,包括单片机端口初始化、时钟芯片初始化、显示模块初始化等。
然后读取时钟芯片中的时间信息,并将其显示在液晶显示屏上。
通过按键检测模块,判断是否有按键操作,如果有,则进行相应的处理,如时间校准、闹钟设置等。
中断服务程序:为了保证时间的准确性,需要使用定时器中断来实现时钟的计时功能。
在中断服务程序中,对时钟芯片进行时间更新,确保时间的准确性。
三、硬件电路设计1、单片机最小系统单片机:AT89C51 单片机是整个系统的核心,负责控制和协调各个模块的工作。
基于51单片机的简易电子钟设计一、设计目的现代社会对于时间的要求越来越精确,电子钟成为家庭和办公场所不可缺少的设备之一、本设计基于51单片机,旨在实现一个简易的电子钟,可以显示当前的时间,并且能够通过按键进行时间的调整和设置闹钟。
二、设计原理本设计主要涉及到51单片机的IO口、定时器、中断、LCD显示技术等方面知识。
1.时钟模块时钟模块采用定时器0的中断进行时间的累加和更新。
以1秒为一个时间单位,每当定时器0中断发生,就将时间加1,并判断是否需要更新小时、分钟和秒的显示。
同时,根据用户按键的操作,可以调整时间的设定。
2.显示模块显示模块采用16x2字符LCD显示屏,通过51单片机的IO口与LCD连接。
可以显示当前时间和设置的闹钟时间。
初次上电或者重置后,LCD显示时间为00:00:00,通过定时器中断和键盘操作,实现时间的更新和设定闹钟功能。
3.键盘模块键盘模块采用矩阵键盘连接到51单片机的IO口上,用于用户进行时间的调整和设置闹钟。
通过查询键盘的按键状态,根据按键的不同操作,实现时间的调整和闹钟设定功能。
4.中断模块中断模块采用定时器0的中断,用于1秒的定时更新时间。
同时可以添加外部中断用于响应用户按键操作。
三、主要功能和实现步骤1.系统初始化。
2.设置定时器,每1秒产生一次中断。
3.初始化LCD显示屏,显示初始时间00:00:00。
4.查询键盘状态,判断是否有按键按下。
5.如果按键被按下,根据不同按键的功能进行相应的操作:-功能键:设置、调整、确认。
-数字键:根据键入的数字进行时间的调整和闹钟设定。
6.根据定时器的中断,更新时间的显示。
7.判断当前时间是否与闹钟设定时间相同,如果相同,则触发闹钟,进行提示。
8.循环执行步骤4-7,实现连续的时间显示和按键操作。
四、系统总结和改进使用51单片机设计的简易电子钟可以显示当前时间,并且实现时间的调整和闹钟设定功能。
但是由于硬件资源有限,只能实现基本的功能,不能进行其他高级功能的扩展,例如闹铃的音乐播放、温度、湿度的显示等。
摘要本设计是定时闹钟的设计,由单片机AT89C51芯片和LED数码管为核心,辅以必要的电路,构成的一个单片机电子定时闹钟。
电子钟设计可采用数字电路实现,也可以采用单片机来完成。
数字电子钟是用数字集成电路构成的,用数码管显示“时”,“分”,“秒”的现代计时装置。
若用数字电路完成,所设计的电路相当复杂,大概需要十几片数字集成块,其功能也主要依赖于数字电路的各功能模块的组合来实现,焊接的过程比较复杂,成本也非常高。
若用单片机来设计制作完成,由于其功能的实现主要通过软件编程来完成,那么就降低了硬件电路的复杂性,而且其成本也有所降低,所以在该设计中采用单片机利用AT89C51,它是低功耗、高性能的CMOS型8位单片机。
片内带有4KB的Flash存储器,且允许在系统内改写或用编程器编程。
另外, AT89C51的指令系统和引脚与8051完全兼容,片内有128B 的RAM、32条I/O口线、2个16位定时计数器、5个中断源、一个全双工串行口等。
AT89C51单片机结合七段显示器设计的简易定时闹铃时钟,可以设置现在的时间及显示闹铃设置时间,若时间到则发出一阵声响,进—步可以扩充控制电器的启停。
设计内容包括了秒信号发生器、时间显示电路、按键电路、供电电源以及闹铃指示电路等几部分的设计。
采用四个开关来控制定时闹钟的工作状态,分别为:K1、设置时间和闹钟的小时;K2、设置小时以及设置闹钟的开关;K3、设置分钟和闹钟的分钟;K4、设置完成退出。
课设准备中我根据具体的要求,查找资料,然后按要求根据已学过的时钟程序编写定时闹钟的程序,依据程序利用proteus软件进行了仿真试验,对出现的问题进行分析和反复修改源程序,最终得到正确并符合要求的结果。
设计完成的定时闹钟达到课程设计的要求,在到达定时的时间便立即发出蜂鸣声音,持续一分钟。
显示采用的六位数码管电路,如果亮度感觉不够,可以通过提升电阻来调节,控制程序中延迟时间的长短,可以获得不同的效果。
[基于单片机的智能电钟]专业:[请 输 入 专 业] 班级:[请 输 入 班 级]学生姓名:[请 输 入 姓 名]指导教师:[请输入指导教师]完成时间:2022年4月27日目录1、设计内容及要求 (2)1.1、设计内容 (2)1.2、设计要求 (2)1.3、撰写设计报告 (2)2、总体方案设计 (2)2.1、方案图.................................. . (2)2.2、面板布置图..................... . (2)2.3、方案讨论.......................................... (3)2.4、明晰任务.................. ...................... .. (4)3、电路原理图................... .. (4)4、程序框图........................ (5)4.1、显示子程序流程图............... (5)4.2、实时时钟芯片1302读/写数据流程图 (6)5、编程序 (6)6、调试 (6)6.1、软件调试....................... .. . (6)6.2、仿真调试........................ ............ (7)7、自我感想.................. .. (7)8、参考书目......................... . (8)附录:C语言编程源程序.................... .. (8)1.设计内容及要求1. 1、设计内容:以AT89C51单片机为核心,制作一个LCD显示的智能电子钟。
1.2、设计要求:(1) 计时:秒、分、时、天、周、月、年。
(2) 闰年自动判别。
(3) 时间、月、日交替显示。
(5) 自定任意时刻自动开/关屏。
(6) 计时精度:误差≤1秒/月(具有微调设置)。
单片机课程设计题目: 智能电子钟学生姓名专业班级指导教师成绩工程技术学院2016 年 3 月目录一、系统设计内容 0设计要求: 0可实现的具体功能: 0二、总体设计 (1)DS1302简介 (1)LCDl602简介 (2)AT89C51单片机简介 (2)三、硬件设计 (2)原理图 (3)PCB板丝印层 (3)PCB板底层 (3)四、软件设计流程 (3)总体设计 (3)主程序流程图 (4)显示流程图 (4)DS1302读取流程 (5)外部中断0流程 (5)外部中断1流程 (6)五、仿真效果图 (8)六、总结与体会 (10)附录 (11)1、程序 (11)2、参考文献 (12)智能电子钟(LCD显示)一、系统设计内容设计要求:以AT89C51单片机为核心,制作一个LCD显示的智能电子钟:(1)计时:秒、分、时、天、周、月、年;(2)闰年自动判别;(4)时间、月、日交替显示;(5)自定任意时刻自动开/关屏;(6)计时精度:误差≤1秒/月(具有微调设置);(7)键盘采用动态扫描方式查询。
所有的查询、设置功能均由功能键K1、K2完成。
本设计采用市场上流行的时钟芯片DS1302进行制作。
可实现的具体功能:智能电子钟的原理主要由4部分组成:(1)单片机的外围设备,即单片机最小系统,此部分是保证单片机正常工作的必要部分;(2)显示部分:LCD显示,即显示年、月、星期、日、时、分、秒等;(3)时钟芯片DS1302,DS1302是DALLAS公式推出的涓流充电时钟芯片,内含一个实时时钟/日历和31字节静态RAM,可以通过串行接口与计算机进行通信,使得管脚数量减少。
实时时钟/日历电路能够计算2100年之前的秒、分、时、日、星期、月、年的,具有闰年调整的能力;(4)按键部分:按键实现开关显示屏对时钟时间的微调,开关键在正常显示模式下按下开火关LCD显示;模式键:可切换到时间调整界面,再按一次退出,此时开关屏键实现对秒的加一操作。
基于单片机的简易电子时钟设计引言:电子时钟是人们日常生活中广泛应用的一种设备,基于单片机的电子时钟可以实现精确的时间显示、闹钟设置、定时功能等。
本设计将使用单片机控制电子时钟的各种功能,通过一个LCD显示屏来显示时间和其他信息。
一、设计目标:1.实现准确显示时间功能;2.设计带有闹钟设置的功能;3.实现定时功能。
二、设计原理:该电子时钟工作原理主要是通过单片机将外部的时钟信号进行调整和处理,然后控制液晶显示屏显示时间。
电子时钟的核心是单片机,通过单片机的计时功能实现时钟的准确显示,并通过输入设备设置闹钟功能和定时功能。
三、设计流程:1.系统初始化:首先,将单片机初始化,设置时钟和计时器的相关参数,开启显示屏的显示功能。
2.时间显示功能:通过计时器中断,定时更新时间,并将时间值传递给液晶显示屏显示出来。
3.闹钟设置功能:通过按键输入设置闹钟时间,将设置好的闹钟时间存储到单片机中。
4.定时功能:通过按键输入设置定时时间,将设置好的定时时间存储到单片机中,当定时时间到达时,触发相应的动作,如报警等。
四、硬件设计:1.单片机选择:选用一款适合的单片机,如51系列单片机。
2.时钟电路:通过外部晶振或者RTC芯片来提供准确的时钟信号。
3.输入设备:使用按键作为输入设备,用于设置闹钟和定时功能;4.显示屏:选用合适的液晶显示屏,用于显示时间。
五、软件设计:1.系统初始化:设置时钟和计时器的相关参数,开启显示屏的显示功能。
2.时间显示功能:通过计时器中断,定时更新时间,并将时间值传递给液晶显示屏显示出来。
3.闹钟设置功能:通过按键输入设置闹钟时间,将设置好的闹钟时间存储到单片机中。
4.定时功能:通过按键输入设置定时时间,将设置好的定时时间存储到单片机中,当定时时间到达时,触发相应的动作,如报警等。
六、实验结果:本设计可以准确显示时间,并可以设置闹钟和定时功能。
当闹钟和定时时间到达时,会触发相应的动作,实现了基本要求。
《单片机技术》课程设计说明书数字电子钟系、部:电气与信息工程学院学生姓名:指导教师:职称专业:班级:完成时间:2013-06-07摘要电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们的欢迎。
所以设计一个简易数字电子钟很有必要。
本电子钟采用ATMEL公司的AT89S52单片机为核心,使用12MHz 晶振与单片机AT89S52 相连接,通过软件编程的方法实现以24小时为一个周期,同时8位7段LED数码管(两个四位一体数码管)显示小时、分钟和秒的要求,并在计时过程中具有定时功能,当时间到达提前定好的时间进行蜂鸣报时。
该电子钟设有四个按键KEY1、KEY2、KEY3、KEY4和KEU5键,进行相应的操作就可实现校时、定时、复位功能。
具有时间显示、整点报时、校正等功能。
走时准确、显示直观、运行稳定等优点。
具有极高的推广应用价值。
关键词电子钟;AT89S52;硬件设计;软件设计ABSTRACTClock is widely used in life, and a simple digital clock is more welcomed by people. So to design a simple digital electronic clock is necessary.The system use a single chip AT89S52 of ATMEL’s as its core to control The crystal oscillator clock,using of E-12MHZ is connected with the microcontroller AT89S52, through the software programming method to achieve a 24-hour cycle, and eight 7-segment LED digital tube (two four in one digital tube) displays hours, minutes and seconds requirements, and in the time course of a timing function, when the time arrived ahead of scheduled time to buzz a good timekeeping. The clock has four buttons KEY1, KEY2, KEY3,KEY4 and KEY5 key, and make the appropriate action can be achieved when the school, timing, reset. With a time display, alarm clock settings, timer function, corrective action. Accurate travel time, display and intuitive, precision, stability, and so on. With a high application value.Key words Electronic clock;;AT89S52;Hardware Design;Software Design目录1设计课题任务、功能要求说明及方案介绍 (1)1.1设计课题任务 (1)1.2功能要求说明 (1)1.3设计总体方案介绍及原理说明 (1)2设计课题硬件系统的设计 (2)2.1设计课题硬件系统各模块功能简要介绍 (2)2.2设计课题电路原理图、PCB图、元器件布局图 (2)2.3设计课题元器件清单 (5)3设计课题软件系统的设计 (6)3.1设计课题使用单片机资源的情况 (6)3.2设计课题软件系统各模块功能简要介绍 (6)3.3设计课题软件系统程序流程框图 (6)3.4设计课题软件系统程序清单 (10)4设计结论、仿真结果、误差分析、教学建议 (21)4.1设计课题的设计结论及使用说明 (21)4.2设计课题的仿真结果 (21)4.3设计课题的误差分析 (22)4.4设计体会 (22)4.5教学建议 (22)结束语 (23)参考文献 (24)致谢 (25)附录 (26)1 设计课题任务、功能要求说明及方案介绍1.1 设计课题任务设计一个具有特定功能的电子钟。
烟台大学光电学院单片机课程设计实验报告课设名称:电子时钟姓名:学号:指导教师:目录一、设计任务与要求 (4)1.1 设计背景 (4)1.2 课程设计目的 (4)1.3 设计要求 (4)二、总体方案设计 (5)2.1 电路的总体原理框图 (5)2.2 实现时钟计时的基本方法 (6)2.3 电子钟的时间显示 (6)2.4 电子钟的时间调整 (6)2.5 总体方案介绍 (7)2.5.1 计时方案 (7)2.5.2 控制方案 (7)2.6元件清单 (7)三、数字钟的硬件设计 (8)3.1 最小系统 (8)3.1.1 芯片分析 (8)3.1.2 晶振电路 (9)3.2 数码显示模块设计 (10)四、系统软件设计 (12)4.1 软件设计分析 (12)图 4-1 系统总体流程图 (13)4.2 源程序清单 (13)五、电路实物图 (19)见附录 (19)六、设计总结 (19)1、设计过程中遇到的问题及解决方法 (19)2、设计体会 (20)3、对设计的建议 (20)参考文献 (22)附录:实物图 23一、设计任务与要求1.1 设计背景随着科学技术的发展和电子技术产业结构调整,单片机开始迅速发展,由于家用电器逐渐普及,市场对于智能时钟控制系统的需求也越来越大。
单片机以其芯片集成度高、处理功能强、可靠性高等优点,成功应用于工业自动化、智能仪器仪表、家电产品等领域。
近些年,人们对数字钟的要求也越来越高,传统的时钟已不能满足人们的需求。
多功能数字钟不管在性能还是在样式上都发生了质的变化,有电子闹钟、数字闹钟等等。
单片机在多功能数字钟中的应用已是非常普遍的,人们对数字钟的功能及工作顺序都非常熟悉。
但是却很少知道它的内部结构以及工作原理。
由单片机作为数字钟的核心控制器,可以通过它的时钟信号进行计时实现计时功能,将其时间数据经单片机输出,利用显示器显示出来。
通过键盘可以进行定时、校时功能。
输出设备显示器可以用液晶显示技术和数码管显示技术。
电子时钟是一种非常广泛日常计时工具,给人们的带来了很大的方便,在社会上越来越流行。
它可以对年、月、日、时、分、秒进行计时,采用直观的数字显示,可以同时显示年月日时分秒和温度等信息,还有时间校准等功能。
该电子时钟主要采用STC89C52单片机作为主控核心,用DS1302时钟芯片作为时钟、液晶12864显示屏显示。
STC89C52单片机是由深圳宏晶科技公司推出的,功耗小,电压可选用4~6V电压供电;DS1302时钟芯片是美国DALLAS公司推出的具有细电流充电功能的低功耗实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小;数字显示是采用的12864液晶显示屏来显示,可以同时显示年、月、日、星期、时、分、秒和温度等信息。
此外,该电子时钟还具有时间校准等功能。
关键词:单片机STC89C52 时钟芯片DS1302 液晶12864 温度基于单片机STC数字式时钟的设计一、绪论随着人们生活水平的提高和生活节奏的加快,对时间的要求越来越高,精准数字计时的消费需求也是越来越多。
二十一世纪的今天,最具代表性的计时产品就是电子万年历,它是近代世界钟表业界的第三次革命。
第一次是摆和摆轮游丝的发明,相对稳定的机械振荡频率源使钟表的走时差从分级缩小到秒级,代表性的产品就是带有摆或摆轮游丝的机械钟或表。
第二次革命是石英晶体振荡器的应用,发明了走时精度更高的石英电子钟表,使钟表的走时和月差从分级缩小到秒级。
第三次革命就是单片机数码计时技术的应用(电子万年历),使计时产品的走时日差从分级缩小到1/600万秒,从原有传统指针计时的方式发展为人们日常更为熟悉的夜光数字显示方式,直观明了,并增加了全自动日期、星期、温度以及其他日常附属信息的显示功能,它更符合消费者的生活需求!因此,电子万年历的出现带来了钟表计时业界跨跃性的进步。
我国生产的电子万年历有很多种,总体上来说以研究多功能电子万年历为主,使万年历除了原有的显示时间,日期等基本功能外,还具有闹铃,报警等功能。
AT89C51单片机电子时钟设计目录1 电子时钟 (4)1.1 电子时钟简介 (4)1.2 电子时钟的基本特点 (4)1.3 电子时钟的原理 (4)2 单片机识的相关知识 (4)2.1单片机简介 (4)2.2 单片机的特点 (5)2.3 AT89C51单片机介绍 (5)3 设计方案的选择 (7)3.1计时方案 (7)3.2 显示方案 (7)3.3 数码管显示工作原理 (8)3.4 键盘电路设计 (9)3.5 主控模块AT89C51 (9)4 系统软件设计 (9)附录 (12)摘要:单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注。
单片机体积小、重量轻、抗干扰能力强、环境要求不高、价格低廉、可靠性高、灵活性好、开发较为容易。
由于具有上述优点,单片机已广泛地应用在工业自动化控制、自动检测、智能仪器仪表、家用电器、电力电子、机电一体化设备等各个方面,而51单片机是各单片机中最为典型和最有代表性的一种。
这次设计通过对它的学习、应用,以AT89C51芯片为核心,辅以必要的电路,设计了一个简易的电子时钟,它由4.5V直流电源供电,通过数码管能够准确显示时间,调整时间,从而到达学习、设计、开发软、硬件的能力。
关键词:单片机;电子时钟;AT89C511 电子时钟1.1 电子时钟简介本设计采用AT89C51单片机,以汇编语言为程序设计的基础,设计一个用六位数码管显示时、分、秒的时钟。
现代的电子时钟是基于单片机的一种计时工具,采用延时程序产生一定的时间中断,用于一秒的定义,通过计数方式进行满六十秒分钟进一,满六十分小时进一,满二十四小时小时清零,从而达到计时的功能,是人民日常生活不可缺少的工具。
1.2 电子时钟的基本特点现在高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟、石英钟、石英表都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调试,数字式电子钟用集成电路计时时,译码代替机械式传动,用LED显示器代替指针显示进而显示时间,减小了计时误差,这种表具有时、分、秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。
中图分类号:基于单片机控制的电子时钟设计专业名称:应用电子技术学生姓名:王明宗导师姓名:王春霞职称:讲师焦作大学机电工程学院2012年 12 月中图分类号: 密级:UDC:单位代码:基于单片机控制的电子时钟设计Based on single-chip microcomputer control the design of the electronic clock焦作大学机电工程学院摘要现代生活的人们越来越重视起了时间观念,可以说是时间和金钱划上了等号。
对于那些对时间把握非常严格和准确的人或事来说,时间的不准确会带来非常大的麻烦,所以以数码管为显示器的时钟比指针式的时钟表现出了很大的优势.数码管显示的时间简单明了而且读数快、时间准确显示到秒。
所以数字电子钟的精度、稳定度远远超过老式机械钟。
而机械式的依赖于晶体震荡器,可能会导致误差.在这次设计中,我们采用LED数码管显示时、分、秒,以24小时计时方式,根据数码管动态显示原理来进行显示,以AT89S51芯片为核心,辅以必要的电路,设计了一个简易的电子时钟,它由4.5V直流电源供电,通过数码管能够准确显示时间,调整时间,并在数码管上显示相应的时间。
关键词:单片机 AT89S51 电子时钟ABSTRACTModern life people pay more and more attention to up the concept of time,can say time and money off the equal sign。
For those who grasp of time is very strict and accurate person or thing, it is not accurate time will bring very big trouble, so to digital tube for display clock than pointer clock showed a lot of advantages。
机械工艺学激光加工论文课程设计一、设计任务1) 计时:秒、分、时、天、周、月、年。
(2) 闰年自动判别。
(3) 五路定时输出,可任意关断(最大可到16路)。
(4) 时间、月、日交替显示。
(5) 自定任意时刻自动开/关屏。
(6) 计时精度:误差≤1秒/月(具有微调设置)。
(7) 键盘采用动态扫描方式查询。
所有的查询、设置功能均由功能键K1、K2完成。
二、方案与论证2.1 、多功能电子钟计时方案方案一:采用实时时钟芯片实时时钟芯片具备年、月、日、时、分、秒计时功能和多点定时功能,计时数据的更新每秒自动进行一次,不需程序干预。
计算机可通过中断或查询方式读取计时数据进行显示,因此计时功能的实现无需占用CPU的时间,程序简单。
此外,实时时钟芯片多数带有锂电池做后备电源,具备永不停止的计时功能;具有可编程方波输出功能,可用做实时测控系统的采样信号等;有的实时时钟芯片内部还带有非易失性RAM,可用来存放需长期保存但有时也需变更的数据。
由于功能完善,精度高,软件程序设计相对简单,且计时不占用CPU时间,因此,在工业实时测控系统中多采用这一类专用芯片来实现实时时钟功能。
方案二: 软件控制利用单片机内部的定时/计数器进行中断定时,配合软件延时实现时、分、秒的计时及秒表计时。
该方案节省硬件成本,且能使设计者对单片机的指令系统能有更深入的了解,从而掌握单片机应用技术MCS-51汇编语言程序设计方法,因此,本系统设计采用此种软件控制方法来实现计时。
而由于ATMEL公司的AT89S52单片机是低功耗的具有4KB在线可编程Flash存储器的单片机。
它与通用80C51系列单片机的指令系和引脚兼容。
片内的Flash可允许在线重新编程,也可使用通用非易失性存储器编程。
它将通用CPU和在线可编程Flash集成在一个芯片上,形成了功能强大、使用灵活和具有较高性能价格比的微控制器。
它的功能强大,而且也较容易购买,故本设计中所选的单片机为AT89S52单片机。
2.2 、多功能电子钟键盘显示方案方案一: 8279扩展。
该方案方框图如图1.2.1所示,8279是一种可编程的键盘/显示接口专用芯片,它含有键盘输入和显示输出两种功能,键扫描程序和动态显示程序全由8279硬件自动完成,此种方案能以比较简单的硬件电路和较少的软件开销实现单片机与键盘、LED显示器的接口。
方案二: 8155扩展,LED动态显示。
该方案方框图如图1.2.2所示,8155是一块可编程的接口芯片,与单片机的接口非常简单,它的键盘、显示共用一个接口电路,可节省I/O口。
但动态扫描方式需占用CPU较多的时间,在单片机没有太多实时测控任务的情况下可以采用。
方案三: 串口扩展,LED静态显示。
该方案方框图如图1.2.3所示,独立式键盘配置灵活,软件结构简单,按键较多时不宜采用。
静态显示占用口资源少,采用串口传输实现静态显示, LED数码管与单片机之间通过6个移位寄存器相连,显示亮度有保证,但此方案的硬件开销大,电路复杂,信息刷新速度慢,比较适用于并行口资源较少的场合。
方案四: 独立式按键,LED动态显示。
该方案方框图如图1.2.4所示,独立式按键直接与单片机I/O口相连构成键盘,每个按键不会相互影响,因本系统用到的按键比较少,采用独立式键盘不会浪费I/O口线,所以本系统采用独立式键盘。
动态显示的亮度虽然不如静态显示,但其硬件电路较简单,可节省硬件成本,虽然动态扫描需占用CPU较多的时间,但本系统中的单片机没有很多实时测控任务,因此,本系统采用此种方案。
三、系统硬件设计(一)系统总框图(二)原理图设计3.2、多功能电子钟电路原理图四、系统软件设计4.1、电源电路工作原理图图4.1所示为集成电源电路的原理图4.2、复位电路工作原理复位是单片机的初始化操作,其主要功能是把PC初始化为0000H,使单片机从0000H 单元开始执行程序,并使其它功能单元处于一个确定的初始状态。
本复位电路采用的是按键复位,它是通过复位端经电阻与VCC电源接通而实现的,它兼具上电复位功能。
因本系统的晶振的频率为12MHz,所以,复位信号持续时间应当超过2μS才能完成复位操作。
4.3、键盘工作原理图4.3所示为键盘原理图图4.3所示为键盘原理图,本系统采用的是独立式键盘结构,每个按键的工作不会影响其它I/O口线的状态。
软件是采用查询式结构,首先逐位查询每根I/O口线的输入状态,如某一根I/O口线输入为低电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序。
4.4、显示器工作原理图4.4所示为键盘原理图系统采用动态显示方式,动态显示通常都是采用动态扫描的方法进行显示,即循环点亮每一个数码管,这样虽然在任何时刻都只有一位数码管被点亮,但由于人眼存在视觉残留效应,只要每位数码管间隔时间足够短,就可以给人以同时显示的感觉。
由图4.4可知,要想让数码管那一段亮,在该数码管位控段为高电平的情况下给这段送低电平就可以了。
五、总结与展望课题设计是培养学生综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。
随着科学技术发展的日新月异,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在,作为二十一世纪的大学生来说掌握单片机的开发技术是十分重要的。
本次课题设计是利用AT89C51单片机设计的有实时显示、时间校准、定时闹钟和整点报时功能的电子时钟。
并详细说明了软件和硬件设计方法及硬件实现。
通过本次设计单片机原理及应用课题设计使我充分认识到了课题设计的重要性和必要性,本次设计使我对以学过的基础知识有了更深入的理解,学会了独立思考、独立工作以及对应用所学基本理论分析和解决实际问题的能力有了很大的提高。
在此次单片机课题设计之后,我不仅加深了对单片机理论的理解,将理论很好地应用到实践当中去,而且我们还学会了如何去创新精神和严谨的科学作风,从而不断地战胜自己,超越自己。
更正要的是,我在这一设计过程中,学会了坚持不懈,不轻易言弃。
当然,改电子时钟还有很多不足之处,比如闹钟只能定一个。
在今后的学习过程中,我们需要继续努力,锻炼自己。
六、参考文献1 李群芳单片微型计算机与接口技术(第三版):电子工业出版社,20082 刘强51单片机含Protel实验指导书:四川师范大学成都学院实验中心,20113 郭天祥新概念51单片机C语言教程电子工业出版社4 周广兴,张子红单片机原理及应用教程北京大学出版社5 浏览/forum-2-1.html,下载里面的相关资料附录一:系统总电路电路原理仿真图:附录二:源代码#include<reg51.H>#include<intrins.h>//----------------------------------------#define uint unsigned int#define uchar unsigned char//----------------------------------------/*uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf 8,0x80,0x98,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳极数码管代码*/uchar code xingqi[8]={0x00,0x07,0x01,0x02,0x03,0x04,0x05, 0x06}; //星期显示代码ucharmiao,shi,fen,date,month,day,year,year10,set,mun,s et_shi,set_fen,time_flag; //全局定义uint year_data,t;//---------------------------------------------sbit SCLK=P3^5; //DS1302通讯线定义sbit DIO=P3^6;sbit RST=P3^7;sbit speak=P0^0;sbit DS=P2^0; //595通讯线定义sbit SH_CP=P2^1;sbit ST_CP1=P2^2;sbit ST_CP2=P2^3;sbit ST_CP3=P2^4;sbit ST_CP4=P2^5;sbit ST_CP5=P2^6;sbit ST_CP6=P2^7;sbit ST_CP7=P3^0;sbit ST_CP8=P3^1;sbit OE1=P1^0;sbit OE2=P1^1;sbit OE3=P1^2;sbit OE4=P1^3;sbit OE5=P1^4;sbit OE6=P1^5;sbit OE7=P1^6;sbit OE8=P1^7;sbit K1=P3^2; //按键接口定义sbit K2=P3^3;sbit K3=P3^4;sbit K4=P0^1; sbit K5=P0^2;//-------------------------------------void write_595(uchar temp) //写74HC595一个字节{uchar temp_595,i;temp_595=temp;for(i=0;i<8;i++){SH_CP=0;_nop_();_nop_();_nop_();if(temp_595&0x80){DS=1;}else{DS=0;}_nop_();_nop_();_nop_();SH_CP=1;temp_595<<=1;}}//----------------------------------------------void delay(uint z) //Nms延时{uint x,y;for(x=z;x>0;x--)for(y=112;y>0;y--);}//---------------------------------------------void delaynus(uint z) //ums延时{uint x,y;for(x=z;x>0;x--)for(y=10;y>0;y--);}//-----------------------------------------------void write(uchar date) //写入DS1302一个字节{uchar temp,i;RST=1;SCLK=0;temp=date;for(i=0;i<8;i++){SCLK=0;if(temp&0x01)DIO=1;elseDIO=0;SCLK=1;temp>>=1;}}//-------------------------------------uchar read() //读出DS1302一个字节{uchar a,temp;RST=1;for(a=8;a>0;a--){temp>>=1;SCLK=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();SCLK=0;if(DIO){temp=temp|0x80;}else{temp=temp|0x00;}}return (temp);}//-----------------------------------void write_1302(uchar add,uchar dat) //写DS1302数据{RST=0;SCLK=0;RST=1;write(add);write(dat);SCLK=1;RST=0;}//------------------------------------------uchar read_1302(uchar add) //读DS1302数据{uchar temp;RST=0;SCLK=0;RST=1;write(add);temp=read();SCLK=1;RST=0;return(temp);}//--------------------------------------------void display() //显示子程序{miao=read_1302(0x81); //读秒fen=read_1302(0x83); //读分shi=read_1302(0x85)&0x3f;//读时date=read_1302(0x87); //读日month=read_1302(0x89); //读月year=read_1302(0x8d); //读年day=read_1302(0x8B); //读星期write_595(miao); //显示秒ST_CP1=0;ST_CP1=1;ST_CP1=0;delaynus(10);write_595(fen); //显示分ST_CP2=0;ST_CP2=1;ST_CP2=0;delaynus(10);write_595(shi); //显示时ST_CP3=0;ST_CP3=1;ST_CP3=0;delaynus(10);write_595(date); //显示日ST_CP4=0;ST_CP4=1;ST_CP4=0;delaynus(10);write_595(month); //显示月ST_CP5=0;ST_CP5=1;ST_CP5=0;delaynus(10);write_595(year); //显示年ST_CP6=0;ST_CP6=1;ST_CP6=0;delaynus(10);write_595(xingqi[day]); //显示星期ST_CP7=0;ST_CP7=1;ST_CP7=0;delaynus(10);}//------------------------------------------void ds1302_init() //1302初始化{RST=0;SCLK=0;/* write_1302(0x80,0x00);//设置初始值SEC write_1302(0x82,0x00);//设置初始值MINwrite_1302(0x84,0x00);//设置初始值HRwrite_1302(0x86,0x00);//设置初始值DA TEwrite_1302(0x88,0x00);//设置初始值MONTHwrite_1302(0x8A,0x00);//设置初始值DAY*/write_1302(0x8C,0x10);//设置初始值YEAR}//----------------------------------------------void PORT_INIT() //端口初始化{P0=0XFE;P1=0X00;P2=0X00;P3=0XFC;}void time_init() //定时器初始化{TMOD=0x11; //设置定时器0\1都为工作方式1TH0=(65536-50000)/256; //装入初值TL0=(65536-50000)%256;TH1=(65536-10000)/256; //装入初值TL1=(65536-10000)%256;PT0=1; //T0定时器优先级最高EA=1 ; //开总中断ET0=1; //开定时器0中断ET1=1; //开定时器1中断TR0=1; //启动定时器0TR1=1; //启动定时器1}//----------------------------------------------void main(void) //主程序{PORT_INIT();ds1302_init();time_init();year=read_1302(0x8d); //读年数据year_data=0x2000|year;write_595(year_data>>8); //显示2010年的20字样ST_CP8=0;ST_CP8=1;ST_CP8=0;set_shi=0x09; //闹钟初始值设定set_fen=0x39;time_flag=0; //标志位set=0;while(1){switch(set){case 0: //设置秒{display(); //显示子程序if((shi==set_shi)&&(fen==set_fen)&&(time_flag= =0)) //闹钟设定只设定小时和分钟{speak=~speak;if((K2==0)&&(time_flag==0)) //按键K2停止闹钟响{P0&=0XFE;time_flag=1;}delay(10);}} break;}if(fen==set_fen+1) //当不按下闹钟停止按键,一分钟后自动停止闹钟{P0&=0XFE;time_flag=0;}}}//----------------------------------------void time0() interrupt 1 // 定时器0中断{TR0=0;TH0=(65536-50000)/256;TL0=(65536-50000)%256;mun++;if(mun==15){mun=0;switch(set){case 1: //设置秒闪烁{OE1=1;delay(300);OE1=0;} break;case 2: //设置分闪烁{OE2=1;delay(300);OE2=0;} break;case 3: //设置时闪烁{OE3=1;delay(300);OE3=0;} break;case 4: //设置日闪烁{OE4=1;delay(300);OE4=0;} break;case 5: //设置月闪烁{OE5=1;delay(300);OE5=0;} break;case 6: //设置年闪烁{OE6=1;OE8=1;delay(300);OE6=0;OE8=0;} break;case 7: //设置星期闪烁{OE7=1;delay(200);OE7=0;} break;case 8: //设置闹钟闪烁{OE2=1;OE3=1;delay(200);OE2=0;OE3=0;} break;}}TR0=1;}//-------------------------------------------void time1() interrupt 3 // 定时器1中断{TR1=0; //先关定时器TH1=(65536-20000)/256;TL1=(65536-20000)%256;//---------------------------------if(K1==0){delay(10);if(K1==0){set++;if(set==9){set=0;write_1302(0x80,miao);//设置初始值SECwrite_1302(0x82,fen); //设置初始值MIN write_1302(0x84,shi); //设置初始值HR write_1302(0x86,date); //设置初始值DA TE write_1302(0x88,month); //设置初始值MONTHwrite_1302(0x8A,day); //设置初始值DAY write_1302(0x8C,year_data); //设置初始值YEAR}t=50000;while((!K1)&&t){t--;}}}//---------------------------------------if(K2==0){delay(10);if(K2==0){switch(set){case 1:{miao++;if((miao&0x0f)>0x09){miao+=0x10;miao&=0xf0;}if(miao==0x60){miao=0x00;}write_595(miao);ST_CP1=0;ST_CP1=1;ST_CP1=0;} break;case 2:{fen++;if((fen&0x0f)>0x09){fen+=0x10;fen&=0xf0;}if(fen==0x60){fen=0x00;}ST_CP2=0;ST_CP2=1;ST_CP2=0;} break;case 3:{if((read_1302(0x85)&0x80)==0x00){shi++;if((shi&0x0f)>0x09){shi+=0x10;shi&=0xf0;}if(shi==0x24) //24小时制{ shi=0x00;}}else{shi=(shi|0x80)+1;if((shi&0x0f)>0x09){shi+=0x10;shi&=0xf0;}if(shi==0x12) //12小时制{shi=0X80;}}write_595(shi); //显示时ST_CP3=0;ST_CP3=1;ST_CP3=0;} break;case 4:{date++;if((date&0x0f)>0x09){date+=0x10;date&=0xf0;}if((date==0x32)&&((month==0x01)||(month= =0x03)||(month==0x05)||(month==0x07)||(month= =0x08)||(month==0x10)||(month==0x12))){date=0x01;}elseif((date==0x31)&&((month==0x04)||(month==0x0 6)||(month==0x09)||(month==0x11))){date=0x01;}elseif((date==0x29)&&(month==0x02)&&((year_data |read_1302(0x8d))%100!=0)&&((year_data|read_1 302(0x8d))%400!=0)){date=0x01;}elseif((date==0x30)&&(month==0x02)&&((year_data |read_1302(0x8d))%100==0)&&((year_data|read_ 1302(0x8d))%400==0)){date=0x01;}write_595(date);ST_CP4=0;ST_CP4=1;ST_CP4=0;} break;case 5:{month++;if((month&0x0f)>0x09){month+=0x10;month&=0xf0;}if(month==0x13){month=0x01;}write_595(month);ST_CP5=0;ST_CP5=1;ST_CP5=0;} break;case 6:{year_data++;if((year_data&0x000f)==0x0a){year_data+=0x0010;year_data&=0xfff0;}if((year_data&0x00ff)==0xa0){year_data+=0x0100; //向前进1year_data&=0xff00; //后面尾数归0}write_595(year_data);ST_CP6=0;ST_CP6=1;ST_CP6=0;write_595(year_data>>8);ST_CP8=0;ST_CP8=1;ST_CP8=0;} break;case 7:{day++;if((day&0x0f)==0x08){day=0x01;}write_595(xingqi[day]);ST_CP7=0;ST_CP7=1;ST_CP7=0;} break;}t=50000;while((!K2)&&t){t--;}}}//--------------------------if(K3==0){delay(10);if(K3==0){switch(set){case 1:{miao--;if((miao&0x0f)==0x0F){miao&=0xf9; //减到0后,再减一次就归0,}if(miao==0xF9) //当全部减到00时,再减一次就为59{miao=0x59;}write_595(miao);ST_CP1=0;ST_CP1=1;ST_CP1=0;} break;case 2:{fen--;if((fen&0x0f)==0x0F){fen&=0xf9;}if(fen==0xF9){fen=0x59;}write_595(fen);ST_CP2=0;ST_CP2=1;ST_CP2=0;} break;case 3:{if((read_1302(0x85)&0x80)==0x00){shi--;if((shi&0x0f)==0x0F){shi&=0xf9;}if(shi==0xF9) //24小时制{shi=0x23;}}else{shi=(shi|0x80)-1;if((shi&0x0f)==0x0F){shi&=0xf9;}if(shi==0xF9) //12小时制{shi=0X12;}}write_595(shi);//显示时ST_CP3=0;ST_CP3=1;ST_CP3=0;} break;case 4:{date--;if((date&0x0f)==0x0F){date&=0xf9;}if((date==0x00)&&((month==0x01)||(month==0x0 3)||(month==0x05)||(month==0x07)||(month==0x0 8)||(month==0x10)||(month==0x12))){date=0x31;}elseif((date==0x00)&&((month==0x04)||(month==0x06)||(month==0x09)||(month==0x11))){date=0x30;}elseif((date==0x00)&&(month==0x02)&&((year_data |read_1302(0x8d))%100!=0)&&((year_data|read_1 302(0x8d))%400!=0)){date=0x28;}elseif((date==0x00)&&(month==0x02)&&((year_data |read_1302(0x8d))%100==0)&&((year_data|read_ 1302(0x8d))%400==0)){date=0x29;}write_595(date);ST_CP4=0;ST_CP4=1;ST_CP4=0;} break;case 5:{month--;if((month&0x0f)==0x0F){month&=0xf9;}if(month==0x00){month=0x12;}write_595(month);ST_CP5=0;ST_CP5=1;ST_CP5=0;} break;case 6:{year_data--;if((year_data&0x000f)==0x0F){year_data&=0xfff9;}if((year_data&0x00f0)==0xF0){year_data&=0xf999;}write_595(year_data);ST_CP6=0;ST_CP6=1;ST_CP6=0;write_595(year_data>>8);ST_CP8=0;ST_CP8=1;ST_CP8=0;} break;case 7:{day--;if((day&0x0f)==0x00){day=0x07;}write_595(xingqi[day]);ST_CP7=0;ST_CP7=1;ST_CP7=0;} break;}t=50000;while((!K3)&&t) //松手检测{t--;}}}//-----------------------------------switch(set){case 8:{if(K4==0){delay(10);if(K4==0){if((read_1302(0x85)&0x80)==0x00){set_shi++;if((set_shi&0x0f)>0x09){set_shi+=0x10;set_shi&=0xf0;}if(set_shi==0x24) //24小时制{set_shi=0x00;}}else{set_shi=(set_shi|0x80)+1;if((set_shi&0x0f)>0x09){set_shi+=0x10;set_shi&=0xf0;}if(set_shi==0x12) //12小时制{set_shi=0X80;}}write_595(set_shi); //显示闹钟的时ST_CP3=0;ST_CP3=1;ST_CP3=0;t=50000;while((!K4)&&t){t--;}}}//------------------------------------if(K5==0){delay(10);if(K5==0){set_fen++;if((set_fen&0x0f)>0x09){ set_fen+=0x10;set_fen&=0xf0;}if(set_fen==0x60){ set_fen=0x00;} write_595(set_fen);ST_CP2=0;ST_CP2=1;ST_CP2=0;t=50000;while((!K5)&&t){ t--;}}}}}//-------------------------if(((K4==0)||(K5==0))&&(set==0)){delay(10);if(((K4==0)||(K5==0))&&(set==0)){write_595(set_shi); //显示闹钟的时ST_CP3=0;ST_CP3=1;ST_CP3=0;write_595(set_fen);ST_CP2=0;ST_CP2=1;ST_CP2=0;P1=0XF9;while((!K4)||(!K5));P1=0X00;}}//------------------------------------------TR1=1; //退出时开定时器}//--------------------------------------------------。