版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、湖北轻工职业技术学院接口技术 课程设计报告基于 RS232串口的数据采集系统设计与实现姓名:何松班级: 06电信 1班一系统结构:设计思路 :本课程设计通过使用带有 AD 的单片机 STC12C5616AD 进行实时的 AD 采样,并将采样到的值通过 RS232串口传输到 PC 机,由 VC 上位机接收,显示当前的电压值,并描绘电压变化实时波形。系统框图 :单片机系统电平转换PC 机参考电压信号输入通道二. 系统设计:(一) 硬件电路设计:硬件部分由 STC12C5416AD 和晶振构成的单片机最小电路和 MAX232 构成的电平转换电路用于和 PC机串口进行电压匹配。电路原理图如下:(二)软
2、件电路设计:(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
3、机,由上位机VC 软件进行处理。考虑到数据传输时可能会出现错位,缺少数据等情况,导致最终显示的电压值错误。因此在单片机传输有效数据的时候,加上了起始字符和结束字符用于尽量减少错误。1.2 软件流程图初始化采集 2.5V 参考电压AD 值采集测量通道电压AD 值发送起始字符“A ”发送参考值高位发送参考值低位发送测量值高位发送测量值低位发送停止字符“z”1.3 程序代码见附录一。(2) VC 程序设计2.1 设计思路VC 上位机以 Microsoft提供的 MSComm控件来与单片机的串口进行通信,获取采集数据。程序将接收到的数据放入缓冲区,经过起始字符和结束字符校验后的数据被处理计算成实际的电
4、压值05V,并显示在静态文本框控件中。同时,当每次接收到一个有效数据时,调用 CDC类的成员函数 LintTo ()。画出数据连续的曲线。2.2 MSComm控件介绍Microsoft提供的用于串口操作的控件MSComm共有 27 个属性。CommPort:设置并返回通信口号,缺省值为COM1。Settings:设置并返回波特率、奇偶校验、数据位、停止位的字符串。其中波特率的范围为300b/s 19200b/s 。PortOpen:设置并返回通信口的状态,同时用来打开和关闭通信口。InputLen :决定每次 Input 读入的字符个数,缺省为0,表示读取接收缓冲区的全部内容。Input :读
5、入并清除接收缓冲区的字符。InBufferCount :返回接收缓冲区已接收的字符数,通过置0 可清初接受缓冲区。Output :将发送的字符串或数组写到发送缓冲区。InputMode :定义 Input属性获得数据的方式。Rthreshold :设置、返回在通信控件置ComEvRecieve并激发OnComm事件前要接收的字符数。SThreshold:设置、返回在通信控件置ComEvSend并激发OnComm 事件前发送缓冲区中的最少字符数。2.3 界面设计如上图所示,添加相应的控件。2.4 主要函数说明添加“打开串口”响应函数:void CWangfei311Dlg:OnBtnOpen()
6、/ TODO: Add your control notification handler code here InitComm() 。/设置串口。波特率 停止位 端口选择pictureinit() 。/画图界面初始化画背景 X 、 Y 轴坐标,标尺MSComm 控件相应函数(画图、显示电压值功能在此事件中)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。 / 数据曲线画笔pen1.CreatePen(PS_SOLID,1,RGB(255,255,255) 。 /实线 线宽 1 白色 pDC1->SelectObject(pen1) 。nEvent = m_Comm.GetCommEvent() 。 / 得到事件if(nEvent = 2)/ 只对接收数据事件进行处理k = m_C
8、omm.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)。
9、Y = int (300-60*v) 。if(Y<0) Y =0 。 /防止画出界限if(Y>300) Y = 300 。 / 防止画出界限reslut.Format("%f",v) 。reslut.TrimLeft() 。CWnd *pWnddata = GetDlgItem(IDC_RECDA TA) 。 pWnddata->SetWindowText(reslut) 。 /在静态文本框中显示电压值pDC->LineTo(X,Y) 。 /画线X+=5 。count+ 。 / 接收数据个数值加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")。三. 系统测试 (最终测试的是 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 。 / 开总中断/发送字符 /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 。/数据清零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() 。添加的成员函数: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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 河北省衡水市衡水中学实验学校2024-2025学年八年级上学期期中考试地理试卷
- 客服对接计划方案
- 2024-2025学年江苏省南京市玄武区科利华中学七年级(上)第一次月考数学试卷(含答案)
- 2010年3月3日深圳市边检面试真题
- 浙江公务员面试模拟44
- 人工智能公司经营手册
- 核心素养视域下小学数学作业的设计与实施
- 关于成立人工智能公司创业计划书
- 内蒙古行政职业能力模拟88
- 职业技术学院《数控加工及编程》课程标准
- 北京市房山区2023-2024学年高二上学期期中地理试题 含解析
- 2024至2030年中国高岭土产业转移研究与目标企业分析咨询报告
- 中国骨关节炎诊疗指南(2024版)
- 2024年妇产科医生个人工作述职报告样本(3篇)
- 2024年第一季度压力性损伤质控工作总结分析
- 2024年湖北机场集团限公司楚天启航“A”春季校园招聘35人(高频重点提升专题训练)共500题附带答案详解
- 广东能源集团节能降碳有限公司招聘笔试题库2024
- 2024年秋季新改版教科版三年级上册科学全册核心素养目标教案教学设计
- 2024广东深圳市优才人力资源限公司招聘14人(派遣至园山街道)(高频重点复习提升训练)共500题附带答案详解
- DL∕T 1835-2018 燃气轮机及联合循环机组启动调试导则
- 玩具跌落测试指引
评论
0/150
提交评论