版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 《接口技術》 課程設計報告</p><p> 基于RS232串口的</p><p> 數據采集系統設計與實現</p><p><b> 姓名:</b></p><p><b> 學號:</b></p><p><b> 班級:<
2、/b></p><p> 完成日期:2010年12月30日</p><p><b> 一.系統結構:</b></p><p><b> 設計思路:</b></p><p> 本課程設計通過使用帶有AD的單片機STC12C5616AD進行實時的AD采樣,并將采樣到的值通過RS232串口傳
3、輸到PC機,由VC上位機接收,顯示當前的電壓值,并描繪電壓變化實時波形。</p><p><b> 系統框圖:</b></p><p><b> 二.系統設計:</b></p><p><b> 硬件電路設計:</b></p><p> 硬件部分由STC12C5416A
4、D和晶振構成的單片機最小電路和MAX232構成的電平轉換電路用于和PC機串口進行電壓匹配。</p><p><b> 電路原理圖如下:</b></p><p> ?。ǘ┸浖娐吩O計:</p><p> (1)單片機C51程序設計</p><p><b> 1.1設計思路</b></p&
5、gt;<p> C51程序由RS232串口發(fā)送程序和AD采樣程序組成。AD采樣采用查詢方式,為了提高采樣的進度,我們應用的2.5V的參考電壓,但是由于此單片機沒有直接的參考電壓輸入端,不能直接輸入參考電壓。基于電源電壓VCC瞬間變換不大,因此我做了變通的方法。每次測量時,先測量2.5V參考電壓,得到10位參考AD值ref,再采集需要測量的通道的電壓值,得到另一個10位AD值Vad,那么所測電壓的計算公式就是:V=2.5*
6、(Vad/ref)。</p><p> 考慮到51單片機進行乘法、除法指令時速度較慢,故將10位ref,Vad直接傳輸到PC機,由上位機VC軟件進行處理。</p><p> 考慮到數據傳輸時可能會出現錯位,缺少數據等情況,導致最終顯示的電壓值錯誤。因此在單片機傳輸有效數據的時候,加上了起始字符和結束字符用于盡量減少錯誤。</p><p><b> 1
7、.2軟件流程圖</b></p><p><b> 1.3程序代碼</b></p><p><b> 見附錄一。</b></p><p> (2) VC程序設計</p><p><b> 2.1 設計思路</b></p><p> V
8、C上位機以Microsoft提供的MSComm控件來與單片機的串口進行通信,獲取采集數據。程序將接收到的數據放入緩沖區(qū),經過起始字符和結束字符校驗后的數據被處理計算成實際的電壓值0~5V,并顯示在靜態(tài)文本框控件中。同時,當每次接收到一個有效數據時,調用CDC類的成員函數LintTo()。畫出數據連續(xù)的曲線。</p><p> 2.2 MSComm控件介紹</p><p> Micros
9、oft提供的用于串口操作的控件MSComm共有27 個屬性。</p><p> CommPort:設置并返回通信口號,缺省值為COM1。</p><p> Settings:設置并返回波特率、奇偶校驗、數據位、停止位的字符串。其中波特率的范圍為300b/s—19200b/s。</p><p> PortOpen:設置并返回通信口的狀態(tài),同時用來打開和關閉通信口
10、。</p><p> InputLen:決定每次Input讀入的字符個數,缺省為0,表示讀取接收緩沖區(qū)的全部內容。</p><p> Input:讀入并清除接收緩沖區(qū)的字符。</p><p> InBufferCount:返回接收緩沖區(qū)已接收的字符數,通過置0可清初接受緩沖區(qū)。</p><p> Output:將發(fā)送的字符串或數組寫到
11、發(fā)送緩沖區(qū)。</p><p> InputMode:定義Input屬性獲得數據的方式。</p><p> Rthreshold:設置、返回在通信控件置ComEvRecieve并激發(fā)OnComm事件前要接收的字符數。</p><p> SThreshold:設置、返回在通信控件置ComEvSend并激發(fā)OnComm事件前發(fā)送緩沖區(qū)中的最少字符數。</p&g
12、t;<p><b> 2.3界面設計</b></p><p> 如上圖所示,添加相應的控件。</p><p><b> 2.4主要函數說明</b></p><p> 添加“打開串口”響應函數:</p><p> void CWangfei311Dlg::OnBtnOpen()
13、 </p><p><b> {</b></p><p> // TODO: Add your control notification handler code here</p><p> InitComm();//設置串口。波特率 停止位 端口選擇</p><p> pictureinit();//畫圖界面初
14、始化 畫背景 X、Y軸坐標,標尺</p><p><b> }</b></p><p> MSComm控件相應函數(畫圖、顯示電壓值功能在此事件中)</p><p> void CWangfei311Dlg::OnOnCommMscomm() </p><p><b> {</b></
15、p><p> // TODO: Add your control notification handler code here</p><p> int nEvent;// Mscomm控件的事件序號</p><p><b> int k;</b></p><p> VARIANT m_input;</p>
16、;<p> char *str;</p><p> long temp,tempref;//存儲接收到的2個10位AD值,分別為測量值,參考值</p><p> int Y;//畫圖縱坐標值</p><p> double v;//計算出的電壓值</p><p> CString reslut;</p>
17、<p> CString Ccount;</p><p> CPen pen1;//數據曲線畫筆</p><p> pen1.CreatePen(PS_SOLID,1,RGB(255,255,255));//實線 線寬1 白色</p><p> pDC1->SelectObject(pen1);</p><p>
18、 nEvent = m_Comm.GetCommEvent();//得到事件</p><p> if(nEvent == 2)//只對接收數據事件進行處理</p><p><b> {</b></p><p> k = m_Comm.GetInBufferCount(); // 接收緩沖區(qū)的字符數目</p><p>
19、; if(k > 0) //若得到接收數據</p><p><b> {</b></p><p> m_input = m_Comm.GetInput();</p><p> str = (char*)(unsigned char*)m_input.parray->pvData;</p><p
20、><b> }</b></p><p> if(*str =='A' && *(str+5) == 'z')//開始字符和停止字符的檢測</p><p><b> {</b></p><p> tempref = (*(str+1))*256+*(str+2);
21、</p><p> temp = (*(str+3))*256+*(str+4);</p><p> v = double(2.5*temp/tempref);</p><p> Y = int (300-60*v);</p><p> if(Y<0) Y =0;//防止畫出界限</p><p> if
22、(Y>300) Y = 300; //防止畫出界限</p><p> reslut.Format("%f",v);</p><p> reslut.TrimLeft();</p><p> CWnd *pWnddata = GetDlgItem(IDC_RECDATA);</p><p> pWndda
23、ta->SetWindowText(reslut);//在靜態(tài)文本框中顯示電壓值</p><p> pDC->LineTo(X,Y);//畫線</p><p><b> X+=5;</b></p><p> count++;//接收數據個數值加1</p><p> Ccount.Format(&quo
24、t;%16d",count);</p><p> Ccount.TrimLeft();</p><p> CWnd *pWndcount = GetDlgItem(IDC_COUNT);</p><p> pWndcount->SetWindowText(Ccount);</p><p> if(X>500)//
25、若畫到X軸最右邊</p><p><b> {X=10;</b></p><p> pictureinit();//清除之前畫的圖</p><p> pDC1->MoveTo(10,Y);//平移起始點到最左端</p><p><b> }</b></p><p&
26、gt;<b> }</b></p><p> Else//若沒有通過校驗,顯示“NO Data”</p><p><b> {</b></p><p> CWnd *pWnddata = GetDlgItem(IDC_RECDATA);</p><p> pWnddata->SetW
27、indowText("NO Data");</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> 三.系統測試(最終測試的是2.5V標準電壓)</p><
28、;p> 附錄一:單片機程序代碼</p><p> //rs232.c源文件代碼:</p><p> #include<reg51.h></p><p> #include"RS232.h"</p><p> #include<intrins.h></p><p&g
29、t; /*++++++++++++++++RS232 mode+++++++++++++++++++++++*/</p><p> //***************************************************</p><p> //***************************************************</p>
30、<p> void delayus(uchar count)</p><p><b> {</b></p><p><b> uint i;</b></p><p><b> uchar j;</b></p><p> for(j=0;j<count
31、;j++)</p><p> for(i=0;i<10;i++);</p><p><b> }</b></p><p> //波特率設置初始化//</p><p> void rs232_init() </p><p> { TMOD=0x20;</p>
32、<p> TL1=0xFD; //9600比特/秒 for 11.0592M </p><p><b> TH1=0xFD;</b></p><p> PCON=0x00;</p><p><b> TR1=1;</b></p><p> SCON=0x50;</
33、p><p> ES=1;//允許串行口中斷 </p><p> EA=1;//開總中斷 </p><p><b> }</b></p><p><b> //發(fā)送字符//</b></p><p> void send(uchar i)</p><
34、;p><b> { </b></p><p><b> SBUF=i;</b></p><p> while(!TI);</p><p><b> TI=0;</b></p><p><b> }</b></p><
35、p> void rs232_isr() interrupt 4 using 1</p><p><b> {</b></p><p><b> if(RI)</b></p><p><b> {</b></p><p> rbuf = SBUF;</p&g
36、t;<p><b> RI = 0;</b></p><p><b> }</b></p><p> if(rbuf == 0xF0) start=0;</p><p> if(rbuf == 0x80) start=1;</p><p> /*===============
37、============================================*/</p><p> //main.c源代碼</p><p> #include<reg51.h></p><p> #include<intrins.h> </p><p> #include "rs232.h
38、"</p><p> #define uchar unsigned char </p><p> #define uint unsigned int </p><p> sfr P1M0=0x91;</p><p> sfr P1M1 =0x92;</p><p> sfr ADC_CONTR =0
39、XC5;</p><p> sfr AUXR = 0x8e;</p><p> sfr ADC_DATA =0xC6;</p><p> sfr ADC_LOW =0xBE;</p><p> uchar rbuf;</p><p> uchar start;</p><p><
40、b> uint V;</b></p><p> uint Vref;</p><p> delay(uchar count)</p><p><b> {</b></p><p> uchar m,n;</p><p> for(m=0;m<=count;m++
41、)</p><p> for(n=0;n<240;n++);</p><p><b> }</b></p><p> /*ADC初始化*/</p><p> void adc_init()</p><p><b> {</b></p>&l
42、t;p> P1M0=0xff;</p><p> P1M1=0x00;</p><p> ADC_DATA = 0; //數據清零</p><p> ADC_LOW = 0;</p><p> ADC_CONTR = 0xe0; //開ADC電源,采集速度選擇最高</p><p> delay(20
43、0);</p><p><b> }</b></p><p> void get_adc(uchar ch)</p><p><b> {</b></p><p> ADC_CONTR = (0xe8 | ch);//開啟轉換</p><p> while(!(A
44、DC_CONTR&0x10));// 等待轉換完成</p><p> ADC_CONTR&=0xe7;//清除start,flag標志</p><p><b> }</b></p><p> void main()</p><p><b> {</b></p>
45、;<p> rs232_init();</p><p> adc_init();</p><p><b> while(1)</b></p><p><b> {</b></p><p> get_adc(0x00);//通道0 參考</p><p>
46、; Vref = (uint)((ADC_DATA<<2)|ADC_LOW);</p><p> get_adc(0x01);</p><p> V = (uint)((ADC_DATA<<2)|ADC_LOW);</p><p> send('A');</p><p> //send(
47、9;A');</p><p> send(Vref>>8);</p><p> send(Vref);</p><p> send(V>>8);</p><p><b> send(V);</b></p><p> send('z');&l
48、t;/p><p> delay(250);</p><p> delay(250);</p><p> delay(250);</p><p> delay(250);</p><p> delay(250);</p><p><b> }</b></p>
49、;<p><b> }</b></p><p> 附錄二:VC程序代碼</p><p><b> 定義的成員變量:</b></p><p><b> public:</b></p><p><b> int X;</b></p
50、><p> CDC* pDC1;</p><p> int m_BaundRate;</p><p> int count;</p><p> CWnd* pWndpicture;</p><p> void pictureinit(void);</p><p><b> CD
51、C* pDC;</b></p><p> int m_port;</p><p> CWangfei311Dlg(CWnd* pParent = NULL);// standard constructor</p><p> void InitComm();</p><p><b> 添加的成員函數:</b
52、></p><p> void CWangfei311Dlg::InitComm()</p><p><b> {</b></p><p> m_Comm.SetCommPort(m_port);</p><p> m_Comm.SetInputMode(1);</p><p>
53、 if(m_BaundRate == 1200)</p><p> m_Comm.SetSettings("1200,n,8,1");</p><p> else if(m_BaundRate == 2400)</p><p> m_Comm.SetSettings("2400,n,8,1");</p>&
54、lt;p> else if(m_BaundRate == 4800)</p><p> m_Comm.SetSettings("4800,n,8,1");</p><p> else if(m_BaundRate == 9600)</p><p> m_Comm.SetSettings("19600,n,8,1"
55、);</p><p> else if(m_BaundRate == 19200)</p><p> m_Comm.SetSettings("19200,n,8,1");</p><p> else if(m_BaundRate == 28800)</p><p> m_Comm.SetSettings("
56、;28800,n,8,1");</p><p> else if(m_BaundRate == 38400)</p><p> m_Comm.SetSettings("38400,n,8,1");</p><p> else if(m_BaundRate == 57600)</p><p> m_Comm
57、.SetSettings("57600,n,8,1");</p><p> else if(m_BaundRate == 115200)</p><p> m_Comm.SetSettings("115200,n,8,1");</p><p> m_Comm.SetRThreshold(1);</p>
58、<p> m_Comm.SetInBufferSize(1024);</p><p> m_Comm.SetOutBufferSize(1024);</p><p> m_Comm.SetInBufferCount(0);</p><p> if(!m_Comm.GetPortOpen())</p><p><b&
59、gt; {</b></p><p> m_Comm.SetPortOpen(TRUE);</p><p><b> }</b></p><p><b> }</b></p><p> void CWangfei311Dlg::OnBtnOpen() </p>&l
60、t;p><b> {</b></p><p> // TODO: Add your control notification handler code here</p><p> InitComm();</p><p> pictureinit();</p><p><b> }</b&g
61、t;</p><p> void CWangfei311Dlg::OnBtnClose() </p><p><b> {</b></p><p> // TODO: Add your control notification handler code here</p><p> if( m_Comm.GetPo
62、rtOpen() )</p><p><b> {</b></p><p> m_Comm.SetPortOpen(0);</p><p><b> }</b></p><p><b> }</b></p><p> void CWangfei
63、311Dlg::OnOnCommMscomm() </p><p><b> {</b></p><p> // TODO: Add your control notification handler code here</p><p> int nEvent;</p><p><b> int k;&
64、lt;/b></p><p> VARIANT m_input;</p><p> char *str;</p><p> long temp,tempref;</p><p><b> int Y;</b></p><p> double v;</p><p
65、> static int i=10;</p><p> CString reslut;</p><p> CString Ccount;</p><p> CPen pen1;</p><p> pen1.CreatePen(PS_SOLID,1,RGB(255,255,255));</p><p>
66、 pDC1->SelectObject(pen1);</p><p> nEvent = m_Comm.GetCommEvent();</p><p> if(nEvent == 2)</p><p><b> {</b></p><p> k = m_Comm.GetInBufferCount();
67、</p><p><b> if(k > 0)</b></p><p><b> {</b></p><p> m_input = m_Comm.GetInput();</p><p> str = (char*)(unsigned char*)m_input.parray-&
68、gt;pvData;</p><p><b> }</b></p><p> if(*str =='A' && *(str+5) == 'z')</p><p><b> {</b></p><p> tempref = (*(str+1
69、))*256+*(str+2);</p><p> temp = (*(str+3))*256+*(str+4);</p><p> v = double(2.5*temp/tempref);</p><p> Y = int (300-60*v);</p><p> if(Y<0) Y =0;</p><p
70、> if(Y>300) Y = 300;</p><p> reslut.Format("%f",v);</p><p> reslut.TrimLeft();</p><p> CWnd *pWnddata = GetDlgItem(IDC_RECDATA);</p><p> pWnddata-&
71、gt;SetWindowText(reslut);</p><p> pDC->LineTo(X,Y);</p><p><b> X+=5;</b></p><p><b> count++;</b></p><p> Ccount.Format("%16d",
72、count);</p><p> Ccount.TrimLeft();</p><p> CWnd *pWndcount = GetDlgItem(IDC_COUNT);</p><p> pWndcount->SetWindowText(Ccount);</p><p><b> if(X>500)</b
73、></p><p><b> {</b></p><p><b> X=10;</b></p><p> pictureinit();</p><p> pDC1->MoveTo(10,Y);</p><p><b> }</b>&
74、lt;/p><p><b> }</b></p><p><b> else</b></p><p> {CWnd *pWnddata = GetDlgItem(IDC_RECDATA);</p><p> pWnddata->SetWindowText("NO Data&quo
75、t;);</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void CWangfei311Dlg::OnSelchangeCombo1() </p><p>&l
76、t;b> {</b></p><p> // TODO: Add your control notification handler code here</p><p> m_port = m_Comboboxsel.GetCurSel()+1;</p><p><b> }</b></p><p&
77、gt; void CWangfei311Dlg::pictureinit()</p><p><b> {</b></p><p> pWndpicture = GetDlgItem(IDC_PICTURE);</p><p> pDC = pWndpicture->GetDC();</p><p> p
78、DC1 = pDC;</p><p><b> CPen pen;</b></p><p> pen.CreatePen(PS_SOLID,1,RGB(255,0,0));</p><p> pDC->SelectObject(pen);</p><p> CRgn pRgn;</p><
79、;p> CBrush pBrush;</p><p> pRgn.CreateRectRgn(0,0,510,310);</p><p> pBrush.CreateSolidBrush(RGB(0,0,0));</p><p> pDC->FillRgn(&pRgn,&pBrush);</p><p>
80、 pDC->MoveTo(10,300);</p><p> pDC->LineTo(500,300);</p><p> pDC->LineTo(490,290);</p><p> pDC->MoveTo(500,300);</p><p> pDC->LineTo(490,310);</p&g
81、t;<p> pDC->MoveTo(10,300);</p><p> pDC->LineTo(10,10);</p><p> pDC->LineTo(0,20);</p><p> pDC->MoveTo(10,10);</p><p> pDC->LineTo(20,20);<
82、;/p><p> pDC->TextOut(0,300,"0");</p><p> pDC->TextOut(0,240,"1");</p><p> pDC->TextOut(0,180,"2");</p><p> pDC->TextOut(0,12
83、0,"3");</p><p> pDC->TextOut(0,60,"4");</p><p> pDC->TextOut(0,0,"5");</p><p> pDC->MoveTo(10,300);</p><p> pDC->LineTo(50
84、0,300);</p><p> pDC->MoveTo(10,240);</p><p> pDC->LineTo(500,240);</p><p> pDC->MoveTo(10,180);</p><p> pDC->LineTo(500,180);</p><p> pDC-
85、>MoveTo(10,120);</p><p> pDC->LineTo(500,120);</p><p> pDC->MoveTo(10,60);</p><p> pDC->LineTo(500,60);</p><p> pDC1->MoveTo(10,300);</p><
86、p><b> }</b></p><p> void CWangfei311Dlg::OnBtnClearcount() </p><p><b> {</b></p><p> // TODO: Add your control notification handler code here</p>
87、;<p> count = 0;</p><p> CString Ccount;</p><p> Ccount.Format("%16d",count);</p><p> Ccount.TrimLeft();</p><p> CWnd *pWndcount = GetDlgItem(IDC_
88、COUNT);</p><p> pWndcount->SetWindowText(Ccount);</p><p><b> }</b></p><p> void CWangfei311Dlg::OnSelchangeCombo2() </p><p><b> {</b><
89、/p><p> // TODO: Add your control notification handler code here</p><p> unsigned long i;</p><p> i = m_Comboboxbtl.GetCurSel();</p><p> if(i == 0)</p><p>
90、; m_BaundRate = 1200;</p><p> else if(i == 1)</p><p> m_BaundRate = 2400;</p><p> else if(i == 2)</p><p> m_BaundRate = 4800;</p><p> else if(i == 3)
91、</p><p> m_BaundRate = 9600;</p><p> else if(i == 4)</p><p> m_BaundRate = 19200;</p><p> else if(i == 5)</p><p> m_BaundRate = 28800;</p><
92、p> else if(i == 6)</p><p> m_BaundRate = 38400;</p><p> else if(i == 7)</p><p> m_BaundRate = 57600;</p><p> else if(i == 8)</p><p> m_BaundRate =
93、 115200;</p><p><b> else</b></p><p> m_BaundRate = 19200;</p><p><b> }</b></p><p> void CWangfei311Dlg::OnBtnClearpicture() </p><
94、p><b> {</b></p><p> // TODO: Add your control notification handler code here</p><p> pictureinit();</p><p><b> X = 10;</b></p><p><b&g
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- rs232串口通信詳解
- RS232串口程序.rar
- RS232串口程序.rar
- RS232串口程序.rar
- RS232串口程序.rar
- rs232串口通信協議
- 投影機rs232串口碼匯總
- rs232串聯接口的通訊程序設計
- 基于fpga的rs-232串口通訊邏輯設計
- 基于RS232串口的數控機床程序傳輸及狀態(tài)監(jiān)控系統的研究.pdf
- RS232接口芯片的IC設計.pdf
- 機電接口技術課程設計
- 微機接口技術課程設計
- 微機接口技術課程設計
- 接口技術課程設計--病房呼叫系統
- 微機原理與接口技術課程設計---字符串程序設計
- 微機原理與接口技術課程設計
- 微機原理與接口技術課程設計
- 微機原理與接口技術課程設計.
- 單片機原理與接口技術課程設計--溫度采集顯示系統
評論
0/150
提交評論