1、实验目的
1、了解D/A转换的基本原理。
2、了解D/A转换芯片0832的性能及编程方法。
3、了解单片机系统中扩展D/A转换的基本方法。
二、实验说明
利用DAC0832,编制程序产生锯齿波、三角波、正弦波。三种波轮流显示,用示波器观看。
3、实验仪器
计算机
伟福实验箱( lab2000P )
示波器
4、实验内容
1、D/A转换是把数字量转换成模拟量的变换,实验台上D/A电路输出的是模拟电压信号。要实现实验要求,比较简单的方法是产生三个波形的表格,然后通过查表来实现波形显示。
2、产生锯齿波和三角波的表格只需由数字量的增减来控制,同时要注意三角波要分段来产生。要产生正弦波,较简单的方法是造一张正弦数字量表。即查函数表得到的值转换成十六进制数填表。
D/A转换取值范围为一个周期,采样点越多,精度越高些。本例采用的采样点为256点/周期。
3、8位D/A转换器的输入数据与输出电压的关系为
U(0∽-5V)=Uref/256×N
U(-5V∽+5V)=2·Uref/256×N-5V
(这里 Uref为+5V)
5、思考题
1、改变输出波形的周期和幅度,缩小或者提高;
2、程序改为查表方式输出;如何计算出数据表;
6、源程序修改原理及其仿真结果
思考题一:改变输出波形的周期和幅度,缩小或者提高
CS0832 equ 0a000h
START: MOV A, #00H
MOV DPTR, CS0832 ; 0832 的地址送DPTR
MOV R1, #H ; 台阶数为
LP: MOVX @DPTR, A ; 送数据至 0832
CALL DELAY ; 1 ms延时
DJNZ R1, NEXT ; 不到 10 台阶转移
SJMP START ; 产生下一个周期
NEXT: ADD A, #20 ; 台阶增幅
CALL DELAY
SJMP LP ; 产生下一台阶
DELAY: MOV 20H, #249 ; 1 ms延时程序
上述程序修改了三处,第一,台阶数,当台阶数较多且每个台阶的持续时间减小时输出波形更平滑,更接近钜齿波;第二,台阶增幅,台阶数和台阶增幅都能影响输出波形的振幅,且都与振幅成正比关系,即其他不变台阶数增多振幅增大或者其他不变台阶增幅增大振幅也增大;第三,增加延时,在台阶增幅和产生下一台阶之间增加延时,可以改变钜齿波的周期。
思考题二:程序改为查表方式输出;如何计算出数据表
产生数据表:
取点N | A=2*3.14/50*N | B=4*SIN(A) | C=(B+5)*256/10 |
0 | 0 | 0 | 128 |
1 | 0.1256 | 0.50108 | 141 |
2 | 0.2512 | 0.99427 | 153 |
3 | 0.3768 | 1.47179 | 166 |
4 | 0.5024 | 1.92612 | 177 |
5 | 0.628 | 2.35011 | 188 |
6 | 0.7536 | 2.73707 | 198 |
7 | 0.8792 | 3.08092 | 207 |
8 | 1.0048 | 3.37622 | 214 |
9 | 1.1304 | 3.61833 | 221 |
10 | 1.256 | 3.80344 | 225 |
11 | 1.3816 | 3.92862 | 229 |
12 | 1.5072 | 3.99191 | 230 |
13 | 1.6328 | 3.99231 | 230 |
14 | 1.7584 | 3.92982 | 229 |
15 | 1.884 | 3.80541 | 225 |
16 | 2.0096 | 3.62104 | 221 |
17 | 2.1352 | 3.37963 | 215 |
18 | 2.2608 | 3.08497 | 207 |
19 | 2.38 | 2.74172 | 198 |
20 | 2.512 | 2.35526 | 188 |
21 | 2.6376 | 1.93170 | 177 |
22 | 2.7632 | 1.47771 | 166 |
23 | 2.8888 | 1.00044 | 154 |
24 | 3.0144 | 0.50740 | 141 |
25 | 3.14 | 0.00637 | 128 |
26 | 3.2656 | -0.49476 | 115 |
27 | 3.3912 | -0.98809 | 103 |
28 | 3.5168 | -1.46586 | 90 |
29 | 3.24 | -1.92054 | 79 |
30 | 3.768 | -2.34495 | 68 |
31 | 3.36 | -2.73242 | 58 |
32 | 4.0192 | -3.07685 | 49 |
33 | 4.1448 | -3.37280 | 42 |
34 | 4.2704 | -3.61561 | 35 |
35 | 4.396 | -3.80146 | 31 |
36 | 4.5216 | -3.92742 | 27 |
37 | 4.72 | -3.99150 | 26 |
38 | 4.7728 | -3.99270 | 26 |
39 | 4.84 | -3.93100 | 27 |
40 | 5.024 | -3.80736 | 31 |
41 | 5.1496 | -3.62374 | 35 |
42 | 5.2752 | -3.38303 | 41 |
43 | 5.4008 | -3.003 | 49 |
44 | 5.52 | -2.74635 | 58 |
45 | 5.652 | -2.36041 | 68 |
46 | 5.7776 | -1.93728 | 78 |
47 | 5.9032 | -1.48363 | 90 |
48 | 6.0288 | -1.00660 | 102 |
49 | 6.1544 | -0.51372 | 115 |
50 | 6.28 | -0.01274 | 128 |
编写DA根据数据表输出波形的程序:
ORG 000H
MAIN:
MOV R1,#50 ;定义显示点的个数
LOOP:
MOV A,R1 ;从第50个点开始显示
MOV DPTR,#SINTAB ;指针指向SIN表地址
MOVC A,@A+DPTR ;取表内数据
MOV DPTR,#0a000h ;指针指向8032地址
MOVX @DPTR,A ;向DA输入数据
ACALL DELAY ;延时一段时间,保证转换完毕
DJNZ R1,LOOP ;R1不为零,表示一个周期未取完, 继续去下一个点数据
AJMP MAIN ;R1=0,表示一个周期的点已经取 完,循环回去再取一个周期
DELAY:
MOV R0,#3
DELAY1:
NOP
NOP
NOP
DJNZ R0,DELAY1
RET
SINTAB:
db 128,141,153,166,177,188,198,207
db 214,221,225,229,230,230,229,225
db 221,215,207,198,188,177,166,154
db 141,128,115,103,90,79,68,58
db 49,42,35,31,27,26,26,27
db 31,35,41,49,58,68,78,90
db 102,115,128
END
上述为取的点较少的程序,在循环上需要判断是否取完整周期,如果从网上下载一个SIN表生成软件则可以迅速取到想要的多组数据,以下为去256点的程序,在循环上就少去了很多麻烦,并且显示也更为清晰。
ORG 000H
MAIN:
MOV R1,#00H
LOOP:
MOV A,R1
因为取点为256,R1最大为255,所以,当取完一个整周期后R1的值会自动变为0,省去了设置循环的麻烦
MOV DPTR,#SINTAB
MOVC A,@A+DPTR
MOV DPTR,#0a000h
MOVX @DPTR,A
INC R1
ACALL DELAY
AJMP LOOP
DELAY:MOV R3,#3
D1: NOP
NOP
NOP
DJNZ R3,D1
RET
SINTAB:
DB 80H,83H,86H,H,8DH,90H,93H,96H
DB 99H,9CH,9FH,0A2H,0A5H,0A8H,0ABH,0AEH
DB 0B1H,0B4H,0B7H,0BAH,0BCH,0BFH,0C2H,0C5H
DB 0C7H,0CAH,0CCH,0CFH,0D1H, 0D4H,0D6H,0D8H
DB 0DAH,0DDH,0DFH,0E1H,0E3H, 0E5H,0E7H,0E9H
DB 0EAH,0ECH,0EEH,0EFH,0F1H, 0F2H,0F4H,0F5H
DB 0F6H,0F7H,0F8H,0F9H,0FAH, 0FBH,0FCH,0FDH
DB 0FDH,0FEH,0FFH,0FFH,0FFH, 0FFH,0FFH,0FFH
DB 0FFH,0FFH,0FFH,0FFH,0FFH, 0FFH,0FEH,0FDH
DB 0FDH,0FCH,0FBH,0FAH,0F9H, 0F8H,0F7H,0F6H
DB 0F5H,0F4H,0F2H,0F1H,0EFH, 0EEH,0ECH,0EAH
DB 0E9H,0E7H,0E5H,0E3H,0E1H, 0DEH,0DDH,0DAH
DB 0D8H,0D6H,0D4H,0D1H,0CFH, 0CCH,0CAH,0C7H
DB 0C5H,0C2H,0BFH,0BCH,0BAH, 0B7H,0B4H,0B1H
DB 0AEH,0ABH,0A8H,0A5H,0A2H, 9FH, 9CH, 99H
DB 96H, 93H, 90H, 8DH, H, 86H, 83H, 80H
DB 80H, 7CH, 79H, 78H, 72H, 6FH, 6CH, 69H
DB 66H, 63H, 60H, 5DH, 5AH, 57H, 55H, 51H
DB 4EH, 4CH, 48H, 45H, 43H, 40H, 3DH, 3AH
DB 38H, 35H, 33H, 30H, 2EH, 2BH, 29H, 27H
DB 25H, 22H, 20H, 1EH, 1CH, 1AH, 18H, 16H
DB 15H, 13H, 11H, 10H, 0EH, 0DH, 0BH, 0AH
DB 09H, 08H, 07H, 06H, 05H, 04H, 03H, 02H
DB 02H, 01H, 00H, 00H, 00H, 00H, 00H, 00H
DB 00H, 00H, 00H, 00H, 00H, 00H, 01H, 02H
DB 02H, 03H, 04H, 05H, 06H, 07H, 08H, 09H
DB 0AH, 0BH, 0DH, 0EH, 10H, 11H, 13H, 15H
DB 16H, 18H, 1AH, 1CH, 1EH, 20H, 22H, 25H
DB 27H, 29H, 2BH, 2EH, 30H, 33H, 35H, 38H
DB 3AH, 3DH, 40H, 43H, 45H, 48H, 4CH, 4EH
DB 51H, 55H, 57H, 5AH, 5DH, 60H, 63H, 66H
DB 69H, 6CH, 6FH, 72H, 76H, 79H, 7CH, 80H
END
仿真结果说明:
上述两个程序都能实现在示波器上显示正弦波的功能,但是取50个点的程序显然没有255个点的程序所显示的正弦波平滑,因为每一个点的取值都有一定得延时,所以看起来呈现阶梯状,而取点多时相应的阶梯状就相对很小难以辨别,从而显得更加平滑。上述两个程序都实现了DA的数据转换。下载本文