单片机课题设计.docx
《单片机课题设计.docx》由会员分享,可在线阅读,更多相关《单片机课题设计.docx(29页珍藏版)》请在冰点文库上搜索。
单片机课题设计
单片机课程设计报告书
课题名称
秒表计时器的设计
姓名
马德明
学号
院、系、部
光电工程系
专业
应用电子技术
指导教师
2014年6月20日
一、设计任务及要求:
设计任务:
1、设计一个秒表计时器,含有启动、暂停、停止(至少)三个键,能够记录至多6组时间数据。
2、当启动按下后,开始计时,若按下停止键,数据存储并停止计时;若按下暂停键,数据存储的同时继续计时,直到计满了6组数据之后停止计时。
3、计数显示精确到0.1秒。
设计要求:
首先进行预设计,根据设计的任务要求,先确定设计的硬件电路方案,然后进行硬件电路的初步设计,在计算机上画出硬件电路图,在老师的指导下进行修正硬件电路图,并对所涉及的参数进行计算。
在确定硬件的基础上,要进行软件的总体设计,包括软件主流程的设计以及各子程序的设计,同时,要写出详细的操作说明,如时间的调整方法,显示窗口的时间切换等,以配合软件的设计。
然后进入硬件的调试及编程工作,设计组内的同学可根据任务分工,有调试硬件各功能模块的,如键盘子程序、显示子程序等,有进行整体程序的编制的,各模块的编制过程中要注意资源的衔接,最好采用伪定义的方式采用单片机的片内RAM资源。
最后进入联机调试,联机调试的原则也要采用分步走的原则,各个功能模块要逐步套入,通过一个再增加一项功能,从而达到设计的总体要求,不要上来编制个最大的程序,最后无法查找错误!
最后写出设计报告。
指导教师签名:
年月日
二、指导教师评语:
指导教师签名:
年月日
三、成绩
指导教师签名:
年月日
目录
一、绪言2
二、系统设计3
1设计任务3
2方案论证3
2.1系统整体设计框图3
2.2系统主要实现如下功能:
3
三、硬件电路设计5
3.1秒表/时钟计时器的硬件电路设计5
3.2单片机最小系统设计6
3.3数码管显示电路的设计6
3.4摁键控制系统模块的设计7
四、程序流程图8
4.1显示子程序8
4.2定时器T0中断服务程序9
4.3T1中断服务程序9
4.4调时功能程序10
4.5整点响程序10
4.6时钟/秒表功能程序10
五、汇编程序设计11
六、电子密码锁控制器仿真21
6.1Proteus调试21
七、结束语22
八、参考文献23
一、绪言
现今的计时器通常只能通过启/停按键实现断点计时的功能,即通过启/停按键来记录一段时间。
这种计时器查看的时间只能为计时结束时刻。
实际的应用中往往需要在不影响正常计时的基础上,能查看记录过程中的某些点的时间。
本课设即针对此问题,设计了一种能通过按键方式查看记录过程中任一时刻值的计时器。
这种计时器在查看中间值时不会影响整个记录过程,并且能把相应数据送入存储模块及显示模块,以便查看。
二、系统设计
1设计任务
通过对秒表计时器发展现状的了解,结合自己本次设计的课题,本次设计任务要完成的目标是:
1、设计一个秒表计时器,含有启动、暂停、停止(至少)三个键,能够记录至多6组时间数据。
2、当启动按下后,开始计时,若按下停止键,数据存储并停止计时;若按下暂停键,数据存储的同时继续计时,直到计满了6组数据之后停止计时。
3、计数显示精确到0.1秒。
2方案论证
2.1系统整体设计框图
图1系统总体设计框图
2.2系统主要实现如下功能:
2.2.1时钟功能
对于时钟功能,需要在数码管上显示小时、分钟和秒钟,因此,可以在内部存储空间分别定义它们的显示缓存空间,来存放小时、分钟和秒钟的BCD码,各2个字节。
由于时钟是不能停止的,因此需要采用内部定时器自动计时,并使用定时器中断处理程序来定时进行时间数值的刷新。
52单片机的2个定时器都具有16位定时器的
工作模式。
当晶振为12MHz时,16位定时器的最大定时值为65.536mS;要达到1秒钟,可以采用两种方法:
采用一个定时器定时与软件计数相结合的方法;或者采用两个定时器级联的方法。
由于秒表在计时功能时也需要用到1个定时器,因此,我们采用第一个方法,只使用1个定时器,例如使用T0。
为了达到较为准确的计时,使T0的溢出时间为50ms,使用一个字节作为软件计数器ST,计数值为20。
定时器的中断处理程序对ST进行减1操作,当ST为0时,1秒到达,此时更新存放小时、分钟、秒钟的显示缓存区。
2.2.2计时功能
当秒表用作计时功能时,也需要一个定时器进行10MS的定时,在本例中使用单片机的TIMER1。
在TIMER1的中断处理程序中对SS和ss的缓存空间进行更新,与上面类似。
2.2.3功能按键
再看按键的处理。
这3个键可以采用中断的方法,也可以采用查询的方法来识别。
对于A、B键,主要功能在于功能切换和数值复位,对于时间的要求不是很严格,而C键主要用于时间的锁定,需要比较准确的控制。
因此可以考虑,对A、B键采用查询的方式,而对于C键采用外部中断。
2.2.4中断嵌套和控制
现在在我的方案中有3个中断,T0、T1中断和外部中断INT0。
这3个中断的特点是:
T0的工作是连续的,可以在误差范围内可以被打断但不可以停止;T1的工作同样可以在误差范围内被打断,但可以被INT0停止;INT0是用来启动或停止T1的。
三硬件电路设计
3.1秒表/时钟计时器的硬件电路设计
采用AT89C52单片机,数字显示采用共阳六段LED显示器,P0口输出段码数据,P2.0-P2.5口作为列扫描输出,P1.0、P1.1、P1.3口接三个开关按钮,用以实现调时及秒表/时钟功能切换设置。
为了给共阳LED数码管提供驱动电压,采用三极管作电源驱动输出。
采用12MHZ晶振,有利于提高系统计时的精确性。
对于A、B键,主要功能在于功能切换和数值复位,对于时间的要求不是很严格,而C键主要用于时间的锁定,需要比较准确的控制。
因此可以考虑,对A、B键采用查询的方式,而对于C键采用外部中断。
图2电子密码锁控制线路图
3.2单片机最小系统设计
图3单片机最小系统
3.3数码管显示电路的设计
显示部分采用动态显示。
数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的共阴极增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。
通过分时轮流控制各个数码管的位选通端,就使各个数码管轮流受控显示,这就是动态驱动。
动态显示是利用人眼视觉暂留特性来实现显示的。
事实上,显示器上任何时刻只有一个数码管有显示。
由于各数码管轮流显示的时间间隔短、节奏快,人的眼睛反应不过来,因此看到的是连续显示的现象。
为防止闪烁延时的时间在1ms左右,不能太长,也不能太短。
图4LED显示器及工作原理
3.4摁键控制系统模块的设计
由P1口作为独立摁键信号的输入端控制时钟的加1s、减1s、复位60.0s等操作。
用外部中断0作为秒表计时器的开启和暂停的操作。
且所有摁键均为低电平有效。
其中部分摁键为单刀双掷开关用于控制增计时或减计时以及限60.0s计时和60.0s外计时。
四、程序流程图
图5主程序流程图
4.1显示子程序
数码管显示的数据存放在内存单元70H-75H中。
其中70H-71H存放秒数据,72H-73H存放分数据,74H-75H存放时数据,每一地址单元内均为十进制BCD码。
由于采用软件动态扫描实现数据显示功能,显示用十进制BCD码数据的对应段码存放在ROM表中。
显示时,先取出70H-75H某一地址中的数据,然后查得对应的显示用段码,并从P0口输出,P2口将对应的数码管选中供电,就能显示该地址单元的数据值。
为了显示小数点及“-”、“A”等特殊字符,在显示班级及计时时采用不同的显示子程序。
4.2定时器T0中断服务程序
定时器TO用于时间计时,定时溢出中断周期可分别设为50ms和10ms.中断进入后,现判断是时钟计时还是秒表计时,时钟计时累计中断20次(即1s)时,对秒计数单元进行加1操作,秒表计时每10ms进行加1操作。
时钟计数单元地址分别在70H-71H(秒)、76H-77H(分)和78H-79H(时),最大计时值为23时59分59秒。
而秒表计数单元地址也在70H-71H(0.01毫秒)、76H-77H(秒)和78H-79H(分),最大计时值为99分59.99秒。
7AH单元内存放“熄灭符”数据(#0AH)。
在计数单元中采用十进制BCD码计数,满60(秒表功能时有100)进位,T0中断服务程序执行流程见下图
图6
定时器T0、T1溢出周期为50ms(10ms),T0为秒计数用,T1为调整时闪烁用;P1.0,P1.1,P1.2为调整按钮,P0口为字符输出口,采用共阳显示管。
4.3T1中断服务程序
T1中断服务程序用于指示调整单元数字的亮闪。
在时间调整状态下,每过0.3s,将对应单元的显示数据换成“熄灭符”数据(#0AH)。
这样在调整时间时,对应调整单元的显示数据会间隔闪亮。
4.4调时功能程序
调时功能程序的设计方法时:
按下P1.0口按键,若按下时间短于1s,则进入省电状态(数码管不亮,时钟不停);否则进入调分状态,等待操作,此时计时器停止走动。
当再按下按钮时,若按下时间短于0.5s,则时间加1分;若按下时间长于0.5s,则进入小时调整状态。
在小时调整状态下,当按键按下的时间长于0.5s,退出调整状态,时钟继续走动。
P1.1口按键在调时状态下可实现减1功能。
4.5整点响程序
如果在时钟状态下,如果是整点那么就用P3.2这个引脚来控制蜂鸣器。
4.6时钟/秒表功能程序
在正常计时状态下,若按下P1.1口按键,则进行时钟/秒表功能的转换,转换后计时从开始。
当按下P1.2口的按键时,可实现清0、计时启动、暂停功能。
五、汇编程序设计
程序清单:
/*AT89C52秒表/时钟程序*/
/*定时器T0、T1溢出周期为50ms(10ms),T0为秒计数用,T1为调整时闪烁用*/
/*P1.0P1.1P1.2为字符输出口,采用共阳显示管。
*/
/*主程序*/
START:
MOV R0,#70H/*清零70H~7AH共11个内存单元*/
MOV R7,#0BH
CLEARDISP:
MOV @R0,#00H
INC R0
DJNZ R7,CLEARDISP
MOV 20H,#00H/*清20H(标志用)*/
MOV 7AH,#0AH/*放入“熄灭符”数据*/
MOV TMOD,#11H/*设置T0、T1为16位定时器*/
MOV TL0,#0B0H/*50ms定时初值(T0计时用)*/
MOV TH0,#3CH
MOV TL1,#0B0H/*50ms定时初值(T1闪烁定时用)*/
MOV TH1,#3CH/*50ms定时初值*/
SETB EA/*总中断开放*/
SETB ET0/*允许T0中断*/
SETB TR0
MOV R4,#14H
START1:
LCALL DISPLAY /*调用显示子程序*/
JNB P1.0,SETMM1/*P1.0口为0时,转时间调整程序*/
JNBP1.1,FUNSS/*秒表功能,P1.1按键调时时作减1操作*/
JNBP1.2,FUNPT/*STOP、PUSE、CLR*/
SJMPSTART1/*P1.0口为1时跳回START1*/
SETMM1:
LJMPSETMM/*转到时间调整程序SETMM*/
FUNSS:
LCALL DS20MS
JB P1.1,START1
WAIT11:
JNB P1.1,WAIT11
CPL 03H
MOV 70H,#00H
MOV 71H,#00H
MOV 76H,#00H
MOV 77H,#00H
MOV 78H,#00H
MOV 79H,#00H
AJMP START1
ACALLZDBS
FUNPT:
LCALL DS20MS
JB P1.2,START1
WAIT22:
JNB P1.2,WAIT21
CLR ET0
CLR TR0
WAIT33:
JB P1.2,WAIT31
LCALL DS20MS
JB P1.2,WAIT33
WAIT66:
JNB P1.2,WAIT61/*清70~79H共10个内存单元*/
MOV R0,#70H
MOV R7,#0AH
CLEARP:
MOV @R0,00H
INC R0
DJNZ R7,CLEARP
WAIT44:
JBP1.2,WAIT41
LCALLDS20MS
JBP1.2,WAIT44
WAIT55:
JNBP1.2,WAIT51
SETBET0
SETBTR0
AJMPSTART1
WAIT21:
LCALLDISPLAY
AJMPWAIT22
WAIT31:
LCALLDISPLAY
AJMPWAIT33
WAIT41:
LCALLDISPLAY
AJMPWAIT44
WAIT51:
LCALLDISPLAY
AJMPWAIT55
WAIT61:
LCALLDISPLAY
AJMPWAIT66
/*中断入口程序*/
ORG 0000H;/*程序执行开始地址*/
LJMPSTART;/*跳到标号START执行*/
ORG 0003H;/*外部中断0中断程序入口
RETI /*外部中断0中断返回*/
ORG 000BH/*定时器T0中断程序入口*/
LJMP INTT0
ORG 0013H/*外部中断1中断程序入口*/
TETI/*外部中断1中断返回*/
ORG 001BH
LJMP INTT1/*跳至INTT1执行*/
ORG 0023H/*串行中断程序入口地址*/
RETI
/*T0中断服务程序*/
INTT0:
PUSH ACC/*累加器入栈保护*/
PUSH PSW /*状态字入栈保护*/
CLR ET0/*关T0中断允许*/
CLR TR0/*关闭定时器T0*/
JB 03H,FSS/*标志为1转秒表处理程序(10ms定时)*/
MOV A,#0B7H/*中断响应时间同步修正*/
ADD A,TL0/*低8位初值修正*/
MOV TL0,A/*重装初值(低8位修正值)*/
MOV A,#3CH/*高8位初值修正*/
ADCC A,TH0
MOV HT0,A/*重装初值(高8位修正值)*/
SETB TR0/*开始定时器T0*/
DJNZ R4,OUTT0/*20次中断未到中断退出*/
ADDSS:
MOV R4,#14H/*20次中断到(1s)重赋初值*/
MOV R0,#71H /*指向秒计时单元(71H~72H)
ACALL ADD1/*调用加1程序(加1s操作)
MOV A,R3
CLR C/*清进位标志*/
CJNE A,#60H,ADDMM
ADDMM:
JC OUTT0/*短于60s时中断退出*/
ACALL CLR0/*长与或者等于60s时对秒计时单元清零*/
MOV R0,#77H/*指向分计时单元(76H~77H)*/
ACALL ADD1/*分计时单元加1min*/
MOV A,R3/*分数据放入A*/
CLR C/*清零位标志*/
CJNE A,#60H,ADDHH
ADDHH:
JC OUTT0/*短于60min时中断退出*/
ACALL LCR0/*长与或者等于60s时对秒计秒单元清零*/
MOV R0,#79H/*指向小时计时单元(78H~79H)*/
ACALL ADD1/*小时计时单元加1h*/
MOV A,R3/*时数据放入A*/
CLR C /*清进位标志*/
JB 03H,OUTT0/*秒表时最大数为99*/
CJNE A,#24H,HOUR
HOUR:
JC OUTT0/*短于24h时中断退出*/
ACALL CLR0/*长与或者等于24h时对秒计时单元清零*/
OUTT0:
MOV 72H,76H/*中断退出时将分、时计时单元数据移
MOV 73H,77H入对应显示单元*/
MOV 74H,78H
MOV 75H,79H
POP PSW /*恢复状态字(出栈)*/
POP ACC /*恢复累加器*/
SETB ET0/*开放T0中断*/
RETI/*中断返回*/
/*秒表计时程序(10min加1),低2位为0.1、0.01秒,中间2位为秒,最高2位为分。
*/
最大计数值为99分59.99秒
FSS:
MOVA,#0F7H
ADDA,TL0
MOVTL0,A
MOVA,#0D8H
ADDCA,THO
MOVTHO,A
SETBTHO
MOVR0,#71H
ACALLADD1
CLRC
MOVA,R3
JZFSS1
SETBC
FSS1:
AJMPADDMM
/*闪动调时程序*/
/*T1中断服务程序,用作时间调整时时调整单元闪烁指示*/
INTT1:
PUSH ACC /*中断现场保护*/
PUSH PSW
MOV TL1,#0B0H/*装入定时器T1定时初值*/
MOV TH1,#3CH
DJNZ R2,INTT1OUT
MOV R2,#06H
CPL 02H
JB 02H,FLASH1
MOV 72H,76H
MOV 73H,77H
MOV 74H,78H
MOV 75H,79H
INTT1OUT:
POP PSW/*恢复现场*/
POP ACC
RET1
FLASH1:
JB 01H,FLASH2/*01位为1时,转[小]时熄灭控制*/
MOV 72H,7AH
MOV 73H,7AH
MOV 74H,78H
MOV 75H,79H
AJMP INTT1OUT
FLASH2:
MOV 72H,76H
MOV 73H,77H
MOV 74H,7AH
MOV 75H,7AH
AJMP INTT1OUT
/*加1子程序*/
ADD1:
MOV A,@R0/*取当前计时单元数据到A*/
DEC R0
SWAP A
ORL A,@R0
ADD A,#01H
DA A
MOV R3,A
ANL A,#0FH
MOV @R0,A
MOV A,R3
INC R0
SWAP A
ANL A,#0FH
MOV @R0,A
RET
/*分减1子程序*/
SUB1:
MOV A,@R0 /*取当前计时单元数据到A*/
DEC R0
SWAP A
ORL A,@R0
JZ SUB11
DEC A
SUB111:
MOV R3,A/*移入R3中暂存数据*/
ANL A,#0FH
CLR C
SUBB A,#0AH
SUB1111:
JC SUB1110
MOV @R0,#09H
SUB110:
MOV A,R3/*取回R3中存数据*/
INC R0
SWAP A
ANL A,#0FH
MOV @R0,A
RET
SUB11:
MOV A,#59H
AJMP SUB111
SUB1110:
MOV A,R3/*移入R3存储器*/
ANL A,#0FH
MOV @R0,A
AJMP SUB110
/*时减1子程序*/
SUBB1:
MOV A,@R0/*取当前计时单元数据到A*/
DEC R0
SWAP A
ORL A,@R0
JZ SUBB11
DEC A
SUBB111:
MOV R3,A/*移入R3存储器*/
ANL A,#0FH
CLR C
SUBB A,#0AH
SUBB1111:
JC SUBB1110
MOV @R0,#09H
SUBB110:
MOV A,R3
INC R0
SWAP A
ANL A,#0FH
MOV @R0,A
RET
SUBB11:
MOV A,#23H
AJMP SUBB111
SUBB1110:
MOV A,R3
ANL A,#0FH
MOV @R0,A
AJMP SUBB110
/*清0程序*/
/*为计时单元复0用*/
CLR0:
CLR A
MOV @R0,A
DEC R0
MOV @R0,A
RET
/*时钟调整程序*/
当调时按键按下进入此程序
SETMM:
CLR ET0/*关定时器T0中断*/
CLR TR0/*关定时器T0*/
LCALL DLIS
JB P1.0,CLOSEDIS
MOV R2,#06H
SETB ET1
SETB TR1
SET2:
JNB P1.0,SET1/*P1口为0,等待*/
SETB 00H
SET4:
JB P1.0,SET3/*等待键按下*/
LCALL DL05S
JNB P1.0,SETHH
MOV R0,#77H
LCALL ADD1
MOV A,R3
CLR C
CJNE A,#60H,HHH
HHH:
JC SET4
LCALL CLR0
CLR C
AJMP SET4
CLOSEDIS:
SETB ET0
SETB TR0
CLOSE:
JB P1.0,CLOSE /*无键按下,等待*/
LCALL DISPLAY
JB P1.0,CLOSE
WAITH:
JNB P1.0,WAITH
LJMP START1
SETHH:
CLR 00H
SETHH1:
JNB P1.0,SET5
SETB 01H
SET6:
JB P1.0,SET7/*等待键按下*/
LCA