单片机课程
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
数字时钟
课
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
:数字时钟设计
系 别: 电气与电子工程系 专 业: 电气工程及其自动化 姓 名: 王鹏
学 号: 121206202
指导教师: 葛广军
河南城建学院
2008年12月30日
- 1 -
成绩评定?
(根据学生设计报告质量、答辩情况及其平时表现综合评定)。
(按下表要求评定)
课程设计成绩评定
指导教师签字 年 月 日
- 2 -
用8013单片机CPU及接口电路设计并实现显示时间的实时时钟。
(1) 在ZY15MCU12BD型综合单片机试验箱的硬件结构上编写软件完成设计。
(2) 程序的首地址应使目标机可以直接运行,即从0000H开始。在主程序的
开始部分必须设置一个合适的栈底。程序放置的地址须连续且靠前,不
要在中间留下大量的空间地址,以使目标机可以使用较少的硬件资源。
(3) 6位LED数码管从左到右分别显示时. 分. 秒(各占用2位),采用24小
时
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
计时制。开始计时时为000000,到235959后变成000000.
(4) 在XD1—2键盘上选定3个键分别作为小时. 分. 秒的调校键。每按一次
键,对应的显示值便加1。分. 秒加到59后变为00;小时加到23后再按键
即变为00.再调校时均不向上一单位进位(例如分加到59后变为00;但小
时不发生改变).
(5) 软件设计必须使用8031片内定时器,采用定时中断结构,不得使用软件
延时法。
(6) 上机调试程序。
(7) 写出设计报告。
1、设计的总体原理框图
见附录3
2、工作原理
电子时钟主要由8031片内定时器定时中断,并取一存储单元作为计数器使用,
每中断一次,在中断服务程序中使计数器加1、8031芯片、74LS373锁存器、8255A接口芯片、74LS240驱动器、LED数码显示管和4*4键盘组成。主要用8031片内定时器定时中断服务程序完成秒、分、时的运算即计时功能,TIME0的中断服务程序完成调时、调分、调秒功能。8255A负责将内存里的时位、分位和秒位数值输出到数
码管。同时按键01键、02键、03键是分别对时、分、秒的加1校对;05键、06键、07键时分别对时、分、秒的减1校对;00键是清零键。并且开机时时钟时从000000开始计时的,到235959时在回到000000.
此实时时钟的设计与实现,主要采用了6只LED数码管,8031内部二进制16位定时器/计数器,可编程中断控制器8031等芯片,包括显示模块,运算模块和校时模块
三大功能模块。
- 3 -
1、显示模块:
用8255控制,用数码管的显示功能来设计。显示部分硬件用六只LED为显示管,这些LED发光二极管的阴极是互相连接在一起的,所以称为共阴极数码管。通过在
这8只发光二极管的阳极加+5 V或0 V的电压使不同的二极管发光,形成不同的数
字。该模块主要是将运算模块和校时模块运算出来并存放在内存单元里的十六进制
表示的时位、分位和秒位数值转化为十进制,并通过8只数码管显示出来。该模块
实现的硬件是DVCC-8086JH实验箱中的LED单元,采用软件译码,即在程序中设
置一个段选码表。CPU直接往LED输出八段代码,省去了硬件译码器。A0~A3作为8段数据输出口,经74LS07驱动后到达各LED。只要做到每送一次段选码时也送一次
位扫描码,并且每送一次位扫描码后,位码中的0右移一位作为下一次的位扫描码,
即可实现由左向右使6只LED依次出现数字显示。
2、运算模块:
该模块的主要功能是对时、分、秒的运算,并把运算出的最终结果存到事先已
经开辟的内存单元里,以便显示模块即时地显示出来。该模块可以细分为秒定时模
块和运算模块。秒定时模块负责提供中断信号,由于CPU运算模块中的指令消耗一定的时间,所以中断信号最好通过硬件来实现。本实验中用8031定时器/计数器,但因为8031供的信号的周期是毫秒级的,因此必须通过软件的方法在运算模块中设
置一个统计中断次数的变量,并且这一变量必须事先在内存里开辟存储单元。中断
信号是8031工作方式为方式1,产生一个50ms的脉冲信号。运算模块负责时、分、
秒的计算,该模块主要通过8031的IR1号中断来实现,但由于每50ms一次中断请求,所以在中断服务程序必须利用已申请内存单元26H来统计中断请求的次数,只有当
26H的值为20时,才能让秒单元内的数值加1。在中断服务程序里,必须对秒、分和
时的单元内的数值进行判断,当秒加到60时,分必须加1 、秒清零;当分加到60时,时加1、分清零。当时加到24时,直接清零。然后转到调用处。
3、校时模块:
该模块主要功能是修改时、分、秒内存单元的数值。每按一次键,对应的显示值
便加1。分、 秒加到59后变为00;小时加到23后再按键即变为00.再调校时均不向上一单位进位(例如分加到59后变为00;但小时不发生改变)。注意:在主程序中对
时间进行调校前应关闭中断,以防在调校过程中定时中断服务程序也对时间进行修
改而造成混淆。
4. 整体功能:
在6块LED数码管上能实现数字时钟的时、分、秒显示,并能对时、分、秒进行加1校对、减1校对和清零。本实验中01键、02键、03键是分别对时、分、秒的加1校对;05键、06键、07键时分别对时、分、秒的减1校对;00键是清零键。并且开机时时
钟时从000000开始计时的,到235959时在回到000000.
- 4 -
见附录4。
1、设计过程中遇到的问题及解决方法
将编写好的源程序输入电脑,编译后出现很多错误,这些错误有许多时平时的实
验遇到过的,例如:输入的分号
格式
pdf格式笔记格式下载页码格式下载公文格式下载简报格式下载
不正确,零和字母O弄混淆了,LOOP5出现了几次,CJNE写成了CJNZ等等,幸好这些错误在平时的实验中遇到了,所以改错误很容
易,但同时也说明了,平时的错误现在还在换,证明错误我还没有完全的改正,这
点我以后一定要注意了。争起错误换了两次就不能在换了。除了常见的错误外,还
有几条错误时我从来没有遇到过的,如:LJMP跳转指令跳不回指定的位置,是因为
跳转的长度大于LJMP跳转的长度,最后只好设置跳转两次后才能跳到指定的位置。
经过多次的修改和向别人请教,错误都拍除了,编译通过了,但功能没有达到
设计的要求,第一、小时加1键加到23时还可以向上加而不是回到00.第二、时钟走到235959时不能回到000000的状态。这两个错误都出现在小时的位置,说明小时键
很特殊,的确,小时键当小于23时个位遇到10要进位,当大于23时个位遇到4时要进位,小时的十位也是一样,要判断两次,才能实现完整的功能。最后,经过几天
在机房的努力,终于实现了时钟的全部要求。
在前期的程序编写和几天的上机调试,使我又获得了很多新的知识,因为前期
编写程序时查了很多
资料
新概念英语资料下载李居明饿命改运学pdf成本会计期末资料社会工作导论资料工程结算所需资料清单
学到了很多知识,这几天的调试更时获得很新的知识,因
为程序中又很多的错误,为了修改错误必须看书或向别人请教,在这个过程中无意
识的获得了很多知识。同时也使我对单片机更感兴趣了,这点我觉得很重要,因为
兴趣使最好的老师,相信在以后的单片机相关的学习中会表现的更好。 2、设计体会
本次课程设计是用8031单片机CPU及接口电路设计一个数字时钟,经过一个星期
的调试,结果满足设计要求,验证无误。设计主要用到了多种芯片,程序也比较长
比较麻烦,同时也遇到了不少困难,尤其是关于校时模块的设计实现。关于显示模
块,在以前的实验中做过,所以问题很容易解决。
通过本次设计,我系统的了解了实时时钟的设计流程,尤其是硬、软件的设计
方法,掌握了键盘显示电路的基本功能及编程方法,掌握了键盘电路和显示电路的
一般原理,也进一步掌握了8031定时器的使用和中断处理器程序的编程方法。开
拓了思路,锻炼了实践动手能力,提高了分工协作能力和分析问题,解决问题的能
力,达到了本次课程设计的目的
3、对设计的建议
希望下次有机会能在更充足的时间里完成,我想会完成的更好
- 5 -
1、胡汉才编著,《单片机原理及其接口技术》清华大学出版社,2004。 2贾金铃等编著,《微型计算原理及应用》重庆大学出版社,2006。 3、吴清秀,周荷琴编著,《微型计算机原理与接口技术》中国科学技术 大学出版社,2004。
4、吴向军、罗源明等编著《汇编语言程序设计》高等教育出版社,2001。
开始
?
初始化( 定时器、显示区、
中断系统、计数单元等)
?
开中断
?
调用显示子程序
?
调用键盘扫描子程序
?
有键按下? N
?
关中断
?
秒键? N
?
秒加1处理
?
分键? N
?
分加1处理
?
小时键? N
?
小时加1处理
图1 主程序流程图
- 6 -
定时器中断处理
?
重送初值
?
保护现场
?
计数单元加1
?
到1秒? N
?
秒加1
?
秒到60? N
?
秒清0、分加1
?
分到60? N
?
分清0、小时加1
?
小时到24? N
?
小时清0
?
恢复现场
?
中断返回
图2 定时器中断程序流程图
ORG 0000H
LJMP START
ORG 000BH
LJMP TIME0
START: MOV SP,#60H
AGAIN: CPL P1.0
- 7 -
MOV R0,#10
LOOP1: MOV R1,#100
LOOP2: MOV R2,#250
DJNZ R2,$
DJNZ R1,LOOP2
DJNZ R0,LOOP1
MOV DPTR,#4003H ;8255初始化
MOV A,#10000001B
MOVX @DPTR,A
MOV TMOD,#01H ;选择方式.
MOV TH0,#3CH
MOV TL0,#0B0H
MOV 20H,#00H ;赋初值
MOV 21H,#00H
MOV 22H,#00H
MOV 23H,#00H
MOV 24H,#00H
MOV 25H,#00H
MOV 26H,#00H
LOOP: MOV IE,#82H ;开中断 SETB TR0 ;启动T0计数
LCALL DIS
LCALL KEY
CJNE A,#0FFH, DDDD ;若有键按下,DDDD SJMP LOOP ;无键按下,则转LOOP DDDD: MOV IE,#00H ;关中断
CJNE A,#03H,LOOP3 ;按下的键为秒键往下执行
INC 25H
MOV A,25H
CJNE A,#10,LOOP
MOV 25H,#0
INC 24H
MOV A,24H
- 8 -
CJNE A,#6,LOOP
MOV 24H,#0
SJMP LOOP
LOOP3: CJNE A,#02H,LOOP4 ;按下的键为分键往下执行
INC 23H
MOV A,23H
CJNE A,#10,LOOP
MOV 23H,#0
INC 22H
MOV A,22H
CJNE A,#6,LOOP
MOV 22H,#0
SJMP LOOP
LOOP4: CJNE A,#01H,LOOP4B ;按下的键为小时键往下执行
INC 21H
MOV A,21H
CJNE A,#10,LOOP5
MOV 21H,#0
INC 20H LOOP4B: CJNE A,#00H,LOOP4C
MOV 20H,#00H
MOV 21H,#00H
MOV 22H,#00H
MOV 23H,#00H
MOV 24H,#00H
MOV 25H,#00H LOOP5: MOV A,20H
SWAP A
ORL A,21H
CJNE A,#24H,LOOP
MOV 20H,#0
MOV 21H,#0
SJMP LOOP ----------各键减1校时程序----------
LOOP00: LJMP LOOP
- 9 -
LOOP4C: CJNE A,#07H,LOOP30
MOV A,25H
DEC 25H
CJNE A,#0,LOOP00
MOV 25H,#9
MOV A,24H
DEC 24H
CJNE A,#0,LOOP00
MOV 24H,#5
SJMP LOOP00 LOOP30: CJNE A,#06H,LOOP40
MOV A,23H
DEC 23H
CJNE A,#0H,LOOP00
MOV 23H,#9
MOV A,22H
DEC 22H
CJNE A,#0,LOOP00
MOV 22H,#5
SJMP LOOP00 LOOP40: CJNE A,#05H,LOOP00
MOV A,21H
CJNE A,#0,LOOP5A
MOV A,20H
CJNE A,#0,LOOP5B
MOV 21H,#3
MOV 20H,#2
SJMP LOOP00 LOOP5A: DEC 21H
LJMP LOOP00
LOOP5B: DEC 20H
MOV 21H,#9
LJMP LOOP00 ;-----------显示子程序-------------
DIS: MOV PSW,#08H
- 10 -
MOV R0,#20H
MOV R2,#0FEH
LOOP10: MOV A,@R0
MOV DPTR,#ASCTAB
MOVC A,@A+DPTR ;查字形代码
MOV DPTR,#4001H ;字形代码送B段口
MOVX @DPTR,A
MOV A,R2
MOV DPTR,#4000H ;字形代码送A位口
MOVX @DPTR,A
MOV R1,#250
DJNZ R1,$
MOV A,#0FFH ;关闭所有的显示位即位口置高电平
MOVX @DPTR,A
MOV A,R2
RL A
MOV R2,A
INC R0
CJNE R0,#26H,LOOP10
RET ASCTAB: DB 0C0H,0F9H,0A4H,0B0H,99H
DB 92H, 82H, 0F8H,80H, 90H
DB 88H, 83H, 0C6H,0A1H,86H
DB 8EH, 40H, 79H, 24H, 30H
DB 19H, 12H, 02H, 78H, 00H
DB 80H, 08H, 03H, 46H, 21H
DB 06H, 0EH, 0BFH,0FFH
;-----------扫描子程序-------------
KEY: MOV DPTR,#4002H
MOV A, #00001111B
MOVX @DPTR, A
MOVX A,@DPTR
ANL A,#0FH
CJNE A,#0FH,NEXT
SJMP LOOP8
NEXT: MOV R2,#11101111B
LOOP6: MOV A,R2
MOV DPTR,#4002H
- 11 -
MOVX @DPTR,A
MOVX A,@DPTR
ANL A,#0FH
CJNE A,#0FH,NEXT1 LOOP7: MOV A,R2
RL A
MOV R2,A
JB ACC.0,LOOP6 LOOP8: MOV A,#0FFH
RET
NEXT1: MOV R6,A
MOV R3,#100 LOOP9: MOV R4,#100
DJNZ R4,$
DJNZ R3,LOOP9
MOVX A,@DPTR
ANL A,#0FH
XRL A,R6
JNZ LOOP7
LOOP20: MOVX A,@DPTR
ANL A,#0FH
CJNE A,#0FH,LOOP20
MOV A,R6
ANL A,#0FH
MOV R6,A
MOV A,R2
ANL A,#0F0H
ORL A,R6
CALL KEY20
RET
;------------查键子程序-----------
KEY20: PUSH ACC
MOV R1,#00H KEY21: JNB ACC.4,KEY22
RR A
INC R1
SJMP KEY21 KEY22: MOV A,R1
- 12 -
MOV B,#4
MUL AB
MOV R1,A
POP ACC
KEY23: JNB ACC.0,KEY24
RR A
INC R1
SJMP KEY23
KEY24: MOV DPTR,#KEYTAB
MOV A,R1
MOVC A,@A+DPTR
RET
KEYTAB: DB 0FH,0BH,07H,03H
DB 0EH,0AH,06H,02H
DB 0DH,09H,05H,01H
DB 0CH,08H,04H,00H
;-----------定时器中断-------------
TIME0: PUSH ACC
PUSH PSW
MOV TH0,#3CH
MOV TL0,#0B0H
INC 26H
MOV A,26H
CJNE A,#20,RETURN ;未到1秒,则转RETURN
MOV 26H,#00H
INC 25H ;到1秒,秒单元的个位加1
MOV A,25H
CJNE A,#10,RETURN;
MOV 25H,#00H
INC 24H
MOV A,24H
CJNE A,#6,RETURN ;未到60秒,则转
MOV 24H,#00H
INC 23H ;分单元个位加1
MOV A,23H
CJNE A,#10,RETURN
MOV 23H,#00H
INC 22H
- 13 -
MOV A,22H
CJNE A,#06H,RETURN ;若未到60分,则转
MOV 22H,00H
INC 21H
MOV A,21H
CJNE A,#4H,CCCC
MOV A,20H
CJNE A,#2H,CCCC
MOV 21H,#00H
MOV 20H,#00H
CCCC: CJNE A,#10,RETURN
MOV 21H,#00H
INC 20H
MOV A,20H RETURN: POP PSW
POP ACC
RETI
END
- 14 -
图四 总电路图
- 15 -