设计一个数字定时器
设计要求
1,定时1-99分钟,开机上电并且默认10分钟。
2,显示时间自选,不一定使用数码管。
3,定时时间可调,调试方式为两种,一是步进,二是直接输入。
4,有负载,220V/A,要求开机上电的时候,负载关闭。
5,有相关的提示信息,一旦时间设定之后,会给出时间设定的提示信息。
6,定时时间到,关闭电晕啊,切断负载电源,关闭电源。
7,系统工作电源Vin=+12V
设计基本理论
本设计将采用C51单片机,C51单片机是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。单片机自带5个中断,两个16位定时器32个I/O口,可擦除只读存储器可以反复擦除多次,功能相当强大。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的C51是一种高效微控制器。C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
主体模块设计
数字定时器系统的基本组成如下图所示
数字定时系统电路的原理框图 根据设计任务与要求,可初步将系统分为五大功能模块:主电路、按键电路、显示电路、继电器电路。进一步细说,主电路选用ATC51作为处理器,系统采用12MHZ的晶振;按键控制电路由两个个按键(启动键(start)、时间设定键 (set))组成,采用三个开关,按键按下产生一个脉冲信号;显示电路由二位8段共阴极数码管和一个9位100欧姆上拉排阻组成,位选,个位和十位由P0输出,段选由P1输出;继电器电路由一个继电器和一个用电器(灯泡)组成,通过电路与P3.0相连。当P3.0输出高电平时,继电器不吸合,灯亮。
各部件具体设计
1单片机最小系统的设计模块
硬件连接说明:本系统以ATC51单片机为核心。单片机采用内部振荡的方式。通过200欧姆电阻与一个6位8段LED数码显示管相连。从P0口输出LED数码管的字形码,从P2口输出LED数码管的位选码,高电平有效。4个功能按键和P1口相连,中间通过10K的电阻与+5V电源相连,按键另一端接地,P1口低电平时表示按键被按下。报警电路则与P3.0口相连,当P3.0口输出高电平时,蜂鸣器响。
2晶振电路设计
由于单片机内部振荡方式电路简单,时钟信号比较稳定,是的单片机应用系统的首选,故本设计采用内部振荡方式,采用12MHZ的晶振。数字定时系统电路的晶振电路图如下图所示。
3定时中断
本设计电路采用定时器T0产生定时中断,由于本设计需要0.1s的基本时间,故选择其工作在定时方式1下。这时定时器T0是一个16位的计时器,由它产生50ms的基本定时中断,两次中断后将得到0.1s的时间。
4键盘电路
键盘电路有式键盘和矩阵式两种。式键盘占用I/O口线较多,适用于按键较少的情况。矩阵式键盘占用的I/O口相对较少,适用于按键很多的情况。共设置4个按键,每个按键分别完成复位、开始/暂停、设置、调整的功能。其电路连接图如下图所示。
5 报警电路
报警电路将采用p3.0口驱动,当数码管显示00.00.0时p3.0口输出高电平,驱动蜂鸣器达到报警的目的,只有当复位键按下后,蜂鸣器才会停止报警。其电路连接图如下图所示
6显示电路
对于显示电路,本设计采用6位8段共阴极LED数码管显示。上电显示最大倒计时时间99.00.00-。其中“-”位为系统状态标志位,当显示“-”时,表示系统处于等待状态,按下开始键后将开始计数,开始计数后此数码管将关闭显示,以达到省电的目的 ,当显示“E”时,表示系统正处于调时状态,此时只用两个调时键有用,按下开始键或复位键将没有用。其显示电路图如下图所示。
系统的调试与结果测试
电后LED数码管显示最大倒计时值99.00.0-,程序处于等待状态
此时,主程序不断调用显示子程序以及扫描键盘按键情况,当检测到有键按下后,转到相应的程序执行。
1.开始/暂停键按下后程序开始减1计数直到0,同时状态显示管熄灭,计数值到0后报警器响。若中途遇到开始/暂停键按下则,暂停倒计时。
2.若中途遇到复位键按下则将倒计时器的倒计时值设置为最大值,并处于等待状态。
3.复位键按下后,程序复位,系统处于等待状态,状态显示管显示“-”。
4.当设置键被按下后,程序进入调时设置状态,同时状态显示管显示“E”。设置状态的初始值位00.00.0E,按下+1调整键,可以将当前的计数单位值加1,再次按下设置键后,即进入了下个计数单位的调时状态,当按下5次设置键后将退出调时状态,若分钟十位被设置为6并再次按下设置键后程序直接退出调时状态。设置状态时开始/暂停键和复位键无效,等退出调时状态后,设置状态时开始/暂停键和复位键恢复功能
结果分析
本设计是一个采用了由内部振荡的时钟方式、程控扫描方式的式键盘、动态显示LED数码管和蜂鸣器式报警器组成的系统。因此该系统使用的电子器件少、外围电路简单,定时精准,使用的I/O少,系统消耗的功耗小,剩余的I/O口多便于扩展其他功能。但是另一方面,本系统由于使用了程控式的键盘和动态显示的LED数码管,所以对CPU的使用率相对较高。
开始在主程序的循环中没有添加调用显示子程序的语句,导致在没有按键按下的情况下LED数码管没有显示。当在主程序循环检测按键的过程中添加了调用显示子程序的语句后就解决了这一问题。由于键盘需要消抖延时和等待按键释放,所以相似的情况又出现了——按下按键后有一段时间LED数码管断续显示或者按下按键后不释放按键时LED数码管没有显示。仔细分析后发现,问题出现的原因还是一样的,由于本设计的LED数码管采用了动态显示,故需要不断调用显示子程序,否则会导致LED数码管没有显示。所以最终做了以下改进:1.按键的消抖延时选择调用两次显示子程序(每次显示子程序大约用时5ms,两次即为10ms左右)来取代原来的10ms软件延时。2.在等待按键释放时,使用循环调用显示子程序来替代原来的循环等待。经过上述两点的改进后,LED数码管无显示或者断续显示的问题就得到了彻底的解决。
心得体会
初次看到本次的课程设计的题目时,感觉设计的难度不大,但是由于是第一次运用
单片机设计,在设计过程中又遇到了种种困难,又感觉到要完成此次设计还需要花费很大的时间和精力。但是经过不断的努力,运用科学的分析方法,最终完成了本次计算机课程设计。
经过三个星期的课设,过程曲折可谓一语难尽。在此期间我也失落过,也曾一度热情高涨。从开始时满富盛激情到最后汗水背后的复杂心情,点点滴滴无不令我回味无长。
生活也是这样,汗水预示着结果也见证着收获。劳动是人类生存生活永恒不变的话题。通过这次课设,我才真正领略到“艰苦奋斗”这一词的真正含义,只有亲自动手才能体会其中的内涵。我想说,设计确实有些辛苦,但苦中也有乐。每当遇到困难的时候,老师和同学给了我很大的帮助,让我学到了很多东西。在此,我对帮助过我的同学及老师深表感谢。我感觉通过课设我和同学们之间的距离更加近了;我想说,设计确实很累,但当我们的设计出现成果时,心中也不免产生喜悦,正所谓“三百六十行,行行出状元”我认为无论干什么,只要人生活的有意义就可以。
另外,课堂上也有部分知识不太清楚,于是我又不得不边学边用,时刻巩固所学知识,通过课设把以前不了解的东西能够学习一下,更深的体会其中的含义,使我收获颇多。整个设计我基本上还满意,由于水平有限,难免会有错误,所以还请老师批评指正。
附录:所使用的VB程序
ORG 0000H
AJMP MAIN
ORG 000BH ;T0中断程序入口地址
AJMP T0ZD
ORG 00100H
MAIN:CLR TR0 ;主程序开始
CLR P3.0 ;关闭蜂鸣器
SETB 20H.1 ;使显示管状态标志位有效
CLR 20H.0 ;开始/暂停标志位,使程序处于等待开始
MOV 40H,#00H ;0.1S位查表码
MOV 41H,#00H ;秒钟个位位查表码
MOV 42H,#00H ;秒钟十位位查表码
MOV 43H,#00H ;分钟个位位查表码
MOV 44H,#06H ;分钟十位位查表码
MOV 45H,#00H ;状态显示管查表码
MOV 46H,#02H ;定时器定时次数
SETB EA ;开总中断
SETB ET0 ;开定时器T0中断
MOV TMOD,#01H ;定时器工作方式0
MOV TL0,#0B0H ;定时初值,采用50MS时
MOV TH0,#3CH
JPJC:LCALL XSCX ;显示倒计时初值60.00.0(XSCX),进入键盘检测程
MOV P1,#0FFH ;判断复位键是否按下
JB P1.0,JC12
LCALL XDYS ;调用消抖延时程序(XDYS)
JB P1.0,JC12
PP10:JNB
P1.0,DP10 ;等待按键按下
AJMP MAIN ;复位键按下后转到主程序(MAIN)重新开始
JC12:MOV P1,#0FFH ;判断设置键是否按下
JB P1.2,JC11
LCALL XDYS
JB P1.2,JC11
PP12:JNB P1.2,DP12 ;调整设置键按下后转到调时子程(TSCX)
ACALL TSCX
JC11:MOV P1,#0FFH ;判断开始/暂停键是否按下
JB P1.1,JPJC
LCALL XDYS
JB P1.1,JPJC
PP11:JNB P1.1,DP11
CPL 20H.0 ;将标志位取反
JB 20H.0,KSJS ;开始/暂停标志为1则开始计(KSJS)
CLR TR0
SETB 20H.1
AJMP JPJC ;继续检测键盘按键情况(JPJC)
DP10:LCALL XSCX ;等待按键按下时,调用显示程序,防止显示管没显示
AJMP PP10 DP11:LCALL XSCX
AJMP PP11 DP12:LCALL XSCX
AJMP PP12 KSJS:CLR 20H.1 ;清除状态显示管
SETB P2.5 JB P3.0,JPJC ;若蜂鸣器响,则不启动计时器
SETB TR0 ;启动计时器TO (KSJS)
AJMP JPJC ; 显示子程序
XSCX:MOV DPTR,#TAB ;显示子程序(XSCX)
MOV A,40H MOVC A,@A+DPTR
MOV P2, #0FFH ;关闭显示.
MOV P0, A ;输出0.1S位的显示段码.
CLR P2.0 ;
P2.0=0
ACALL XSYS
MOV DPTR,#TAB1 ;
MOV A,41H
MOVC A,@A+DPTR
MOV P2, #0FFH ;关闭显示.
MOV P0, A ;输出秒钟个位的显示码.
CLR P2.1 ;
P2.1=0
ACALL XSYS
MOV DPTR,#TAB
MOV A,42H
MOVC A,@A+DPTR
MOV P2, #0FFH ;关闭显示.
MOV P0, A ;输出秒钟十位位的显示段码.
CLR P2.2 ;
P2.2=0
ACALL XSYS
MOV DPTR,#TAB1
MOV A,43H
MOVC A,@A+DPTR
MOV P2, #0FFH ;关闭显示.
MOV P0, A ;输出分钟个位的显示段码.
CLR P2.3 ;
P2.3=0
ACALL XSYS
MOV DPTR,#TAB
MOV A,44H
MOVC A,@A+DPTR
MOV P2, #0FFH ;关闭显示.
MOV P0, A ;输出分钟十位的显示段码.
CLR P2.4 ;
P2.4=0
ACALL XSYS
JNB 20H.1,ZBTC ;
20H.1为1则显示计时器状态
MOV DPTR,#TAB2
MOV A,45H
MOVC A,@A+DPTR
MOV P2, #0FFH ;关闭显示.
MOV P0, A ;输出段码.
CLR P2.5 ;
P2.5=0
ACALL XSYS
ZBTC:RET
TSCX:CLR TR0 ;调时子程序(TSCX)
CLR 20H.0 ;使时间调整时处于暂停状态
MOV 40H,#00H
MOV 41H,#00H
MOV 42H,#00H
MOV 43H,#00H
MOV 44H,#00H
SETB 20H.1 ;使状态显示管的位选码有效
MOV 45H,#01H ;将状态显示码更改为E(调时状态)
MOV R0,#44H
JCTZ:ACALL XSCX ;先调用显示程序,扫描时间调整键
MOV P1,#0FFH
JB P1.3,NEXT ;+1键盘没有按下
ACALL XDYS ;键盘按下,消抖延时
JB P1.3,NEXT
DEN0:JNB P1.3,DEN1 ;等待按键释放
AJMP JYCX ;+1键按下后,跳转到+1程序
NEXT:MOV P1,#0FFH
JB P1.2,JCTZ
ACALL XDYS ;键盘按下,消抖延时
JB P1.2,JCTZ
DEN2:JNB P1.2,DEN3 ;等待按键释放
MOV A,44H
CJNE A,#06H,DEC4 ;设置键再次按下,将调整指针指向下一位
AJMP TCTS DEC4:DEC R0
CJNE R0,#3FH,JCTZ ;若R0为3FH则退出调时程序
AJMP TCTS ;若@R0不为#06H,但R0为#3FH,则跳出调时程序
JYCX:CJNE R0,#44H,XIA1 ;加1调时部分
CJNE @R0,#06H,INCR ;调整分钟十位
AJMP SET0 XIA1:CJNE R0,#43H,XIA2
AJMP TZ09 ;调整分钟个位 XIA2:CJNE R0,#42H,XIA3
CJNE @R0,#05H,INCR ;调整秒钟十位
AJMP SET0 XIA3:CJNE R0,#41H,XIA4
AJMP TZ09 ;调整秒钟个位 XIA4:CJNE R0,#40H,TCTS
TZ09:CJNE @R0,#09H,INCR ;调整0.1秒位
SET0:MOV @R0,#00H
AJMP JCTZ INCR:INC @R0
AJMP JCTZ DEN1:ACALL XSCX
AJMP DEN0 DEN3:ACALL XSCX
AJMP DEN2
TCTS:MOV TH0,#3CH ;退出调时程序
MOV TL0,#0B0H
MOV 45H,#00H ;将状态显示码更改为D(等待状态)
RET ; T0中断子程序
T0ZD:CLR EA ;T0中断子程序,关中断 (T0ZD)
CLR ET0
CLR TR0
DJNZ 46H,TCZD
MOV 46H,#02H ;当定时两次后重新给计时次数赋值为2
MOV R0,#40H ;减1计数,R0为40H
CJNE @R0,#01H,R040
INC R0 ;R0为41H
CJNE @R0,#00H,DEC1 INC R0 ;R0为42H
CJNE @R0,#00H,DEC1 INC R0 ;R0为43H
CJNE @R0,#00H,DEC1 INC R0 ;R0为44H
CJNE @R0,#00H,DEC1
AJMP JYFH R040:CJNE @R0,#00H,DEC1 ;R0为40H
INC R0 ;R0为41H
CJNE @R0,#00H,R041
INC R0 ;R0为42H
CJNE @R0,#00H,R042
INC R0 ;R0为43H
CJNE @R0,#00H,R043
INC R0 ;R0为44H
CJNE @R0,#00H,R044
AJMP ZJFH R041:
MOV 40H,#09H
DEC 41H
AJMP TCZD R042:
MOV 40H,#09H
MOV 41H,#09H
DEC 42H AJMP TCZD R043:
MOV 40H,#09H
MOV 41H,#09H
MOV 42H,#05H
DEC 43H
AJMP TCZD
R044:MOV 40H,#09H
MOV 41H,#09H
MOV 42H,#05H
MOV 43H,#09H
DEC 44H
AJMP TCZD
DEC1:DEC 40H
TCZD:MOV TH0,#3CH ;退出中断子程序
MOV TL0,#0B0H
SETB EA
SETB ET0
SETB TR0
AJMP ZZFH JYFH:DEC 40H
ZJFH:SETB P3.0 ;启动蜂鸣器 ZZFH:RETI
XDYS:ACALL XSCX ;消抖延时程序,延时10ms(2*5ms)
ACALL XSCX ;采用调用显示子程序延时以改善LED显示效果
RET XSYS:MOV 55H,#20 ;显示延时程序,延时1ms
DEL2:MOV 56H,#25 DEL1:DJNZ 56H,DEL1
DJNZ 55H,DEL2
RET
TAB:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
TAB1:DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH
TAB2:DB 040H,79H ;D等待状态,E调时状态
END