——以“單片機89C2051 輸出口的正弦波輸出設計”為例
摘要:以學習單片機為目的,為在沒有仿真器和目標板的情況下對單片機內(nèi)部程序運行時有感性的認識,以常用的89C2051 單片機為核心,利用Proteus 仿真軟件的硬件仿真模塊建立一個正弦波發(fā)生電路,并運用C 語言編寫相應程序,結合所設計電路在Proteus 仿真軟件的軟件仿真功能進行了綜合仿真,并把仿真結果和實際電路與程序運行的結果進行了比較。據(jù)此,通過從實踐出發(fā)來,把實踐與理論結合在一起的學習方法來達到入門單片機知識。
1 引言
對于單片機的學習,由于其比較抽象,特別是在編寫程序時,完全只是憑借程序員周密的邏輯思維來進行程序設計,為了讓程序設計員更好的理解和調(diào)試其所設計的程序,所有單片機生產(chǎn)廠家都針對他們的單片機系列設計生產(chǎn)了相應的仿真器。然而這些仿真器的價格卻不菲,無凝這是初次學習單片機時重要考慮的因素。而目前隨著我國電子技術的飛速發(fā)展,我們所有生活上所用到、見到的電子產(chǎn)品都離不開單片機的身影,這也愈加激起我們對單片機的學習熱情。然而在具體學習這門技術時,特別是高校教學時,因為實驗設備不夠和教學課時少等原因,往往都是采用純理論性的或集體性的實驗。而通過這種學習之后,以我個人在校學習時的經(jīng)歷和對一些高校學生的了解,大部分學習者最終都是知識考試過了關,卻什么都不會。針對這一現(xiàn)象,在此本文提倡運用仿真的方法結合具體的設計來學習單片機知識。
目前國外很多軟件設計公司都針對單片機的學習而設計了許多仿真軟件,這使得單片機學習者只需要一臺個人電腦就可以完成單片機程序的設計和調(diào)試,大大降低了我們的學習成本,方便了我們的學習。其中,Proteus[1]是由英國Labcenter 公司開發(fā)的具有硬件電路分析、實物仿真軟件和程序仿真功能的仿真軟件。通過軟件安裝在個人電腦后,可以實現(xiàn)了單片機和SPICE 電路相結合的仿真。在此運用該仿真軟件,設計以AT89C2051[2]的P1 口輸出正弦波為目的的硬件電路和相應程序,通過這一具體的項目設計,把理論與實踐結合起來,以期引導入門單片機學習。
2設計Proteus里的仿真電路
為了對單片機內(nèi)部程序運行時有感性上的理解,在此利用Proteus7 Professional 下的ISIS7 Professional 仿真電路設計軟件設計了如下圖1 所示的電路,該電路所預達到的功能是通過單片機AM89C2051 的P10-P17 口輸出準正弦波并通過虛擬示波器顯示出來,為了避免可能由電路元器件引起后面的調(diào)試工作,電路所有采用的元器件都采用軟件自帶的標準庫里的元器件。
圖1 Proteus 中基于AT89C2051 單片機的準正弦波電路[!--empirenews.page--]
圖1 所示電路的核心部件是信號處理器U1,雙擊它時可對它進行相應的設定,完成相應的設定后其功能就完全可以用來履行已燒入程序代碼的CPU 的功能;時鐘電路有晶體振蕩器Y1 和瓷片電容C7、C8 組成;信號由U1 的P10-P17 這8 個輸出口輸出,信號再經(jīng)過上來電阻RP1、R1-R8 分壓輸出和通過電壓跟隨器電路轉化成近似于正弦波信號。
電阻R1 至R8 滿足如下方程:
于是得出S0-S8 分別約為:0、0.0381、0.1464、0.3087、0.5、0.6913、0.8536、0.7619和1。S(n)值確定后,作出S(n)的值在EXCEL 里折線圖如圖2 所示,從圖表中可以看出其形狀類似于正弦信號在-90°到+90°象限內(nèi)的波形。再依據(jù)以上結果,由式(3)可計算出R1-R8 的阻值關系,并按照常用電阻阻值規(guī)則,可取定如圖1 電路圖所示電阻阻值。
圖2 S(n)的在Excel 里的折線圖
3 設計相應程序
參照前面所設計電路,利用時間中斷程序來產(chǎn)生頻率為1KHz 的正弦波,所設計程序源代碼及相關注釋如下:
3.1定義P1端口的輸出值
首先定義P1 端口的輸出,P1 端口將按照數(shù)組P1_out[ ]給出的值不停的輸出,也類似于P1 端口的P10 置“1”其他端口置“0”后不停的左移和右移。之所以該數(shù)組的大小為16是因為將輸出正弦波周期在時域上分成16 等分。
code char P1_out[16]=
{0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0x02,0x04,0x06,0x10,0x20,0x40,0x80};
3.2初始化時鐘中斷0和1
在此程序中主要是初始化有關時鐘中斷寄存器。
void int_init(void)
{ EA=0;//關閉所有中斷,以保證在調(diào)用此子程序時中斷不會發(fā)生
TMOD=0x11; //#00000001B ;定義時鐘中斷0 為16 位時鐘發(fā)生器
TCON=0x50; //#00010000B ; 使能時鐘中斷0
IE=0x0a; //#00000010B ; 運行時鐘中斷0
IP=0x02; //#00000010B ; 時鐘中斷0 優(yōu)先
TL0= (65535-1000/16);
TH0= ((65535-1000/16)>>8); /*初始化時鐘中斷0 的計數(shù)寄存器,系統(tǒng)時鐘12MHz, 所以中斷計數(shù)時間為1us,中斷發(fā)生時間為1000/16X1us=1/16ms, 頻率為16KHz,除以16 是因為一個周期被分成16 等分*/
EA=1; //允許中斷發(fā)生
} [!--empirenews.page--]
3.3主程序
#include
#include
#include
void main(void)
{
static short P1_out_cnt=0; //定義對P1 口輸出時計數(shù)
int_init(); //調(diào)用中斷初始化子程序
while(1) //下面為一個無限循環(huán)
{
_nop_();
}
}
3.4時鐘中斷子程序
void timer_0 (void) interrupt 1 using 1
{ TL0= (65535-1000/16);
TH0= ((65535-1000/16)>>8); //重置時鐘中斷0 的時間計數(shù)寄存器值
P1=P1_out[P1_out_cnt]; //P1 口按數(shù)組給定值輸出
P1_out_cnt++; //指向數(shù)組中下一個值
P1_out_cnt&=0x0f; //00001111B,保證0≤P1_out_cnt≤15
}
4 仿真與實驗
在以上工作完成之后,通過仿真軟件Proteus7 professional 下面的ISIS7 Professional 菜單窗口里對一些參數(shù)進行設定,為了簡單完成仿真,在此只對必要的參數(shù)進行設定:首先對Design/Configure Power Rail 下的電源Vcc=5V 和GND=0 進行設定,其次是對Source/add or remove source code file 下的源程序代碼名和Code generation tool=ASEM51 進行設定,在次是對雙擊單片機U1 彈出的菜單進行Clock Frequency 和Program file 目標代碼(有源代碼編譯后產(chǎn)生的HEX 后綴名文件)的設定。最后點擊Debug/Execute 便開始仿真運行,在運行過程中可以看到電腦屏上電路圖中U1 輸出口的輸出狀態(tài),虛擬示波器上顯示如圖3 所示的波形。
為了對所仿真的結果做進一步的認證,在此設計了實際的電路來與之加以比較,如圖4所示是按照圖1 電路圖設計了實際電路板之后,用示波器對其輸出進行測試所得實際波形,實驗表明仿真的結果與實際的測試結果相一致。
圖3 仿真輸出波形
圖4 實際輸出波形
5 結束語
對所設計的C 語言程序結合硬件電路的進行了仿真,并通過虛擬示波器顯示了所設計程序運行的結果,并比較了仿真與實際電路運行輸出結果,表明了通過Proteus 仿真軟件可以達到與通過實際電路來學習單片機的效果。
完整的設計了一個項目的硬件電路和C 程序,通過真實具體的正弦波發(fā)生電路及其程序的設計來達到學習單片機引路作用,增強了學習者對單片機工作原理和應用設計的理解,為單片機初學者提供了一種切實可行的方法。
附圖實際測試電路板
注:實際電路板上包涵了文中圖1 的電路