接口技术课程设计.doc_第1页
接口技术课程设计.doc_第2页
接口技术课程设计.doc_第3页
接口技术课程设计.doc_第4页
接口技术课程设计.doc_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

湖北轻工职业技术学院接口技术 课程设计报告基于RS232串口的数据采集系统设计与实现姓 名:何松班 级:06电信1班一系统结构:设计思路:本课程设计通过使用带有AD的单片机STC12C5616AD进行实时的AD采样,并将采样到的值通过RS232串口传输到PC机,由VC上位机接收,显示当前的电压值,并描绘电压变化实时波形。系统框图:单片机系统参考电压信号输入通道电平转换PC机二.系统设计:(一) 硬件电路设计:硬件部分由STC12C5416AD和晶振构成的单片机最小电路和MAX232构成的电平转换电路用于和PC机串口进行电压匹配。电路原理图如下:(二)软件电路设计:(1)单片机C51程序设计1.1设计思路C51程序由RS232串口发送程序和AD采样程序组成。AD采样采用查询方式,为了提高采样的进度,我们应用的2.5V的参考电压,但是由于此单片机没有直接的参考电压输入端,不能直接输入参考电压。基于电源电压VCC瞬间变换不大,因此我做了变通的方法。每次测量时,先测量2.5V参考电压,得到10位参考AD值ref,再采集需要测量的通道的电压值,得到另一个10位AD值Vad,那么所测电压的计算公式就是:V=2.5*(Vad/ref)。考虑到51单片机进行乘法、除法指令时速度较慢,故将10位ref,Vad直接传输到PC机,由上位机VC软件进行处理。考虑到数据传输时可能会出现错位,缺少数据等情况,导致最终显示的电压值错误。因此在单片机传输有效数据的时候,加上了起始字符和结束字符用于尽量减少错误。1.2软件流程图初始化采集2.5V参考电压AD值采集测量通道电压AD值发送起始字符“A”发送参考值高位发送参考值低位发送测量值高位发送测量值低位发送停止字符“z”1.3程序代码见附录一。(2) VC程序设计2.1 设计思路VC上位机以Microsoft提供的MSComm控件来与单片机的串口进行通信,获取采集数据。程序将接收到的数据放入缓冲区,经过起始字符和结束字符校验后的数据被处理计算成实际的电压值05V,并显示在静态文本框控件中。同时,当每次接收到一个有效数据时,调用CDC类的成员函数LintTo()。画出数据连续的曲线。2.2 MSComm控件介绍Microsoft提供的用于串口操作的控件MSComm共有27 个属性。CommPort:设置并返回通信口号,缺省值为COM1。Settings:设置并返回波特率、奇偶校验、数据位、停止位的字符串。其中波特率的范围为300b/s19200b/s。PortOpen:设置并返回通信口的状态,同时用来打开和关闭通信口。InputLen:决定每次Input读入的字符个数,缺省为0,表示读取接收缓冲区的全部内容。Input:读入并清除接收缓冲区的字符。InBufferCount:返回接收缓冲区已接收的字符数,通过置0可清初接受缓冲区。Output:将发送的字符串或数组写到发送缓冲区。InputMode:定义Input属性获得数据的方式。Rthreshold:设置、返回在通信控件置ComEvRecieve并激发OnComm事件前要接收的字符数。SThreshold:设置、返回在通信控件置ComEvSend并激发OnComm事件前发送缓冲区中的最少字符数。2.3界面设计如上图所示,添加相应的控件。2.4主要函数说明添加“打开串口”响应函数:void CWangfei311Dlg:OnBtnOpen() / TODO: Add your control notification handler code hereInitComm();/设置串口。波特率 停止位 端口选择pictureinit();/画图界面初始化 画背景 X、Y轴坐标,标尺MSComm控件相应函数(画图、显示电压值功能在此事件中)void CWangfei311Dlg:OnOnCommMscomm() / TODO: Add your control notification handler code hereint nEvent;/ Mscomm控件的事件序号int k;VARIANT m_input;char *str;long temp,tempref;/存储接收到的2个10位AD值,分别为测量值,参考值int Y;/画图纵坐标值double v;/计算出的电压值CString reslut;CString Ccount;CPen pen1;/数据曲线画笔pen1.CreatePen(PS_SOLID,1,RGB(255,255,255);/实线 线宽1 白色pDC1-SelectObject(pen1); nEvent = m_Comm.GetCommEvent();/得到事件if(nEvent = 2)/只对接收数据事件进行处理k = m_Comm.GetInBufferCount(); / 接收缓冲区的字符数目if(k 0) /若得到接收数据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);Y = int (300-60*v);if(Y300) Y = 300; /防止画出界限reslut.Format(%f,v);reslut.TrimLeft();CWnd *pWnddata = GetDlgItem(IDC_RECDATA);pWnddata-SetWindowText(reslut);/在静态文本框中显示电压值pDC-LineTo(X,Y);/画线X+=5;count+;/接收数据个数值加1Ccount.Format(%16d,count);Ccount.TrimLeft();CWnd *pWndcount = GetDlgItem(IDC_COUNT);pWndcount-SetWindowText(Ccount);if(X500)/若画到X轴最右边X=10;pictureinit();/清除之前画的图pDC1-MoveTo(10,Y);/平移起始点到最左端Else/若没有通过校验,显示“NO Data”CWnd *pWnddata = GetDlgItem(IDC_RECDATA);pWnddata-SetWindowText(NO Data);三.系统测试(最终测试的是2.5V标准电压)附录一:单片机程序代码/rs232.c源文件代码:#include#includeRS232.h#include/*+RS232 mode+*/*/*void delayus(uchar count)uint i;uchar j;for(j=0;jcount;j+)for(i=0;i10;i+);/波特率设置初始化/void rs232_init() TMOD=0x20;TL1=0xFD; /9600比特/秒 for 11.0592M TH1=0xFD;PCON=0x00;TR1=1;SCON=0x50;ES=1;/允许串行口中断 EA=1;/开总中断 /发送字符/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#include #include rs232.h#define uchar unsigned char #define uint unsigned int sfr 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=0;n240;n+);/*ADC初始化*/ void adc_init() P1M0=0xff;P1M1=0x00;ADC_DATA = 0; /数据清零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();adc_init();while(1)get_adc(0x00);/通道0 参考Vref = (uint)(ADC_DATA2)|ADC_LOW);get_adc(0x01);V = (uint)(ADC_DATA8);send(Vref);send(V8);send(V);send(z);delay(250);delay(250);delay(250);delay(250);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();添加的成员函数:void CWangfei311Dlg:InitComm()m_Comm.SetCommPort(m_port);m_Comm.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);else 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_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 handler code hereInitComm();pictureinit();void CWangfei311Dlg:OnBtnClose() / TODO: Add your control notification handler code hereif( m_Comm.GetPortOpen() )m_Comm.SetPortOpen(0);void CWangfei311Dlg:OnOnCommMscomm() / TODO: Add your control notification handler code hereint nEvent;int k;VARIANT m_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();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(Y300) Y = 300;reslut.Format(%f,v);reslut.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(X500)X=10;pictureinit();pDC1-MoveTo(10,Y);elseCWnd *pWnddata = GetDlgItem(IDC_RECDATA);pWnddata-SetWindowText(NO Data);void CWangfei311Dlg:OnSelchangeCombo1() / TODO: Add your control notification handler code herem_port = m_Comboboxsel.GetCurSel()+1;void CWangfei311Dlg:pictureinit()pWndpicture = GetDlgItem(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-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(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-MoveTo(10,60);pDC-LineTo(500,60);pDC1-MoveTo(10,300);void CWangfei311D

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论