undefined-0's Blog

历添新岁月 春满旧山河

0%

搭建Blog踩坑记录

  • 本地新添了博文,使用hexo server查看,一切正常。
  • hexo d,但显示nothing to commit, working tree clean
  • 解决方法:
    1
    2
    3
    hexo clean
    hexo generate
    hexo deploy

实验八 综合实验 十字路口交通灯

南北红灯(D1、D7)亮维持15秒,在南北红灯亮的同时东西绿灯(D5、D11)也亮,并维持10s。
到10s时,东西绿灯(D5、D11)闪亮,闪亮3s后熄灭。
在东西绿灯(D5、D11)熄灭时,东西黄灯(D6、D12)亮,并维持2秒。
到2秒时,东西黄灯(D6、D12)熄灭,东西红灯(D4、D10)亮,同时南北红灯(D1、D7)熄灭,绿灯(D2、D8)亮。

接线方法:
P1.0—P3.5 T1输入
P1.1—D1 D7 南北红
P1.2—D2 D8 南北绿
P1.3—D3 D9 南北黄
P1.4—D4 D10 东西红
P1.5—D5 D11 东西绿
P1.6—D6 D12 东西黄
注:交通灯模块的LED为置低点亮

T0定时50ms,使P1.0口输出周期为100ms的方波,作为计数器T1的输入
T1重装载值:
0FB—0.5s
0F6—1s
0EC—2s
0E2—3s
9C—10s
6A—15s

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
; EW -> East & West,东西
; SN -> South & North,南北

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 ;开中断总控

LOOP:
MOV TH1,#9CH ;10s
MOV TL1,#9CH
;T1采用查询方式,不允许中断
SETB TR1 ;启动T1

CLR P1.5 ;点亮东西绿
CLR P1.1 ;点亮南北红
JNB TF1,$ ;若10s未到,等待
MOV R0,#06H ;10s到了,装载R0(为控制绿灯闪烁次数而设的计数变量)
CALL_EW_GREEN_FLASH:
ACALL GREEN_EW_FLASH ;绿灯闪烁(闪烁三秒--->调用六次)
DJNZ R0,CALL_EW_GREEN_FLASH
SETB P1.5;东西绿闪烁结束,熄灭东西绿
CLR TR1 ;停止T1
CLR P1.6;点亮东西黄
MOV TH1,#0ECH ;2s
MOV TL1,#0ECH
SETB TR1 ;启动T1
JNB TF1,$ ;若2s未到,等待
CLR TR1 ;2s到了,停止T1
CLR TF1 ;清中断标志位
SETB P1.6;熄灭东西黄
SETB P1.1;熄灭南北红
CLR P1.4;点亮东西红
CLR P1.2;点亮南北绿
MOV TH1,#9CH ;10s
MOV TL1,#9CH
SETB TR1;启动T1
JNB TF1,$ ;若10s未到,等待
MOV R0,#06H ;10s到了,装载R0(为控制绿灯闪烁次数而设的计数变量)
CALL_SN_GREEN_FLASH:
ACALL GREEN_SN_FLASH ;绿灯闪烁(闪烁三秒--->调用六次)
DJNZ R0,CALL_SN_GREEN_FLASH
SETB P1.2;南北绿闪烁结束,熄灭南北绿
CLR TR1 ;停止T1
CLR P1.3;点亮南北黄
MOV TH1,#0ECH ;2s
MOV TL1,#0ECH
SETB TR1 ;启动T1
JNB TF1,$ ;若2s未到,等待
CLR TR1 ;2s到了,停止T1
CLR TF1 ;清中断标志位
SETB P1.3;熄灭南北黄
SETB P1.4;熄灭东西红
SJMP LOOP

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

GREEN_EW_FLASH:
JNB TF1,$ ;若0.5s未到,等待(第一次进入GREEN_EW_FLASH时,标志位TF1未清零,不会等待)
CLR TR1 ;0.5s到了,停止T1
CLR TF1 ;清中断标志位
CPL P1.5 ;东西绿开始闪烁
MOV TH1,#0FBH ;0.5s
MOV TL1,#0FBH
SETB TR1 ;启动T1
RET

GREEN_SN_FLASH:
JNB TF1,$ ;若0.5s未到,等待(第一次进入GREEN_SN_FLASH时,标志位TF1未清零,不会等待)
CLR TR1 ;0.5s到了,停止T1
CLR TF1 ;清中断标志位
CPL P1.2 ;南北绿开始闪烁
MOV TH1,#0FBH ;0.5s
MOV TL1,#0FBH
SETB TR1 ;启动T1
RET

END

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

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

实验六 A/D D/A 实验

test 6_1

A/D实验
用AT89S52的MCU驱动ADC0809进行模数转换。程序启动时,由8个LED显示AD0809通道0的电压值(以二进制数形式)。
接线方法:实验书P108硬件连接表(忽略数码管部分,将P1口连至LED处)

image-20240722150702777
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
EOC 	BIT 	P3.0

ORG 0000H
LJMP MAIN
ORG 0100H

MAIN:
MOV A,#0FFH
MOV P0,A
MOV A,#00H
MOV P2,A

LOOP:
MOV DPTR,#7FFFH ;选择P2.7(若给P2口赋全0,则接线时可以选取P2口的任意一位接片选信号CS)
MOV A,#00H ;任意值
MOVX @DPTR,A ;给AD一个写操作,启动转换
JNB EOC,$ ;等待转换结束
MOVX A,@DPTR ;将转换结果读入A
MOV P1,A ;将转换结果从P1输出
LJMP LOOP

END

test 6_2

D/A实验
实现D/A接口设计,编写程序输出占空比为1/3的方波、锯齿波、三角波、正弦波。
用2个开关控制输出波形的类型,使用示波器观察波形。

接线方法:P0接数模转换区DB0-DB7,P2.7接数模转换区CS,P3.6接数模转换区WR。
示波器红表笔接DA输出,黑表笔接GND。
P3.2(INT0)、P3.3(INT1)各接一个拨码开关,初始时置为高。

效果:11-锯齿波 10-三角波 01-方波 00-正弦波

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
ORG 0000H
AJMP MAIN

ORG 0003H
LJMP INT0_ISR

ORG 0013H
LJMP INT1_ISR

ORG 0050H
MAIN:
MOV IE,#85H ;1000 0101,允许外部中断INT1和INT0,开中断总开关
SETB PX1 ;设外部中断1为高优先级中断
; TCON不作其他配置,保持复位时的全0(外部中断触发方式为低电平)

;MOV R0 #02H ;为控制方波占空比而设置的计数变量

SAWTOOTH: ;锯齿波
CLR A
MOV DPTR,#7FFFH
LOOP_SAWTOOTH:
MOVX @DPTR,A
INC A
SJMP LOOP_SAWTOOTH

INT0_ISR: ;P3.2所接的开关置为低时进入外部中断0
SQUARE:
MOV DPTR,#7FFFH
CLR A ;对A清零
MOVX @DPTR,A
LOOP_SQUARE:
CPL A
MOVX @DPTR,A
ACALL DELAY ;高电平 一段延时
CPL A
MOVX @DPTR,A
ACALL DELAY ;低电平 两段延时
ACALL DELAY
JB P3.2,EXIT ;若P3.2所接的开关被置为高,则退出中断
SJMP LOOP_SQUARE ;若P3.2所接的开关仍为低,则继续输出方波

DELAY:
MOV R7,#0FFH
DJNZ R7,$
RET

EXIT:
RETI

INT1_ISR: ;P3.3所接的开关置为低时进入外部中断1
JB P3.2,TRIANGLE ;若P3.2所接的开关被置为高,则输出三角波。否则输出正弦波。
JB P3.3,EXIT ;若P3.3所接的开关被置为高,则退出中断

SIN:
MOV R1,#63 ;一个周期内输出64个点
LOOP_SIN:
MOV DPTR,#TAB
MOV A,R1
MOVC A,@A+DPTR
MOVX @DPTR,A
NOP ;延时,可根据实际情况更改
DJNZ R1,LOOP_SIN
SJMP INT1_ISR

TAB: ;正弦波数据表
DB 80H,8CH,98H,0A5H,0B0H,0BCH,0C7H,0D1H
DB 0DAH,0E2H,0EAH,0F0H,0F6H,0FAH,0FDH,0FFH
DB 0FFH,0FFH,0FDH,0FAH,0F6H,0F0H,0EAH,0E3H
DB 0DAH,0D1H,0C7H,0BCH,0B1H,0A5H,99H,8CH
DB 80H,73H,67H,5BH,4FH,43H,39H,2EH
DB 25H,1DH,15H,0FH,09H,05H,02H,00H
DB 00H,00H,02H,05H,09H,0EH,15H,1CH
DB 25H,2EH,38H,43H,4EH,5AH,66H,73H

TRIANGLE:
MOV DPTR,#7FFFH
CLR A ;对A清零
LOOP_TRIANGLE_INC:
MOVX @DPTR,A
INC A
CJNE A,#0FFH,LOOP_TRIANGLE_INC
LOOP_TRIANGLE_DEC:
MOVX @DPTR,A
DEC A
JNZ LOOP_TRIANGLE_DEC
JB P3.3,EXIT ;若P3.3所接的开关被置为高,则退出中断
JNB P3.2,INT1_ISR ;若P3.2所接的开关被置为低,则进入中断服务程序1
LJMP LOOP_TRIANGLE_INC

END

实验五 计数器实验

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

实验四 定时器实验

注:本实验所用单片机外接晶振频率为11.059MHz

test 4_1

采用定时器控制从P1.0口输出1000Hz方波信号,占空比为1/4。

接线方法:P1.0接示波器红表笔,任找一低电平接黑表笔。

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
ORG 0000H
SJMP MAIN

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

ORG 0030H
MAIN:
CLR P1.0 ;设P1.0、P1.1初始为低电平
MOV TMOD,11H ;0000 0001:设置T0为定时器,工作在方式1
MOV TH0,#0FFH ;开启后立即进入中断
MOV TL0,#0FEH
SETB ET0 ;允许T0中断
SETB TR0 ;启动T0
SETB EA ;开中断总开关
SJMP $

;T0中断服务程序
T0_ISR:
CLR TR0 ;停止T0
CPL P1.0 ;反转P1.0
JNB P1.0, T0_CHANGE_TIME ;如果P1.0为低电平,设置T0为低电平持续时间
MOV TH0, #0FFH ;重装载(250μs,高电平持续时间)
MOV TL0, #01AH
SETB TR0;重新启动T0
RETI

T0_CHANGE_TIME:
MOV TH0, #0FDH ;重装载(750μs,低电平持续时间)
MOV TL0, #4DH
SETB TR0 ;重新启动T0
RETI

END

test 4_2

采用定时器控制从P1.0和P1.1分别输出周期为3ms占空比为1/3的方波和周期为为500μs占空比为1/5的方波。

接线方法:P1.0接示波器红表笔(CH1),任找一低电平接黑表笔
P1.1接示波器红表笔(CH2),任找一低电平接黑表笔

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
ORG 0000H
SJMP MAIN

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

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

ORG 0050H
MAIN:
CLR P1.0 ;设P1.0、P1.1初始为低电平
CLR P1.1
MOV TMOD,#11H ;0001 0001:设置T1、T0都为定时器,都工作在方式1
MOV TH0,#0FFH ;开启后立即进入中断
MOV TL0,#0FEH
MOV TH1,#0FFH
MOV TL1,#0FEH
SETB ET0 ;允许T0中断
SETB ET1 ;允许T1中断
SETB TR0 ;启动T0
SETB TR1 ;启动T1
SETB EA ;开中断总开关
SJMP $

;T0中断服务程序
T0_ISR:
CLR TR0 ;停止T0
CPL P1.0 ;反转P1.0
JNB P1.0, T0_CHANGE_TIME ;如果P1.0为低电平,设置T0为低电平持续时间
MOV TH0, #0FCH ;重装载(1ms,高电平持续时间)
MOV TL0, #066H
SETB TR0;重新启动T0
RETI

T0_CHANGE_TIME:
MOV TH0, #0F8H ;重装载(2ms,低电平持续时间)
MOV TL0, #0CDH
SETB TR0 ;重新启动T0
RETI

;T1中断服务程序
T1_ISR:
CLR TR1 ;停止T1
CPL P1.1 ;反转P1.1
JNB P1.1, T1_CHANGE_TIME ;如果P1.1为低电平,设置T1为低电平持续时间
MOV TH1, #0FFH ;重装载(100μs,高电平持续时间)
MOV TL1, #0A4H
SETB TR1;重新启动T1
RETI

T1_CHANGE_TIME:
MOV TH1, #0FEH ;重装载(400μs,低电平持续时间)
MOV TL1, #8FH
SETB TR1 ;重新启动T1
RETI

END

来自其他人的一种更好的写法:

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
;采用定时器控制从P1.0和P1.1分别输出周期为3ms占空比为1/3的方波和周期为500微秒占空比为1/5的方波。
;11.0592MHz,1.085069微秒
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP TIMER0_ISR
ORG 001BH
AJMP TIMER1_ISR
ORG 0100H
MAIN:MOV TMOD, #00010010H ; 设置定时器0为模式1、定时器1为模式2 (16位定时器、8位定时器)
MOV TH0, #0FCH ; 设置定时器0初始值 (1ms)
MOV TL0, #03FH
MOV TH1, #0A4H ; 设置定时器1初始值 (100微秒)
MOV TL1, #0A4H
MOV R0, #2 ; 计数2(低电平2ms)
MOV R1, #4 ; 计数4(低电平400微秒)
CLR P1.0 ; 低电平
CLR P1.1 ; 低电平
SETB ET0 ; 使能定时器0中断
SETB ET1 ; 使能定时器1中断
SETB EA ; 使能全局中断
SETB TR0 ; 启动定时器0
SETB TR1 ; 启动定时器1
LOOP: SJMP LOOP ; 无限循环

TIMER0_ISR: MOV TH0, #0FCH ; 重装载定时器0初始值
MOV TL0, #03FH
DJNZ R0, EXIT ; R0=0 P1.0=1
CPL P1.0
JB P1.0, CYCLE1 ; P1.0=1->CYCLE1&P1.0=0->R0=2
MOV R0, #2
SJMP EXIT
CYCLE1: MOV R0, #1
SJMP EXIT

TIMER1_ISR: MOV TH1, #0A4H ; 重装载定时器1初始值
MOV TL1, #0A4H
DJNZ R1, EXIT ; R1=0 P1.0=1
CPL P1.1
JB P1.1, CYCLE2 ; P1.1=1->CYCLE2&P1.1=0->R1=4
MOV R1, #4
SJMP EXIT
CYCLE2: MOV R1, #1
SJMP EXIT

EXIT:RETI
END

实验三 外部中断实验

test 3_1

通过外部中断使P1口的开关控制8个发光二极管,开始是P1.0所接的灯亮,以后每中断一次,下一个灯亮,顺序左移,周而复始。

接线方法:P0口接8个LED,P3.2接信号发生器(输出方波)红表笔,任找一低电平接黑表笔

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ORG 0000H
AJMP MAIN
ORG 0003H ;INT0入口
AJMP INTERRUPT1
MAIN:
MOV A,#0FEH
MOV P1,A ;P1.0所接的灯亮
SETB IT0 ;边沿触发中断
SETB EX0 ;允许INT0中断
SETB EA ;开中断总开关
SJMP $
INTERRUPT1:
RL A
MOV P1,A
RETI
END

test 3_2

外部中断控制P1口连接的8个发光二极管,同时亮,或同时灭,每中断一次,变反一次

接线方法:P1口接8个LED,P3.2接信号发生器(输出方波)红表笔,任找一低电平接黑表笔

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ORG 0000H
AJMP MAIN
ORG 0003H ;INT0入口
AJMP INTERRUPT1
MAIN:
MOV A,#0FFH
MOV P1,A ;开始灯全灭
SETB IT0 ;边沿触发中断
SETB EX0 ;允许INT0中断
SETB EA ;开中断总开关
SJMP $
INTERRUPT1:
CPL A
MOV P1,A
RETI
END

test 3_3

外部中断控制P1口连接的8个发光二极管。
中断第一次,8个发光二极管循环点亮;
中断第二次,8个发光二极管逐个点亮;
中断第三次,8个发光二极管高四位和低四位交替亮灭。
如此循环往复。

接线方法:P1口接8个LED,P3.2接按键

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
ORG 0000H
AJMP MAIN

ORG 0003H ;INT0入口
AJMP INTERRUPT1

ORG 0030H
MAIN:
MOV A,#0FFH
MOV P1,A ;开始灯全灭
SETB IT0 ;边沿触发中断
SETB EX0 ;允许INT0中断
SETB EA ;开中断总开关
RELOAD:MOV R3,#03H ;计数变量
MOV A,#0FEH
MOV P1,A ;点亮P1.0所接的灯

LOOP0:
RL A
MOV P1,A
ACALL DELAY
CJNE R3,#03,LOOP1
SJMP LOOP0

LOOP1:
MOV A,#0FEH
MOV P1,A
MOV R4,#00H
ACALL DELAY
LOOP11:
ADD A,ACC
MOV P1,A
INC R4 ;计算是否满8次
ACALL DELAY
CJNE R3,#02,LOOP2
CJNE R4,#08H,LOOP11 ;不满8次,继续逐个点亮
SJMP LOOP1 ;满8次,重新从全灭开始逐个点亮

LOOP2:
MOV A,#0FH
MOV P1,A
ACALL DELAY
CPL A
MOV P1,A
ACALL DELAY
CJNE R3,#01,RELOAD
SJMP LOOP2

INTERRUPT1:
DEC R3 ;R3减一
RETI

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

END

实验二 并行接口输入输出实验

test 2_1

选用输出口接八只发光二极管,编写程序,使发光二极管循环点亮(采用软件延时)
接线方法:使用P1口连接LED

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ORG 0000H
MOV A,#0FEH
LOOP:
MOV P1,A ;点亮P1.0连接的LED
LCALL DELAY
RL A
MOV P1,A
SJMP LOOP

DELAY: MOV R0,#0AH ;延时子程序(延时时间约1秒)
DELAY1: MOV R1,#00H
DELAY2: MOV R2,#0C3H
DJNZ R2,$
DJNZ R1,DELAY2
DJNZ R0,DELAY1
RET
END

test 2_2

采用一个输入口和一个输出口,将开关的状态反映在发光二极管上
接线方法:P1口接开关,P0口接LED

1
2
3
4
5
6
7
ORG 0000H
LOOP:
ORL P1,#0FFH ;读P1口之前先对其写1
MOV A,P1 ;将P1口状态(按键状态)读入A
MOV P0,A ;将按键状态送至P0,使其在LED上反映出来
SJMP LOOP
END

写在最前面

本分类内使用的单片机皆为AT89S52,外接晶振频率为11.059MHz。

实验一 验证实验

test 1_1

将外部数据存储器0000H-0010H中的内容传送到片内数据存储器60H-70H单元。

1
2
3
4
5
6
7
8
9
10
11
ORG 0000H
MOV DPTR,#0000H
MOV R0,#60H
LOOP:
MOVX A,@DPTR
MOVX @R0,A
INC DPTR
INC R0
CJNE R0 ,#71H,LOOP
SJMP $
END

test 1_2

程序跳转表

(1)运行程序,打开数据窗口,观察地址 30H、31H、32H、33H的数据变化。用键盘输入改变地址 30H、31H、32H、33H 的值,观察其实验效果。修改源程序中给30H~33H的赋值,观察实验效果。

(2)打开CPU窗口,选择单步或跟踪执行方式运行程序,观察CPU窗口各寄存器的变化。

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
ORG 0
LJMP START // 改动此处,改变的是赋值
FUNC0:MOV 30H,#0
RET
FUNC1:MOV 31H,#1
RET
FUNC2:MOV 32H,#2
RET
FUNC3:MOV 33H,#3
RET

FUNCENTER:
ADD A,ACC // AJMP是一个2字节指令,故A需要乘以2,使得程序在JMP指令中跳转到正确的位置
MOV DPTR,#FUNCTAB
JMP @A+DPTR

FUNCTAB:
AJMP FUNC0
AJMP FUNC1
AJMP FUNC2
AJMP FUNC3

START:
MOV A,#0
CALL FUNCENTER
MOV A,#1
CALL FUNCENTER
MOV A,#2
CALL FUNCENTER
MOV A,#3
CALL FUNCENTER
LJMP $
END

test 1_3

test1_3_1

教材第55页5题。

1
2
3
4
5
6
ORG 0000H
MOV A,#56H
ADD A,#74H ; CAH+CAH = 194H,高位舍弃
ADD A,ACC
SJMP $
END

test1_3_2

教材第55页7题。

1
2
3
4
5
6
7
8
9
10
11
ORG 0000H
MOV 59H,#50H
MOV A,59H
MOV R0,A
MOV A,#0
MOV @R0,A
MOV A,#25H
MOV 51H,A
MOV 52H,#70H
SJMP $
END

test1_3_3

教材第55页8题。

1
2
3
4
5
6
7
8
9
10
11
ORG 0000H
MOV SP,#60H
MOV 30H,#24H
MOV 31H,#10H
PUSH 30H
PUSH 31H
POP DPL
POP DPH
MOV A,#00H
MOVX @DPTR,A
SJMP $

实验一 数据库定义实验

1. 基本操作实验:

1)课本p286 10.4.1 基本操作实验内容

  • 使用Management Studio创建图书读者数据库及学生课程数据库。

学生课程数据库的表结构为:
​ 学生(学号,姓名,年龄,性别,所在系);
​ 课程(课程号,课程名,先行课);
​ 选课(学号,课程号,成绩);

图书读者数据库表结构为:
图书(书号,类别,出版社,作者,书名,定价);
读者(编号,姓名,单位,性别,电话);
借阅(书号,读者编号,借阅日期);

  • 实验结果截图:

    • 数据库创建:image-20240510090837905

    • 学生课程数据库的表结构:

    image-20240510091339291

    image-20240510091307613

    image-20240510091359025

    • 图书读者数据库的表结构:

    image-20240510090936973

    image-20240510091441925

    image-20240510091506765

2) 设定每个表的主码。

  • 实验结果:

    主码
    学生 学号
    课程 课程号
    选课 学号、课程号
    图书 书号
    读者 编号
    借阅 书号、读者编号

3) 在Management Studio中建立学生表、课程表和选课表的表级约束。(外码)。

  • 实验结果:

    外码字段 参照字段
    dbo.选课 学号 dbo.学生 - 学号
    dbo.选课 课程号 dbo.课程 - 课程号
    dbo.借阅 书号 dbo.图书 - 书号
    dbo.借阅 读者编号 dbo.读者 - 编号

4) 通过Management Studio实现对上述三个表中数据的增加、删除和修改。

  • 增加:image-20240510152324808

  • 删除:image-20240510152615348

    删除后:image-20240510152650427

    • 修改:image-20240510152820025

      修改后:image-20240510152852125

2. 提高操作实验:

1) 使用SQL命令重新创建以上三个基本表。

2) 选择合适的数据类型;

3) 定义必要的索引,表级约束和列级约束。

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
--创建学生课程数据库
CREATE DATABASE 学生课程数据库;
GO

USE 学生课程数据库;
GO

CREATE TABLE 学生 (
学号 INT PRIMARY KEY,
姓名 VARCHAR(50),
年龄 INT,
性别 CHAR(2),
所在系 VARCHAR(50)
);

CREATE TABLE 课程 (
课程号 INT PRIMARY KEY,
课程名 VARCHAR(50),
先行课 NCHAR(4),
FOREIGN KEY (先行课) REFERENCES 课程(课程号)
);

CREATE TABLE 选课 (
学号 INT,
课程号 INT,
成绩 DECIMAL(5, 2),
PRIMARY KEY (学号, 课程号),
FOREIGN KEY (学号) REFERENCES 学生(学号),
FOREIGN KEY (课程号) REFERENCES 课程(课程号)
);
  • 命令执行结果:
    image-20240510093550622
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
--创建图书读者数据库
CREATE DATABASE 图书读者数据库;
GO

USE 图书读者数据库;
GO

CREATE TABLE 图书 (
书号 INT PRIMARY KEY,
类别 VARCHAR(50),
出版社 VARCHAR(50),
作者 VARCHAR(50),
书名 VARCHAR(100),
定价 DECIMAL(10, 2)
);

CREATE TABLE 读者 (
编号 INT PRIMARY KEY,
姓名 VARCHAR(50),
单位 VARCHAR(100),
性别 CHAR(2),
电话 VARCHAR(20)
);

CREATE TABLE 借阅 (
书号 INT,
读者编号 INT,
借阅日期 DATE,
PRIMARY KEY (书号, 读者编号),
FOREIGN KEY (书号) REFERENCES 图书(书号),
FOREIGN KEY (读者编号) REFERENCES 读者(编号)
);
  • 命令执行结果:
    image-20240510093441056

3.选择操作实验:

  • 自行设计一个数据库小系统,并通过SQL命令和SQL SERVER Management Studio在计算机上实现建库、建表、建立表间联系和必要的索引和约束。

    医院信息数据库:

    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
    --创建医院信息数据库
    CREATE DATABASE 医院信息数据库
    GO

    USE 医院信息数据库
    GO

    CREATE TABLE 医生 (
    工号 INT PRIMARY KEY,
    姓名 VARCHAR(100) NOT NULL,
    年龄 INT NOT NULL,
    性别 CHAR(2) NOT NULL,
    职称 VARCHAR(50),
    科室 VARCHAR(100)
    );

    CREATE TABLE 患者 (
    患者号 INT PRIMARY KEY,
    姓名 VARCHAR(100) NOT NULL,
    年龄 INT NOT NULL,
    性别 CHAR(2) NOT NULL,
    身份证号码 NVARCHAR(18) NOT NULL UNIQUE
    );

    CREATE TABLE 病历 (
    病历号 INT PRIMARY KEY,
    患者号 INT,
    医生工号 INT,
    就诊日期 DATE,
    病情描述 TEXT,
    FOREIGN KEY (患者号) REFERENCES 患者(患者号),
    FOREIGN KEY (医生工号) REFERENCES 医生(工号)
    );
    • 命令执行结果:
      image-20240510152021435