单片机定时器实验
实验三单片机内部定时器应用
实验目的
1、理解单片机内部定时器的工作原理及使用方法
2、了解单片机定时中断程序的编写和调试方法
3、掌握定时器的基本使用方法
实验仪器
单片机开发板、万利仿真机、稳压电源、计算机
实验原理
1、单片机定时器的工原理
MCS-51 单片机内部有两个16 位可编程的定时器/计数器T0 和T1。它们即可用作定时器方式,又可用作计数器方式。其中T0 由TH0 和TL0 计数器构成;T1 由TH1 和TL1 计数器构成。
工作于定时器方式时,通过对机器周期(新型51单片机可以对振荡周期计数)的计数,即每一个机器周期定时器加1,来实现定时。故系统晶振频率直接影响定时时间。如果晶振频率为
图4-8 定时控制寄存器数据格式编写程序控制这两个寄存器就可以控制定时器的运行方式。
单片机内部定时器/计数器的使用,简而概之:(1)如需用中断,则将EA和相关中断控制位置1;(2)根据需要设置工作方式,即对TMOD设置;(3)然后启动计数,即对TR0或TR1置1。(4)如使用中断,则计数溢出后硬件会自动转入中断入口地址;如使用查询,则必须对溢出中断标志位TF0或TF1进行判断。
2、用定时器编写一个秒计时器
假设系统使用的晶振频率为12MH Z,即每个机器周期为1us。如使用方式1,则定时时间最长是216×1us=65536us=65.536ms,小于1s。故必须设置一个软件计数单元,即假设定时器定时中断时间为50ms,则必须定时中断20次才达到1s并对秒计时单元加1,20即为软件计数次数。最后再把秒计时单元的值转成显示数码送显示缓冲区。
图4-9 定时器应用程序流程图
实验内容
1、单片机定时器秒计时器
LEDCLK BIT P3.4;
LEDDIN BIT P2.3;
LEDDATA DATA P0; 定时器中断中断保护现场 恢复现场 软件计秒计时器加Y N
主程初始化中断
控制器,定
启动定时器
调用显示程
DSEG AT 30H
dispbuf: ds 8;显示缓冲区
timetick: ds 1
second: ds 1
minute: ds 1
hour: ds 1
TIMECOUNT EQU 50000
CSEG at 0000H
SJMP MAIN
ORG 000BH
LJMP P_T0
ORG 0030;中断服务程序
P_T0:
PUSH PSW
PUSH ACC
PUSH DPH
PUSH DPL
MOV TH0,#(65535-TIMECOUNT)/256 MOV TL0,#(65535-TIMECOUNT)MOD 256 SETB RS0;后面所使用的R0~r7
DJNZ timetick,P_T02
MOV timetick,#20 INC second
; cjne second,#60,P_T01 ; MOV SECOND,#0
; inc minute;
P_T01: M OV A,second MOV B,#100
DIV AB
MOV R0,#dispbuf+2 MOV @R0,A
DEC R0
MOV A,B
MOV B,#10
DIV AB
MOV @R0,A
DEC R0
MOV @R0,B
P_T02: C LR RS0
POP DPL
POP DPH
POP ACC
POP PSW
RETI
MAIN:
mov sp,#60h
MOV dispbuf,#0
MOV dispbuf+1,#0
MOV dispbuf+2,#0
MOV dispbuf+3,#0
MOV dispbuf+4,#0
MOV dispbuf+5,#0
MOV dispbuf+6,#0
MOV dispbuf+7,#0
MOV
TH0,#(65535-TIMECOUNT)/256;3CAF
MOV TL0,#(65535-TIMECOUNT)MOD 256; MOV TMOD,#01H;设定定时器的工作方式SETB ET0;允许T0溢出中断
SETB TR0;启动t0
SETB EA;开启总中断
MAIN1:
ACALL DISP
SJMP MAIN1
DISP:
MOV R6,#8
MOV R0,#dispbuf CLR LEDCLK
CLR LEDDIN
NOP
DISP1: S ETB LEDCLK MOV A,@R0
MOV DPTR,#LEDTAB MOVC A,@A+DPTR MOV LEDDATA,A; MOV R7,#5
ACALL DelayNms INC R0
SETB LEDDIN
CLR LEDCLK
DJNZ R6,DISP1 RET; 大延时DelayNms:
D1: ACALL Delay1ms DJNZ R7,D1
RET; 延时子程序Delay1ms:
push 07
mov R7,#250
delay1:
NOP
NOP
DJNZ R7,delay1
POP 07
RET
LEDTAB:DB 03H,9FH,25H,0DH;0,1,2,3
DB 99H,49H,41H,1FH;4,5,6,7
DB 01H,09H,11H,0C1H;8,9,A,B
DB 63H,85H,61H,71H;C,D,E,F
END
2、修改上面的程序,设计一个N秒倒计时器(N 为学号后两位)。倒计时时间到后,重新开始计时。
LEDCLK BIT P3.4;
LEDDIN BIT P2.3;
LEDDATA DATA P0;
DSEG AT 30H
dispbuf: ds 8;显示缓冲区
timetick: ds 1
second: ds 1
minute: ds 1
hour: ds 1
TIMECOUNT EQU 50000
CSEG at 0000H
SJMP MAIN
ORG 000BH
LJMP P_T0
ORG 0030H;中断服务程序
P_T0:
PUSH PSW
PUSH ACC
PUSH DPH
PUSH DPL
MOV TH0,#(65535-TIMECOUNT)/256 MOV TL0,#(65535-TIMECOUNT)MOD 256 SETB RS0;后面所使用的R0~r7
DJNZ timetick,P_T01
MOV timetick,#20
dec second
MOV A,second
CJNE A,#00,P_T01 MOV SECOND,#33
P_T01: M OV A,second MOV B,#100
DIV AB
MOV R0,#dispbuf+2 MOV @R0,A
DEC R0
MOV A,B
MOV B,#10
DIV AB
MOV @R0,A
DEC R0
MOV @R0,B
CLR RS0
POP DPL
POP DPH
POP ACC
POP PSW
RETI
MAIN:
mov sp,#60h
MOV dispbuf,#0
MOV dispbuf+1,#0
MOV dispbuf+2,#0
MOV dispbuf+3,#0
MOV dispbuf+4,#0
MOV dispbuf+5,#0
MOV dispbuf+6,#0
MOV dispbuf+7,#0
mov timetick,#20
mov second,#33
MOV
TH0,#(65535-TIMECOUNT)/256;3CAF
MOV TL0,#(65535-TIMECOUNT)MOD 256; MOV TMOD,#01H
SETB ET0;允许T0溢出中断
SETB TR0;启动t0
SETB EA;开启总中断
MAIN1:
ACALL DISP
SJMP MAIN1
DISP:
MOV R6,#8
MOV R0,#dispbuf CLR LEDCLK
CLR LEDDIN
NOP
DISP1: S ETB LEDCLK MOV A,@R0
MOV DPTR,#LEDTAB MOVC A,@A+DPTR MOV LEDDATA,A; MOV R7,#5
ACALL DelayNms INC R0
SETB LEDDIN
CLR LEDCLK
DJNZ R6,DISP1 RET; 大延时DelayNms:
D1: ACALL Delay1ms DJNZ R7,D1
RET; 延时子程序
Delay1ms:
push 07
mov R7,#250
delay1:
NOP
NOP
DJNZ R7,delay1
POP 07
RET
LEDTAB: DB 03H,9FH,25H,0DH;0,1,2,3
DB 99H,49H,41H,1FH;4,5,6,7
DB 01H,09H,11H,0C1H;8,9,A,B
DB 63H,85H,61H,71H;C,D,E,F
END
思考题
1、在实验程序基础上编写一个24小时计时时钟。
LEDCLK BIT P3.4;
LEDDIN BIT P2.3;
LEDDATA DATA P0;
DSEG AT 30H
dispbuf: ds 8;显示缓冲区
timetick: ds 1
second: ds 1
minute: ds 1
hour: ds 1
TIMECOUNT EQU 50000
CSEG at 0000H
SJMP MAIN
ORG 000BH
LJMP P_T0
ORG 0030H;中断服务程序
P_T0:
PUSH PSW
PUSH ACC
PUSH DPH
PUSH DPL
MOV TH0,#(65535-TIMECOUNT)/256
MOV TL0,#(65535-TIMECOUNT)MOD 256
SETB RS0;后面所使用的R0~r7
DJNZ timetick,P_T02
MOV timetick,#20
INC second
MOV A,second
CJNE A,#60,P_T01;秒MOV SECOND,#0
inc minute;
MOV A,minute;分
CJNE A,#60,P-T01
INC HOUR;时
MOV A,HOUR
CJNE A,#12,P-T01
MOV HOUR,#0
P_T01:MOV A,second
MOV B,#100
DIV AB
MOV R0,#dispbuf+2
MOV @R0,A
DEC R0
MOV A,B
MOV B,#10
DIV AB
MOV @R0,A
DEC R0
MOV @R0,B
P_T02:CLR RS0
POP DPL
POP DPH
POP ACC
POP PSW
RETI
MAIN:
mov sp,#60h
MOV dispbuf,#0
MOV dispbuf+1,#0
MOV dispbuf+2,#0
MOV dispbuf+3,#0
MOV dispbuf+4,#0
MOV dispbuf+5,#0
MOV dispbuf+6,#0
MOV dispbuf+7,#0
MOV
TH0,#(65535-TIMECOUNT)/256;3CAF
MOV TL0,#(65535-TIMECOUNT)MOD 256;
MOV TMOD,#01H;设定定时器的工作方式
SETB ET0;允许T0溢出中断SETB TR0;启动t0
SETB EA;开启总中断
MAIN1:
ACALL DISP
SJMP MAIN1
DISP:
MOV R6,#8
MOV R0,#dispbuf
CLR LEDCLK
CLR LEDDIN
NOP
DISP1:SETB LEDCLK
MOV A,@R0
MOV DPTR,#LEDTAB MOVC A,@A+DPTR
MOV LEDDATA,A;
MOV R7,#5
ACALL DelayNms
INC R0
SETB LEDDIN
CLR LEDCLK
DJNZ R6,DISP1
RET; 大延时
DelayNms:
D1: ACALL Delay1ms
DJNZ R7,D1
RET; 延时子程序
Delay1ms:
push 07
mov R7,#250
delay1:
NOP
NOP
DJNZ R7,delay1
POP 07
RET
LEDTAB: DB 03H,9FH,25H,0DH;0,1,2,3
DB 99H,49H,41H,1FH;4,5,6,7
DB 01H,09H,11H,0C1H;8,9,A,B
DB 63H,85H,61H,71H;C,D,E,F END
2、说说把显示程序放在主程序和定时中断程序的优缺点。