借助51單片機和DAC0832實現通過按鍵控制不同波形的波形發生器。下文為設計文章及proteus仿真電路圖和仿真效果圖;后面附有與電路圖對應的有效源程序。 工作原理:
產生指定的信號波形可以通過DAC來實現,對輸出的二進制數字量進行相應改變來實現不同波形的產生。正弦波是利用MATLAB將正弦曲線均勻取樣得到等間隔時刻的y方向上二進制數值,然后依次輸出后經D/A轉換得到;三角波信號是將輸出的二進制數字信號依次加1,達到0xff時再依次減1,并實時將數字信號經D/A轉換得到波形信號。 實現方法: 正弦波:先使用MATLAB在x方向進行等間隔取樣,將y軸上的讀數取整之后轉換成16進制數形成一個表格。在程序中采取不斷讀表輸出的方式經 D/A 轉換得到正弦波。 三角波:程序中設計三角波最高達到00FFH,先不斷加1,達到峰值之后不斷減1,將這些信號同步輸出,并利用D/A轉換得到三角波。可以在虛擬示波器上觀察到這兩種不同的波形。 仿真原理圖:
仿真原理圖
結果圖:
結果圖1
結果圖2
全部實驗程序見附件: - ; 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
復制代碼
|