单片机智能电子钟设计模板

合集下载

单片机电子闹钟程序亲自编写-可用

单片机电子闹钟程序亲自编写-可用

单片机电子闹钟程序(亲自编写-可用)————————————————————————————————作者:————————————————————————————————日期:学校电子钟,有闹钟功能,按键可调时间,可调打铃时间,打铃时间长短显示,每个模块有功能注释。

其中正常时间显示和闹钟时间显示可用一个开关来调整。

芯片选择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(一)

(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单片机的简易电子钟设计一、设计目的现代社会对于时间的要求越来越精确,电子钟成为家庭和办公场所不可缺少的设备之一、本设计基于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.定时功能:通过按键输入设置定时时间,将设置好的定时时间存储到单片机中,当定时时间到达时,触发相应的动作,如报警等。

六、实验结果:本设计可以准确显示时间,并可以设置闹钟和定时功能。

当闹钟和定时时间到达时,会触发相应的动作,实现了基本要求。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

机械工艺学激光加工论文课程设计一、设计任务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; //退出时开定时器}//--------------------------------------------------。

相关文档
最新文档