时钟设计报告Word文件下载.docx
《时钟设计报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《时钟设计报告Word文件下载.docx(41页珍藏版)》请在冰豆网上搜索。
(3)对时、分、秒作加1处理时,应注意它们的个位、十位的进位问题,选取一个合适的算法。
(4)在主程序中对时间进行调校前应关闭中断,以防在调校过程中定时中断服务程序也对时间进行修改而造成混乱。
(5)选择计数单元时应注意不得与子程序的使用单元发生冲突。
(6)参考流程图(见后所附)。
1.6工作环境简介
(1)硬件:
计算机一台、ZY15MCU12BD型综合单片机实验箱一台、通讯电缆一根。
(2)软件:
Windows操作系统、KeilC51软件。
1.7调试指南
首先调通子程序,对显示和键盘扫描子程序,可以仿照实验3、实验4进行调试;
对于其它新编子程序,可以用键盘输入入口参数,再用单步、设断点运行的方法看各中间环节的结果是否为预期值。
最后再用同样的方法调试主程序。
可以在Proteus仿真软件中进行预调试,待各种错误排除后,再到实际硬件中调试。
在仿真软件环境下运行,有可能因计算机的处理能力不够而走时缓慢,而在实际硬件中运行正常。
1.8推荐参考文献
(1)胡汉才单片机原理及其接口技术(第二版).北京:
清华大学出版社,2004.2
(2)徐安等单片机原理及应用.北京:
北京希望电子出版社,2003.2
(3)丁元杰单片微机原理及应用(第二版).北京:
机械工业出版社,1999.10
(4)李建忠单片机原理及应用.西安:
西安电子科技大学出版社,2002.2
(5)徐惠民单片微型计算机原理、接口及应用(第二版).北京:
北京邮电大学出版社,2000.10
(6)闫玉德MCS-51单片机原理及应用(C语言版).北京:
机械工业出版社
(7)何桥等单片机原理及应用.北京:
中国铁道出版社,2004.3
(8)李群芳单片机原理、接口及应用—嵌入式系统技术基础.北京:
清华大学出版社,2005.3
1.9主程序流程图
开始
初始化(定时器、显示区、
中断系统、计数单元等)
开中断
调用显示子程序
调用键盘扫描子程序
N
有键按下?
Y
关中断
秒加1处理
秒键?
分加1处理
小时加1处理
分键?
小时键?
图1主程序流程图
1.10定时器中断服务程序流程图
定时器中断处理
重送初值
保护现场
计数单元加1
到1秒?
秒加1
秒清0、分加1
秒到60?
分清0、小时加1
分到60?
小时到24?
小时清0
恢复现场
中断返回
图2定时器中断程序流程图
基于MCS-51单片机的时钟设计
2硬件结构概述
2.18051硬件结构与原理
8051内部由算数逻辑部件ALU、定时控制部件和寄存器组等组成
2.2电源电路
使用开发板或者实验箱上的5V电源进行供电。
2.38段LED显示器
1、MCS-51CPU通过一片8255对8段LED显示器进行段驱动和位驱动,8255的A口、B口、C口、控制口的地址分别为片外RAM的4000H、4001H、4002H、4003H。
2、.LED显示器的各段由8255的B口驱动,低电平对应段发光,高电平对应段熄灭。
各段的驱动位如图5-1,各显示字的字形代码如下所示:
显示字字形代码显示字字形代码显示字字形代码0C0H0.40H-BFH
1F9H1.79H灭FFH
2A4H2.24H
D7
3B0H3.30H
499H4.19H
592H5.12H
682H6.02H
7F8H7.78H
880H8.00H
990H9.10H
A88HA.08H
B83HB.03H
图5-18段LED各段控制位
CC6HC.46H
DA1HD.21H
E86HE.06H
F8EHF.0EH
3.LED显示器的各位由8255的A口驱动,低电平对应位发光,高电平对应位熄灭。
LED显示器对应位口位
左起第一位D0
左起第二位D1
左起第三位D2
左起第四位D3
左起第五位D4
左起第六位D5
2.44*4矩阵键盘
实验箱上有一个16键的矩阵键盘,分为4行×
4列。
4行分别连接到一片8255(与8段LED显示器的段驱动和位驱动共用)的PC0~PC3,4列分别连接到8255的PC4~PC7。
8255的A口、B口、C口、控制口的地址分别为片外RAM的4000H、4001H、4002H、4003H。
第4列
第3列
第2列
第1列
行
输
入
PC3
00H
01H
02H
03H
第4行
PC2
04H
05H
06H
07H
第3行
PC1
08H
09H
0AH
0BH
第2行
PC0
0CH
0DH
0EH
0FH
第1行
PC7
PC6
PC5
PC4
列驱动
图6-1键盘布置及键值
选择列驱动码使某一列为低电平而其它列为高电平,再读取行输入,若该列有键按下则相应的位便是低电平。
每个键均安排一个键值。
2.5可编程并行接口8255A
2.5.18255A的基本性能
可编程通用并行输入/输出接口电路
通用性强,使用灵活,通过它CPU可直接与外设相连
具有三个相互独立的输入/输出端口
A端口、B端口、C端口
三个端口可联合使用,构成具有握手联络信号的并行接口
端口有多种工作方式可供选择
A口有三种工作方式:
方式0、1、2
B口有二种工作方式:
方式0、方式1
2.5.28255A的内部结构
三个数据端口:
A口、B口、C口
每个端口都是8位的,可以选择为输入/输出口
A口:
8位输出锁存/缓冲、输入锁存/缓冲
B口:
C口:
8位输出锁存/缓冲、输入缓冲
可分为两个4位端口分别使用
A组、B组控制电路
A组:
控制A口和C口上半部分(PC4~PC7)
B组:
控制B口和C口下半部分(PC0~PC3)
2.5.38255A的引脚图
2.5.48255A的控制字
工作方式控制字的格式
3软件结构概述
3.1显示子程序
3.1.1程序流程图
返回
回
显示子程序的详细流程图
3.1.2显示子程序代码
DIS:
MOVR0,#20H
MOVR2,#0FEH
MOV27H,#21H
LOOP6:
MOVA,R0
MOV28H,#00H
CJNEA,27H,CHANGE
MOV28H,#10H
INC27H
MOVA,27H
CJNEA,#27H,JAMPP
JAMPP:
CLRA
CHANGE:
MOVA,@R0
ADDA,28H
MOVDPTR,#SUBTAB
MOVCA,@A+DPTR
MOVDPTR,#4001H
MOVX@DPTR,A
MOVA,R2
MOVDPTR,#4000H
MOVR3,#5
LOOP4:
MOVR4,#25
LOOP5:
MOVR1,#10
DJNZR1,$
DJNZR4,LOOP5
DJNZR3,LOOP4
MOVA,#0FFH
RLA
MOVR2,A
INCR0
CJNER0,#26H,LOOP6
RET
SUBTAB:
DB0C0H,0F9H,0A4H,0B0H,99H
DB92H,82H,0F8H,80H,90H
DB88H,83H,0C6H,0A1H,86H
DB8EH,40H,79H,24H,30H
DB19H,12H,02H,78H,00H
DB10H,08H,03H,46H,21H
DB06H,0EH,0BFH,0FFH
3.2键盘扫描子程序
3.2.1程序流程图
读取列值
返回键值0FFH
列值加上行首值
并查键值表
返回键值
键盘扫描流程图
3.2.2键盘扫描程序代码
KEY:
MOVDPTR,#4002H
MOVA,#00H
MOVXA,@DPTR
ANLA,#0FH
CJNEA,#0FH,KEYSCAN
SJMPEXIT
KEYSCAN:
ACALLDY20MS
MOVR2,#0EFH
MOVR3,#04H
MOVR0,#00H
KEYSM1:
MOVA,R2
CJNEA,#0FH,JSADD
DJNZR3,KEYSM1
EXIT:
SJMPDONE
JSADD:
JBACC.0,JSADD1
AJMPJSADD4
JSADD1:
JBACC.1,JSADD2
MOVA,#04H
JSADD2:
JBACC.2,JSADD3
MOVA,#08H
JSADD3:
JBACC.3,JSADD4
MOVA,#0CH
JSADD4:
ADDA,R0
MOVDPTR,#KEYTAB
DONE:
KEYTAB:
DB0FH,0EH,0DH,0CH
DB0BH,0AH,09H,08H
DB07H,06H,05H,04H
DB03H,02H,01H,00H
DY20MS:
MOVR7,#0A0H
DY20MS1:
MOVR6,#0FFH
DY20MS2:
DJNZR6,DY20MS2
DJNZR7,DY20MS1
3.3主程序设计
3.3.1主程序流程图
关定时器
CLR2AH.0
31H=0?
开定时器
SETB2AH.0
2AH.0=1?
已按奇数次31H=1,否则31H=0
是启动停止按键?
是清零按键?
时钟清零
秒加1按键?
分加1按键?
分加1
时加1
时加1按键?
秒减1按键?
秒减1
分减1按键?
分减1
时减1按键?
时减1
主程序流程图
3.3.2主程序代码
ORG0100H
MOVSP,#6FH
MOVDPTR,#4003H;
控制口地址送DPTR
MOVA,#81H;
A口、B口方式0输出,C口高4位出,低4位输入
MOVX@DPTR,A;
控制字送控制口
MOVTMOD,#10H
MOVTH1,#3CH;
送定时器初值
MOVTL1,#0B0H
MOV30H,#14H
SETBEA
RETURN:
LCALLDIS
LCALLKEY
CJNEA,#0FFH,YES1
MOVA,31H
CJNEA,#00H,START
CLRET1
CLRTR1
CLR2AH.0
SJMPRETURN
START:
JB2AH.0,RETURN
SETBET1
SETBTR1
SETB2AH.0
YES1:
CJNEA,#0FH,NO_START
INC31H
MOVA,31H
MOVB,#02H
DIVAB
MOVA,B
MOV31H,A
NO_START:
CJNEA,#0BH,NO_CLEAR
MOV20H,#00H
MOV21H,#00H
MOV22H,#00H
MOV23H,#00H
MOV24H,#00H
MOV25H,#00H
LJMPRETURN
NO_CLEAR:
CJNEA,#0AH,NOS
INC25H
MOVA,25H
CJNEA,#0AH,JMPSS
INC24H
MOV25H,#00H
MOVA,24H
CJNEA,#06H,JMPSS
MOV24H,#00H
JMPSS:
LJMPNOH
NOS:
CJNEA,#09H,NOM
INC23H
MOVA,23H
INC22H
MOV23H,#00H
MOVA,22H
CJNEA,#06H,NOH
MOV22H,#00H
SJMPNOH
NOM:
CJNEA,#08H,DEC_S
INC21H
MOVA,21H
CJNEA,#0AH,CHECK
INC20H
MOV21H,#00H
CHECK:
MOVA,20H
CJNEA,#02H,NOH
MOVA,21H
CJNEA,#04H,NOH
DEC_S:
CJNEA,#0EH,NO_DECS
DEC25H
MOVA,25H
CJNEA,#0FFH,NO_Z1
MOVA,24H
CJNEA,#00H,NO_J1
MOV25H,#00H
LJMPRETURN
NO_J1:
MOV25H,#09H
DEC24H
NO_Z1:
LJMPRETURN
NO_DECS:
CJNEA,#0DH,NO_DECM
DEC23H
MOVA,23H
CJNEA,#0FFH,NO_Z2
MOVA,22H
CJNEA,#00H,NO_J2
NO_J2:
MOV23H,#09H
DEC22H
NO_Z2:
NO_DECM:
CJNEA,#07H,NOH
DEC21H
CJNEA,#0FFH,NOH
MOVA,20H
CJNEA,#00H,NO_J3
NO_J3:
MOV21H,#09H
DEC20H
NOH:
3.4中断服务程序
3.4.1中断服务程序流程图
计数单元减1
定时器中断程序流程图
3.4.2中断服务程序代码
ORG001BH
AJMPsheji_EI
ORG0050H
sheji_EI:
PUSHPSW
PUSHACC
DJNZ30H,JAMP
MOV30H,#14H
CJNEA,#0AH,JAMP1
JAMP1:
JCJAMP
INC24H
CJNEA,#06H,JAMP2
JAMP2:
CJNEA,#0AH,JAMP3
JAMP3:
CJNEA,#06H,JAMP4
JAMP4:
CJNEA,#0AH,JAMP5
JAMP5:
MOVA,20H
CJNEA,#02H,JAMP6
JAMP6:
MOVA,21H
CJNEA,#04H,JAMP7
JAMP7:
MOV20H,#00H
MOV21H,#00H
JAMP:
MOVTH1,#3CH;
重送定时器初值
MOVTL1,#0B0H
POPACC
POPPSW
RETI
END
3.5调试过程
照着程序流程图慢慢的在keil软件中写出课设所要求的程序代码,并进行编译,看看是否有指令错误,如果指令正确会生成.hex的文件,然后在proteus7软件添加仿真电路图并加载.hex文件于8031或89C51芯片中,点击仿真运行按钮进行仿真,会看到下图所示的效果:
但是第一代代码毕竟不是那么完美,在进行按键对分钟进行加1调整时会出现如下的结果:
上图出现了字母A的显示,这是因为软件代码中没有对加1之后的单元里面的值进行范围的限制,此时的按键加1代码如下:
CLRET1
CJNEA,#0FH,NO_S;
F键秒钟加1
SJMPNO_H
NO_S:
CJNEA,#0BH,NO_M;
B键分钟加1
INC23H
SJMPNO_H
NO_M:
CJNEA,#07H,NO_H;
7键时钟加1
INC21H
在进行了代码的优化之后显示不再出现字母:
优化代码如下:
YES1:
MOVA,#0AH,NO_S
CJNEA,#0AH,NO_S
INC23H
MOVA,#0AH,NO_M
CJNEA,#0AH,NO_M
SJMPNO_H
经过上述代码优化后效果是好了不少,但是对时钟显示以及显示范围没有处理好,时钟要求23显示后下一位是00而不是24,所以时钟代码优化如下:
NO_M:
CJNEA,#07H,NO_H
CHECK:
CJNEA,#02H,NO_H
CJNEA,#04H,NO_H
在上述所有优化后数码管显示23.59.59之后会显示00.00.00,这就是我们日常生活中说需要的效果。
在中断服务程序中也要对加1操作进行上述代码的类似优