东北大学秦皇岛分校单片机数字时钟课程设计方案报告文件_第1页
东北大学秦皇岛分校单片机数字时钟课程设计方案报告文件_第2页
东北大学秦皇岛分校单片机数字时钟课程设计方案报告文件_第3页
东北大学秦皇岛分校单片机数字时钟课程设计方案报告文件_第4页
东北大学秦皇岛分校单片机数字时钟课程设计方案报告文件_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PAGE东北大学秦皇岛分校计算机与通信工程学院单片机课程设计 设计题目数字钟设计专业名称电子信息工程班级学号4101403学生姓名李凯指导教师陈海宴设计时间2013.01.01—2013。01.07目录TOC\o”1-3”\h\z\u1、设计目的 12、设计方案 1_Toc345499754"5、硬件电路设计及描述 35。1位单片机简介 35。2STC89S52单片机主要功能介绍 3_Toc345499758”5。4时钟电路 55。5按键电路 66.2时间重设流程图 7HYPERLINK\l”_Toc345499765"6。3正常时间显示流程图 8HYPERLINK\l”_Toc345499766”7程序主要模块 10HYPERLINK\l”_Toc345499767”7.1延时子程序 107.2中断服务子程序 10HYPERLINK\l”_Toc345499769”7。3显示子程序 128、程序调试及仿真 12HYPERLINK\l”_Toc345499772"8。1普通时间显示模式仿真图 13HYPERLINK\l”_Toc345499773"8。2年月日显示模式仿真图 13_Toc345499775”8。4调节仿真图 1410。设计总结及感想 15HYPERLINK\l”_Toc345499778"10.1操作问题 1512、设计时间与安排 18HYPERLINK\l”_Toc345499782"附录一:设计原理 19_Toc345499784”附录三:总体仿真图 21HYPERLINK\l”_Toc345499785”附录四:设计源程序 22PAGE291、设计目的1。学习8051定时器时间计时处理、按键扫描及LED数码管显示的设计方法。2.设计任务及要求利用实验平台上6个LED数码管,设计带有闹铃功能的数字时钟课程设计的目的与意义在于让我们将理论与实践相结合。培养我们综合运用电子课程中的理论知识解决实际性问题的能力。让我们对电子电路、电子元器件、proteus仿真等方面的知识进一步加深认识,同时在软件编程、排错调试、相关仪器设备的使用技能等方面得到较全面的锻炼和提高,为今后能够独立完成某些单片机应用系统的开发和设计打下一个坚实的基础.2、设计方案本次设计时钟电路,使用了ATC89S52单片机芯片控制电路,单片机控制电路简单且省去了很多复杂的线路,使得电路简明易懂,使用试验箱上的开关来调整时钟的时、分、秒和年、月、日,用一LED来模拟定时和整点提醒,同时使用C语言程序来控制整个时钟显示,使得编程变得更容易,这样通过四个模块:单片机定时器、中断、开关、芯片、LED灯、数码管显示(显示电路用6个共阴数码管分别显示,小时(年份)、分钟(月份)和秒(日),通过动态扫描进行显示,从而避免了译码器的使用,同时节约了I/0端口,使电路更加简单)即可满足设计要求,来设计一款单片机和简单外设控制的电子时钟。3、设计要求1)使用6位数码管,前两位显示小时(24小时制),中间两位显示分钟,后两位显示秒。时钟每走1秒,秒数码管加1显示,60秒后分钟数码管加1显示,60分钟后小时数码管加1显示。2)校正时间功能(即调整时间)3)添加“闹时"功能,通过点亮LED灯来模拟。4)添加“整点闹时”功能。为走时准确性设计解决算法并编程实现。5)掌握使用Proteus绘制仿真图的过程、方法和技巧。6)掌握单片机开发软件Keil的使用和调试.7)编写并调试单片机定时及其中断程序,以实现电子时钟的功能。8)设计六位八段数码管显示电路并编写驱动程序,输入并调试拆字程序和数码显示程序.9)完成系统硬件电路的设计和制作。10)总结检验电路设计结果11)注:年月日初始值2012年1月1号.数码管显示120101.由于开机时钟为6:00:00,闹钟为6:00:10。开机会报时10秒。4。实验原理附录一5、硬件电路设计及描述5.1位单片机简介1972年,美国Intel公司首先推出8位微处理器8008,并于1976年9月率先推出MCS—48系列单片机。在这以后,8位单片机纷纷面市。例如,莫斯特克和仙童公司合作生产的3870系列,摩托罗拉公司生产的6801系列等.随着集成电路工艺水平的提高,一些高性能的8位单片机相继问世.例如,1978年摩托罗拉公司的MC6801系列及齐洛格公司的Z8系列,1979年NEC公司的UPD78XX系列。这类单片机的寻址能力达64KB,片内ROM容量达4-—8KB,片内除带有并行I\O口外,还有串行I\O口,甚至还有A\D转化器功能。8位单片机由于功能强,被广泛用于自动化装置、智能仪器仪表、智能接口、过程控制、通信、家用电器等各个领域。5。2STC89S52单片机主要功能介绍STC89S52单片机内部主要包括累加器ACC(有时也简称为A)、程序状态字PSW、地址指示器DPTR、只读存储器ROM、随机存取存储器RAM、寄存器、并行I/O接口P0~P3、定时器/计数器、串行I/O接口以及定时控制逻辑电路等。这些部件通过内部总线联接起来,构成一个完整的微型计算机。其管脚图如图所示:VCC:电源。GND:接地。P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流.P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故.在FLASH编程和校验时,P1口作为第八位地址接收。P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故.P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流.当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。P3口也可作为AT89C51的一些特殊功能口,如下表所示:口管脚备选功能P3。0RXD(串行输入口)P3。1TXD(串行输出口)P3。2/INT0(外部中断0)P3.3/INT1(外部中断1)P3.4T0(记时器0外部输入)P3。5T1(记时器1外部输入)P3。6/WR(外部数据存储器写选通)P3.7/RD(外部数据存储器读选通)RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。5。3复位电路单片机的复位是由外部的复位电路来实现的.复位引脚RST通过一个斯密特触发器与复位电路相连,斯密特触发器用来抑制噪声,在每个机器周期的S5P2,斯密特触发器的输出电平由复位电路采样一次,然后才能得到内部复位操作所需要的信号。上电复位:上电复位电路是—种简单的复位电路,只要在RST复位引脚接一个电容到VCC,接一个电阻到地就可以了。上电复位是指在给系统上电时,复位电路通过电容加到RST复位引脚一个短暂的高电平信号,这个复位信号随着VCC对电容的充电过程而回落,所以RST引脚复位的高电平维持时间取决于电容的充电时间。为了保证系统安全可靠的复位,RST引脚的高电平信号必须维持足够长的时间。5.4时钟电路时钟是单片机的心脏,单片机各功能部件的运行都是以时钟频率为基准,有条不紊的一拍一拍地工作。因此,时钟频率直接影响单片机的速度,时钟电路的质量也直接影响单片机系统的稳定性。常用的时钟电路有两种方式:一种是内部时钟方式,另一种为外部时钟方式。本文用的是内部时钟方式。电路图如下:单片机内部有一个用于构成振荡器的高增益反相放大器,该高增益反向放大器的输入端为芯片引脚XTAL1,输出端为引脚XTAL2.这两个引脚跨接石英晶体振荡器和微调电容,就构成一个稳定的自激振荡器。按键电路按键的开关状态通过一定的电路转换为高、低电平状态。按键闭合过程在相应的I/O端口形成一个负脉冲。闭合和释放过程都要经过一定的过程才能达到稳定,这一过程是处于高、低电平之间的一种不稳定状态,称为抖动.抖动持续时间的常长短与开关的机械特性有关,一般在5-10ms之间。为了避免CPU多次处理按键的一次闭合,应采用措施消除抖动。本文采用的是独立式按键,直接用I/O口线构成单个按键电路,每个按键占用一条I/O口线,每个按键的工作状态不会产生互相影响。5。5按键电路逻辑电平开关电路如下图所示。实验台上有八个开关K1-K8,与之相对应的K1—K8个引线孔为逻辑电平输出端。开关想上拨相应插孔输出高电平“1”,向下拨相应插孔输出低电平“0”。5。6单片机与8255连接电路图单片机通过驱动驱动芯片与8255连接,用来传送片选地址信号和数据信息,以实现对8255的控制。5。78255与数码管连接图8255通过驱动芯片来对数码管进行显示控制。6、电路的软件设计6.1软件程序主流程图及总体仿真图附录二、附录三6。2时间重设流程图按键处理是先检测秒按键是否按下,秒按键如果按下,秒就加1;如果没有按下,就检测分按键是否按下,分按键如果按下,分就加1;如果没有按下,就检测时按键是否按下,时按键如果按下,时就加1;如果没有按下,就把时间显示出来。年月日的重设原理相同,不在重复. 6.3正常时间显示流程图定时器中断时是先检测1秒是否到,1秒如果到,秒单元就加1;如果没到,就检测1分钟是否到,1分钟如果到,分单元就加1;如果没到,就检测1小时是否到,1小时如果到,时单元就加1,如果没到,就显示时间。年月日的计时原理相同,不再重复。7程序主要模块7.1延时子程序数码管的闪烁提示,以及整点提醒等模块也用到了延时,只是延时的长短不同罢了,在此不再赘述。7。2中断服务子程序本实验中,计数器T0,T1中断都有运用,标准频率(11.0592KHz),其中T0中断为闹钟定时所用,T1中断为时钟定时所用.T0和T1工作于方式1,计数器计数9216次,进入中断,计数初值为65536—9216,装满定时器需要0.001s的时间,从而1000次中断为一秒,一秒之后,判断是否到60秒,若不到则秒加一,然后返回,若到,则秒赋值为0,分加一,依次类推。包括日期显示的功能也是如此。外部中断0用来实现手动关闭闹钟,P3。2引脚外接一个开关.当闹钟响应(LED灯亮)是,闭合开关(低电平有效),可以关闭闹钟.NOYESYESNO中断服务程序中日历的实现较为复杂,要考虑平年,闰年,因为有特殊的2月,但是数码管只有六个,不能完全显示年份,所以默认2月份有28天。其中1、3、5、7、8、10、12月是每月31天。4、6、9、11月为每月30天。7。3显示子程序六个数码管轮流进行显示,分别显示1ms,依赖人的视觉暂留效应,给人以数码管持续高亮的错觉.7。4调整程序时钟包括很多调整,如时分秒,年月日等,本程序,设计了相应的调整程序段,通过对应的按键,程序跳入调整模式或功能模式。结合电路图整体思路为:1.按1键——设置模式。显示时分秒(年月日)且可调整,通过闪烁来确定设置时间的哪个位。按三次则重新计时。时分秒(年月日)调整对应键如下:3键——调整对应位,按一次该位加14键-—调整对应位,按一次该位减12。按2键—-年月日模式。时间调整对应键如下:1键—-设置模式,调整年或月或日3键——调整对应位,按一次该位加14键——调整对应位,按一次该位减15.按5键关闭闹钟.当闹钟响时,可以人为地手动关闭闹钟。8、程序调试及仿真本程序通过Keil单片机开发平台实现程序的编译,链接,生成HEX文件。程序再编译过程中可以发现错位,并及时改正,在设计时非常重要,使错误被扼杀在摇篮中。通过Keil和硬件仿真平台Proteus的联合,可以将设计效果仿真出来,根据效果,有目的的改变设计,优化程序.在具体的试验箱调试过程中,我们遇到了很多问题,如数码管位选的的问题,我们仿真时是高电平有效,但是在调试时确是低电平有效。开始放真时,我们用了P3。0、P3.1和P3.3口作为普通的I/O口,但是效果很不好,于是我们改用了P1的一些端口才打到理想的效果。8。1普通时间显示模式仿真图显示时间是5:59:568。2年月日显示模式仿真图表示2012年1月1日8.3闹钟显示仿真图表示闹铃时刻为6:00:10点8。4调节仿真图由于调节过程中,数字值要闪烁,效果不好,所以这里略去,未进行截图。9、试验箱操作事物图时分秒显示结果:年月日显示结果:闹钟显示结果:10。设计总结及感想在实验的开始几天,基本上没有收获,不知何从下手,不知所措.为了看得更远,不妨站在前人的肩膀上,我在整体思路模糊的情况下,在网上大量招资粮,各种与电子时钟相关的文章,我阅读了不少。随着涉猎的点滴积累,我对电子时钟的设计方案已经慢慢酝酿而成。有了方向和不少知识储备后,在接下来的几天,几乎每天都有突破,虽然有时只是一句程序的修改或诞生,但那种收获的感觉很暖人心。经过这次单片机课程设计,我从一个单片机实践的门外汉,已经越升为略知一二的新手。虽然还有很多有关单片机的应用有待学习,但万变不离其宗,只要深入了解单片的原理,全部知识点,各个细节,一切设计皆有可能。实验中遇到了不少问题,接下来总结一下,共同探讨。10。1操作问题1、按键问题。我的设计中,很多功能选择是通过按键开关实现的。在仿真中发现,调整数值时,有时按键反应太快,按一次,跳了几下,使设置时间,日期很不方便。但是仿真多了之后,找到了按键(实际上是按鼠标)的节奏,对按键的掌控力提高了不少,不怎么会出现跳变的情况了。有些开关我采用了长按键的方式来防抖,效果不错,但是每次都要长按键,调整效率太低,我没有普及.本来想把所有的按键都加延时防抖电路,但仿真中感觉对键盘的控制力没提高多少,有时还是会出问题,这个方案放弃了。索性将板子焊接出来了在调试软件吧,仿真毕竟不是那么“真”啊!实际电路调试中,按键反应没有出现过于灵敏的问题,基本可控制.出现以上问题,我认为是电路板上焊接点太多,接触不是很好,影响了信号的传输时间,从而解决了按键问题!也有可能是按键质量问题,接触不良。2、中断冲突问题,为了实现秒表,我在T0中断嵌套了秒表相关进位程序,由于秒表要求精度0。01秒,故我的T0中断定时为就刚好0.01秒,中断100次,刚好1秒。秒表确实实现了,但是我的闹铃音质变差了.一开始以为是闹铃程序存太多冗余环节,影响了T1的音乐输出中断,但是检查程序后,发现没什么多余的,裁剪无从下手.3、显示数字分隔问题。本实验中用6个共阳极数码管显示年月日及时分秒,但是6个数码管连在一起,显示过程中不能有效地区分时,分,秒和年,月,日,数码管是两两组合起来,形成某位的十位和个位,故用小数点在适当位置一直保持高亮状态,形成分隔符,实现方便的读取数据。10。2设计问题1、硬件部分:首先要通过计算与参考资料等决定参数.而后通过仿真软件等调试,然后再在试验箱上进行实际操作。因为试验箱上的连线已经做好,不用再设计连接.2、软件设计部分:设计软件首先要考虑要做的功能,确定出合理的算法。合理的算法不仅要可以实现功能,而且在添加功能的时候要方便灵活。有的人为了实现某种功能用了各种各样的方法来实现,结果程序结构吃死,当想要添加功能或者修改其他功能的时候,将修改程序大部分结构,也就是说要破坏程序现有的结构。3、关于调试:Keil软件调试单片机程序的时候,编译通过并不代表程序是正确的。编译通过只能说明程序没有语法上的错误。进行软件仿真或者下载到开发板上进行调试,经常会出现各种各样的错误。许多超出预期效果的现象往往是一些微小错误引起的.例如没有现场保护跟恢复现场等,所以养成良好的编程习惯也很重要。有些想达成某些功能而添加的语句,实际上确一点效果也没有。举个编程中的小问题:当有按键按下时,我们都要有软件防抖。正常的方法是调用一个延时。在实际调试中,要跳过这个抖动,需要100MS左右。如果使用正常的延时,会导致按键按下时CPU100MS内无法进行其他操作,也就是说。平均1S内100MS不调用显示子程序,这样就会导致亮度降低。这时候,考虑到显示子程序一次有十几毫秒,就特别写了一个调用7次显示的子程序来作为按键防抖的延时,实际上效果也是很不错的。这个想法就是在修改了多次程序未达到想要的效果(有按键按下时显示亮度不降低)后最终想出来的办法。我认为有些细节是仿真软件不能模拟的,必须要通过开发板的实际操作得以验证,PC机的资源有限,运行速度和性能的差异也有可能产生仿真的不同结果.4、一个星期天以来的其他体会:态度要积极,不要认为很简单就不紧不慢。很多东西并不是自己设想的那么顺利,有时候一个小问题可以花上你半天甚至一天的时间。虽然自己在程序上并没遇到太大的问题,但是因为态度不够积极,对于没画过的PCB图迟迟不去下手,在周四晚上才解决.本以为周五一天可以做完板并完成整机调试,可是各种突发事件让自己措手不及.发现板来不及做完后才将程序功能进行扩展。这是我在这次实验中的一个教训,也让我明白了对于自己不能太过于自信,态度决定一切.本次的设计使我从中学到了一些很重要的东西,那就是如何从理论到实践的转化,怎样将我所学到的知识运用到我以后的工作中去.在大学的课堂的学习只是在给我们灌输专业知识,而我们应把所学的用到我们现实的生活中去,此次的电子时钟设计给我奠定了一个实践基础,我会在以后的学习、生活中磨练自己,使自己适应于以后的竞争,同时在查找资料的过程中我也学到了许多新的知识,在和同学协作过程中增进同学间的友谊,使我对团队精神的积极性和重要性有了更加充分的理解。通过这次设计让我真正体会到了,有付出,才会有收获,我深刻的认识到计算机专业的路的不平坦,我知道,今后我的路还是很长,我要学的东西也有很多。我会以一种良好的态度去迎接每一个挫折和挑战。11、参考文献[1]陈海宴。51单片机原理及应用[M]。北京:北京航空航天大学,2010.[2]谢自美。电子线路设计·实验·测试[M].武汉:华中理工大学出版社,1992。[3]何立民.单片机应用系统设计[M].北京:北京航空航天大学出版社,1993.[4]楼然笛.单片机开发[M].北京:人民邮电出版社,1994。

[5]付家才.单片机控制工程实践技术[M].北京:化学工业出版社2004.3。

[6]李光才.单片机课程设计实例指导[M].北京:北京航空航天大学出版社2004.

[7]朱定华.单片机原理及接口技术实验[M].北京:北方交通大学出版社2002.11.[8]刘湘涛.江世明.单片机原理与应用[M]。北京:电子工业出版社,2006。12、设计时间与安排1、设计时间:2周2、设计时间安排:熟悉实验设备、收集资料:2天设计图纸、实验、计算、程序编写调试:2天编写课程设计报告:1天答辩:1天附录一:设计原理附录二:设计总体流程图附录三:总体仿真图附录四:设计源程序/*————————--———-——--—————-—————-—————————-——-——-—--—————-———--—--————-—-———-——————-—-——-——--————--—团队课题名称:数字电子时钟 团队成员:4101424胡水仙(队长)*4101403李凯*4101406陈文豪*4101431付荣 实现的功能:1.时分秒和年与日的显示; 2。时分秒和年月日显示的切换; 3.时分秒显示有误,通过按键(拨码开关代替)加或减调整; 4。年月日显示有误,通过按键(拨码开关代替)加或减调整; 5。闹钟功能,当到达指定时间,闹钟响应(LED灯代替),分为 两种模式:1。闹钟响应后若无人处理,十秒后自动关闭, 2。闹钟响应后可以手动关闭(外部中断0实现); 6。整点报时功能,当到达整点时,闹铃响应(LED灯代替); 线路连接:1.P1.7口接L1的LED灯,用来模拟闹钟(闹铃),低电平点亮 2。P1。0、P1。1、P1。2、P1。3分别接K1、K2、K3、K4***P3.2接K5 其中:K1为时间调整开关 K2为时分秒和年月日切换开关 K3为调整时间时加1开关 K4为调整时间时减1开关 K5为外部中断0输入开关,下降沿有效—--———--——-—-—--—————-————-——-—-—-—-——--————-—-————--——-——-———-————————-——--—————-————-————————-*/#include<reg52.h>#include〈absacc.h〉 //地址操作头文件#defineucharunsignedchar#defineuintunsignedintsbitdeng=P1^7; //LED灯的端口(模拟闹钟或者闹铃)sbitshezhi=P1^0; //时间设置开关sbitjia=P1^2; //设置时间时加1开关sbitqiehuan=P1^1; //年月日和时分秒切换开关sbitjian=P1^3; //设置时间时减1开关ucharduan1,duan2,duan3,duan4,duan5,duan6;//定义段选相关变量uintmiao=50,fen=59,shi=6,nian=12,yue=1,ri=1; //年月日、时分秒标志变量uintt0flag=0; //闹钟时间标志位uchartimer[3]={6,0,10};//闹钟的初始化时间#defineweiXBYTE[0xff20] //PA口地址#defineduanXBYTE[0xff21] //PB口地址#definecontrolXBYTE[0xff23] //控制寄存器地址ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};//数码管编码表/*-——-—-—-—-——--—-————-—--————-—-——-————-—————————--—-——-——-——-———-———-——————-——-———-—-———定时器初始化子程序-—-———-————-——--————-—--—-—-————————-——-———-—————--—————-———-———--——-———————-———--*/voidtimer_init(void){TMOD=0x11; //定时/计数器0和1使用模式1,16位定时器TH0=0x00; //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出TL0=0x00;TH1=0x00;TL1=0x00;EA=1;//总中断打开ET0=1;ET1=1;EX0=1;IT0=1;}/*———-——--———————--——————-——————--————-———-—-———-—-—--——-————--——--—-—--——-—-—-—-—-—-延时子程序———-——-———-—--——-———--—-—————-——-—-———-——-———-———--——-—-—————--—--———-—-—-——--—-——*/voiddelayms(unsignedcharms){uchari;while(--ms!=0)for(i=0;i〈50;i++);}/*-—-———-—————————-———--——--—-————-——-—-—-—-——-—-———-—--———————--—————-———————--—-—————-——-显示子程序-———————-—-—-——-———--—-————-——-—--—————-—-——-—-—--—--——————————--—-—--—-—————-—--—————--———--*/voidxianshi(){wei=0xdf;//打开位选,选第一位数码管11011111duan=duan1;//打开段选,显示数码关管第一位delayms(3);wei=0xef;//打开位选,选第二位数码管11101111duan=duan2; //打开段选,显示数码关管第二位delayms(3); wei=0xf7;//打开位选,选第三位数码管//11110111 duan=duan3; //打开段选,显示数码关管第三位delayms(3);wei=0xfb;//打开位选,选第四位数码管//11111011 duan=duan4; //打开段选,显示数码关管第四位delayms(3);wei=0xfd;//打开位选,选第五位数码管11111101duan=duan5; //打开段选,显示数码关管第五位delayms(3);wei=0xfe;//打开位选,选第六位数码管11111110duan=duan6; //打开段选,显示数码关管第六位delayms(3);}/*--—--—-—--——-—-—————--———-—-—-—--—--—————--——-——————-—————--——————-—-—————-—--——-——--—-—-初始化子程序——-—-——-———--——-—-—--—————-—————————————-——-——-—————-——-——--—-——--——--—--—————--——-——--—-—*/voidinit_all(){ shezhi=1;//引脚置高电平作为输入jia=1;qiehuan=1; jian=1;timer_init(); control=0x80;delayms(3);}/*————-————————--—————————-—--—-———-——-——--———-—--———-——-—-—-—-———-—-———--——-————-—-—-—-—--—主程序———-——-—-—--———--—--—-—-—--———--——-———————-——--——--—-——-——-——-—-—-——-—-—-————-—-—--—--—-—--—-———-*/voidmain(){uintflag=0,j=0,xuanze1=0,xuanze2=0;//定义闪烁标志变量flag,闪烁时间变量j,时分、、//秒选择变量xuanze1,年月日选择变量xuanze2init_all();while(1)//死循环{ if(qiehuan==1)//如果P1。1为高电平则执行以下显示和调整时间指令 { xuanze2=0;//日期设置年月日选择变量置0,防止日期时间来回切换时发生错误 if(xuanze1==0) { TR1=1;//如果时间设置时分秒选择变量为0,说明处于//运行状态,此时定时器开启 flag=1;//烁标志位强制置1,不闪烁 if((shi==timer[0])&&(fen==timer[1])&&(miao==timer[2]))//如果时间达到//预设值,则闹钟响(LED灯亮) { deng=0; //灯亮 TR0=1; //开始计时 } if((fen==0)&&(miao==0)) //如果是整点 { deng=0; //灯亮,整点提醒 delayms(2); deng=1; //灯灭,关闭闹铃 } } if(!shezhi)//P1。0设置按钮 { xianshi();//延时去抖,用显示子程序延时,防止按动按钮时闪烁 if(!shezhi)//再次确认按键是否按下,没有按下则退出 { while(!shezhi)xianshi();//如果确认按下按键等待按键释放,没有//释放则一直执行数码管扫描,防止闪烁 { TR1=0; xuanze1++; //确定要设定的时或分或秒 if(xuanze1==4) xuanze1=0; } } } if(!jia) { xianshi(); //延时去抖,用显示子程序延时,防止按动按钮时闪烁 if(!jia) //再次确认按键是否按下,没有按下则退出 { while(!jia)xianshi(); //如果确认按下按键等待按键释放,没有释//放则一直执行数码管扫描,防止闪烁 { if(xuanze1==1) //时加 shi++; if(shi==24) shi=0; if(xuanze1==2) //分加 fen++; if(fen==60) fen=0; if(xuanze1==3) //秒加 miao++; if(miao==60) miao=0; } } } if(!jian) { xianshi(); //延时去抖,用显示子程序延时,防止按动按钮时闪烁 if(!jian) //再次确认按键是否按下,没有按下则退出 { while(!jian)xianshi(); //如果确认按下按键等待按键释放,没//有释放则一直执行数码管扫描,防止闪烁 { if(xuanze1==1) //时减 shi——; if(shi==—1) shi=23; if(xuanze1==2) //分减 fen-—; if(fen==—1)fen=59; if(xuanze1==3) //秒减 miao—-; if(miao==—1) miao=59; } } } If(flag==1)//闪烁标志位为1,所有数码管都亮,//与下面的flag=0构成闪烁程序 { If(shi〈10)//灭零判断,如果小时数小于10则第//一位数码管熄灭 duan1=0xff; else duan1=table[shi/10];//分解显示信息 duan2=table[shi%10]; duan3=table[fen/10]; duan4=table[fen%10]; duan5=table[miao/10]; duan6=table[miao%10]; } if(flag==0)//闪烁标志位为0,对应数码管熄灭 { if(xuanze1==1) { duan1=0xff;//当设置小时时,第一二位数码管闪烁 duan2=0xff; } if(xuanze1==2) { duan3=0xff; duan4=0xff; } if(xuanze1==3) { duan5=0xff; duan6=0xff; } } } if(qiehuan==0)//如果P1.1为低电平则执行以下显示和调整日期指令 { xuanze1=0;//时间设置时分秒选择变量置0,防止日期时间来回切换时发生错误 if(xuanze2==0) flag=1; if(!shezhi) { xianshi(); if(!shezhi) { while(!shezhi)xianshi(); { xuanze2++; //确定要设定的年或月或日 if(xuanze2==4) xuanze2=0; } } } if(!jia) { xianshi(); //延时去抖,用显示子程序延时,防止按//动按钮时闪烁 if(!jia) //再次确认按键是否按下,没有按下则退出 { while(!jia)xianshi(); //如果确认按下按键等待按键释放,没有//释放则一直执行数码管扫描,防止闪烁 { if(xuanze2==1) //年加 nian++; if(nian==100) nian=0; if(xuanze2==2) //月加 yue++; if(yue==13) yue=1; if(xuanze2==3) //日加 { ri++; if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)//月份判断 { if(ri==32) ri=1; } if(yue==4||yue==6||yue==9||yue==11) { if(ri==31) ri=1; } if(yue==2) { if(ri==29) ri=1; } } } } }if(!jian) { Xianshi(); //延时去抖,用显示子程序延时防止//按动按钮时闪烁 if(!jian) //再次确认按键是否按下,没有按下则退出 { While(!jian)xianshi(); //如果确认按下按键等待按键释放,没//有释放则一直执行数码管扫描,防止闪烁 { if(xuanze2==1) //年减 nian-—; if(nian==-1) nian=99; if(xuanze2==2) //月减 yue--; if(yue==0) yue=12; if(xuanze2==3) //日减 { ri-—; if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)//月份判断 { if(ri==0) ri=31; } if(yue==4||yue==6||yue==9||yue==11) { if(ri==0) ri=30; } if(yue==2) { if(ri==0) ri=28; } } } } } if(flag==1) { duan1=table[nian/10];//分解显示信息 duan2=table[nian%10]; duan3=table[yue/10]; duan4=table[yue%10]; duan5=table[ri/10]; duan6=table[ri%10]; } if(flag==0) { if(xuanze2==1) { duan1=0xff; //调整时间时,年时间值闪烁 duan2=0xff; } if(xuanze2==2) { duan3=0xff; //调整时间时,月时间值闪烁 duan4=0xff; } if(xuanze2==3) { duan5=0xff; //调整时间时,日值闪烁 duan6=0xff; } } } xianshi(); j++; if(20==j)//延时闪烁时间 { j=0; flag=!flag;//闪烁标志变量 }}}/*————-———-——--——-——--—-—-—-——-——--————--—-——-—--——--——————————--—--——-———-————--——--———-—外部中断0中断子程序-————————-—-—-—-————--——--———--———-————--———--——-—-—-—-——-——-—————-———

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论