单片机实验
微机实验:脑时钟
实验目的
1、掌握定时器的编程方式。
2、了解中断子程序的执行过程,掌握其编程设计和调试方法。
3、加深对51系列单片机内部结构和使用方法的理解。
4、初步理解基于8031的微机化仪表的整体设计。
实验内容和原理:
利用实验板设计电脑时钟,既能显示时间,又能调整时间。
显示格式如图5-1。相应地,在片内RAM开辟显示缓冲区2A∽2FH,每一个显示缓冲单元对应一个数码管,为便于显示,采用非压缩BCD码。另外,还开辟时、分、秒、0.1秒四个计时单元,地址为40-43H,为便于计算,采用16进制数。
为产生时间基准,用定时器0,工作方式1,溢出周期0.1S。即每隔0.1s产生一次中断请求,0.1s单元加1。中断10次即1秒,秒单元加1。秒单元计数到60时,分单元加1。分单元计数到60时,时单元加1。显然,只要把时、分、秒计时单元中的值转送至显示缓冲单元(需16进制转换为10进制),那么,就能实现时间显示。
为实现时间调整,键盘布置如图5-2所示。键号为9、A、B的三只键分别用作秒、分、时选择键;键号为4、5的二只键分别用作减少和增加键。例如,需要“分”调整,则先按“分”键,再按“↓”或“↑”键。
整个程序,由主程序,定时中断程序,时间设置程序等部分组成。
图5-3 主程序框图
主程序(流程框图见图5-3):
ORG 0000H |
||
LJMP MAIN |
||
ORG 000BH |
||
LJMP CLOCK |
;定时中断入口 | |
MAIN: |
MOV SP, #60H |
;设置堆栈 |
MOV DPTR, #0B000H |
;8155命令字 | |
MOV A, #03H |
;A、B口输出,C口输入 | |
MOVX @DPTR, A |
||
MOV TMOD, #01H |
;定时器T0,方式1 | |
MOV TH0, #3CH |
;定时间100ms | |
MOV TL0, #B0H |
||
MOV IE, #82H |
;开T0中断 | |
SETB TR0 |
;启动T0 | |
MOV 40H, #00H |
;计时单元清零 | |
MOV 41H, #00H |
||
MOV 42H, #00H |
||
MOV 43H, #00H |
||
MOV R0, #2AH |
;显示缓冲2A~2F清零 | |
CLR A |
||
MP0: |
MOV @ R0, A |
|
INC R0 |
||
CJNE R0, #30H, MP0 |
||
DIS: |
LCALL DISP |
;调显示子程序 |
LCALL SETUP |
;调设置子程序 | |
SJMP DIS |
定时中断服务子程序(流程框图见图5-4)
ORG 0500H |
||
CLOCK: |
PUSH PSW |
;压栈保护 |
PUSH A |
||
MOV TH0, #3CH |
;重装初值 | |
MOV TL0, #0BCH |
||
INC 43H |
;0.1s单元加1 | |
|
MOV A, 43H |
|
CJNE A, #0AH, RET0 |
;1s不到,转RET0 | |
MOV 43H, #00H |
;1s到,0.1s单元清零 | |
INC 42H |
;秒单元加1 | |
MOV A, 42H |
||
CJNE A, #3CH, RET0 |
;1分不到,转RET0 | |
MOV 42H , #00H |
;1分到,秒单元清零 | |
INC 41H |
;分单元加1 | |
MOV A, 41H |
||
CJNE A, #3CH, RET0 |
;1小时不到,转RET0 | |
MOV 41H, #00H |
;1小时到,分单元清零 | |
INC 40H |
;时单元加1 | |
MOV A, 40H |
||
CJNE A, #81H, RET0 |
;24小时到否? | |
MOV 40H, #00H |
;到,则时清零 | |
RET0: |
MOV A, 40H |
;将计时单元中16进制转换 |
MOV B, #0AH |
;为十进制后,送显示缓冲 | |
DIV AB |
||
MOV 2AH, A |
;“时”送显示 | |
MOV 2BH, B |
||
MOV A, 41H |
||
MOV B, #0AH |
||
DIV AB |
||
MOV 2CH, A |
;“分”送显示 | |
MOV 2DH, B |
||
MOV A, 42H |
||
MOV B, #0AH |
||
|
DIV AB |
|
MOV 2EH, A |
;“秒”送显示 | |
MOV 2FH, B |
||
POP A |
;出栈 | |
POP PSW |
||
RETI |
时间设置子程序(流程框图见图5-5)
ORG 0450H |
||
SETUP: |
LCALL KS1 |
;判别有无键按下? |
JZ ST9 |
;无键按下,退出 | |
CLR EA |
;关中断 | |
LCALL KEYA |
;求键号→A | |
CJNE A, #0BH, ST1 |
;“时”键? | |
MOV 20H, #01 H |
;是,置时标志 | |
SJMP ST9 |
||
ST1: |
CJNE A, #0AH, ST2 |
;“分”键? |
MOV 20H, #02H |
;是,置分标志 | |
SJMP ST9 |
||
ST2: |
CJNE A, #09H, ST3 |
;“秒”键? |
MOV 20H, #04H |
;是,置秒标志 | |
|
SJMP ST9 |
|
ST3: |
CJNE A, #05H, ST6 |
;“增加”键? |
MOV A, 20H |
;是,则判时分秒标志 | |
CJNE A, #01H, ST4 |
||
|
INC 40H |
;“时”+1 |
SJMP ST9 |
||
ST4: |
CJNE A, #02H, ST5 |
|
INC 41H |
;“分”+1 | |
SJMP ST9 |
||
ST5: |
CJNE A, #04H, ST9 |
|
INC 42H |
;“秒”+1 | |
SJMP ST9 |
||
ST6: |
CJNE A, #04H, ST10 |
;“减少”键? |
MOV A, 20H |
;是,判时分秒标志 | |
CJNE A, #01H, ST7 |
||
DEC 40H |
;“时”-1 | |
SJMP ST9 |
||
ST7: |
CJNE A, #02H, ST8 |
|
DEC 41H |
;“分”-1 | |
SJMP ST9 |
||
ST8: |
CJNE A, #04H, ST9 |
|
DEC 42H |
;“秒”-1 | |
ST9: |
SETB EA |
;开中断 |
RET |
||
ST10: |
MOV 20H, #00H |
|
RET |
实验步骤:
1、输入程序。
2、连续运行程序,检查显示能否正常计时,按键能否实现调整。如发现不正常,可采用断点、单步等方法进行分段调试。
思考题:
1、如何调整时钟精度?
2、如何判断CPU是否响应定时中断?
3、主程序最后一句能否改为NOP或SJMP$?
全部0条评论
快来发表一下你的评论吧 !