毕业设计任务书一题目电子钟二基本要求利用单片机内部的定时器设计一个电子时钟,在LED上显示时、分、秒毕业设计报告写作要求一、封面二、内容提要三、目录四、正文1、概述所作题目的意义、本人所做的工作及系统的主要功能2、硬件电路设计及描述;3、软件设计流程及描述;4、源程序代码。五设计体会六、参考文献《单片微型计算机应用技术》徐仁贵机械工业出版社《单片机控制技术及应用》韩全立电子工业出版社。关键词单片机存储器数码管按键电铃一、绪论用单片机控制的自动打铃器,充分发挥单片机体积小,价格便宜,功耗低可靠性好等特点。可用于学校作息,方便了广大师生。同时也可作为电子手表的设计方案,两者在原理及实现的功能上是一样的效果,也可作为各种时钟控制电路的报警装置使用,具有用途范围广,原理简单便于操作和维护的优点总体上单片机设计方案在现实中应用非常广泛而且在现实生活中也比较容易实现设计的实施二、总体设计方案1.设计思路利用单片机及定时器设计的一个时钟,在每次秒加1的计时过程中,都与规定的时间作比较,如果相等就进行开关电铃,不等则返回。同时时时的时间显示功能为我们提供了方便2总体电路方框图三、设计原理分析1.校时模式按下K1(模式选择键),将模式选择为校时模式(模式指示灯黄灯亮),K2,K3,K4分别为时钟加1键,分钟加1键,秒钟加1键,K5无用。2.定时模式按下K1(模式选择键),将模式选择为定时模式(模式指示灯绿灯亮),K2为定时器组选择(本装置有24组定时器)键,K3,K4分别为定时器时钟加1键和定时器分钟加1键,K5为定时器状态选择键,每按K5一次,此组的定时器状态改变一次,并将此组数据存入片内数据存储器中按下K1(模式选择键),将模式选择为工作模式(模式指示灯红灯亮),K2,K3,K4,K5无用。此模式为正常工作模式3自动打零器电路图四、程序部分1.程序分为五部分1.初始化程序,2.键值处理程序,3.中断程序,4.显示程序,5显示驱动程序2.部分寄存器及按键说明28H:扫描指针寄存器20H--25H:显示缓存寄存器R6:时钟寄存器R5:分钟寄存器R4:秒钟寄存器K1:模式选择键K2:时加1(定时器组加1)键K3:分加1(定时器时加1)键K4:秒加1(定时器分加1)键K5:定时器状态改变既存储键3.程序流程图4总体软件流程图的解释总体流程图的定时器首先设定一个时间,执行程序时及进入计时程序。通过加一比较程序与设定的计时程序进行比较,如果不到计时时间执行中断返回指令。在此时如果校时键启动时可进行校时作用。而LED显示器也通过8051控制程序实时传来的数据进行显示工作。LED也是动态的显示方式。5校时程序流程图首先进入校时显示模式,此时K1如果有按下,校时程序即可执行。此时如果K2手工操作下被按下则计时加一,达到与想要的结果一致即可停止K2的操作,如果计时结果在现在时间之前则可一直按下直到到达24小时一个循环时候,然后再次按下达到想要的计时结果。而24时也是校时循环终点。此时指示灯也有所变化。可以作为执行程序效果的参考。而校分流程图也对整体软件流程产生影响,最终达到时间的精确。小时和分钟的实时显示是定时的基础。6校分及显示流程图解释首先进入校分模式时看K1是否按下,如果按键则K3是否有按键,如果有则分钟加一,如此便起到修改分钟的作用,如果分钟修改到达60分钟则分钟全部清零,分钟计时重新开始。如果K1键没有按下,则小时和分钟数据进入显示缓存器,然后进入显示器显示,此时看K1键是否还在断开状态,如果没有按下则时间还是显示而不做变化如果K1键按下则此时进入定时器进入工作状态,因此K1键是程序运行的关键所在,在K1键进入工作状态的同时修改小时和分钟及定时器的工作程序才能进行7程序清单1.初始化程序:READEQU0;读RAMWRITEEQU2;写入RAMEWENEQU4;RAM写入使能EWDSEQU6;RAM写入禁止ADR46EQU21H;RAM地址显示显示启动定时器进入工作状态时分值送显示缓存区K1有按键吗?清分单元显示分值加1置校分标志K3有按键吗?K1有按键吗?是60分吗?THIGHEQU0F8HTLOWEQU5FHTIMENEQU30;打铃持续时间(30秒)CSBITP3.7;RAMCSCLKBITP3.6;RAMCLKDIBITP3.5;RAMDIDOBITP3.4;RAMDOORG0000H;主程序起始地址AJMPSTART;跳至主程序ORG000BH;TIMER0中断起始地址AJMPTIM0;跳至TIMER0中断子程序START:MOVSP,#60H;设置堆栈在60HMOV28H,#00;显示寄存器初值为00MOVR6,#12H;“时”寄存器值为12HMOVR5,#00H;“分”寄存器值为00HMOVR4,#00H;“秒”寄存器值为00H2.键值处理程序:LOOP:SETBP0.5;工作模式CLRP0.6CLRP0.7JBP0.0,N1;K1(模式选择键)按了?不是则跳至N1ACALLDELAY;消除抖动JNBP0.0,$;K1(模式选择键)放开了?ACALLDELAY;消除抖动AJMPSET;转到定时模式SETN1:MOV2FH,R6;将时钟数据载入2FH中MOV2EH,R5;将分钟数据载入2EH中MOVRAM,#00;把93C46地址置0SETBRS0;将工作寄存器组选择1区LOOP1:MOVA,#READ;读RAMACALLRAMMOVA,R3;取出定时器的状态ANLA,#01HCJNEA,#01H,N2;定时器为关闭,则跳转至N2MOVA,R4;取出定时器分钟数据CJNEA,2FH,N2;定时器分钟数据与时钟分钟不同则转至N2MOVA,R5;取出定时器时钟数据CJNEA,2EH,N2;定时器时钟数据与时钟时钟不同则转至N2MOVTMOD,#01H;MOVTH0,#THIGH;MOVTL0,#TLOWH;SETBTR0SETBP2.1;定时器时间到,打铃MOVR7,#9678H;中断查询7500次让时间达到30秒SJMP$TISE:DJNER7CPLP2.1终止打铃MOVA,RAM;将RAM地址载入A中N2:CJNEA,#1EH,N3;到定时器数据表表尾?没到转至N3MOVADR46,#00;到表尾,置RAM地址为表头AJMPLOOP1;转至LOOP1N3:INCRAM;RAM地址加2INCRAMAJMPLOOP1;转至LOOP1SET:CLRP0.5;校时模式SETBp0.6高电平CLRP0.7低电平LOOPS:JBP0.0,N11;K1(模式选择键)按了?不是则跳至N11ACALLDELAY;消除抖动JNBP0.0,$;K1(模式选择键)放开了?ACALLDELAY;消除抖动AJMPSETTIME;转至SETTIMEN11:JBP0.1,N13;K2(时钟加1键)按了?不是则跳至N13ACALLDELAY;消除抖动MOVA,R6;将时寄存器的值载入AADDA,#01H;A内容加1DAA;做十进制调整MOVR6,A;将A的值存入时寄存器CJNEA,#24H,N12;是否超过24时?不是则跳至N12MOVR6,#00H;是则清除时寄存器的值为00N12:JNBP0.1,$;K2(时钟加1键)放开了?ACALLDELAY;消除抖动N13:JBP0.2,N15;K3(分钟加1键)按了?不是则跳至N15ACALLDELAY;消除抖动MOVA,R5;将分寄存器的值载入AADDA,#01;A内容加1DAA;做十进制调整MOVR5,A;将A的值存入分寄存器CJNEA,#60H,N14;是否超过60分?不是则跳至N14MOVR5,#00H;是则清除分寄存器的值为00N14:JNBP0.2,$;K3(分钟加1键)放开了?ACALLDELAY;消除抖动N15:JBP0.3,N17;K4(秒钟加1键)按了?不是则跳至N17ACALLDELAY;消除抖动MOVA,R4;将秒寄存器的值载入AADDA,#01;A内容加1DAA;做十进制调整MOVR4,A;将A的值存入秒寄存器CJNEA,#60H,N16;是否超过60秒?不是则跳至N16MOVR4,#00;是则清除分寄存器的值为00N16:JNBP0.3,$;K4(秒钟加1键)放开了?ACALLDELAY;消除抖动N17:AJMPLOOPS;转至LOOPSSETTIME:CLRP0.5;定时模式CLRP0.6SETBP0.7MOVRAM,#00HMOVA,#READ;将数据存储器的地址为RAM中的数据ACALLTORAMLOOPB:ACALLDISP;调用DISPJBP0.0,N21;K1(模式选择键)按了?不是则跳至N21ACALLDELAY;消除抖动JNBP0.0,$;K1(模式选择键)放开了?ACALLDELAY;消除抖动AJMPLOOP;转至LOOPN21:JBP0.1,N22;K2(定时器组加1键)按了?不是则跳至N22ACALLDELAY;消除抖动MOVA,RAM;将地址载入ACLRC;清除进位位RRCA;A右移1位ADDA,#01H;地址加1MOVR6,A;将A存入R6CLRC;清除进位位RLCA;A左移1位MOVRAM,A;将A中地址存入RAMMOVA,#READ;读RAM地址为ADR46中的数据ACALLTORAMJNBP0.1,$;K2(定时器组加1键)放开了?ACALLDELAY;消除抖动N22:JBP0.2,N24;K3(定时器分钟加1键)按了?不是则跳至N24ACALLDELAY;消除抖动MOVA,R4;将定时器分寄存器的值载入AADDA,#01;A内容加1DAA;做十进制调整MOVR4,A;将A的值存入定时器分寄存器CJNEA,#60H,N23;是否超过60分?不是则跳至N16MOVR4,#00H;是则清除分寄存器的值为00N23:JNBP0.2,$;K3(定时器分钟加1键)放开了?ACALLDELAY;消除抖动N24:JBP0.3,N26;K4(定时器时钟加1键)按了?不是则跳至N26ACALLDELAY;消除抖动MOVA,R5;将定时器时寄存器的值载入AADDA,#01H;A内容加1DAA;做十进制调整MOVR5,A;将A的值存入定时器时寄存器CJNEA,#24H,N25;是否超过24时?不是则跳至N25MOVR5,#00;是则清除分寄存器的值为00N25:JNBP0.3,$;K4(定时器时钟加1键)放开了?ACALLDELAY;消除抖动N26:JBP0.4,N27;K5(改变定时器状态存储键)按了?不是则跳至N27ACALLDELAY;消除抖动INCR3;改变R3最低位的值(表示定时器的状态,1表示开,0表示关)MOVA,#WRITE;将A的值写入RAM地址为ADR46中ACALLTORAMJNBP0.4,$;K5(改变定时器状态存储键)放开了?ACALLDELAY;消除抖动N27:AJMPLOOPB;转至LOOPB3.中断程序:TIM0:MOVTH0,#THIGH;重设计时4000微秒MOVTL0,#TLOWPUSHACC;将A的值存入堆栈PUSHPSW;将PSW的值存入堆栈CLRRS0;设置工作寄存器为0区DJNZR2,X2;计时1秒MOVR2,#250ACALLCLOCK;调用计时子程序CLOCKACALLDISP;调用显示子程序X2:ACALLSCAN;调用扫描子程序POPPSWPOPACCRETI4.显示器驱动程序:SCAN:MOVR0,#28H;(28H)为扫描指针INC@R0;扫描指针加1CJNE@R0,#6,X3;扫描完6个显示器?不是跳至X3MOV@R0,#00;是则扫描指针为0X3:MOVA,@R0;扫描指针载入AADDA,#20;A加常数20H(显示寄存器地址)=各时间显示区地址;存入R1=各时间显示地址MOVR1,A;扫描指针存入AMOVA,@R0;将A高低4位交换(P1高4位为扫描