基于STC89C51單片機的數字電壓表設計
3.1 單片機編程
單片機在這個系統中所起的作用是控制ADC0809進行數據轉化,并將轉化的數據通過串口發送到上位機上。因為單片機做數據處理的能力不是很強,所以,將所采集的數據轉化量送到PC機上,再利用PC機強大的數據處理能力來進行處理,最后得出想要的結果。因為ADC0809的CLOCK需要外接時鐘信號(一般接500 kHz),這個時鐘信號頻率可以用標準的振蕩電路產生,也可以用單片機自帶的TO或T1口產生。為了設計的最小化,本設計采用的是自帶的TO口來提供時鐘信號。其程序如下:本文引用地址:http://www.j9360.com/article/173529.htm
3.2 上位機編程
上位機采用VC++6.0實現可視化界面及與下位機的通信功能。VC++是基于Windows操作系統的編程語言工具,可采用API函數來直接實現與下位機的通信,但是這種方法要涉及到很多低層設置,所以,本文采用的是Microsoft推出的ActiveX技術來實現串口通信,即應用程序直接使用ActiveX控件提供的接口來訪問ActiveX控件。Microsoft Communications Control(以下簡稱MSComm)是Microsoft公司提供的可在簡化Windows下串行通信編程的ActiveX控件,它為應用程序提供了通過串行接口收發數據的簡便方法。具體來說,它提供了兩種處理通信問題的方法:一是事件驅動(Event2driven)方法,二是查詢方法。本設計采用的是查詢方法,這種方法適合于較小的應用程序。在這種情況下,每當應用程序執行完某一串行口操作后,將不斷檢查MSComm控件的CommEvent屬性,以便檢查執行結果或者檢查某一事件是否發生。如果應用程序較小而且是自成一體,這種方法可能更可取。故對本設計更為可取。MSComm控件有許多重要的屬性,其中首要的幾個如表1所列。
在對上位機編程時,應首先創建一個基于對話框的應用程序,然后插入MSComm控件,可在對話框資源上放一個編輯框(IDC_EDIT_RECEIVE)顯示電壓值,再放兩個按鈕控件[開始測量IDC_TEST)和停止測量(ID_STOP)。然后再做對話框模板,鼠標點擊右鍵,選擇Classwizard,增加成員變量,將IDC_MSCOMMl關聯成員變量m_mscomm設定為CMSComm控件類型,但IDC_EDIT_RECEIVE關聯成員變量m_receive不是控件類型,是數值類型(float)。之后分別對兩個按鈕和MSComm控件添加消息響應函數,這可在Classwizard下自動添加。
添加代碼時,要首先設置MSComm控件的屬性,這可以在OnInitDialog函數中添加。本文采用的是COMl口,波特率為9600,無奇偶校驗位,8位數據位,l位停止位,用二進制方式收發數據。在開始測量按鈕的OnTest()函數下添加SetTimer(1,500,NULL);開啟定時器每500 ms觸發一次定時器事件,并在停止測量按鈕OnStop ()函數下添加KillTimer(1);按鈕的作用是停止定時器事件。接著是添加WM_TIMER消息。可在OnTimer(UINT nIDEvent)上添加CByteArray bytoutArr;bytoutArr.Add(0xfd);m_mscomm.SetOutput(COleVariant(bytoutArr));(采用二進制方式發送數據0xfd,500ms發送一次,下位機只有在接收到0xfd后才會將轉化的數據傳回來,這也相當于一個簡單的通信協議。
數據的接收處理(也是本文的重點)可通過在MSComm控件的消息響應函數中采用查詢方式檢查接收事件是否發生來完成。具體代碼如下:
評論