undefined-0's Blog

历添新岁月 春满旧山河

0%

AT89S52_test5

实验五 计数器实验

test 5_1

采用定时器与计数器相结合的方法使P1.7所接的发光二极管亮1秒、灭1秒,周而复始。
用三种组合实现:①查询方式+中断方式;②查询方式+查询方式;③中断方式+中断方式。

接线方法:P1.7接一LED,P3.5(T1输入)接P1.0(周期为100ms的方波输出)

①查询方式+中断方式
T1计数10,T0计时50ms
T1采用查询,T0采用中断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
ORG 0000H
SJMP MAIN

ORG 000BH ;T0中断服务程序入口
SJMP T0_ISR

ORG 0030H
MAIN:
CLR P1.0 ;设P1.0初始为低电平(为输出周期为100ms的方波做准备)
CLR P1.7 ;设P1.7初始为低电平(LED点亮)
MOV TMOD,#61H ;0110 0001:设置T1为计数器,方式2;设置T0为定时器,方式1
MOV TH0,#4CH
MOV TL0,#01H
MOV TH1,#0F6H
MOV TL1,#0F6H
SETB ET0 ;允许T0中断
;SETB ET1 ;允许T1中断
SETB TR0 ;启动T0
SETB TR1 ;启动T1
SETB EA ;开中断总开关

CHECK: ;查询T1是否有中断溢出请求
JBC TF1,HANDLE ;若中断请求标志位TF1为1,则将其清零并跳转到处理程序
SJMP CHECK

HANDLE: ;若T1有中断溢出请求,则取反P1.7
CPL P1.7
SJMP CHECK

;T0中断服务程序
T0_ISR:
CPL P1.0
MOV TH0,#4CH ;重装载
MOV TL0,#01H
RETI

END

test 5_2

②查询方式+查询方式
T1、T0皆采用查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
ORG 0000H
SJMP MAIN

ORG 0030H
MAIN:
CLR P1.7 ;设P1.7初始为低电平(LED点亮)
SETB P1.0 ;设P1.0初始为高电平(为输出周期为100ms的方波做准备)
MOV TMOD,#61H ;0110 0001:设置T1为计数器,方式2;设置T0为定时器,方式1
MOV TH1,#0F6H
MOV TL1,#0F6H
SETB TR1 ;启动T1(定时)

LABEL1:
CPL P1.7

LABEL2:
MOV TH0,#4CH
MOV TL0,#01H
SETB TR0 ;启动T0(计数)

LABEL3:
JBC TF0,LABEL4 ;若50ms到了,则将中断请求标志位TF0清零并跳转LABEL4(翻转P1.0)
SJMP LABEL3 ;50ms未到,继续查询中断请求标志位TF0状态

LABEL4:
CPL P1.0
JBC TF1,LABEL1 ;若1s到了,则将中断请求标志位TF1清零并跳转LABEL1(翻转P1.7)
AJMP LABEL2 ;某一个50ms到了,但1s没到,回到LABEL2对T0进行重装载

END

test 5_3

③中断方式+中断方式
T1、T0皆采用中断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
ORG 0000H
SJMP MAIN

ORG 000BH ;T0中断服务程序入口
SJMP T0_ISR

ORG 001BH ;T1中断服务程序入口
SJMP T1_ISR

ORG 0030H
MAIN:
CLR P1.0 ;设P1.0初始为低电平(为输出周期为100ms的方波做准备)
CLR P1.7 ;设P1.7初始为低电平(LED点亮)
MOV TMOD,#61H ;0110 0001:设置T1为计数器,方式2;设置T0为定时器,方式1
MOV TH0,#4CH
MOV TL0,#01H
MOV TH1,#0F6H
MOV TL1,#0F6H
SETB ET0 ;允许T0中断
SETB ET1 ;允许T1中断
SETB TR0 ;启动T0
SETB TR1 ;启动T1
SETB EA ;开中断总开关
SJMP $

;T0中断服务程序
T0_ISR:
CPL P1.0
MOV TH0,#4CH ;重装载
MOV TL0,#01H
RETI

;T1中断服务程序
; T1采用方式2,无需重装载
T1_ISR:
CPL P1.7
RETI

END

test 5_4

输入计数脉冲,将计数脉冲的个数显示出来(小于15次),循环往复
接线方法:P1口接八个LED,P3.5(T1输入)接按钮(按下一次,产生一个脉冲)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
;采用T1进行计数

ORG 0000H
SJMP MAIN

ORG 001BH ;T1中断服务程序入口
SJMP T1_ISR

ORG 0030H
MAIN:
CLR A
CPL A
MOV P1,A
CPL A
MOV TMOD,#60H ;0110 0000:设置T1为计数器,方式2
MOV TH1,#0FFH ;按下一次按钮,进入一次中断
MOV TL1,#0FFH
SETB ET1 ;允许T1中断
SETB TR1 ;启动T1
SETB EA ;开中断总开关
SJMP $

;T1中断服务程序
; T1采用方式2,无需重装载
T1_ISR:
CJNE A,#0FH,INCA ;若脉冲个数未到15个,则A直接加1
MOV A,#0 ;若脉冲个数已到15个,则从零开始计数
INCA:INC A
CPL A
MOV P1,A
CPL A
RETI

END