undefined-0's Blog

历添新岁月 春满旧山河

0%

AT89S52_test7

实验七 综合实验 (定时器控制方式)

test 7_1

用 P1 口作为输出口实现循环彩灯。(至少要有 5 种形式)

中断第一次,8个发光二极管循环点亮;
中断第二次,8个发光二极管逐个点亮;
中断第三次,8个发光二极管高四位和低四位交替亮灭。
中断第四次,8个发光二极管间隔1个交替亮灭;
中断第五次,8个发光二极管间隔2个交替亮灭;
如此循环往复。

接线方法:P1口接8个LED,P3.5(T1输入)接P2.1(周期为100ms的方波输出)
配置T0为定时器,T1为计数器
T1计数20,T0计时50ms(0.1s*20 = 2s)

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
	ORG 0000H
SJMP MAIN

ORG 000BH ;T0(定时器)中断服务程序入口
LJMP T0_ISR

ORG 0030H
MAIN:
MOV A,#0FFH
MOV P1,A ;所有灯熄灭
MOV TMOD,#61H ;0110 0001:设置T1为计数器,方式2;设置T0为定时器,方式1
MOV TH0,#4CH
MOV TL0,#01H
SETB ET0 ;允许T0中断
SETB TR0 ;启动T0
SETB EA ;开中断总控
MOV TH1,#0DCH ;2s
MOV TL1,#0DCH
;T1采用查询方式,不允许中断
MOV R4,#0H


MODE1:
MOV A,#0FEH
MOV P1,A ;点亮P1.0所接的灯
LOOP1:
ACALL DELAY
RL A
MOV P1,A
INC R4 ;计算是否满8次
CJNE R4,#08H,LOOP1;不满8次,继续循环点亮
LCALL MODE_SWITHCING

MODE2:
MOV A,#0FEH
MOV P1,A
MOV R4,#00H
LOOP2:
ACALL DELAY
ADD A,ACC
MOV P1,A
INC R4 ;计算是否满8次
CJNE R4,#08H,LOOP2 ;不满8次,继续逐个点亮
LCALL MODE_SWITHCING

MODE3:
MOV A,#0FH
MOV P1,A
LOOP3:
ACALL DELAY
CPL A
MOV P1,A
INC R4 ;计算是否满8次
CJNE R4,#08H,LOOP3 ;不满8次,继续翻转
LCALL MODE_SWITHCING

MODE4:
MOV A,#33H ;0011 0011
MOV P1,A
LOOP4:
ACALL DELAY
CPL A
MOV P1,A
INC R4 ;计算是否满8次
CJNE R4,#08H,LOOP4 ;不满8次,继续翻转
LCALL MODE_SWITHCING

MODE5:
MOV A,#55H ;0101 0101
MOV P1,A
LOOP5:
ACALL DELAY
CPL A
MOV P1,A
INC R4 ;计算是否满8次
CJNE R4,#08H,LOOP5 ;不满8次,继续翻转
LCALL MODE_SWITHCING
LJMP MODE1

DELAY: MOV R0,#0AH
DELAY1: MOV R1,#00H
DELAY2: MOV R2,#0C3H
DJNZ R2,$
DJNZ R1,DELAY2
DJNZ R0,DELAY1
RET

MODE_SWITHCING:
MOV P1,#0FFH
MOV R4,#0H
SETB TR1
JNB TF1,$
CLR TR1
CLR TF1
RET

T0_ISR:
MOV TH0,#4CH
MOV TL0,#01H
CPL P2.1
RETI

END

test 7_2

设计一个简易数字钟。 选择一位开关作为数字钟的开关。
开关合上后,数字钟从0开始运行;
开关断开后,数字钟的显示关闭;
开关再次合上后,数字钟又从0开始运行。
led0–led5 表示为6位二进制数,显示数字钟的秒值;
led6–led7 表示为2位二进制数,显示数字钟的分钟值,
如达到4分钟,分钟值又从0开始;如此循环往复。

接线方法:P1接8个LED,P2.1(周期为100ms的方波输出)接P3.5(T1输入),P2.2连一拨码开关(低电平:关闭;高电平:开始计时)

T1计数10,T0计时50ms(0.1s*10 = 1s)

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
ORG 0000H
SJMP MAIN

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

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

MAIN:
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 TR0 ;启动T0
SETB ET1 ;允许T1中断
SETB TR1 ;启动T1
SETB EA ;开中断总控
MOV R1,#00H;计数变量(分钟)
MOV R2,#00H;计数变量(秒)
CLR A
SJMP $

T1_ISR: ;1秒到了
;计数器T1采用的是方式2,无需重装载
MOV A,R1
ADD A,R2
;CLR P2.2
JB P2.2,JUDGE ;若P2.2连接的拨码开关拨向高电平,则开始计时,否则停止计时(每隔一秒检测一次)
MOV A,#0FFH ;开关被拨向低电平,计时清零
MOV P1,A
MOV R1,#00H ;计数变量(分钟)
MOV R2,#00H ;计数变量(秒)
SJMP EXIT

JUDGE: ;判断是否计到了3分59秒
CJNE A,#0FBH,ADD_S ;11111011,若没有到3分59秒则加一秒(11H->3;111011H->59)
MOV R1,#00H ;若到了3分59秒则清零
MOV R2,#00H
MOV A,#00H
CPL A
MOV P1,A
CPL A

ADD_S:
MOV A,R2
CJNE A,#3BH,ADD_1S ;00111011,若没有到59秒则直接加一秒
MOV R2,#00H ;若到了59秒,则秒数清零,分钟数加一
MOV A,R1
ADD A,#40H ;01000000,加一分钟
MOV R1,A
;此处不必再让A加上R2,因为秒数已被清零。直接将A赋给P1即可。
CPL A
MOV P1,A
CPL A
SJMP EXIT

ADD_1S:
MOV A,R2
INC A
MOV R2,A
ADD A,R1
CPL A
MOV P1,A
CPL A
SJMP EXIT

EXIT:
RETI

T0_ISR: ;50ms到了
MOV TH0,#4CH ;重装载
MOV TL0,#01H
CPL P2.1
RETI

END