当前位置:
首页 >
单片机技术文章 >
51单片机 > 详细内容
- 定时器和中断实验
- 发布时间:2009/6/29 阅读次数:3056 字体大小: 【小】 【中】【大】
ORG 0000H
AJMP START
ORG 000BH ;T0中断入口地址
AJMP INT_T0
ORG 0030H
START: MOV SP,#60H
MOV TMOD,#01H ;置T0为方式1
MOV TL0,#0B0H ;延时50mS的时间常数
MOV TH0,#3CH
MOV R0,#00H ;数码管显示单元
MOV R1,#20 ;定时次数
SETB TR0;启动定时器1,开始定时
SETB ET0
SETB EA ;开中断
Slop: acall display
SJMP Slop
INT_T0:;T0中断服务子程序
PUSH ACC;保护现场
PUSH PSW
PUSH DPL
PUSH DPH
CLR TR0;关闭定时器1,停止定时
MOV TL0,#0B0H;延时50mS常数
MOV TH0,#3CH
DJNZ R1,EXIT
MOV R1,#20;重置定时次数
MOV A,R0
INC A ;数码管显示单元内容加一
MOV R0,A
CJNE A,#10,EXIT
MOV R0,#00H ; 数码管显示单元清0
EXIT: SETB TR0;启动定时器0,开始定时
POP DPH;恢复现场
POP DPL
POP PSW
POP ACC
RETI
;显示子程序
display: mov a,R0
mov dptr,#numtab;指定查表启始地址
MOVC A,@A+DPTR ;得到段码
mov P0,a ; 段码送P0口
clr P2.7 ;送位码
acall delay1 ;延时10ms
setb P2.7
ret
;延时子程序
delay1:MOV R2,#20
L1: MOV R3,#248
DJNZ R3,$
DJNZ R2,L1
RET
;实验板上的7段数码管0~9数字的共阴显示代码
numtab: DB 0CFH,03H,5DH,5BH,93H,0DAH,0DEH,43H,0DFH,0DBH
END
3、使用软件定时1秒,控制2个数码管循环显示秒数0~59,每秒钟数字加一。
(1)在设计过程中使用一个存储单元作为秒计数单元,当一秒钟到来时,就让秒计数单元加1,当秒计数达到60时,就自动返回到0,重新秒计数。
(2)对于秒计数单元中的数据要把它十位数和个数分开,方法一:采用对10整除和对10求余;方法二:采用分数、合数法。
(3)在数码管上显示数,通过查表的方式完成。
(4)一秒时间的产生采用软件精确延时的方法来完成,经过精确计算得到1秒时间为1.002秒。
方法一汇编源程序
;----------10毫秒延时子程序
DELY10ms: MOV R4,#20
D1: MOV R5,#248
DJNZ R5,$
DJNZ R4,D1
RET
;-------主程序
Second EQU 30H
ORG 0
START: acall init
NEXT: acall display
Ljmp next
Init: MOV Second,#00H
ret
display: MOV R3,#50
dis2:MOV A,Second
MOV B,#10
DIV AB
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A ;送出十位数字的段码
CLR p2.7 ;送位码
Acall dely10ms
Setb p2.7
MOV A,B
MOVC A,@A+DPTR
MOV P0,A ;送出个位数字的段码
CLR p2.6
LCALL DELY10mS
Setb p2.6
djnz r3,dis2 ;20毫秒循环执行50次,时间约1秒
INC Second
MOV A,Second
CJNE A,#60,ret0
Mov Second,#00h
Ret0: ret
TABLE: DB 0CFH,03H,5DH,5BH,93H,0DAH,0DEH,43H,0DFH,0DBH
END
方法二汇编程序:
temp equ 22h ;计数器个位和十位数值存放内存位置
ORG 0000H ;程序执行开始地址
LJMP START ;跳到标号START执行
;-------------------- 主程序 ---------------------------
START: mov temp,#0 ;初始化计数器,从0开始
stlop: acall display ;调用显示子程序
acall add1 ;对计数器加1
mov a,temp
cjne a,#60H,next ;判断计数器是否满60?
mov temp,#0 ;满60就清零重新开始
next: ljmp stlop ;不满就循环执行
;显示子程序
display: mov r1,#50
dis1: mov a,temp ;将temp中的十六进制数转换成10进制
anl a,#0Fh
mov dptr,#numtab;指定查表启始地址
MOVC A,@A+DPTR ;查数字的段码
mov P0,a ;送出个位数字的段码
clr P2.7 ;送出位码
acall delay1 ;显示10ms
setb P2.7 ;关闭位选
mov a,temp;将temp中的十六进制数转换成10进制
anl a,#0F0h
swap a
mov dptr,#numtab;指定查表启始地址
MOVC A,@A+DPTR ;查数字的段码
mov P0,a ;送出十位数字的段码
clr P2.6 ;送位码
acall delay1 ;显示10ms
setb P2.6
djnz r1,dis1
ret
;延时子程序
delay1:MOV R2,#20
L1: MOV R3,#248
DJNZ R3,$
DJNZ R2,L1
RET
;加一子程序
add1: mov a,temp
inc a
da a
mov temp,a
ret
;实验板上的7段数码管0~9数字的共阴显示代码
numtab: DB 0CFH,03H,5DH,5BH,93H,0DAH,0DEH,43H,0DFH,0DBH
end
4、使用定时器T0,定时1秒,控制2个数码管循环显示秒数0~59,每秒钟数字加一。
本题请大家参考前面的例题独立完成。
1、说明实验目的和内容。
2、画出实验电路原理图,并简要分析电路的执行过程。
3、完成实验内容(4)的程序设计框图并说明编程思想,并给出程序清单。
4、根据实验内容,调式程序,观察、分析程序的运行过程。
5、给出实验结果并进行分析。
6、实验体会。