undefined-0's Blog

历添新岁月 春满旧山河

0%

AT89S52_test6

实验六 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