毕业设计简易电子时钟.doc_第1页
毕业设计简易电子时钟.doc_第2页
毕业设计简易电子时钟.doc_第3页
毕业设计简易电子时钟.doc_第4页
毕业设计简易电子时钟.doc_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

目录第一章 概述11.1 单片机11.2 设计目的11.3 系统原理1第二章 系统总体设计方案22.1 方案选择222简易电子时钟总体设计框图2221主控制器2222控制电路3223电源电路3224显示电路32.3硬件电路图 (见附录2)32.3.1 振荡电路32.3.2 复位电路 42.3.3 lcd电路4第三章 主程序流程图7源程序见附录47第四章 实物制作与调试说明84.1 元件的选择与制板方面84.2 整体调试方面8第五章 使用说明书9第六章 结束语10附录11附录1元件清单11附录2 电路原理图12附录313附录4 源程序14参考文献27第一章 概述1.1 单片机单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构的最佳选择。 目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。特别是随着电子技术的飞速发展,电子控制器件不断向着小型化、智能化方向发展,同时可靠性不断提高,单片机由于具有集成度高、功能强、通用性好、可靠性高、抗干扰能力强、体积小、使用方便灵活等特点,无论是在国防工业、通讯尖端技术领域,还是在智能仪器、民用电器中都使用的越来越多。1.2 设计目的由于单片机在人们生活中越来越广泛的应用,而且带来极大的方便,所以在这样的高速发展的时代里,发展的步伐已逼迫人们继续去发现。我们是当代的大学生,肩负着历史的使命,时代要求我们不断创新。所以,我们要利用自己的有限时间,发挥更大的作用。然而,做到这些,首先要有时间观念。因此,我们决定做一个简易时钟,让它来时刻提醒我们要抓紧时间,努力奋斗。我们制作的电子时钟,设计简单,操作方便,功能齐全,特别适合在各工作学习环境中使用。使用时可以通过两个按键的作用来设置时间与闹钟,既可以随时看时间,又能达到定点报时的效果。在此基础上,我们还通过另外的程序扩展了它的功能,即同时调动年、月、日,这样,更增加了其实用性。1.3 系统原理此次设计主要研究的是利用at89c51单片机来实现时间的计数和报时,通过对它的p2口实现调时与定时,所以本次设计采用二个按键来控制,通过按键之间的协调作用来完成设置值,在硬件电路中用再使用蜂鸣器来报时,并通过lcd1602液晶显示时间及操作的相关信息。同时,应用振荡电路、复位电路等控制使硬件设备更加完善。第二章 系统总体设计方案2.1 方案选择方案一:用at89c51做主控器,用6位数码管显示时间信息,并用9个开关同时进行时间的调整,这样可以直接调出我们需要的时间,方便快捷。方案二:应用液晶显示屏直接显示时间。但需要完善的程序,一旦有一点点问题,就会影响到全部的显示效果。基于以上两种方案,我们认真研究:用方案一的按键矩阵来控制时间故然可以方便地调时,但这样设计必然增加了电路制作的成本,而且硬件电路连接复杂程度增加,另外在程序设计时也要相应增加按键控制指令,增加了软件设计的难度。信息显示部分采用液晶lcd1602,这样能够显示更多的信息,而且硬件连接比用数码管简洁,只要在设计程序方面细心考虑,认真研究,很容易实现其功能。综上所述,我们小组经过讨论,一致决定采用方案二来完成本次设计。22简易电子时钟总体设计框图主控制器单片机复位按键控制时钟振荡lcd液晶显示电源系统图 1 简易电子时钟的设计电路框图我们采用at89c5作为总控制点。在时间显示部分由液晶显示屏处理,并接在c51的p2口,通过三个按键实现复位、选择、修改的功能。221主控制器单片机at89c51具有低电压供电和体积小,系统稳定等特点,四个端口足够满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。222控制电路由三个按键完成。其中s1用来选择所要调整的参数,如选择时间设置或闹钟设置;s2用于具体调整数值。复位键控制恢复初始值。223电源电路用5v直流电源供电,也可以用usb接口供电。提供两种供电模式,可供不同情况下选择使用。224显示电路整个显示电路由液晶lcd-1602来完成。主要性能如下: 显示形式 : 16 (c)2 (l) 字符输入数据 :来自mpu的8位并行数据接口驱动路数 : 1/16 duty 视 角 : 6 点 背 光 : led 控制器 : ks0070bcgrom容量: 160 58dots character fonts generator (cg) romcgram容量:8 58dots character fonts generator(cg)ram其详细工作过程见后面lcd电路。2.3硬件电路图 (见附录2) 2.3.1 振荡电路单片机内的cpu在执行指令程序时,要经过“取指”、“译码”,再定时给相关电路发出控制信号,以实现“机器码指令”所要求的功能。这就要求内部必须有一个基准时钟。本处用外接晶振的方法,因为这样比较方便。还要接两个瓷片电容,这样时钟更稳定。 图1 振荡电路图2.3.2 复位电路 当晶振正常工作时,rst(9)脚上出现的两个机器周期的高电平将使单片机有效复位。考虑到震荡器有一定的起振时间,该引脚必须保持10ms以上高电平,才可以有效复位。这里有的是自动复位电路。电容两端相当于断路,首先电源对电容充电,rst端为高电平的时候,电源通过电阻对电容进行放电,rst端电压慢慢下降,降到一定程度即为低电平,单片机开始正常工作。图2 复位电路图2.3.3 lcd电路 图3 lcd电路表1 i/o 接口表管脚号符号功 能1vss电源地(gnd)2vdd电源电压(+5v)3veelcd驱动电压(可调)4rs输入口,输入mpu选择模块内部寄存器类型信号:rs=0,当mpu进行写模块操作,指向指令寄存器; 当mpu进行读模块操作,指向地址计数器;rs=1,无论mpu读操作还是写操作,均指向数据寄存器5r/w输入口,输入mpu选择读/写模块操作信号: r/w=0 读操作;r/w=1 写操作6e输入口,输入mpu读/写模块操作使能信号: 读操作时,信号下降沿有效;写操作时,高电平有效714db0db7输入/输出口,mpu与模块之间的数据传送通道lcd显示屏为16路common 80路segment 组成的点阵,可以显示16(character)x1(line)个5x8点阵的字符。控制器ks0070接收来自mpu的指令和数据,控制着整个模块的工作。控制器主要由指令寄存器ir、数据寄存器dr、忙标志bf、地址计数器ac、ddram、cgrom、cgram以及时序发生电路组成。u 指令寄存器(ir)和数据寄存器(dr)本模块内部具有两个8位寄存器:指令寄存器(ir)和地址寄存器(dr)。用户可以通过rs和r/w输入信号的组合选择指定的寄存器,进行相应的操作。下表中列出了组合选择方式。表2指令指令寄存器组合方式rsr/w说 明00将db0db7的指令代码写入指令寄存器中1分别将状态标志bf和地址计数器(ac)内容读到db7和 db6db010将db0db7的数据写入数据寄存器中,模块的内部操作自动将数据写到ddram或者cgram中1将数据寄存器内的数据读到db0db7,模块的内部操作自动将ddram或者cgram中的数据送入数据寄存器中指令寄存器ir,内部存储ddram和cgram中的数据显示的指令代码和地址信息,只能由mpu对其执行写操作;数据寄存器dr,内部暂时存储mpu与模块内部ddram和cgram之间的传送数据,内部操作使dr与ddram或者cgram之间的数据传送自动进行。u 忙标志位bf忙标志bf=1时,表明模块正在进行内部操作,此时不接受任何外部指令和数据。当rs=0、r/w=1以及e为高电平时,bf输出到db7。每次操作之前最好先进行状态字检测,只有在确认bf=0之后,mpu才能访问模块;u 地址计数器(ac)ac地址计数器是ddram或者cgram的地址指针。随着ir中指令码的写入,指令码中携带的地址信息自动送入ac中,并行做出ac作为ddram的地址指针还是cgram的地址指针的选择。ac具有自动加1或者减1的功能。当dr与ddram或者cgram之间完成一次数据传送后,ac自动会加1或减1。在rs=0、r/w=1且e为高电平时,ac的内容送到db6db0;表3地址计数器high order bitslow order bitsac6ac5ac4ac3ac2ac1ac0u 显示数据寄存器(ddram)ddram存储显示数据,容量为80x8位共80个字符。ddram地址与lcd显示屏上的显示位置的对应关系如下:表4 一行显示字符列位置123787980ddram地址00h01h03h4dh4eh4fhu 字符发生器rom在cgrom中,模块已经以8位字符码的形式生成了5x8点阵或者5x10点阵的字符字模组,其中包含5x8点阵的字符字模208组(一个字符对应一组字模),5x10点阵的字符字模32组。字符字模是显示字符的5x8点阵或者5x10点阵的位图数据,每一组字符字模都有一个由其在cgrom中存放地址的高八位数据组成的字符码对应。字符码地址范围为00hffh,其中00h07h字符码与用户在cgram中生成的自定义字符的字模组相对应。u 字符发生器ram在cgram中,用户可以生成自定义字符的字模组。对于5x8点阵的字符,可以存放8组,5x10点阵的字符,存放4组。相对应的字符码从cgrom的00h07h范围内选择。第三章 简易电子时钟主程序流程图开始初始化调显示子程序s1键是否按下 s1键是否按下y闹钟设置s2键是否按下调调整子程序时间设置调时间设置子程序保存设置退出保存设置退出退出图5 主程序流程源程序见附录4第四章 实物制作与调试说明4.1 元件的选择与制板方面本次设计,对元件的购买总体来说没什么困难,一切实物具在。只是尽量选择能使电路简化的器件。为了不增大电路板的体积及减小功耗,本设计采用89c51单片机及液晶显示屏,体积小,工作电压低。制板中,首先考虑美观原则,我们布线简单,跳线尽量减少,更确保了没有短路现象。所以pcb图的设计至关重要。在pcb图做好以后,就是制板了。将打印好的pcb图紧贴到单面板覆铜的一面,经压板机压板,然后将电路图印到单面板上。晾干以后,将板放入三氯化铁溶液中进行腐蚀。制好板以后,将电路板上的石墨刮掉,再按实际电路钻孔,这样整个制板过程就结束了。下面就是安装和焊接元件了。安装中要很注意正负极的问题,还要按元件体积的由低到高顺序进行。例如,先安装较低的电阻等器件并焊好,最后安装较高的元件,这样会使所制的板更完善。4.2 整体调试方面先是硬件调试。第一步是否有断线、连线等现象,这些在我们所制的板中没有出现。然后是用万用表来测量连线和接点,检查它们的通断状态是否和设计一样,还要检查各种电源线和地线是否有短路现象,检查后,发现一切正常。再就是加电检查,电源端符合要求的电压值+5v,同时接地端的电压为0。软件调试。首先是测试显示电路的正确性,根据硬件写好一段显示程序,写入单片机中。安装好硬件,上电,显示正常,达到预期效果。证明显示电路正常。按下复位按键,led无显示,弹起按键,显示部分正常工作,证明复位电路也没问题。接下来是按键子程序及报警子程序的调试,将按键子程序及报警子程序及上述程序正确编排后,写入单片机中,上电后,各个部分都正常。然后把系统软件烧入芯片,进行整机调试,整体可以顺利工作。第五章 使用说明书本电路额定工作直流电压为+5v。电路中有三个按键,从左到右依次为rest、s1、s2,介绍如下:接通电源,红色指示灯亮,表明电源正常,此时lcd液晶显示器显示初值00:00:00,并开始运行。reset为复位按键。s1键为闹钟或时间选择键。按一次,进入闹钟设置,在液晶显示器的第二行首将显示“alarm”字样。此时,再按s2可以选择闹钟开或关,然后按s1移动lcd液晶光标,进行闹钟时、分、秒选择,此时按下s2可以设定相应的数值。设置好闹钟后,按s1进入时间,液晶第二行首将显示“time”字样,再像设置闹钟时一样,调整时间。不同的是此时还可以调整年月日,而星期是自动随年月日的调整而变化的。当使光标移动到最后一个调整位时,只要再按下s1就可以退出设置了,此时系统将自动保存设置值。当到了指定闹钟时间,并且又打开闹钟,则蜂鸣器会发出报警声,提醒定时已到,当按下s2时,蜂鸣器才会停止响声。第六章 结束语经过几天的忙碌,从查资料到电路板的制图、打印、压板、腐蚀、焊接元件,再到检测调试等,我们的简易电子时钟终于做好了。这期间,我学到了很多。对于那些硬件我们早有接触,但软件系统就不太明白。而到了现在,不仅使我更了解了c51的引脚及整体功能,也让我再次熟悉了单片机软、硬件结合的过程,让我对单片机产生了浓厚的兴趣。实际上,从制作到制好是一个逐步强化的过程。我们需要考虑的方面很多,一不小心就会疏忽,那些问题,小到焊接的顺序,如:电阻先焊,后接电容,那些体积较大的元件要在最后焊接;大到程序的烧录,程序是整个功能实现的重要部分,其编排的对错和烧录质量都会影响最终结果。当一切完成了,还要写设计报告,这又需要细心。报告的格式、字体的大小要求以及各部分的说明等都要达到完美。总而言之在这次的设计中我们通过用理论与实践相结合,加强了理论知识与实践统一的能力,这不但巩固了所学的知识也加强了自己的动手操作能力。在共同合作的过程中,又提高了我队同学友爱团结、协作攻关,一起开拓进取的基本素质。无论是对于以后关于电子方面的设计还是对于将来的工作,我都受益颇深!在整个设计中,首先要感谢老师给我们组的用心指导,还有一些同学的热心帮助。通过整个设计流程,使我深深的懂得成功不但在于虚心请教,动脑用手,还在于同心协力的合作!附录附录1元件清单元器件大小和型号个数电阻8.2k130015.1k120014.7k1晶振11.059m1电容0.1u210u极性电容130100u极性电容1芯片at89c511电位器101三极管80501蜂鸣器5v1排针20口液晶显示屏16021按键四脚3三脚1发光二极管led1附录2 电路原理图附录3附录4 源程序27 rs equ p3.4 rw equ p3.5 ep equ p3.6pre bit p2.0 ;调整键(k1)adj bit p2.1 ;调整键(k2)spk bit p1.0 ;闹钟声音输出口year data 18h ;年,月,日变量month data 19hdate data 1ahweek data 1bhhour data 1ch ;时,分,秒,百分之一秒变量min data 1dhsec data 1ehsec100 data 1fhhour_arm data 20h ;闹钟时,分,秒,变量min_arm data 21hsec_arm data 22hstate data 23halarm bit state.0 ;闹钟是否启用标志1-启用,0-禁止leap bit state.1 ;是否闰年标志1-闰年,0-平年key_s data 24h ;当前扫描键值key_v data 25h ;上次扫描键值dis_buf_u0 data 26h ;lcd 上排显示缓冲区dis_buf_u1 data 27hdis_buf_u2 data 28hdis_buf_u3 data 29hdis_buf_u4 data 2ahdis_buf_u5 data 2bhdis_buf_u6 data 2chdis_buf_u7 data 2dhdis_buf_u8 data 2ehdis_buf_u9 data 2fhdis_buf_u10 data 30hdis_buf_u11 data 31hdis_buf_u12 data 32hdis_buf_u13 data 33hdis_buf_u14 data 34hdis_buf_u15 data 35hdis_buf_l0 data 36h ;lcd 下排显示缓冲区dis_buf_l1 data 37hdis_buf_l2 data 38hdis_buf_l3 data 39hdis_buf_l4 data 3ahdis_buf_l5 data 3bhdis_buf_l6 data 3chdis_buf_l7 data 3dhdis_buf_l8 data 3ehdis_buf_l9 data 3fhdis_buf_l10 data 40hdis_buf_l11 data 41hdis_buf_l12 data 42hdis_buf_l13 data 43hdis_buf_l14 data 44hdis_buf_l15 data 45hflag data 46h ;标识调整状态 0-闹钟功能,1-闹钟时,2-闹钟分,3闹钟秒;4-年,5-月,6-日,7-时,8-分,9-秒,10-退出调整。dis_h data 47hdis_m data 48hdis_s data 49hdis_s0 data 4ahdis_s1 data 4bhdis_s2 data 4chdis_s3 data 4dhdis_s4 data 4ehdis_s5 data 4fh;*初始化*org 0000hljmp startorg 000bhljmp timer0org 001bhljmp timer1org 0100hstart: mov sp,#60hmov r0,#18hmov a,#00hmem_ini: mov r0,ainc r0cjne r0,#5fh,mem_inilcall delay_5ms ;初始化lcdmov r0,#38h ;设置lcd 为16x2 显示,5x7 点阵,八位数据接口lcall lcd_wcmdlcall delay_5msmov r0,#0ch ;设置lcd 开显示及光标形式(光标不闪烁,不显示-)lcall lcd_wcmdlcall delay_5msmov r0,#06h ;lcd 显示光标移动设置(光标地址指针加1,整屏显示不移动)lcall lcd_wcmdlcall delay_5msmov r0,#01h ;清除lcd的显示内容lcall lcd_wcmdlcall delay_5ms;第一自定义字符:mov r0,#40hlcall lcd_wcmd ;01 000 000第1 行地址 (d7d6 为地址d5d4d3 为字符存放位置mov r0,#1fhlcall lcd_wdat ;xxx 11111第1 行数据(d7d6d5 为xxx,表示为任意数(d4d3d2d1d0 为字符行数据(1-点亮,0-熄灭)mov r0,#41hlcall lcd_wcmd ;01 000 001第2 行地址mov r0,#11hlcall lcd_wdat ;xxx 10001第2 行数据mov r0,#42hlcall lcd_wcmd ;01 000 010第3 行地址mov r0,#15hlcall lcd_wdat ;xxx 10101第3 行数据mov r0,#43hlcall lcd_wcmd ;01 000 011第4 行地址mov r0,#11hlcall lcd_wdat ;xxx 10001第4 行数据mov r0,#44hlcall lcd_wcmd ;01 000 100第5 行地址mov r0,#1fhlcall lcd_wdat ;xxx 11111第5 行数据mov r0,#45hlcall lcd_wcmd ;01 000 101第6 行地址mov r0,#0ahlcall lcd_wdat ;xxx 01010第6 行数据mov r0,#46hlcall lcd_wcmd ;01 000 110第7 行地址mov r0,#1fhlcall lcd_wdat ;xxx 11111第7 行数据mov r0,#47hlcall lcd_wcmd ;01 000 111第8 行地址mov r0,#00hlcall lcd_wdat ;xxx 00000第8 行数据;第二个自定义字符:mov r0,#48hlcall lcd_wcmd ;01 001 000第1 行地址mov r0,#01hlcall lcd_wdat ;xxx 00001第1 行数据mov r0,#49hlcall lcd_wcmd ;01 001 001第2 行地址mov r0,#1bhlcall lcd_wdat ;xxx 11011第2 行数据mov r0,#4ahlcall lcd_wcmd ;01 001 010第3 行地址mov r0,#1dhlcall lcd_wdat ;xxx 11101第3 行数据mov r0,#4bhlcall lcd_wcmd ;01 001 011第4 行地址mov r0,#19hlcall lcd_wdat ;xxx 11001第4 行数据mov r0,#4chlcall lcd_wcmd ;01 001 100第5 行地址mov r0,#1dhlcall lcd_wdat ;xxx 11101第5 行数据mov r0,#4dhlcall lcd_wcmd ;01 001 101第6 行地址mov r0,#1bhlcall lcd_wdat ;xxx 11011第6 行数据mov r0,#4ehlcall lcd_wcmd ;01 001 110第7 行地址mov r0,#01hlcall lcd_wdat ;xxx 00001第7 行数据mov r0,#4fhlcall lcd_wcmd ;01 001 111第8 行地址mov r0,#00hlcall lcd_wdat ;xxx 00000第8 行数据mov year,#5 ;置年初值mov month,#1 ;置月初值mov date,#1 ;置日初值mov dis_s0,#45h ;emov dis_s1,#61h ;amov dis_s2,#67h ;gmov dis_s3,#75h ;umov dis_s4,#69h ;imov dis_s5,#20h ; mov r1,#00h ;显示一自定义字符lcall week_prolcall update_buflcall display_pro ;屏显初始化;*主程序*main: mov ie,#8ah ;cpu 开中断,timer0,timer1 开中断mov tmod,#11h ;timer0,timer1 工作于模式1, 16 位定时方式mov th0,#0dch ;timer0 置10ms 定时初值mov tl0,#00hmov th1,#0ffh ;timer1 置闹钟声音初值mov tl1,#00hsetb alarm ;初始启动闹钟功能clr tr1 ;timer1 禁止setb tr0 ;timer0 启动mov key_v,#03hmain_1: lcall key_scanmov a,key_sxrl a,key_vjz main_1lcall delay_5mslcall delay_5mslcall key_scanmov a,key_sxrl a,key_vjz main_1mov key_v,key_smov a,key_vxrl a,#01hjnz main_2clr tr0 ;进入调整状态,禁止timer0mov ie,#00h ;cpu 禁止中断lcall key_pre_pro ;pre 按键按下,调用pre 按键处理程序sjmp main_1main_2: mov a,key_vxrl a,#02hjnz main_1lcall key_adj_pro ;adj 按键按下,调用pre 按键处理程序sjmp main_1;*按键扫描程序*key_scan: clr amov p1,#0ffhmov c,premov acc.1,cmov c,adjmov acc.0,cmov key_s,a ;本次扫描键值存入key_sret;*pre 按键处理程序*key_pre_pro: inc flagmov r4,flagcjne r4,#1,key_pre_1 ;注意,该指令不改变操作mov r0,#0ehlcall lcd_wcmd ;显示光标_,整个光标不闪烁mov dis_s0,#61h ;amov dis_s1,#6ch ;lmov dis_s2,#61h ;amov dis_s3,#72h ;rmov dis_s4,#6dh ;mmov dis_s5,#3ah ;:mov r1,#50h ;pmov dis_h,hour_armmov dis_m,min_armmov dis_s,sec_armlcall update_buflcall display_pro ;更新屏显内容mov r0,#47hlcall lcd_pos ;使光标位于第一个调整项下jmp key_pre_ekey_pre_1: cjne r4,#2,key_pre_2mov r0,#49hlcall lcd_pos ;光标置小时报警设置位置jmp key_pre_ekey_pre_2: cjne r4,#3,key_pre_3mov r0,#4chlcall lcd_pos ;光标置分钟报警设置位置jmp key_pre_ekey_pre_3: cjne r4,#4,key_pre_4mov r0,#4fhlcall lcd_pos ;光标置秒时报警设置位置jmp key_pre_ekey_pre_4: cjne r4,#5,key_pre_5mov dis_s0,#74h ;tmov dis_s1,#69h ;imov dis_s2,#6dh ;mmov dis_s3,#65h ;emov dis_s4,#3ah ;:mov dis_s5,#20h ; mov r1,#50h ;pmov dis_h,hourmov dis_m,minmov dis_s,seclcall update_buflcall display_pro ;更新屏显内容mov r0,#05hlcall lcd_pos ;光标置年调整位置jmp key_pre_ekey_pre_5: cjne r4,#6, key_pre_6mov r0,#08hlcall lcd_pos ;光标置月调整位置jmp key_pre_ekey_pre_6: cjne r4,#7,key_pre_7mov r0,#0bhlcall lcd_pos ;光标置日调整位置jmp key_pre_ekey_pre_7: cjne r4,#8,key_pre_8mov r0,#49hlcall lcd_pos ;光标置时调整位置jmp key_pre_ekey_pre_8: cjne r4,#9,key_pre_9mov r0,#4chlcall lcd_pos ;光标置分调整位置jmp key_pre_ekey_pre_9: cjne r4,#10,key_pre_10mov r0,#4fhlcall lcd_pos ;光标置秒调整位置jmp key_pre_ekey_pre_10: mov flag,#0 ;flag 到11,就清零mov r0,#0chlcall lcd_wcmd ;设置lcd 开显示及光标不闪烁,不显示-mov r0,#01hlcall lcd_wcmd ;清除lcd的显示内容mov ie,#8ah ;cpu 开中断,timer0,timer1 开中断setb tr0 ;启动timer0key_pre_e:ret;*adj 按键处理程序*key_adj_pro: mov r5,flagcjne r5,#0,key_adj_0 ;flag=0,如果有闹钟声音,就停止闹钟声音mov c,tr1jnc key_adj_aclr tr1key_adj_a: jmp key_adj_ekey_adj_0: cjne r5,#1,key_adj_1 ;flag=1,调整是否启用闹钟cpl alarmlcall update_buflcall display_promov r0,#47hlcall lcd_posjmp key_adj_ekey_adj_1: cjne r5,#2,key_adj_2 ;flag=2,调整闹钟时inc hour_armmov a,hour_armcjne a,#24,key_adj_1_1mov hour_arm,#0key_adj_1_1: mov dis_h,hour_armlcall update_buflcall display_promov r0,#49hlcall lcd_posjmp key_adj_ekey_adj_2: cjne r5,#3,key_adj_3 ;flag=3,调整闹钟分inc min_armmov a,min_armcjne a,#60,key_adj_2_1mov min_arm,#0key_adj_2_1: mov dis_m,min_armlcall update_buflcall display_promov r0,#4chlcall lcd_posjmp key_adj_ekey_adj_3: cjne r5,#4,key_adj_4 ;flag=4,调整闹钟秒inc sec_armmov a,sec_armcjne a,#60,key_adj_3_1mov sec_arm,#0key_adj_3_1: mov dis_s,sec_armlcall update_buflcall display_promov r0,#4fhlcall lcd_posjmp key_adj_ekey_adj_4: cjne r5,#5,key_adj_5 ;flag=5,调整年inc yearmov a,yearcjne a,#100,key_adj_4_1mov year,#0key_adj_4_1: lcall week_prolcall update_buflcall display_promov r0,#05hlcall lcd_posjmp key_adj_ekey_adj_5: cjne r5,#6,key_adj_6 ;flag=6,调整月inc monthmov a,monthcjne a,#13,key_adj_5_1mov month,#1key_adj_5_1: lcall week_prolcall update_buflcall display_promov r0,#08hlcall lcd_posjmp key_adj_ekey_adj_6: cjne r5,#7,key_adj_7 ;flag=7,调整日inc datemov a,monthxrl a,#2jnz key_adj_6_2 ;不是二月跳转mov a,date ;mov c,leap ;判断是否闰年jc key_adj_6_1xrl a,#29 ;平年二月日期28 天jnz key_adj_6_5jmp key_adj_6_4key_adj_6_1: xrl a,#30 ;闰年二月日期29 天jnz key_adj_6_5jmp key_adj_6_4 ;跳转到月处理key_adj_6_2: mov a,monthxrl a,#4jz key_adj_6_3mov a,monthxrl a,#6jz key_adj_6_3mov a,monthxrl a,#9jz key_adj_6_3mov a,monthxrl a,#11jz key_adj_6_3mov a,datexrl a,#32 ;大月日期31 天jnz key_adj_6_5jmp key_adj_6_4key_adj_6_3: mov a,datexrl a,#31 ;小月日期30 天jnz key_adj_6_5key_adj_6_4: mov date,#1key_adj_6_5: lcall week_prolcall update_buflcall display_promov r0,#0bhlcall lcd_posjmp key_adj_ekey_adj_7: cjne r5,#8,key_adj_8 ;flag=8,调整时inc hourmov a,hourcjne a,#24,key_adj_7_1mov hour,#0key_adj_7_1: mov dis_h,hourlcall update_buflcall display_promov r0,#49hlcall lcd_posjmp key_adj_ekey_adj_8: cjne r5,#9,key_adj_9 ;flag=9,调整分inc minmov a,mincjne a,#60,key_adj_8_1mov min,#0key_adj_8_1: mov dis_m,minlcall update_buflcall display_promov r0,#4chlcall lcd_posjmp key_adj_ekey_adj_9: cjne r5,#10,key_adj_e ;flag=10,调整秒inc secmov a,seccjne a,#60,key_adj_9_1mov sec,#0key_adj_9_1: mov dis_s,seclcall update_buflcall display_promov r0,#4fhlcall lcd_posjmp key_adj_ekey_adj_e:ret;*timer0 定时中断程序*timer0: mov th0,#0dchmov tl0,#00hinc sec100mov a,sec100cjne a,#100,timer0_emov sec100,#0lcall time_promov a,sec ;eagui 显示1 秒钟,消失一秒种,形成闪动anl a,#01jz timer0_1mov dis_s0,#20h ; mov dis_s1,#20h ; mov dis_s2,#20h ; mov dis_s3,#20h ; mov dis_s4,#20h ; mov dis_s5,#20h ; sjmp timer0_2timer0_1: mov dis_s0,#45h ;emov dis_s1,#61h ;amov dis_s2,#67h ;gmov dis_s3,#75h ;umov dis_s4,#69h ;imov dis_s5,#20h ; timer0_2: mov r1,#00hmov dis_h,hourmov dis_m,minmov dis_s,seclcall update_buflcall display_protimer0_e:reti;*timer1 定时中断程序*timer1: mov th1,#0ffhmov tl1,#00hcpl spkreti;*时间日期处理函数*time_pro: inc sec ;秒处理mov a,seccjne a,#60,time_pro_amov sec,#0inc min ;分处理mov a,mincjne a,#60,time_pro_amov min,#0inc hour ;时处理mov a,hourcjne a,#24,time_pro_amov hour,#0inc date ;日处理(日处理要考虑是否闰年,大月,小月)mov a,monthxrl a,#2jnz time_pro_d2 ;不是二月,转time_pro_d2mov a,date ;mov c,leap ;判断是否闰年jc time_pro_d1xrl a,#29 ;平年二月日期28 天jnz time_pro_wsjmp time_pro_m ;跳转到月处理time_pro_d1: xrl a,#30 ;闰年二月日期29 天jnz time_pro_wsjmp time_pro_m ;跳转到月处理time_pro_d2: mov a,monthxrl a,#4jz time_pro_d3mov a,monthxrl a,#6jz time_pro_d3mov a,monthxrl a,#9jz time_pro_d3mov a,monthxrl a,#11jz time_pro_d3mov a,datexrl a,#32 ;大月日期31 天jnz time_pro_wsjmp time_pro_m ;跳转到月处理time_pro_d3: mov a,datexrl a,#31 ;小月日期30 天jnz time_pro_wtime_pro_m: mov date,#1inc month ;月处理mov a,monthcjne a,#13,time_pro_wmov month,#1inc year ;年处理mov a,yearcjne a,#100,time_pro_wmov year,#0time_pro_w: lcall week_pro ;星期处理time_pro_a: jnb

温馨提示

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

评论

0/150

提交评论