借助51单片机和DAC0832实现通过按键控制不同波形的波形发生器。下文为设计文章及proteus仿真电路图和仿真效果图;后面附有与电路图对应的有效源程序。 工作原理:
产生指定的信号波形可以通过DAC来实现,对输出的二进制数字量进行相应改变来实现不同波形的产生。正弦波是利用MATLAB将正弦曲线均匀取样得到等间隔时刻的y方向上二进制数值,然后依次输出后经D/A转换得到;三角波信号是将输出的二进制数字信号依次加1,达到0xff时再依次减1,并实时将数字信号经D/A转换得到波形信号。
实现方法:
正弦波:先使用MATLAB在x方向进行等间隔取样,将y轴上的读数取整之后转换成16进制数形成一个表格。在程序中采取不断读表输出的方式经 D/A 转换得到正弦波。
三角波:程序中设计三角波最高达到00FFH,先不断加1,达到峰值之后不断减1,将这些信号同步输出,并利用D/A转换得到三角波。可以在虚拟示波器上观察到这两种不同的波形。
仿真原理图:
结果图:
全部实验程序见附件:
代码:
- ; Main.asm file generated by New Project wizard
- ; Created: 周五 5月 24 2019
- ; Processor: AT89C52
- ; Compiler: ASEM-51 (Proteus)
- ;=====================================
- $NOMOD51
- $INCLUDE (80C52.MCU)
- ;======================================
- ; DEFINITIONS
- ; VARIABLES
- ; RESET and INTERRUPT VECTORS
- ;======================================
- ; Reset Vector
- org 0000h
- jmp Start
- ;=======================================
- ; CODE SEGMENT
- ;=======================================
- org 0100h
- Start:
- ;***R4=0锯齿波R4=1三角波R4=2正弦波R4=3方波R4=梯形波***
- ;***********************
- ; 锯齿波
- ;***********************
- MOV R4,#0
- J0: MOV A,#0
- J0next: CJNE R4,#0,S1 ;判断R4,不等0跳转产生三角波
- MOV P2,A ;P2赋值
- LCALL delay ;延时
- INC A ;增加A的值,产生锯齿波上升沿
- JB P1.0,J0p11 ;扫描检测按键给R4赋值选择输出信号波形
- MOV R4,#0 ;产生锯齿波信号
- J0p11: JB P1.1,J0p12
- MOV R4,#1 ;产生三角波信号
- J0p12: JB P1.2,J0p13
- MOV R4,#2 ;产生正弦波信号
- J0p13: JB P1.3,J0p14
- MOV R4,#3 ;产生方波信号
- J0p14: JB P1.4,J0p15
- MOV R4,#4 ;产生梯形波信号
- J0p15: SJMP J0next
- ;***************************
- ; 三角波
- ;***************************
- S1: MOV A,#0
- S1n1: CJNE R4,#1,Z3 ;判断R4,不等于1则跳转正弦波发生
- MOV P2,A ;产生三角波的上升沿
- LCALL delay ;调用延时
- INC A ;增加A
- JB P1.0,S11p11 ;扫描检测按键确定输出信号种类
- MOV R4,#0 ;产生锯齿波信号
- S11p11: JB P1.1,S11p12
- MOV R4,#1 ;产生三角波信号
- S11p12: JB P1.2,S11p13
- MOV R4,#2 ;产生正弦波信号
- S11p13: JB P1.3,S11p14
- MOV R4,#3 ;产生方波信号
- S11p14: JB P1.4,S1p1
- MOV R4,#4 ;产生梯形波信号
- S1p1: CJNE A,#255,S1n1
- S1n2: CJNE R4,#1,Z3
- MOV P2,A ;产生三角波的下降沿
- LCALL delay
- DEC A ;减小A
- JB P1.0,S12p11 ;扫描检测按键状态确定输出信号波形
- MOV R4,#0 ;产生锯齿波信号
- S12p11: JB P1.1,S12p12
- MOV R4,#1 ;产生三角波信号
- S12p12: JB P1.2,S12p13
- MOV R4,#2 ;产生正弦波信号
- S12p13: JB P1.3,S12p14
- MOV R4,#3 ;产生方波信号
- S12p14: JB P1.4,S1p2
- MOV R4,#4 ;产生梯形波信号
- S1p2: CJNE A,#0,S1n2
- SJMP S1n1
- ;**********************************
- ; 正弦波
- ;**********************************
- Z3: MOV R0,#0
- Z3NEXT: CJNE R4,#2,F4 ;判断R4,不等于2跳转输出方波
- MOV A,R0
- MOV DPTR,#TAB ;将正弦波的表头给DPTR,转到表格去查表
- MOVC A,@A+DPTR
- MOV P2,A
- LCALL DELAY
- INC R0
- JB P1.0,Z3p11
- MOV R4,#0
- Z3p11: JB P1.1,Z3p12 ;扫描检测按键选择输出波形
- MOV R4,#1
- Z3p12: JB P1.2,Z3p13
- MOV R4,#2
- Z3p13: JB P1.3,Z3p14
- MOV R4,#3
- Z3p14: JB P1.4,Z3next
- MOV R4,#4
- SJMP Z3NEXT
- ;*******************************
- ; 方波
- ;*******************************
- F4: CJNE R4,#3,T5 ;判断R4,不等于3则跳转梯形波
- MOV A,#0
- MOV P2,A
- CALL FBDELAY
- MOV A,#255
- MOV P2,A
- CALL FBDELAY
- F40: JB P1.0,F41 ;扫描检测按键分别选择输出波形
- MOV R4,#0
- F41: JB P1.1,F42
- MOV R4,#1
- F42: JB P1.2,F43
- MOV R4,#2
- F43: JB P1.3,F44
- MOV R4,#3
- F44: JB P1.4,F4
- MOV R4,#4
- JMP F4
- ;*******************************
- ; 梯形波
- ;*******************************
- T5: MOV A,#0
- T5b: CJNE R4,#4,T51b ;判断R4,不等4则跳转
- JMP T51b1
- T51b: JMP J0 ;跳转到锯齿波那一步
- T51b1: MOV P2,a
- LCALL delay
- INC A ;产生梯形波的上升沿;
- JB P1.0,T5b0 ;扫描检测按键选择输出波形
- MOV R4,#0
- T5b0: JB P1.1,T5b1
- MOV R4,#1
- T5b1: JB P1.2,T5b2
- MOV R4,#2
- T5b2: JB P1.3,T5b3
- MOV R4,#3
- T5b3: JB P1.4,T5b10
- MOV R4,#4
- T5b10: CJNE A,#255,T5b
- LCALL fbdelay
- T5b11: CJNE R4,#4,T52b
- JMP T52b2
- T52b: JMP J0
- T52b2: MOV P2,a
- LCALL delay
- DEC A ;产生梯形波的下降沿
- JB P1.0,T5b12 ;扫描检测按键选择输出波形
- MOV R4,#0
- T5b12: JB P1.1,T5b13
- MOV R4,#1
- T5b13: JB P1.2,T5b14
- MOV R4,#2
- T5b14: JB P1.3,T5b15
- MOV R4,#3
- T5b15: JB P1.4,T5b16
- MOV R4,#4
- T5b16: CJNE A,#0,T5b11
- JMP T5
- DELAY: MOV R6,#2 ;延时函数
- D1: MOV R7,#20
- DJNZ R7,$
- DJNZ R6,D1
- RET
- fbdelay: MOV R1,#40 ;方波延时函数
- D2: MOV R2,#255
- DJNZ R2,$
- DJNZ R1,D2
- RET
- ;正弦波波形表
- TAB:
- DB 80H,83H,86H,89H,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, 89H, 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, 75H, 78H, 7bH, 7eH
- Loop:
- jmp Loop
- ;=============================================
- END