標題: 51單片機制作任意波形發生器設計資料 附匯編語言程序 [打印本頁]
作者: 笨拙的圖圖 時間: 2019-5-20 18:30
標題: 51單片機制作任意波形發生器設計資料 附匯編語言程序
本次設計的任務是設計制作一個波形發生器,該波形發生器能產生正弦波、方波、三角波和由用戶編輯的特定形狀波形。示意圖如下:

基本要求如下:
(1)具有產生正弦波、方波周期性波形的功能;
(2)輸出波形的頻率范圍為100Hz~20kHz(非正弦波頻率按10次諧波計算);重復頻率可調,頻率步進間隔≤100Hz;
(3)輸出波形幅度范圍0~5V(峰-峰值),可按步進0.1V(峰-峰值)調整;
(4)具有顯示輸出波形的類型、重復頻率(周期)和幅度的功能。
1.1 方案方案一:采用單片函數發生器可產生正弦波、方波等,操作簡單易行,用 D/A 轉換器的輸出來改變調節電壓,可以實現數控調整頻率,但產生信號的頻率穩定度不高。
方案二:利用芯片組成的電路輸出波形,MAX038是MAXIM公司生產的一個只需要很少外部元件的精密高頻波形產生器,它能產生準確的高頻正弦波、三角波、方波。輸出頻率和占空比可以通過調整電流、電壓或電阻來分別地控制。所需的輸出波形可由在A0和A1輸入端設置適當的代碼來選擇,且具有輸出頻率范圍寬、波形穩定、失真小、使用方便等特點。
方案三:采用Atmel公司的AT89C51單片機編程方法實現,該方案可以通過編程的方法控制信號波形的頻率和幅度,而在硬件電路不便的情況下,通過程序實現頻率的變化和輸出波形的選擇,并同時在顯示器顯示相應的結果。
方案一輸出信號頻率不夠穩定;方案二成本高,程序復雜度高;方案三軟硬件結合,硬件成本低,軟件起點低,用匯編語言即可完成,優化型相對比較好,容易實現,且滿足設計要求。綜合考慮,我們采用了方案三,用AT89C51單片機設計多功能信號發生器,能夠滿足信號的頻率穩定性和精度的準確性。
1.2 系統描述 本方案以AT89C51為控制核心,主要模塊包括復位電路、時鐘信號發生電路、鍵盤控制電路、D/A轉化及LED顯示電路,其原理框圖如下:
鍵盤控制電路鍵盤電路分為獨立式按鍵和矩陣式鍵盤,為了簡化程序,我們采用了獨立式鍵盤。獨立式按鍵是指直接用I/O口線構成的單個按鍵電路。每個獨立式按鍵單獨占有一根I/O口線,每根I/O口線的工作狀態不會影響其他I/O口線的工作狀態,這是一種最簡單易懂的按鍵結構。電路圖如下所示:

圖5 鍵盤輸入電路
2.5 LED顯示電路
2.5.1 數碼管功能介紹 數碼管的外形結構如下圖所示,由圖可見它由8個發光二極管構成,通過不同的組合用來顯示0—9,A—F及小數點“.”等符號。數碼管通常有共陰極和共陽極兩種型號,共陰極數碼管的發光二極管陰極必須接低電平,當某發光二極管的陽極為高電平(一般為+5V)時,此二極管點亮;共陽極數碼管的發光二極管是陽極并接到高電平,對于需點亮的發光二極管使其陰極接地電平即可(一般接地)。顯然,要顯示某字形就應使此字形的相應字段點亮,實際就是送不同電平組合代表的數據至數碼管。這種裝入數碼管顯示字形的數據稱字形碼。

圖6 數碼管原理圖
要使數碼管顯示不同的數字或者字符,需要使端口輸出相應的字型碼,顯示器的字形與字碼關系如下圖所示:

圖7 段碼表
2.5.2 LED動態顯示原理及電路LED數碼管動態顯示接口是單片機中應用最為廣泛的一種顯示方式之一,動態驅動是將所有數碼管的8個顯示筆劃"a,b,c,d,e,f,g,dp"的同名端連在一起,另外為每個數碼管的公共極COM增加位選通控制電路,位選通由各自獨立的I/O線控制,當單片機輸出字形碼時,單片機對位選通COM端電路的控制,所以我們只要將需要顯示的數碼管的選通控制打開,該位就顯示出字形,沒有選通的數碼管就不會亮。通過分時輪流控制各個數碼管的的COM端,就使各個數碼管輪流受控顯示,這就是動態驅動。在輪流顯示過程中,每位數碼管的點亮時間為1~2ms,由于人的視覺暫留現象及發光二極管的余輝效應,盡管實際上各位數碼管并非同時點亮,但只要掃描的速度足夠快,給人的印象就是一組穩定的顯示數據,不會有閃爍感,動態顯示的效果和靜態顯示是一樣的,能夠節省大量的I/O端口,而且功耗更低。
本次設計采用6位共陰極數碼管,選取AT89C51的P0口作為信號輸出端口,并外接兩片鎖存器74HC573,用于驅動數碼管,其中一片作為數碼管的段選信號輸入端,另一片作為數碼管的位選信號輸入端,選取AT89C51的P2.6和P2.7分別作為兩片鎖存器的片選信號輸入端,電路圖如下所示:

圖8 LED顯示電路
2.6 D/A轉換及放大電路
2.6.1 DAC0832功能介紹DAC0832是8分辨率的D/A轉換集成芯片。與微處理器完全兼容。這個DA芯片以其價格低廉、接口簡單、轉換控制容易等優點,在單片機應用系統中得到廣泛的應用。D/A轉換器由8位輸入鎖存器、8位DAC寄存器、8位D/A轉換電路及轉換控制電路構成。其引腳圖如下所示:

圖9 DAC0832引腳圖
關于DAC0832的引腳功能如下:
D0~D7:數字信號輸入端。
ILE:輸入寄存器允許,高電平有效。
CS:片選信號,低電平有效。
WR1:寫信號1,低電平有效。
XFER:傳送控制信號,低電平有效。
WR2:寫信號2,低電平有效。
IOUT1、IOUT2:DAC電流輸出端。
RFB:是集成在片內的外接運放的反饋電阻。
VREF:基準電壓(-10~10V)。
Vcc:是源電壓(+5~+15V)。
AGND:模擬地。
NGND:數字地,可與AGND接在一起使用。
2.6.2 D/A轉換電路由于單片機輸出的是數字信號,因此要得到模擬信號的波形就必須對其進行數模轉換。我們采用了DAC0832數模轉換器,由于其輸出為電流輸出,需要外加運算放大器OP07使之裝換為電壓輸出,最后通過示波器顯示輸出的波形。我們選取了AT89C51的P1口作為波形數字信號的輸出端口,電路圖如下所示:
圖10 D/A轉換電路
3 系統調試本次設計的系統仿真在Proteus軟件中進行,并采用匯編語言進行程序的編寫。
3.1 軟件調試3.1.1 三角波產生圖11 三角波仿真圖
TRI: CJNE R7,#0FFH,GO1
CLR 20H
GO1: CJNE R7,#00H,GO2
SETB 20H
GO2: JNB TF1,GO3
CLR TF1
JB 20H,GO4
DEC R7
SJMP GO6
GO4: INC R7
GO6: MOV P1,R7
LCALL DISPLAY
GO3: MOV A,P3
ORL A,#1FH
CPL A
JZ GO5
LCALL DELAY
MOV A,P3
ORL A,#1FH
CPL A
JZ GO5
LJMP CHANGESTATE
GO5: LJMP TRI
3.1.2 方波產生
圖12 方波仿真圖
REC:JNB TF1,GG1
CLR TF1
DJNZ R2,GG2
MOV R2,#0FFH
CPL 20H
GG2:JB 20H,GG3
MOV P1,#00H
SJMP GG4
GG3:MOV P1,#0FFH
GG4:
GG1:MOV A,P3
ORL A,#0FH
CPL A
JZ GG5
LCALL DELAY
MOV A,P3
ORL A,#0FH
CPL A
JZ GG5
GG5:LJMP REC
3.1.3 正弦波產生
圖13 正弦波仿真圖
SIN: JNB TF1,G1
CLR TF1
INC R1
MOV A,R1
MOVC A,@A+DPTR
MOV P1,A
G1: MOV A,P3
ORL A,#1FH
CPL A
JZ G2
MOV A,P3
ORL A,#1FH
CPL A
JZ G2
G2: LJMP SIN
3.1.4 鍵盤控制 通過按鍵的控制,可以實現波形的相互轉換和調頻的功能。P3.5和P3.6端口的鍵盤分別實現頻率的加減功能,P3.7端口的鍵盤實現波形之間的相互轉換。其仿真效果如下圖所示:
圖14 波形轉換仿真圖
3.1.5 LED顯示本次設計采用6位數碼管實現顯示功能,其中前3位用于顯示波形的類型,REC代表方波,SIN代表正弦波,TRI代表三角波;后3位用于顯示波形的頻率。其仿真效果如下圖所示:
圖15 LED仿真圖
3.2 硬件調試本次設計的硬件電路調試結果如下圖所示:
圖16 硬件效果圖
4 系統功能介紹 本次設計的電路可實現以下三大功能:
本次設計電路可產生方波、三角波、正弦波三種波形,而且通過鍵盤控制可以實現三種波形之間的相互轉換和頻率調節的功能。
本次設計的顯示功能通過6位數碼管實現,可以顯示三種波形的類型和頻率。
本次設計的電路具有鍵盤控制功能,可以進行三種波形之間的任意轉換和波形頻率的調節,并可以將改變后的結果實時地顯示在在數碼管上。
5 設計總結我們小組此次的設計題目是波形發生器的設計,通過小組成員將近一個月的努力,并按照本次電子設計競賽的相關要求,最終完成此次設計。在此次設計中收獲頗多,主要有以下幾點:
- 通過對電路的設計,對51系列單片機的原理和功能有了進一步的了解,對之前學過的書本上的電路知識有了更深刻的體會,如復位電路的原理,晶振電路的作用,上拉電阻的功能,LED顯示電路的原理等,熟悉了DAC0832芯片的原理和功能,并且能對其進行應用。
- 通過原理圖的繪制,學會了Proteus軟件的使用,并且能用它完成一些簡單的電路設計,對常用的一些元器件有了一定的了解和認識。
- 本次設計的硬件電路相對簡單,核心部分是程序的編寫,考慮到匯編語言與硬件電路聯系比較緊密,我們組通過討論最終選取匯編語言進行程序的編寫,方便后期調試過程查找錯誤。在軟件和硬件的調試階段遇到很多的問題,如LED顯示亂碼、閃爍、波形失真等,通過不斷的查找錯誤,對程序進行相應的修改,使其達到設計的要求,在這個過程中,認識到有時候一個簡單的錯誤就有可能造成電路無法正常工作,可謂“失之毫厘,差之千里”,培養了我們嚴謹細致的工作態度,同時對電路的的工作原理有了更深刻的認識。
- 在本次電路設計的過程中,深刻體會到對于一個功能較為復雜的系統設計,一定要學會劃分功能模塊,逐個實現,最終再進行整合,切不可眉毛胡子一把抓,那樣不僅操作起來麻煩,效率低,而且容易出錯。
- “紙上得來終覺淺,絕知此事要躬行”,通過本次電子設計競賽,深刻體會到理論聯系實踐的重要性,要學會活學活用。同時,在實踐的過程中,也可以加深對理論知識的認識,提高動手能力。
- 通過本次電子設計競賽,我更加深刻的認識到團隊合作的重要性,小組成員分工合作,是設計成功的關鍵,只有大家團結一致,才能更快更好的完成任務。
我們此次的設計基本滿足設計的要求,當然還是存在不足的地方,例如當頻率過小的時候波形會有些失真,波形的頻率調節范圍比較小,D/A轉換器轉換時可以加一個鎖存器,放大電路設計上還有待進一步改進,使其具有更強的輸出能力等。
附錄1 系統原理圖
單片機源程序如下:
- ORG 0000H
- lJMP MAIN
-
- MAIN:
- MOV TMOD,#20H
- MOV R0,#02H
- MOV A,#0FFH
- MOV P3,A
- MOV A,#70H
- MOV SP,A
- MOV R6,#0FFH
- REMAIN:CLR TR1
- MOV TH1,R6
- SETB TR1
- LCALL JM
-
- CJNE R0,#01,SHIFT
- TRI: CJNE R7,#0FFH,GO1
- CLR 20H
- GO1: CJNE R7,#00H,GO2
- SETB 20H
-
- GO2: JNB TF1,GO3
- CLR TF1
- JB 20H,GO4
- DEC R7
- SJMP GO6
- GO4: INC R7
- GO6: MOV P1,R7
- LCALL DISPLAY
- GO3:
- MOV A,P3
- ORL A,#1FH
- CPL A
- JZ GO5
- LCALL DELAY
- MOV A,P3
- ORL A,#1FH
- CPL A
- JZ GO5
- LJMP CHANGESTATE
- GO5: LJMP TRI
-
- SHIFT:JC SIN1
- REC:JNB TF1,GG1
- CLR TF1
- DJNZ R5,GG2
- MOV R5,#0FFH
- CPL 20H
- GG2:JB 20H,GG3
- MOV P1,#00H
- SJMP GG4
- GG3:MOV P1,#0FFH
- GG4:LCALL DISPLAY
- GG1:MOV A,P3
- ORL A,#1FH
- CPL A
- JZ GG5
- LCALL DELAY
- MOV A,P3
- ORL A,#1FH
- CPL A
- JZ GG5
- LCALL CHANGESTATE
- GG5:LJMP REC
-
- SIN1:NOP
- MOV DPTR,#TABSIN
- SIN: JNB TF1,G1
- CLR TF1
- INC R1
- MOV A,R1
- MOVC A,@A+DPTR
- MOV P1,A
- LCALL DISPLAY
- G1: MOV A,P3
- ORL A,#1FH
- CPL A
- JZ G2
- LCALL DELAY
- MOV A,P3
- ORL A,#1FH
- CPL A
- JZ G2
- LCALL CHANGESTATE
- G2: LJMP SIN
-
- CHANGESTATE:
- JB P3.7,GOTO1
- INC R0
- CJNE R0,#03H,GOTO1
- MOV R0,#00H
- GOTO1: JB P3.6,GOTO2
- INC R6
- GOTO2: JB P3.5,GOTO3
- DEC R6
- GOTO3: MOV A,P3
- CPL A
- JNZ GOTO3
- LJMP REMAIN
-
- JM:MOV DPTR,#TABNUM
- MOV A,R6
- MOV B,#100
- DIV AB
- MOVC A,@A+DPTR
- MOV 14H,A
- MOV A,B
- MOV B,#10
- DIV AB
- MOVC A,@A+DPTR
- MOV 15H,A
- MOV A,B
- MOVC A,@A+DPTR
- MOV 16H,A
-
- MOV DPTR,#TABWM
- MOV A,R0
- MOV B,#03H
- MUL AB
- MOV 10H,A
- MOVC A,@A+DPTR
- MOV 11H,A
- INC DPTR
- MOV A,10H
- MOVC A,@A+DPTR
- MOV 12H,A
- MOV A,10H
- INC DPTR
- MOVC A,@A+DPTR
- MOV 13H,A
- RET
-
-
- DISPLAY:
- SETB P2.6
- MOV P0,11H
- CLR P2.6
- MOV P0,#0FFH
- SETB P2.7
- MOV P0,#0FEH
- CLR P2.7
- MOV P0,#0FFH
- LCALL DELAY
-
- SETB P2.6
- MOV P0,12H
- CLR P2.6
- MOV P0,#0FFH
- SETB P2.7
- MOV P0,#0FDH
- CLR P2.7
- MOV P0,#0FFH
- LCALL DELAY
-
- SETB P2.6
- MOV P0,13H
- CLR P2.6
- MOV P0,#0FFH
- SETB P2.7
- MOV P0,#0FBH
- CLR P2.7
- MOV P0,#0FFH
- LCALL DELAY
-
- SETB P2.6
- MOV P0,14H
- CLR P2.6
- MOV P0,#0FFH
- SETB P2.7
- MOV P0,#0F7H
- CLR P2.7
- MOV P0,#0FFH
- LCALL DELAY
-
- SETB P2.6
- MOV P0,15H
- CLR P2.6
- MOV P0,#0FFH
- SETB P2.7
- MOV P0,#0EFH
- CLR P2.7
- MOV P0,#0FFH
- LCALL DELAY
-
- SETB P2.6
- MOV P0,16H
- CLR P2.6
- MOV P0,#0FFH
- SETB P2.7
- MOV P0,#0DFH
- CLR P2.7
- MOV P0,#0FFH
- LCALL DELAY
- RET
- DELAY:MOV R2,#0FFH
- MOV R3,#1
- LOOP:
- DJNZ R3,LOOP
- MOV R3,#2
- DJNZ R2,LOOP
- RET
-
- TABNUM: DB 3FH,06H,5BH,4FH,66H
- DB 6DH,7DH,07H,7FH,6FH
- TABWM: DB 6DH,06H,37H,07H,77H
- DB 30H,77H,79H,39H
- TABSIN:
- 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,76H,79H,7CH,80H
-
-
- END
復制代碼完整的Word格式文檔51黑下載地址:
51單片機實現波形發生器.doc
(3.34 MB, 下載次數: 197)
2019-5-20 18:30 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者: cooleaf 時間: 2020-5-4 22:16
直接匯編,好NBa的樣子!!
作者: 葉SiR 時間: 2020-6-7 16:03
你好,照著你的proteus和keil,但是仿真的時候顯示不對啊
作者: 咸魚Sirrr 時間: 2020-11-23 16:45
同問,為啥仿真是出不來波形?
作者: 1750813067 時間: 2021-4-25 14:21
實際電路怎么連接的啊
作者: xLi_ 時間: 2021-6-14 21:23
請問現在解決了嗎?想請教幾個問題
作者: 黃昏時分無故人 時間: 2021-6-18 09:49
后來解決了嗎
作者: kmikmi 時間: 2021-6-20 09:31
程序有3個錯誤
作者: 51hei團團 時間: 2021-6-20 18:51
我編譯出來是0個錯誤,不過我沒有電路沒有測試功能
-
-
asm.7z
2021-6-20 18:51 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
15.17 KB, 下載次數: 4, 下載積分: 黑幣 -5
| 歡迎光臨 (http://m.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |