演讲限时计时器
- 格式:doc
- 大小:510.00 KB
- 文档页数:16
开放式单片机应用系统专题设计专题名称:演讲定时器班级:光电1103班姓名:彭超学号:U201114995指导老师:曹丹华一、任务要求基本要求:1.计时精度为1秒2.可通过键盘设置规定的演讲时间3.有启动、停止键、复位键4.时间过半有声音提示(1秒)5.正常演讲时绿灯每隔3秒闪烁一次(亮1s熄2s)6.演讲结束前一分钟有声音提示,同时指示灯由绿灯变为黄灯,且闪烁频率不断加快,到达定时时间蜂鸣器长鸣2秒二、功能特点及使用说明功能特点:1.可以调节LED数码管的亮度,以适应不同环境的需求,在周围环境较暗是亦可降低LED数码管的亮度节省电池电量,如果做成工业产品必定是便携式的,耗电量很重要(其实这玩意儿做单片机上估计没人用,编一个手机上用的app还是蛮不错的)2.设置了两种计时模式,一种是直接输入[秒数](比如演讲3分钟,输入0180),另一种是输入[分.秒](比如演讲3分钟,输入0300)3.设置了静音键,当演讲者希望关闭声音时,可以使用按键来关闭声音4.设置了一个重置键,用来重置机器5.设置了一对RUN/STOP键,用来暂停/恢复演讲计时使用说明:1.键盘整个键盘被分为十个数字键和六个功能键,各键功能:开机之后通过数字键0、1来选择模式2.声音数码管最末尾的小数点代表声音是否打开,按F12可关闭声音3.亮度调节按F14可以增加亮度,按F13可以降低亮度,总共设置了六级亮度,足以适应生活中对亮度的要求4.锁定暂停恢复F11可以暂停计时,之后可以通过F10来恢复计时5.软件重启F15可以在任何时候复位机器,在计时结束之后必须通过F15才可以重新设置计时6.模式选择开机后的画面如左图所示现在按下0可进入模式0按下1可进入模式1进如模式1后的画面如左图所示中间小数点左边数字为分右边的为秒按下数字键由高位到低位依次录入数据左图为7分28秒最末位的小数点表示声音打开进如模式0后的画面如左图所示按下数字键由高位到低位依次录入数据三、设计方案1.定时与中断的选择由于要控制黄灯的闪烁频率,亮1s,灭2s,之后亮1s,灭1.95s……黄灯熄灭的的时间为公差为50ms的等差数列故选择定时器定时时间为50ms,在中断内设置一个20分频的寄存器,每一秒钟加一,主程序中识别这个1s刺激信号来运作关于CPU时钟的选择,当然我情愿去选24.5MHz,这样指令跑的比较快,但是这样做会使CPU的负荷更高,并且做软件延时的时候需要更多次循环,不仅编写程序时要多加两条语句,更加重了CPU的负担,于是我的CUP时钟选取了最低的3.0625MHz2.按键的设计按键了解清楚是由低四口驱动的话就给高四口送高电平,低四口写入低电平,每当有键按下,高四口对应的引脚的电平就会被拉低,由此来涉及按键程序(消抖还有取键值等基本内容就不必多讲了)3.计时时间的输入开机后,在选完模式之后按顺序由高位到低位输入数据,如果有数字键按下,则通过一个指针直接将输入的键值直接写入显存,以后要使用的时候也直接从显存调用,非常方便4.绿灯闪烁的控制绿灯由于要3秒闪一次,所以之间使用一个寄存器做三分频,然后来控制绿灯在其中1s种内亮,而剩下的两秒种内熄灭5.黄灯变频闪烁的实现方法黄灯的变频闪烁要在时间到达最后60s才会启动,黄灯每次点亮1s之后熄灭一段时间,熄灭的时间是一个递减的等差数列,这样就可以做到黄灯的闪烁频率逐渐加快(经过计算后熄灭的时间依次为2s 1.95s 1.9s ……..0s),由于黄灯的程序比较短,置于中断中,在提高程序稳定性的同时不会致使中断过于冗长6.蜂鸣器的控制中断每一秒钟产生一个信号,之后主程序在接受到这个信号之后开始进行一系列的工作,其中就有判断现在蜂鸣器是否应该响,如果蜂鸣器响了,那么下一秒就会被关掉,这样就做到了响1s 结束时需要响两秒,这只需要一个2s中的延时程序,延时结束之后再将蜂鸣器关掉我还设置了一个静音键,每当蜂鸣器要工作时,都会检查静音控制单元,再确定是否打开蜂鸣器7.两种计时模式下显示的区分方法在模式选择时建立了一个模式控制字,显示时通过模式控制字来确定2号数码管是否显示小数点老区别分和秒8.亮度调节与按键静音的实现亮度控制字设置了六级亮度控制,每当显示完之后都会查询亮度控制字来确定LED灯的熄灭时间,一用人的视觉暂留效应,熄灭时间越长,LED就显得越暗9.暂停复位功能暂停就是机器动态停机,主要是关闭中断,还要在动态刷新显示器和按键,以对复位键的按下做出响应,再打开中断恢复机器状态四、流程图五、源程序系统内存分配表:File name: mcu_pengchao.asmDescription: 演讲计时器Date: 2013-11-7Designed by: 彭超光电1103班U201114995Source used: 30H,31H,32H,33H,34H,35H,36H,37H38H,39H,3AH3BH,3CH,3DH,3EH40H,41H,42H,43H,44H,45H,46H47H,48H,4AH,4BH,4CH,4DH,4EHR0,R1,R2,R3,R4,R5,R6,R7,R8,A,B;data;请参照上页的系统内存规划表比对其含义$include (C8051F310.inc)ORG 0000HSJMP STARTORG 000BHSJMP T0IORG 0030HSTART: MOV SP,#50HACALL Init_DeviceACALL OTHERSMAIN: ACALL MODCHOOSEACALL INPUTACALL READYMOV R7,#0TIME: ACALL DAKMOV A,R7CJNE A,3AH,CHANGESJMP TIMECHANGE: MOV 3AH,R7ACALL DISCHANGEACALL LEDCONACALL VOICESJMP TIME;///////////////////////////////////////////////;// 中断服务//;////////////////////////////////////////////////T0I: MOV TL0,#138 ;载入计时初值(50ms) MOV TH0,#244PUSH ACC ;保护现场PUSH PSWINC 45HMOV A,45HCJNE A,#20,JIXUMOV 45H,#0INC R7JIXU: CJNE R5,#4,TUICHU ;黄灯置于中断中ACALL YELLEDTUICHU: POP PSW ;恢复现场POP ACCRETI;///////////////////////////////////////////////;// 黄灯控制//;///////////////////////////////////////////////YELLED: MOV A,46HCJNE A,#0,CLSD9 ;判断该亮还是该灭MOV 44H,#0CLR P0.0INC 47HMOV A,47HCJNE A,#20,JIESHU ;亮1sMOV 47H,#0MOV 46H,#1SJMP JIESHUCLSD9: MOV 44H,#1SETB P0.0DEC 49HMOV A,49HCJNE A,#0,JIESHUMOV 46H,#0DEC 48HMOV 49H,48H ;灭的时间每次减少50ms JIESHU: RET;////////////////////////////////////////////////;// 模式选择//;///////////////////////////////////////////////MODCHOOSE: ACALL DAKCJNE A,#0,JXMOV 3DH,#0 ;选择模式0后显示----MOV 36H,#0AHMOV 37H,#0AHMOV 38H,#0AHMOV 39H,#0AHRETJX: CJNE A,#1,MODCHOOSEMOV 3DH,#1 ;选择模式1后显示≡.≡MOV 36H,#0CHMOV 37H,#0CHMOV 38H,#0CHMOV 39H,#0CHRET;////////////////////////////////////////////////;// 显示与按键//;////////////////////////////////////////////////DAK: ACALL DISACALL SCANKEYACALL KEYRET;显示DIS: MOV R0,#36HMOV R3,#00HMOV A,R3DX: ORL A,44H ;黄灯也要使用P0口(44H为黄灯控制单元)MOV P0,AMOV A,@R0MOV DPTR,#DSGMOVC A,@A+DPTRCJNE R0,#36H,PDMOV R4,35HCJNE R4,#1,DIR ;声音开启时显示末位的小数点INC ASJMP DIRPD: CJNE R0,#38H,DIRMOV R4,3DHCJNE R4,#1,DIR ;模式2时显示中间的小数点来分隔分秒INC ADIR: MOV P1,AACALL D2MSINC R0MOV A,R3ADD A,#40HJC LDMOV R3,ASJMP DXLD: MOV P1,#0;通过34H单元控制延时,实现亮度控制MOV A,34HCJNE A,#5,TO4RETTO4: CJNE A,#4,TO3ACALL D2MSACALL D2MSRETTO3: CJNE A,#3,TO2MOV R4,#6HERE1: ACALL D2MSDJNZ R4,HERE1RETTO2: CJNE A,#2,TO1MOV R4,#9HERE2: ACALL D2MSDJNZ R4,HERE2RETTO1: CJNE A,#1,TO0MOV R4,#15HERE3: ACALL D2MSDJNZ R4,HERE3RETTO0: MOV R4,#29HERE4: ACALL D2MSDJNZ R4,HERE4RETD2MS: MOV R2,#0DEL: NOPNOPDJNZ R2,DELRETDSG: DB 0FCH,060H,0DAH,0F2H,066H,0B6H,0BEH DB 0E0H,0FEH,0F6H,002H,06CH,092H,3H,7H,17H;键盘扫描SCANKEY: ANL P2,#0F0H ;低四位同时写0,看高四位哪一位为0,则对应列号MOV A,P2CJNE A,#0F0H,K1MOV A,#16MOV 43H,#16 ;无键按下,返回键值为16RETK1: ACALL DELAYANL P2,#0F0HMOV A,P2CJNE A,#0F0H,K2SJMP SCANKEYK2: ACALL KVCK3: MOV P2,#0F0HMOV A,P2CJNE A,#0F0H,K3 ;等待按键松开ACALL DELAYMOV A,R2MOV B,#04H ;根据行列号计算键值MUL ABADD A,R3MOV 43H,ARET;低四位同时写0,看高四位哪一位为0,则对应列号KVC: MOV 40H,A ;将P2端口高四位的状态存于40H中,留待行的判断MOV R2,#04HLIE: SETB CRLC ADEC R2JC LIE ;列号存在R2中MOV R3,#0FFHMOV 41H,#0FEH ;低四位依次写零(低四位具有驱动能力)MOV 42H,#0FEHMOV R0,#42HMOV P2,#0FEHHANG: MOV A,P2XCHD A,@R0MOV P2,AMOV A,41HRL AMOV 41H,AMOV 42H,AMOV A,P2ANL A,#0F0H ;A的低四位清零,用来和R4的高四位进行判断INC R3 ;行号存在R3中CJNE A,40H,HANGRETDELAY: MOV R4,#16LP1: MOV R6,#250LP2: DJNZ R6,LP2DJNZ R4,LP1RET;键值响应KEY: CJNE A,#16,NEXT ;无键按下SJMP GIVENEXT: CJNE A,#15,NEXT1 ;复位键AJMP STARTNEXT1: CJNE A,#14,NEXT2 ;增加亮度MOV R3,34HCJNE R3,#5,THEN1SJMP GIVETHEN1: INC 34HSJMP GIVENEXT2: CJNE A,#13,NEXT3 ;减小亮度MOV R3,34HCJNE R3,#0,THEN2THEN2: DEC 34HSJMP GIVENEXT3: CJNE A,#12,NEXT4 ;关闭声音MOV R1,35HCJNE R1,#1,THEN3MOV 35H,#0SJMP GIVETHEN3: MOV 35H,#1SJMP GIVENEXT4: CJNE A,#11,GIVE ;暂停ACALL STOPGIVE: MOV A,43HRET;锁定STOP: CLR ET0CLR TR0ACALL DISACALL SCANKEYCJNE A,#10,STOPSETB ET0SETB TR0RET;///////////////////////////////////////////////;// 声音控制//;///////////////////////////////////////////////VOICE: ACALL VOICE_HALFACALL VOICE_60SACALL VOICE_ENDRETVOICE_HALF: CLR P3.1MOV A,3BHCJNE A,#1,MIN ;如果之前就过一半了,则跳过该程序CLR CMOV A,32HSUBB A,#1MOV 32H,AMOV A,33HSUBB A,#0MOV 33H,A;减法结束CJNE A,#0FFH,MINMOV 3BH,#0MOV A,35HCJNE A,#1,MINSETB P3.1MIN: RETVOICE_60S: MOV A,31HCJNE A,#0,NXNX ;如果输入值小于60s,则跳过MOV A,30HCJNE A,#61,LEXXLEXX: JNC NXNXMOV R5,#4SJMP MIMNXNX: MOV A,3CH ;如果之前就在60s响过了,则跳过CJNE A,#1,MIMMOV A,3DH ;模式判别(3DH为模式控制单元)CJNE A,#0,MOOD2MOV A,39HCJNE A,#0,MIMMOV A,38HCJNE A,#0,MIMMOV A,37HCJNE A,#6,MIMMOV A,36HCJNE A,#0,MIMSJMP MIIMOOD2: MOV A,39HCJNE A,#0,MIMMOV A,38HCJNE A,#1,MIMMOV A,37HCJNE A,#0,MIMMOV A,36HCJNE A,#0,MIMMII: MOV 3CH,#0MOV R5,#4MOV A,35HCJNE A,#1,MIMSETB P3.1MIM: RET;结束判断VOICE_END: MOV A,39HCJNE A,#00H,RUNMOV A,38HCJNE A,#00H,RUNMOV A,37HCJNE A,#00H,RUNMOV A,36HCJNE A,#00H,RUNCLR ET0CLR TR0CLR EAMOV A,35HCJNE A,#1,NXSETB P3.1NX: MOV R3,#0NUX: ACALL DELAY ;延时2s(响2s)DJNZ R3,NUXMOV R3,#0NUY: ACALL DELAYDJNZ R3,NUYCLR P3.1ED: ACALL DAKSJMP EDRUN: RET;///////////////////////////////////////////////;// 绿灯控制//;////////////////////////////////////////////////LEDCON: CJNE R5,#4,GRELED ; R5=4意味着绿灯不应该亮(最后60s了)SJMP MIEGRELED: INC R5CJNE R5,#3,MIE ;R5在0 1 2之间循环(3秒中有一秒被点亮)MOV R5,#0CLR P3.3MOV R3,#8LOOP: CLR P3.4SETB P3.4DJNZ R3,LOOPSJMP HALFMIE: SETB P3.3MOV R3,#8LUUP: CLR P3.4SETB P3.4DJNZ R3,LUUPHALF: RET;////////////////////////////////////////////////;// 输入数值//;///////////////////////////////////////////////INPUT: LCALL DAKCJNE A,#10,GOONGOON: JC GOSJMP INPUTGO: DEC R1MOV @R1,ACJNE R1,#36H,INPUTWAIT: LCALL DAKCJNE A,#10,WAITRET;///////////////////////////////////////////////;// 准备计时//;///////////////////////////////////////////////READY: MOV A,3DHCJNE A,#0,MD1 ;模式判别;数值提取MOV A,37HMOV B,#10MUL ABMOV 4AH,AMOV A,38HMOV B,#100MUL ABMOV 4BH,AMOV 4CH,BMOV A,39HMOV B,#10MUL ABMOV B,#100MUL ABMOV 4DH,AMOV 4EH,BMOV A,36HADD A,4AHADD A,4BHMOV 4BH,AMOV A,4CHADDC A,4EHMOV 4EH,AMOV A,4BHADD A,4DHMOV 30H,AMOV A,4EHADDC A,#0MOV 31H,A ;(模式0)转化为16进制数后存放于30H 31H单元SJMP CHUYI2MD1: MOV A,37HMOV B,#10MUL ABADD A,36HMOV 4AH,AMOV A,39HMOV B,#10MUL ABADD A,38HMOV B,#60MUL ABADD A,4AHMOV 30H,AMOV A,BADDC A,#0MOV 31H,A ;(模式1)转化为16进制数后存放于30H 31H单元CHUYI2: CLR CRRC AMOV 33H,AMOV A,30HRRC AMOV 32H,A ;除以2后存放于32H 33H单元;3 2 1 GOSETB EASETB ET0MOV TL0,#0C6HMOV TH0,#06HSETB TR0RET;开始计时;///////////////////////////////////////////////;// 显存减一//;///////////////////////////////////////////////DISCHANGE: MOV A,3DHCJNE A,#0,MOD1 ;模式识别DEC 36HMOV A,36HCJNE A,#0FFH,SHIWEIMOV 36H,#09HDEC 37HSHIWEI: MOV A,37HCJNE A,#0FFH,BAIWEIMOV 37H,#09HDEC 38HBAIWEI: MOV A,38HCJNE A,#0FFH,QWEIMOV 38H,#09HDEC 39HQWEI: MOV A,39HCJNE A,#0FFH,NUNUMOV 39H,#09HSJMP NUNUMOD1: DEC 36HMOV A,36HCJNE A,#0FFH,MIAOMOV 36H,#09HDEC 37HMIAO: MOV A,37HCJNE A,#0FFH,FENMOV 37H,#05HDEC 38HFEN: MOV A,38HCJNE A,#0FFH,TWEIMOV 38H,#09HDEC 39HTWEI: MOV A,39HCJNE A,#0FFH,NUNUMOV 39H,#05H NUNU: RETI;/////////////////////////////////////////////// ;// 内存的初始化// ;/////////////////////////////////////////////// OTHERS: CLR P3.1MOV 44H,#1MOV R1,#3AHMOV 43H,#0MOV 3AH,#0MOV 3BH,#1MOV 3CH,#1MOV 34H,#3MOV 35H,#1MOV 36H,#11MOV 37H,#11MOV 38H,#11MOV 39H,#11MOV R5,#0MOV 3DH,#3MOV 46H,#0MOV 48H,#40MOV 49H,#40RET;/////////////////////////////////////////////// ;// 单片机初始设置// ;/////////////////////////////////////////////// Init_Device:; PCA_Initanl PCA0MD, #0BFhmov PCA0MD, #000h; Timer_Initmov TMOD, #001hmov CKCON, #002hmov TL0, #0C6hmov TH0, #006h; Port_IO_Initmov P0MDOUT, #001hmov P1MDOUT, #0ffhmov XBR1, #040h; Interuput_InitCLR ET0CLR EACLR TR0retEND六、程序测试方法与结果七、心得与体会这次单片计划课程设计是我第一次亲手设计一个完整的系统,我的完成时间应该是比较短的,也没有感受到想象中的难度,不过这次设计确实在很多方面不同于平时课堂上的一些简单的程序我最大的感受就是流程图在系统设计中的作用,画好流程图,思路就清晰了,如果构思没有错误的话,剩下的事情就是矫正一些细节的错误,在抽选好题目之后就开始构思,大概花了一天把主程序和各个模块都构思好了,结下来的两天对着流程图敲代码,然后逐个模块进行调试,在第四天的时候就已经可以在开发板上跑出符合设计要求的结果了(当时只有键盘的部分是使用我同学的,我写的键盘程序在后来周四上机的时候让两位助教看了将近两个小时之后终于找到了问题,在这里真心的对助教表示感谢)我选择使用汇编语言编写程序,而没有选择自己熟悉的C,在现在看来这是一个比较正确的选择,用汇编语言写程序直接和硬件挂钩,了解了每隔端口的配置,深入理解了单片机结构和工作原理之后才会避免出现一些错误,如果当时用C来编写,不仅有可能使某些代码经过汇编之后变的很冗长,更重要的是自己有可能根本就不了解这些代码在机器中怎么运行,机器对代码处理的过程,,当然,这也体现了汇编语言编写程序的优点以往写小程序都不怎么主意的问题在这次课设中都暴露出来了,尤其是在内存的规划上,比如在完成计时的子模块之后的调试中发现,在输入数值大于768的时候中断会异常的没有办法打开,后来检查才发现是自己用了内存中几个Temp,它们的位置刚好在SFR内,后来就集中规划了内存,重新设置了堆栈栈底才解决问题总之这次课程设计培养了自己汇编语言遍写程序的能力,加深了自己对单片机的理解,也提升了自己对硬件层面程序语言的认识,对今后的学习和工作有很大帮助设计人签名:。