可驅動(吸收或輸出電流)4個TTL邏輯門電路。對端口P2寫“1”,通過內部的上拉電阻把端口拉到高電平,此時可作輸入口,作輸入口使用時,因為內部存在上拉電阻,某個引腳被外部信號拉低時會輸出一個電流(IIL)。在訪問外部程序存儲器或16位地址的外部數據存儲器時,P2口送出高8位地址數據。在訪問8位地址的外部數據存儲器(如執行MOVX @RI 指令)時,P2口輸出P2鎖存器的內容。Flash 編程或校驗時,P2亦接收高位地址和一些控制信號。
P3口:P3口是一組帶有內部上拉電阻的8位雙向I/O口。P3口輸出緩沖級可驅動(吸收或輸出電流個TTL邏輯)4門電路。對P3口寫入“1”時,它們被內部上拉電阻拉高并可作為輸入端口。此時,被外部拉低的P3口將用上拉電阻輸出電流(IIL)。P3口除了作為一般的I/O口線外,更重要的用途是它的第二功能。P3口還接收一些用于Flash閃速存儲器編程和程序校驗的控制信號。
RST:復位輸入。當振蕩器工作時,RST引腳出現兩個機器周期以上高電平將使單片機復位。
ALE/PROG:當訪問外部程序存儲器或數據存儲器時,ALE(地址鎖存允許)輸出脈沖用于鎖存地址的低8位字節。一般情況下,ALE仍以時鐘振蕩頻率的1/6輸出固定的脈沖信號,因此它可對外輸出時鐘或用于定時目的。要注意的是:每當訪問外部數據存儲器時將跳過一個ALE脈沖。對Flash存儲器編程期間,該引腳還用于輸入編程脈沖(PROG)。如有必要,可通過對特殊功能寄存器(SFR)區中的8EH 單元的D0位置位,可禁止ALE操作。該位置位后,只有一條MOVX和MOV指令才能將ALE激活。此外,該引腳會被微弱拉高,單片機執行外部程序時,應設置ALE 禁止位無效。
PSEN:程序儲存允許(PSEN)輸出是外部程序存儲器的讀選通信號,當AT89C52由外部程序存儲器取指令(或數據)時,每個機器周期兩次PSEN有效,即輸出兩個脈沖。在此期間,當訪問外部數據存儲器,將跳過兩次PSEN信號。
EA/VPP:外部訪問允許。欲使CPU僅訪問外部程序存儲器(地址為0000H—FFFFH),EA 端必須保持低電平(接地)。需注意的是:如果加密位LB1被編程,復位時內部會鎖存EA端狀態。如EA端為高電平(接Vcc端),CPU則執行內部程序存儲器中的指令。Flash 存儲器編程時,該引腳加上+12V的編程允許電源Vpp,當然這必須是該器件是使用12V編程電壓Vpp。
XTAL1:振蕩器反相放大器的及內部時鐘發生器的輸入端。
XTAL2:振蕩器反相放大器的輸出端。
2.1.2 DAC0832數模轉換器
DAC0832是8分辨率的D/A轉換集成芯片。與微處理器完全兼容。這個DA芯片以其價格低廉、接口簡單、轉換控制容易等優點,在單片機應用系統中得到廣泛的應用。D/A轉換器由8位輸入鎖存器、8位DAC寄存器、8位D/A轉換電路及轉換控制電路構成。圖3為其芯片管腳圖。

圖3 DAC0832管腳圖
各個管腳功能如下:
D0~D7:8位數據輸入線,TTL電平,有效時間應大于90ns(否則鎖存器的數據會出錯)
ILE:數據鎖存允許控制信號輸入線,高電平有效;
CS:片選信號輸入線(選通數據鎖存器),低電平有效;
WR1:數據鎖存器寫選通輸入線,負脈沖(脈寬應大于500ns)有效。由ILE、CS、WR1的邏輯組合產生LE1,當LE1為高電平時,數據鎖存器狀態隨輸入數據線變換,LE1的負跳變時將輸入數據鎖存;
XFER:數據傳輸控制信號輸入線,低電平有效,負脈沖(脈寬應大于500ns)有效;
WR2:DAC寄存器選通輸入線,負脈沖(脈寬應大于500ns)有效。由WR2、XFER 的邏輯組合產生LE2,當LE2為高電平時,DAC寄存器的輸出隨寄存器的輸入而變化,LE2的負跳變時將數據鎖存器的內容打入DAC寄存器并開始D/A轉換。
IOUT1:電流輸出端1,其值隨DAC寄存器的內容線性變化;
IOUT2:電流輸出端2,其值與IOUT1值之和為一常數;
Rfb:反饋信號輸入線,改變Rfb端外接電阻值可調整轉換滿量程精度;
Vcc:電源輸入端,Vcc的范圍為+5V~+15V;
VREF:基準電壓輸入線,VREF的范圍為-10V~+10V;
AGND:模擬信號地
DGND:數字信號地
2.1.3其他器件
本次設計中,不僅僅用到了AT89C52單片機和DAC0832數模轉換芯片,還用到了74HC138譯碼器和74HC573鎖存器。
74HC138 作用原理于高性能的存貯譯碼或要求傳輸延遲時間短的數據傳輸系統,在高性能存貯器系統中,用這種譯碼器可以提高譯碼系統的效率。
74HC573數據鎖存器。主要用于數碼管、按鍵等等的控制。

圖4 74HC138 圖5 74HC573
2.2硬件連接圖
2.2.1主控電路
中斷系統是使處理器具有對外界異步事件的處理能力而設置的。當中央處理器CPU正在處理某件事的時候外界發生了緊急事件,要求CPU暫停當前的工作,轉而去處理這個緊急事件。在波形發生器中,只用到片內定時器/計數器溢出時產生的中斷請求,即是在AT89C52輸出一個波形采樣點信號后,接著啟動定時器,在定時器未產生中斷之前,AT89C52等待,直到定時器計時結束,產生中斷請求,AT89C52響應中斷,接著輸出下一個采樣點信號,如此循環產生所需要的信號波形。如圖所示2.1,AT89C52所在電路中的工作情況。
本此課設中,AT89C52單片機的P1口接獨立式按鍵電路,P2口部分接譯碼器,P0口接鎖存器。主控電路圖如圖6所示

圖6 主控電路
2.2.2 獨立式鍵盤
獨立式鍵盤中,各按鍵相互獨立,每個按鍵各接一根輸入線,每根輸入線上的按鍵工作狀態不會影響其它輸入線上的工作狀態。因此,通過檢測輸入線的電平狀態就可以很容易的判斷按鍵是否被按下了。獨立式鍵盤電路配置靈活,軟件結構簡單。但每個按鍵需占用一根輸入線,在按鍵數量較多時,輸入口浪費大,電路結構顯得很繁雜,故此種鍵盤適用于按鍵較少或操作速度較高的場合。如圖7所示。
按鍵與AT89C52的P1口連接。 KEY1是監測是否輸出鋸齒波按鍵;KEY2是監測是否輸出三角波按鍵;KEY3監測是否輸出梯形波按鍵;KEY4監測是否輸出正弦波按鍵;KEY5是調頻按鍵。

圖7 獨立式鍵盤電路圖
2.2.3數模轉換電路
DAC0832是8分辨率的D/A轉換集成芯片。與微處理器完全兼容。這個DA芯片以其價格低廉、接口簡單、轉換控制容易等優點,在單片機應用系統中得到廣泛的應用。D/A轉換器由8位輸入鎖存器、8位DAC寄存器、8位D/A轉換電路及轉換控制電路構成。
由于AT89C51所產生的是數字信號,所以通過DAC0832把數字信號轉換成模擬信號。DAC0832輸出的模擬量是電流,為了轉換成電壓,所以在它后面接入一個運放器。如圖8。

圖 8 數模轉換電路圖
2.2.4驅動電路
74HC138作用原理于高性能的存貯譯碼或要求傳輸延遲時間短的數據傳輸系統,在 高性能存貯器系統中,用這種譯碼器可以提高譯碼系統的效率。
74HC573數據鎖存器。主要用于數碼管、按鍵等等的控制。如圖9所示,74HC138加74HC573的工作電路。

圖9 74HC138和74HC573的工作電路。
2.3總電路圖
多種波形發生器的總電路圖如圖10所示

圖11 總電路圖
3 程序設計
3.1主流程圖的設計
主程序的流程圖如圖12所示,開始時判斷是否調頻,然后判斷是否調用鋸齒波程序,然后判斷是否調用三角波程序,然后判斷是否調用梯形波程序,然后判斷是否調用正弦波程序,最后在循環回到判斷是否調頻。

圖12 軟件主程序流程圖
3.2 子程序的設計
3.2.1鋸齒波的產生
鋸齒波的實現過程是首先定義一個初值然后進行加法操作,加的步數的多少則根據要求的頻率來進行。然后加到某個數之后就再重新設置為初值,再重復執行剛剛的操作,如此循環下去。子程序如下:
ST:MOV A,#00H ;設置初值
LOOP:MOVX @DPTR,A ;把數據送到端口轉換
ADD A,R6 ;通過步長改變數據,上升波形
CJNE A,#00H,LOOP ;A值是否到最高點
DJNZ R5,LOOP
SJMP LOP
3.2.2三角波的產生
三角波的實現是設置一個初值,當加到某個值的時候,執行減一操作,減到初值時,再加一。子程序如下:
TRIANGLE:MOV A,#00H ;設置初值
LOOP3:MOVX @DPTR,A ;把數據送到端口轉換
ADD A,R6 ;通過步長改變數據上升波形
CJNE A,#00H,LOOP3 ;A值是否到最高點
DEC A ;減少步長改變數據下降波形
LOOP2:MOVX @DPTR,A ;把數據送到端口轉換
DEC A ;減少步長改變數據下降波形
CJNE A,#00H,LOOP2 ;A值是否到最低點
DJNZ R5,LOOP3 ;波形周期
SJMP LOP ;返回檢測開關
3.2.3梯形波的產生
梯形波的實現是設置一個初值,然后進行加一,當加到某個數時延時,之后減一,減到初值時在返回到之前的操作,繼續加一、延時、減一。梯形波產生的子程序如下:
TXING:MOV A,#00H ;設置初值
LOOP4:MOVX @DPTR,A ;把數據送到端口轉換
ADD A,R6 ;增加步長改變數據上升波形
CJNE A,#00H,LOOP4 ;A值是否到最高點
SUBB A,R6 ;下降波形做準備
DEC A
MOV R7,0EEH ;循環次數
LOP2:MOVX @DPTR,A ;進行延時
DJNZ R7,LOP2
LOOP1:MOVX @DPTR,A ;把數據送到端口轉換
SUBB A,R6
DEC A
CJNE A,#00H,LOOP1 ;是否到最低點
MOV R7,0EEH ;循環次數
LOP1:MOVX @DPTR,A ;把數據送到端口轉換
DJNZ R7,LOP1 ;進行延時
SJMP LOP ;返回檢測開關
3.2.4正弦波的產生
正弦波的實現比較麻煩,需要查表,每查一次表,輸出一個數值,之后查下一個數值繼續輸出,當一個波形的256個數值全部輸出之后,從頭開始繼續輸出。正弦波產生的子程序如下:
SINE:MOV A,#00H ;設置初值
LOOP7:MOV R7,A ;保存當前的數據
MOV DPTR,#SIN ;讀取表的地址
MOVC A,@A+DPTR ;讀取表中的數據
MOV DPTR,#7FFH ;D/A0832的端口地址
MOVX @DPTR,A ;進行數據轉換
MOV A,R7 ;恢復當前數據
INC A ;為讀取表的下一個值做準備
CJNE A,#00H,LOOP7 ;是否讀完表的數據
SJMP START ;返回檢測開關
FM:MOV R6,#04H ;改變調頻/調幅
MOV R5,#02H
SJMP START ;返回檢測開關
;--------以下是通過正弦的值所建立的一個表
SIN: 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
3.2.5主程序
主程序的代碼如下:
ORG 0000H ;程序開始
MOV SP,#60H ;設置堆棧
MOV DPTR,#7FFH ;0832的地址
LOP:MOV P1,#0FFH
MOV A,P1
JNB P1.5,FM ;是否需要調頻
MOV R6,#01H ;設置步長
MOV R5,#01H
START:JNB P1.0,ST ;輸出鋸齒波程序
JNB P1.1,TRIANGLE ;輸出三角波程序
JNB P1.2,TXING ;輸出梯形波程序
JNB P1.3,SINE ;輸出正弦波程序
SJMP LOP ;循環檢測
4應用軟件
本次課程設計中,我們用到了Protues7.8對其電路圖進行繪制和仿真,還用到了Keil C51對程序進行譯碼和編譯。下面對這兩個軟件進行簡單的介紹。
4.1 Proteus
Protues軟件是英國Labcenter electronics公司出版的EDA工具軟件。它不僅具有其它EDA工具軟件的仿真功能,還能仿真單片機及外圍器件。它是目前最好的仿真單片機及外圍器件的工具。
Protues軟件具有其它EDA工具軟件的功能。它能夠完成原理布圖、PCB自動或人工布線和SPICE電路仿真的功能。同時Protues具有革命性的特點:
- 互動的電路仿真。用戶甚至可以實時采用諸如RAM,ROM,鍵盤,馬達,LED,LCD,AD/DA,部分SPI器件,部分IIC器件。
- 仿真處理器及其外圍電路。可以仿真51系列、AVR、PIC、ARM、等常用主流單片機。還可以直接在基于原理圖的虛擬原型上編程,再配合顯示及輸出,能看到運行后輸入輸出的效果。配合系統配置的虛擬邏輯分析儀、示波器等,Protues建立了完備的電子設計開發環境。
Protues提供了4大功能模塊:
(1)智能原理圖設計(ISIS)
豐富的器件庫:超過27000種元器件,可方便地創建新元件;智能的器件搜索:通過模糊搜索可以快速定位所需要的器件;智能化的連線功能:自動連線功能使連接導線簡單快捷,大大縮短繪圖時間;支持總線結構:使用總線器件和總線布線使電路設計簡明清晰;可輸出高質量圖紙:通過個性化設置,可以生成印刷質量的BMP圖紙,可以方便地供WORD、POWERPOINT等多種文檔使用。
(2)完善的電路仿真功能(Prospice)
ProSPICE混合仿真:基于工業標準SPICE3F5,實現數字/模擬電路的混合仿真;超過27000個仿真器件:可以通過內部原型或使用廠家的SPICE文件自行設計仿真器件,Labcenter也在不斷地發布新的仿真器件,還可導入第三方發布的仿真器件; 多樣的激勵源:包括直流、正弦、脈沖、分段線性脈沖、音頻(使用wav文件)、指數信號、單頻FM、數字時鐘和碼流,還支持文件形式的信號輸入; 豐富的虛擬儀器:13種虛擬儀器,面板操作逼真,如示波器、邏輯分析儀、信號發生器、直流電壓/電流表、交流電壓/電流表、數字圖案發生器、頻率計/計數器、邏輯探頭、虛擬終端、SPI調試器、I2C調試器等; 生動的仿真顯示:用色點顯示引腳的數字電平,導線以不同顏色表示其對地電壓大小,結合動態器件(如電機、顯示器件、按鈕)的使用可以使仿真更加直觀、生動; 高級圖形仿真功能(ASF):基于圖標的分析可以精確分析電路的多項指標,包括工作點、瞬態特性、頻率特性、傳輸特性、噪聲、失真、傅立葉頻譜分析等,還可以進行一致性分析。
(3)獨特的單片機協同仿真功能(VSM)
支持主流的CPU類型:如ARM7、8051/52、AVR、PIC10/12、PIC16、PIC18、PIC24、dsPIC33、HC11、BasicStamp、8086、MSP430等,CPU類型隨著版本升級還在繼續增加,如即將支持CORTEX、DSP處理器;支持通用外設模型:如字符LCD模塊、圖形LCD模塊、LED點陣、LED七段顯示模塊、鍵盤/按鍵、直流/步進/伺服電機、RS232虛擬終端、電子溫度計等等,其COMPIM(COM口物理接口模型)還可以使仿真電路通過PC機串口和外部電路實現雙向異步串行通信; 實時仿真:支持UART/USART/EUSARTs仿真、中斷仿真、SPI/I2C仿真、MSSP仿真、PSP仿真、RTC仿真、ADC仿真、CCP/ECCP仿真。編譯及調試:支持單片機匯編語言的編輯/編譯/源碼級仿真,內帶8051、AVR、PIC的匯編編譯器,也可以與第三方集成編譯環境(如IAR、Keil和Hitech)結合,進行高級語言的源碼級仿真和調試。
(4)實用的PCB設計平臺
原理圖到PCB的快速通道:原理圖設計完成后,一鍵便可進入ARES的PCB設計環境,實現從概念到產品的完整設計;先進的自動布局/布線功能:支持器件的自動/人工布局;支持無網格自動布線或人工布線;支持引腳交換/門交換功能使PCB設計更為合理; 完整的PCB設計功能:最多可設計16個銅箔層,2個絲印層,4個機械層(含板邊),靈活的布線策略供用戶設置,自動設計規則檢查,3D可視化預覽;多種輸出格式的支持:可以輸出多種格式文件,包括Gerber文件的導入或導出,便利與其它PCB設計工具的互轉(如protel)和PCB板的設計和加工。
4.2 KeilC51
Keil C51是美國Keil Software公司出品的51系列兼容單片機C語言軟件開發系統,與匯編相比,C語言在功能上、結構性、可讀性、可維護性上有明顯的優勢,因而易學易用。Keil提供了包括C編譯器、宏匯編、連接器、庫管理和一個功能強大的仿真調試器等在內的完整開發方案,通過一個集成開發環境(uVision)將這些部分組合在一起。運行Keil軟件需要WIN98、NT、WIN2000、WINXP等操作系統。
Keil C51軟件提供豐富的庫函數和功能強大的集成開發調試工具,全Windows界面。另外重要的一點,只要看一下編譯后生成的匯編代碼,就能體會到Keil C51生成的目標代碼效率非常之高,多數語句生成的匯編代碼很緊湊,容易理解。在開發大型軟件時更能體現高級語言的優勢。
C51工具包的整體結構,uVision與Ishell分別是C51 for Windows和for Dos的集成開發環境(IDE),可以完成編輯、編譯、連接、調試、仿真等整個開發流程。開發人員可用IDE本身或其它編輯器編輯C或匯編源文件。然后分別由C51及C51編譯器編譯生成目標文件(.OBJ)。目標文件可由LIB51創建生成庫文件,也可以與庫文件一起經L51連接定位生成絕對目標文件(.ABS)。ABS文件由OH51轉換成標準的Hex文件,以供調試器dScope51或tScope51使用進行源代碼級調試,也可由仿真器使用直接對目標板進行調試,也可以直接寫入程序存貯器如EPROM中。
Keil具有具有很多優點:
(1)Keil C51生成的目標代碼效率非常之高,多數語句生成的匯編代碼很緊湊,容易理解。在開發大型軟件時更能體現高級語言的優勢。
(2)與匯編相比,C語言在功能上、結構性、可讀性、可維護性上有明顯的優勢,因而易學易用。用過匯編語言后再使用C來開發,體會更加深刻。 Keil C51軟件提供豐富的庫函數和功能強大的集成開發調試工具,全Windows界面。
5調試與仿真結果
本次的設計主要應用了protues和keilC51軟件進行系統設計和仿真,經過仿真后,結果較好,示波器可以正確的輸出鋸齒波、三角波、梯形波、正弦波。
沒有按鍵按下時,波形圖如圖13所示

圖13 沒有按鍵按下時波形圖
當按下K1按鍵時,產生鋸齒波,如圖14所示

圖14 按下K1鍵產生鋸齒波
當按下K2按鍵時,產生三角波,15如圖所示

圖15 按下K2鍵時產生三角波
當按下按鍵K3時,產生梯形波,如圖16所示

圖16 按下K3產生梯形波
當按下K4按鍵時,產生正弦波,如圖17所示

圖17 按下K4產生正弦波
按下K5按鍵的時候采樣頻率會發生變化。
6總結
經過近兩周的單片機課程設計,終于完成了我們組的波形發生器的設計,基本達到了設計要求,從心底里來說,還是很高興的。但還是有很多需要反思的問題。
在本次設計的過程中,雖然讓我長進了很多。對于單片機設計,其中硬件電路是比較簡單的,主要是解決程序設計的問題,而程序設計它反映了我們解決問題的思維邏輯和創新能力。因此在整個設計過程中大部分時間是用在程序上面的。
要設計一個成功的電路,必須要有耐心,要有堅持的毅力。完成這次設計后,我在書本理論知識的基礎上又有了更深層次的理解。我發現,在我們所使用的書籍上有些知識在實際應用中其實并不是十分理想,各種參數都需要自己去調整。這就要求我們更加注重實踐環節。