电子秒表与闹钟

  • 格式:doc
  • 大小:177.00 KB
  • 文档页数:18

目录摘要 (Ⅰ)1 系统概述 (2)1.1 基本要求 (2)1.2 发挥部分 (2)1.3 实验功能 (2)2 方案考虑 (3)2.1 硬件方案 (3)2.2 软件方案 (3)3 方案比较 (4)3.1 显示部分 (4)3.2 焊接部分 (4)3.3 按键部分 (4)4 程序流程图设计 (5)5 PROTUES仿真原理图 (9)6 课程设计体会 (10)参考文献 (11)附1:课程设计原理图 (12)附2:源程序代码 (13)1 系统概述1.1 基本要求(1) 显示准确的北京时间(时、分、秒),可用24小时制式;(2) 随时可以调校时间;(3) 允许通过转换功能键转换显示时间;(4) 所有按键需要通过串口自发自收来调校各种功能。

1.2 发挥部分(1)增加秒表功能(2)增加闹铃功能1.3 实验功能本系统是基于单片机AT89S52制作的数字电子钟。

根据实验要求,在完成实验所要求的基本功能外,扩展了几个功能。

硬件系统设计方面:采用六位LED 数码管,用切换的方式显示时间和设置的闹钟时间;可调整时间以及闹钟时间;具有设置闹钟的功能。

软件系统设计方面:程序采用汇编语言编写,使自己更加理解硬件语言以及其工作原理;“时钟”基准时间由单片机内部的定时中断提供用一个计数器对定时中断的次数进行计数,可实现“秒”定时,同理可以进行“分”﹑“时”定时;采用按键查询功能复用,简化了程序的设计;采用动态扫描法显示6位数码管。

2.1 硬件方案(1)采用6位LED数码管显示时间。

(2)采用“动态扫描驱动”,但所需驱动电流要大。

(3)显示部分也可采用液晶,但液晶成本较高。

(4)键盘的按键数目较多时则采用行列式矩阵结构为好。

“一键多用”的构思和设计能大为减少按键的数目。

(5)整体设计上应考虑其结构简单﹑操作简便﹑布局美观﹑成本低廉。

2.2 软件方案(1)“时钟”基准时间由单片机内部的定时中断提供,定时时间应是“秒”的整除数,且长短适宜。

最长不能超过16位定时器的最长定时时间;最短不能少于中断服务程序的执行时间。

通常来说基准时间越短,越有利于提高时钟的运行精确度。

(2)用一个计数器对定时中断的次数进行计数,可以进行“分”﹑“时”定时。

(3) LED 数码管显示器采用“动态扫描驱动”时要注意的是:驱动信号的维持时间必须大于“起辉时间”(电流大起辉时间短),而驱动信号的间歇时间必须小于“余辉时间”(电流大余辉时间长),但驱动电流大小受硬件电路能力和LED数码管极限功耗的制约。

(4)动态扫描显示方式在更新显示内容时,因LED数码管余辉的存在可能会造成显示字符的模糊,新内容写入显示器之前须将所有的LED数码管熄灭。

3.1 显示部分我们采用了数码管显示,鉴于数码管也能实现基本的功能,而且液晶成本又太昂贵,同时我们放弃了用译码芯片,一方面进一步降低成本,另一方面少了部分电路,减少错误产生。

3.2 焊接部分印制电路板的特点是布线紧凑、优点是美观,跳线少,线路稳定,主要的工作量在于前期原理图的绘制跟PCB板的布线,缺点是腐蚀容易不均匀而断线;而手工焊万用板优点是可变性高,自由度高,主要工作量是原理图的布线与跳线的构思跟焊接,缺点是电路板焊接麻烦。

我们选择手工焊万用板的原因:原材料提供的只是万用板,从按照题目要求的方面考虑;万用板便于功能的扩展,板上也留了很多空位为创新功能使用。

3.3 按键部分按键方面,主要是采用矩阵键盘扫描跟按键查询。

矩阵键盘扫描法用到比较多的按键,使操作复杂,资源得不到充分利用。

为了避免不必要的失误,所以采用“按键查询,一个功能一个按键”的方式,排列整齐,简洁美观。

4 程序流程图设计主程序流程图:当有不同按键,进入不同的服务子程序,同时在查询的时候判断是不是整点,有没有到达闹铃设置的时间,进入服务子程序采用的是查询的模式。

秒表子程序流程图:闹铃程序流程图:实现闹钟功能主要有两个步骤,首先是能在按键中把闹钟数值写进寄存器,实现存储功能。

其次是根据在查询按键服务程序中作判别,检查当前时间是否与闹铃时间相等,如果相等,则使在相应时间时对蜂鸣器提供驱动电流即可。

就实现了闹钟设置的功能。

TO中断子程序:5 PROTUES仿真原理图列出元件连线仿真,如图5.1图5.1电子秒表与闹钟的系统可分为四个环节,分别是单片机控制系统、时间显示模块、控制键模块和闹铃模块。

通过若干模块的协调工作就可以完成相应的时间调整和定时闹钟的相应功能以及显示功能。

单片机控制系统由可编程可擦除只读存储器AT89C51构成,此设计中用到了C51单片机的中断系统,并行口设计和定时器等功能。

时间显示模块显示部分采用六位一体共阳数码管,自左到右分别显示时时-分分-秒秒。

控制键模块,其中K1键为闹钟设置键,K2为小时设置键,K3为分钟设置键。

闹铃模块采用SPEAKER,当定时时间到时,P1.7产生连续脉冲SPEAKER报警。

6 课程设计体会本实验花了我们四天的时间,由于该大作业是用汇编语言写的,很多语句掌握都不是很牢固,但是经过这么长时间的实验,我基本掌握了部分汇编语言的用法,特别是实验中经常用到的按键查询,跳转语句,以及汇编的方法。

刚开始的时候,我什麽都不懂,根本不知怎样入门,后来查找了一些系统资料,渐渐有了些了解,才开始写自己的程序。

虽然如此,中间还是遇到过不少困难,不如些按键查询的时候,仿真不出来,不知道哪里出错了,也不知道是不是程序有问题,后来在小组成员的帮助下,终于找到问题所在,通过不断的琢磨,后来不仅实现了老师的要求的基本功能,更加了秒表,闹铃。

本来还想加上纪念日和音乐闹铃,当一方面时间有限,另一方面尝试后失败了就暂时搁下。

调试的时候,刚上去的时候,板子工作很不稳定,虽然有时候能够显示到正确的东西,当大多数时间都是显示的杂乱无章,鉴于有时候能够正确显示,我们是板子焊的不好,于是重新焊过,第二个版子刚上电的时候,还是不能很正确的工作,后来,一步一步的调试,先用简单的程序检查板子,发现板子是没有问题的,于是就确定是程序的问题,我把程序分为好几块,一块一块的调试,一段好了之后,在加上一段。

最后发现是在一个子程序里边用了一个错误的指令,改正了之后就完全正确了。

经过这次试验,确实学到很多知识。

参考文献[1]徐煜明,韩雁.单片机原理及接口技术,电子工业出版社[2]万光毅,严义,邢春香.单片机实验与实践教程,北京航空航天大学出版社[3]张迎新.单片机中级教程,北京航空航天大学出版社[4]丁元杰.单片机原理与应用,机械工业出版社[5]孙育才.MCS-51系列单片微型计算机及其应用,东南大学出版社附1:课程设计原理图附2:源程序代码**************************************; 变量地址分配;********************************************************* Hour EQU 3AH; 小时计数器的地址Minute EQU 3BH; 分钟计数器的地址Second EQU 3CH; 秒计数器的地址P1Val EQU 3DH; 数码管位驱动值的地址ClockMode BIT 20H.0; 模式(正常走时/闹时)设置寄存器地址,值为0时正常走时,为1时闹时设定AlarmOnOff BIT 20H.1; 闹钟开启/关闭标志,为0关闭,为1开启AlarmTimeOn BIT 20H.2; 此位为1时表示闹时时间到DispHour EQU 21H; 小时显示寄存器的地址DispMinute EQU 22H; 分钟显示寄存器的地址DispSecond EQU 23H; 秒显示寄存器的地址AlarmHour EQU 2EH; 闹时小时计数器的地址AlarmMinute EQU 2FH; 闹时分钟计数器的地址k1 BIT P3.2; 闹钟设置键k2 BIT P3.3; 小时设置键k3 BIT P3.5; 分钟设置键ORG 0000HAJMP MainORG 0BHAJMP TimeIntORG 0020HMain:MOV SP,#70HMOV 39H,#14HMOV Hour,#12MOV Minute,#00MOV Second,#00MOV AlarmHour,#06MOV AlarmMinute,#00CLR ClockModeCLR AlarmTimeOnSETB p1.7MOV TMOD,#00000001BMOV TH0,#03CHMOV TL0,#0B0HMOV IE, #82HSETB TR0L1:JB K1,CheckMinuteKeyLCALL DelayJB K1,CheckMinuteKeySETB ClockModeLCALL AlarmSetCheckMinuteKey:JB K3,CheckHourKeyMOV A,MinuteADD A,#1MOV Minute,A;CJNE A,#60,NotOver1MOV Minute,#0NotOver1:JNB K3,$CheckHourKey:JB K2,CheckAlarmMOV A,HourADD A,#1MOV Hour,ACJNE A,#24,NotOver2MOV Hour,#0NotOver2:JNB K2,$CheckAlarm: ;JNB AlarmTimeOn,ToReturnLCALL LOOPToReturn:AJMP L1;********************************************** ; 定时器Timer0中断服务程序;********************************************** TimeInt:MOV TH0,#03CHMOV TL0,#0B0HPUSH ACCPUSH PSWSETB RS0CLR RS1DJNZ 39H,NotoneSecondMOV 39H,#14HLCALL ClockLCALL ConvertoBufferNotoneSecond:LCALL ScanDisplayPOP PSWPOP ACCRETIScanDisplay:MOV R1,#30HMOV R4,#11111110BMOV A,R4PLAY:MOV P2,AMOV A,@R1MOV DPTR,#TABMOVC A,@A+DPTRMOV P0,ALCALL DelayINC R1MOV A,R4RL AJNB ACC.6,LD1MOV R4,AAJMP PLAYLD1: RETTAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH ;共阳段码表 "0""1""2" "3""4""5""6""7" "8""9""不亮" Clock:MOV A,SecondADD A,#1MOV Second,ACJNE A,#3CH,NotOverFlowMOV Second,#0MOV A,MinuteADD A,#1MOV Minute,ACJNE A,#3CH,NotOverFlowMOV Minute,#0MOV A,HourADD A,#1MOV Hour,ACJNE A,#18H,NotOverFlowMOV Hour,#0NotOverFlow:JNB AlarmOnOff,NotAlarmMOV A,MinuteCJNE A,AlarmMinute,NotAlarmMOV A,HourCJNE A,AlarmHour,NotAlarm SETB AlarmTimeOn NotAlarm:RETConvertoBuffer:MOV R1,#30HJB ClockMode,DispAlarmSet MOV A,Second;MOV DispSecond,A;MOV A,Minute;MOV Dispminute,A;MOV A,Hour;MOV DispHour,AAJMP Convert DispAlarmSet:JB AlarmOnOff,AlarmOn MOV DispSecond,#00H AJMP NextAlarmOn:MOV DispSecond,#11Next:MOV A,AlarmMinuteMOV Dispminute,AMOV A,AlarmHourMOV DispHour,AConvert:MOV A,DispSecondMOV B,#10DIV ABMOV @R1,BINC R1MOV @R1,AINC R1MOV A,DispMinuteMOV B,#10DIV ABMOV @R1,BINC R1MOV @R1,AINC R1MOV A,DispHourMOV B,#10DIV ABMOV @R1,BMOV @R1,ARET;************************************* ; 闹时设置子程序;************************************* AlarmSet:JNB K1,$LCALL DelayCheckArmMinuteKey:JB K3,CheckArmHourKeyCL1: SETB AlarmOnOffMOV A,AlarmMinuteADD A,#1MOV AlarmMinute,ACJNE A,#60,ArmNotOver1MOV AlarmMinute,#0ArmNotOver1:JNB K3,$CheckArmHourKey:JB K2,AlarmSetEndSETB AlarmOnOffMOV A,AlarmHourADD A,#1MOV AlarmHour,ACJNE A,#24,ArmNotOver2MOV AlarmHour,#0ArmNotOver2:JNB K2,$JB K3,AlarmSetEndACALL CL1AlarmSetEnd:JB K1,AlarmSetJNB K1,$CLR ClockModeRET;************************************** ; 闹时服务子程序;************************************** LOOP:CLR P1.7ACALL Delay1SETB P1.7JB K1,LOOPCLR AlarmOnOffCLR AlarmTimeOnAlarmReturn: RET;************************************** ; 延时子程序;************************************** DELAY1: MOV R3,#15LOOP1: MOV R5,#90NOPLOOP2: DJNZ R5,LOOP2DJNZ R3,LOOP1RETDelay:MOV R6,#05HDel:MOV R7,#08FhDJNZ R7,$DJNZ R6,DelRETEND。