接口技術課程方案設計書_第1頁
接口技術課程方案設計書_第2頁
接口技術課程方案設計書_第3頁
接口技術課程方案設計書_第4頁
接口技術課程方案設計書_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、湖北輕工職業(yè)技術學院接口技術 課程設計報告基于 RS232串口的數(shù)據(jù)采集系統(tǒng)設計與實現(xiàn)姓名:何松班級: 06電信 1班一系統(tǒng)結構:設計思路 :本課程設計通過使用帶有 AD 的單片機 STC12C5616AD 進行實時的 AD 采樣,并將采樣到的值通過 RS232串口傳輸?shù)?PC 機,由 VC 上位機接收,顯示當前的電壓值,并描繪電壓變化實時波形。系統(tǒng)框圖 :單片機系統(tǒng)電平轉換PC 機參考電壓信號輸入通道二. 系統(tǒng)設計:(一) 硬件電路設計:硬件部分由 STC12C5416AD 和晶振構成的單片機最小電路和 MAX232 構成的電平轉換電路用于和 PC機串口進行電壓匹配。電路原理圖如下:(二)軟

2、件電路設計:(1)單片機 C51 程序設計1.1 設計思路C51 程序由 RS232 串口發(fā)送程序和AD 采樣程序組成。 AD 采樣采用查詢方式,為了提高采樣的進度,我們應用的2.5V 的參考電壓,但是由于此單片機沒有直接的參考電壓輸入端,不能直接輸入?yún)⒖茧妷?。基于電源電壓VCC瞬間變換不大,因此我做了變通的方法。每次測量時,先測量2.5V參考電壓,得到10 位參考AD值ref,再采集需要測量的通道的電壓值,得到另一個10 位AD值Vad,那么所測電壓的計算公式就是:V=2.5*(Vad/ref) ??紤]到51 單片機進行乘法、除法指令時速度較慢,故將10 位ref,Vad 直接傳輸?shù)?PC

3、機,由上位機VC 軟件進行處理??紤]到數(shù)據(jù)傳輸時可能會出現(xiàn)錯位,缺少數(shù)據(jù)等情況,導致最終顯示的電壓值錯誤。因此在單片機傳輸有效數(shù)據(jù)的時候,加上了起始字符和結束字符用于盡量減少錯誤。1.2 軟件流程圖初始化采集 2.5V 參考電壓AD 值采集測量通道電壓AD 值發(fā)送起始字符“A ”發(fā)送參考值高位發(fā)送參考值低位發(fā)送測量值高位發(fā)送測量值低位發(fā)送停止字符“z”1.3 程序代碼見附錄一。(2) VC 程序設計2.1 設計思路VC 上位機以 Microsoft提供的 MSComm控件來與單片機的串口進行通信,獲取采集數(shù)據(jù)。程序將接收到的數(shù)據(jù)放入緩沖區(qū),經(jīng)過起始字符和結束字符校驗后的數(shù)據(jù)被處理計算成實際的電

4、壓值05V,并顯示在靜態(tài)文本框控件中。同時,當每次接收到一個有效數(shù)據(jù)時,調用 CDC類的成員函數(shù) LintTo ()。畫出數(shù)據(jù)連續(xù)的曲線。2.2 MSComm控件介紹Microsoft提供的用于串口操作的控件MSComm共有 27 個屬性。CommPort:設置并返回通信口號,缺省值為COM1。Settings:設置并返回波特率、奇偶校驗、數(shù)據(jù)位、停止位的字符串。其中波特率的范圍為300b/s 19200b/s 。PortOpen:設置并返回通信口的狀態(tài),同時用來打開和關閉通信口。InputLen :決定每次 Input 讀入的字符個數(shù),缺省為0,表示讀取接收緩沖區(qū)的全部內容。Input :讀

5、入并清除接收緩沖區(qū)的字符。InBufferCount :返回接收緩沖區(qū)已接收的字符數(shù),通過置0 可清初接受緩沖區(qū)。Output :將發(fā)送的字符串或數(shù)組寫到發(fā)送緩沖區(qū)。InputMode :定義 Input屬性獲得數(shù)據(jù)的方式。Rthreshold :設置、返回在通信控件置ComEvRecieve并激發(fā)OnComm事件前要接收的字符數(shù)。SThreshold:設置、返回在通信控件置ComEvSend并激發(fā)OnComm 事件前發(fā)送緩沖區(qū)中的最少字符數(shù)。2.3 界面設計如上圖所示,添加相應的控件。2.4 主要函數(shù)說明添加“打開串口”響應函數(shù):void CWangfei311Dlg:OnBtnOpen()

6、/ TODO: Add your control notification handler code here InitComm() 。/設置串口。波特率 停止位 端口選擇pictureinit() 。/畫圖界面初始化畫背景 X 、 Y 軸坐標,標尺MSComm 控件相應函數(shù)(畫圖、顯示電壓值功能在此事件中)void CWangfei311Dlg:OnOnCommMscomm()/ TODO: Add your control notification handler code here int nEvent 。 /Mscomm 控件的事件序號int k 。VARIANT m_input。ch

7、ar *str 。long temp,tempref 。 /存儲接收到的2 個10 位AD值,分別為測量值,參考值int Y 。 /畫圖縱坐標值double v。/計算出的電壓值CString reslut 。CString Ccount 。CPen pen1。 / 數(shù)據(jù)曲線畫筆pen1.CreatePen(PS_SOLID,1,RGB(255,255,255) 。 /實線 線寬 1 白色 pDC1->SelectObject(pen1) 。nEvent = m_Comm.GetCommEvent() 。 / 得到事件if(nEvent = 2)/ 只對接收數(shù)據(jù)事件進行處理k = m_C

8、omm.GetInBufferCount()。 / 接收緩沖區(qū)的字符數(shù)目if(k > 0)/ 若得到接收數(shù)據(jù)m_input = m_Comm.GetInput() 。str = (char*)(unsigned char*)m_input.parray->pvData。if(*str ='A' && *(str+5) = 'z')/開始字符和停止字符的檢測tempref = (*(str+1)*256+*(str+2)。temp = (*(str+3)*256+*(str+4)v = double(2.5*temp/tempref)。

9、Y = int (300-60*v) 。if(Y<0) Y =0 。 /防止畫出界限if(Y>300) Y = 300 。 / 防止畫出界限r(nóng)eslut.Format("%f",v) 。reslut.TrimLeft() 。CWnd *pWnddata = GetDlgItem(IDC_RECDA TA) 。 pWnddata->SetWindowText(reslut) 。 /在靜態(tài)文本框中顯示電壓值pDC->LineTo(X,Y) 。 /畫線X+=5 。count+ 。 / 接收數(shù)據(jù)個數(shù)值加1Ccount.Format("%16d&qu

10、ot;,count) 。Ccount.TrimLeft() 。CWnd *pWndcount = GetDlgItem(IDC_COUNT)。pWndcount->SetWindowText(Ccount) 。if(X>500)/ 若畫到 X 軸最右邊X=10 。pictureinit() 。/清除之前畫的圖 pDC1->MoveTo(10,Y) 。 / 平移起始點到最左端Else/若沒有通過校驗,顯示“NO Data ”CWnd *pWnddata = GetDlgItem(IDC_RECDATA) 。pWnddata->SetWindowText("NO

11、Data")。三. 系統(tǒng)測試 (最終測試的是 2.5V 標準電壓)附錄一:單片機程序代碼/rs232.c 源文件代碼:#include<reg51.h>#include"RS232.h"#include<intrins.h>/*+RS232 mode+*/ /* /* void delayus(uchar count)uint i 。uchar j。for(j=0 。 j<count 。 j+)for(i=0 。 i<10 。 i+) 。/波特率設置初始化/void rs232_init()TMOD=0x20。TL1=0xFDT

12、H1=0xFD。/9600 比特 /秒for 11.0592MPCON=0x00 。TR1=1 。SCON=0x50 。ES=1。 /允許串行口中斷EA=1 。 / 開總中斷/發(fā)送字符 /void send(uchar i)SBUF=i 。while(!TI) 。TI=0 。void rs232_isr() interrupt 4 using 1if(RI)rbuf = SBUF 。RI=0。if(rbuf = 0xF0) start=0 。if(rbuf = 0x80) start=1 。/*=*/main.c 源代碼#include<reg51.h>#include<in

13、trins.h>#include "rs232.h"#define uchar unsigned char#define uint unsigned intsfr P1M0=0x91 。sfr P1M1 =0x92 。sfr ADC_CONTR =0XC5。sfr AUXR = 0x8e 。sfr ADC_DATA =0xC6 。sfr ADC_LOW =0xBE。uchar rbuf 。uchar start。uint V 。uint Vref 。delay(uchar count)uchar m,n。for(m=0 。 m<=count 。 m+)for(n

14、=0 。 n<240。 n+) 。/*ADC 初始化 */void adc_init()P1M0=0xff 。P1M1=0x00 。ADC_DATA = 0 。/數(shù)據(jù)清零ADC_LOW = 0 。ADC_CONTR = 0xe0 。 /開 ADC 電源 ,采集速度選擇最高delay(200) 。void get_adc(uchar ch)ADC_CONTR = (0xe8 | ch) 。 /開啟轉換while(!(ADC_CONTR&0x10)ADC_CONTR&=0xe7。 / 等待轉換完成/清除 start,flag標志void main()rs232_init()

15、。adc_init() 。while(1)get_adc(0x00) 。/ 通道 0 參考Vref = (uint)(ADC_DATA<<2)|ADC_LOW)get_adc(0x01) 。V = (uint)(ADC_DATA<<2)|ADC_LOW)。send('A') 。/send('A') 。send(Vref>>8) 。send(Vref) 。send(V>>8) 。send(V)。send('z')。delay(250) 。delay(250) 。delay(250) 。delay(25

16、0) 。delay(250) 。附錄二: VC程序代碼定義的成員變量:public:int X 。CDC* pDC1 。int m_BaundRate 。int count 。CWnd* pWndpicture 。void pictureinit(void)。CDC* pDC 。int m_port 。CWangfei311Dlg(CWnd* pParent = NULL)。/ standard constructorvoid InitComm() 。添加的成員函數(shù):void CWangfei311Dlg:InitComm()m_Comm.SetCommPort(m_port) 。m_Comm

17、.SetInputMode(1) 。if(m_BaundRate = 1200)m_Comm.SetSettings("1200,n,8,1") 。else if(m_BaundRate = 2400)m_Comm.SetSettings("2400,n,8,1") 。else if(m_BaundRate = 4800)m_Comm.SetSettings("4800,n,8,1") 。else if(m_BaundRate = 9600)m_Comm.SetSettings("19600,n,8,1") 。el

18、se if(m_BaundRate = 19200)m_Comm.SetSettings("19200,n,8,1") 。else if(m_BaundRate = 28800)m_Comm.SetSettings("28800,n,8,1") 。else if(m_BaundRate = 38400)m_Comm.SetSettings("38400,n,8,1") 。else if(m_BaundRate = 57600)m_Comm.SetSettings("57600,n,8,1") 。else if(m_

19、BaundRate = 115200)m_Comm.SetSettings("115200,n,8,1") 。m_Comm.SetRThreshold(1) 。m_Comm.SetInBufferSize(1024) 。m_Comm.SetOutBufferSize(1024) 。m_Comm.SetInBufferCount(0) 。if(!m_Comm.GetPortOpen()m_Comm.SetPortOpen(TRUE) 。void CWangfei311Dlg:OnBtnOpen()/ TODO: Add your control notification ha

20、ndler code here InitComm() 。pictureinit() 。void CWangfei311Dlg:OnBtnClose()/ TODO: Add your control notification handler code here if( m_Comm.GetPortOpen() )m_Comm.SetPortOpen(0) 。void CWangfei311Dlg:OnOnCommMscomm()/ TODO: Add your control notification handler code here int nEvent 。int k 。VARIANT m

21、_input。char *str 。long temp,tempref 。int Y 。double v。static int i=10 。CString reslut 。CString Ccount 。CPen pen1。pen1.CreatePen(PS_SOLID,1,RGB(255,255,255) 。pDC1->SelectObject(pen1) 。nEvent = m_Comm.GetCommEvent() 。if(nEvent = 2)k = m_Comm.GetInBufferCount()。if(k > 0)m_input = m_Comm.GetInput()

22、 。str = (char*)(unsigned char*)m_input.parray->pvData。if(*str ='A' && *(str+5) = 'z')tempref = (*(str+1)*256+*(str+2)。temp = (*(str+3)*256+*(str+4)。v = double(2.5*temp/tempref) 。Y = int (300-60*v) 。if(Y<0) Y =0 。if(Y>300) Y = 300 。reslut.Format("%f",v) 。res

23、lut.TrimLeft() 。CWnd *pWnddata = GetDlgItem(IDC_RECDATA) 。pWnddata->SetWindowText(reslut) 。pDC->LineTo(X,Y) 。X+=5 。count+ 。Ccount.Format("%16d",count) 。Ccount.TrimLeft() 。CWnd *pWndcount = GetDlgItem(IDC_COUNT)。pWndcount->SetWindowText(Ccount) 。if(X>500)X=10 。pictureinit() 。pDC

24、1->MoveTo(10,Y) 。elseCWnd *pWnddata = GetDlgItem(IDC_RECDATA) 。pWnddata->SetWindowText("NO Data")。void CWangfei311Dlg:OnSelchangeCombo1()/ TODO: Add your control notification handler code here m_port = m_Comboboxsel.GetCurSel()+1 。void CWangfei311Dlg:pictureinit()pWndpicture = GetDlg

25、Item(IDC_PICTURE)。pDC = pWndpicture->GetDC()。pDC1 = pDC 。CPen pen。pen.CreatePen(PS_SOLID,1,RGB(255,0,0) 。pDC->SelectObject(pen) 。CRgn pRgn 。CBrush pBrush 。pRgn.CreateRectRgn(0,0,510,310) 。pBrush.CreateSolidBrush(RGB(0,0,0) 。pDC->FillRgn(&pRgn,&pBrush)。pDC->MoveTo(10,300) 。pDC->

26、;LineTo(500,300) 。pDC->LineTo(490,290) 。pDC->MoveTo(500,300) 。pDC->LineTo(490,310) 。pDC->MoveTo(10,300) 。pDC->LineTo(10,10) 。pDC->LineTo(0,20) 。pDC->MoveTo(10,10) 。pDC->LineTo(20,20) 。pDC->TextOut(0,300,"0") 。pDC->TextOut(0,240,"1") 。pDC->TextOut(

27、0,180,"2") 。pDC->TextOut(0,120,"3") 。pDC->TextOut(0,60,"4") 。pDC->TextOut(0,0,"5") 。pDC->MoveTo(10,300) 。pDC->LineTo(500,300) 。pDC->MoveTo(10,240) 。pDC->LineTo(500,240) 。pDC->MoveTo(10,180) 。pDC->LineTo(500,180) 。pDC->MoveTo(10,120) 。pDC->LineTo(500,120) 。pDC->Move

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論