欢迎来到装配图网! | 帮助中心 装配图网zhuangpeitu.com!
装配图网
ImageVerifierCode 换一换
首页 装配图网 > 资源分类 > DOC文档下载
 

使用串行接口的数据采集系统的设计与实现

  • 资源ID:71603401       资源大小:280.50KB        全文页数:16页
  • 资源格式: DOC        下载积分:20积分
快捷下载 游客一键下载
会员登录下载
微信登录下载
三方登录下载: 微信开放平台登录 支付宝登录   QQ登录   微博登录  
二维码
微信扫一扫登录
下载资源需要20积分
邮箱/手机:
温馨提示:
用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
支付方式: 支付宝    微信支付   
验证码:   换一换

 
账号:
密码:
验证码:   换一换
  忘记密码?
    
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

使用串行接口的数据采集系统的设计与实现

. . . . 使用串行接口的数据采集系 统的设计与实现一:设计任务与要求1. 连接单片机基本电路,检查电路,直到测量出晶振有振荡波形。2. 连接串口芯片MAX232C,使用STC编程软件,可以测量到芯片存在。3. 编写基本的串口测试实验,可以将串口数据传输到PC机。4. 连接TL431,用电压表测量输出电压为2.5V,给单片机芯片作为参考电压。5. 编写AD读取程序,将AD读取的测量值通过串口传输到PC机,验证其正确性。在输入端加入不同的直流电压,调节程序在屏幕上显示的正确的直流电压值。6. 在AD端加入低频正弦/脉冲/三角信号,在屏幕上正确的波形。7. 采用合适的方法,能够准确测量输入信号的时间参数。二:系统设计单片机采用串口编程的STC5616AD单片机,根据其技术文档,做出单片机最小系统。同时焊接TL431使其输出电压为2.5V作为基准电压。再把采样的数据发送给PC。其系统框图为: 单 片 机PC信号TL431Max2322.5V基准电压三:数据采集具体原理图: 此程序由RS232串口发送程序和AD采样程序组成。AD采样采用查询方式,为了提高采样的进度,我们应用的2.5V的参考电压,但是由于此单片机没有直接的参考电压输入端,不能直接输入参考电压。所以每次测量时,先测量2.5V参考电压,得到10位参考AD值ref,再采集需要测量的通道的电压值,得到另一个10位AD值Vad,那么所测电压的计算公式就是:V=2.5*(Vad/ref)。具体AD,串口发送 程序:#include<STC12C5620AD.H>typedef unsigned char INT8U;typedef unsigned int INT16U;#define AD_SPEED 0x00/最低采样速率void delay(INT8U delay_time) / 延时函数 INT16U n; while(delay_time-) n = 6000; while(-n); INT16U get_AD_result(INT8U channel) ADC_DATA = 0; channel &= 0x07; /0000,0111 清0高5位 ADC_CONTR = AD_SPEED; ADC_CONTR = 0xE0; /1110,0000 清 ADC_FLAG, ADC_START 位和低 3 位 ADC_CONTR |= channel; /选择 A/D 当前通道 delay(1); /使输入电压达到稳定 ADC_CONTR |= 0x08; /0000,1000 令 ADCS = 1, 启动A/D转换kaishizhuanhuan, while (1) /等待A/D转换结束 if (ADC_CONTR & 0x10) /0001,0000 测试A/D转flag=1 zhuanhuanwancheng 换结束否 break; ADC_CONTR &= 0xe7; /1110,0111 清 ADC_FLAG 位, 关闭A/D转换, qingchu FLAG return (ADC_DATA<<8 | ADC_LOW2); /返回 A/D 10 位转返回fanhui 10 bit换结果void initiate_RS232 (void) / 串口初始化 ES = 0; / 禁止串口中断 TMOD = 0x20; / 设置 T1 为波特率发生器 SCON = 0x50; / 0101,0000 8位数据位, 无奇偶校验 TH1 = TL1 =-(22118400/12/32/9600); /botelv gaodiweishezhi RI = 0; TR1 = 1; ES = 1; / 允许串口中断void Send_Byte(INT8U one_byte) / 发送一个字节 TI = 0; / 清零串口发送中断标志 SBUF = one_byte; /fasongshuju while (!TI); TI = 0; / 清零串口发送中断标志void main() INT16U ADC_10bit,ADC_REF; initiate_RS232(); /波特率 = 9600 botelv ADC_CONTR |= 0x80; /1000,0000 打开 A/D dakaiAD转换电源 while(1) ADC_REF=get_AD_result(6);delay(0x1); ADC_10bit = get_AD_result(0); Send_Byte(ADC_REF>>8);Send_Byte(ADC_REF<<6);Send_Byte(ADC_10bit>>8);Send_Byte(ADC_10bit<<6); delay(0x30); /延时 STC12C56AD.H程序:/* sfr AUXR = 0x8e; */* sfr IPH = 0xb7; */* Watchdog Timer Register */sfr WDT_CONTR = 0xe1; /* ISP_IAP_EEPROM Register */sfr ISP_DATA = 0xe2;sfr ISP_ADDRH = 0xe3;sfr ISP_ADDRL = 0xe4;sfr ISP_CMD = 0xe5;sfr ISP_TRIG = 0xe6;sfr ISP_CONTR = 0xe7;/* System Clock Divider */sfr CLK_DIV = 0xc7;/* I_O Port Mode Set Register */sfr P0M0 = 0x93;sfr P0M1 = 0x94;sfr P1M0 = 0x91;sfr P1M1 = 0x92;sfr P2M0 = 0x95;sfr P2M1 = 0x96;sfr P3M0 = 0xb1;sfr P3M1 = 0xb2;/* SPI Register */sfr SPSTAT = 0x84;sfr SPCTL = 0x85;sfr SPDAT = 0x86;/* ADC Register */sfr ADC_CONTR = 0xc5;sfr ADC_DATA = 0xc6;sfr ADC_LOW2 = 0xbe;/* PCA SFR */sfr CCON = 0xD8;sfr CMOD = 0xD9;sfr CCAPM0 = 0xDA;sfr CCAPM1 = 0xDB;sfr CCAPM2 = 0xDC;sfr CCAPM3 = 0xDD;sfr CCAPM4 = 0xDE;sfr CCAPM5 = 0xDF;sfr CL = 0xE9;sfr CCAP0L = 0xEA;sfr CCAP1L = 0xEB;sfr CCAP2L = 0xEC;sfr CCAP3L = 0xED;sfr CCAP4L = 0xEE;sfr CCAP5L = 0xEF;sfr CH = 0xF9;sfr CCAP0H = 0xFA;sfr CCAP1H = 0xFB;sfr CCAP2H = 0xFC;sfr CCAP3H = 0xFD;sfr CCAP4H = 0xFE;sfr CCAP5H = 0xFF;sfr PCA_PWM0 = 0xF2;sfr PCA_PWM1 = 0xF3;sfr PCA_PWM2 = 0xF4;sfr PCA_PWM3 = 0xF5;sfr PCA_PWM4 = 0xF6;sfr PCA_PWM5 = 0xF7;/* CCON */sbit CF = CCON7;sbit CR = CCON6;sbit CCF5 = CCON5;sbit CCF4 = CCON4;sbit CCF3 = CCON3;sbit CCF2 = CCON2;sbit CCF1 = CCON1;sbit CCF0 = CCON0;/* Above is STC additional SFR or change */*-REG51F.HHeader file for 8xC31/51, 80C51Fx, 80C51Rx+Copyright (c) 1988-1999 Keil Elektronik GmbH and Keil Software, Inc.All rights reserved.Modification according to DataSheet from April 1999 - SFR's AUXR and AUXR1 added for 80C51Rx+ derivatives-*/* BYTE Registers */sfr P0 = 0x80;sfr P1 = 0x90;sfr P2 = 0xA0;sfr P3 = 0xB0;sfr PSW = 0xD0;sfr ACC = 0xE0;sfr B = 0xF0;sfr SP = 0x81;sfr DPL = 0x82;sfr DPH = 0x83;sfr PCON = 0x87;sfr TCON = 0x88;sfr TMOD = 0x89;sfr TL0 = 0x8A;sfr TL1 = 0x8B;sfr TH0 = 0x8C;sfr TH1 = 0x8D;sfr IE = 0xA8;sfr IP = 0xB8;sfr SCON = 0x98;sfr SBUF = 0x99;/* 80C51Fx/Rx Extensions */sfr AUXR = 0x8E;/* sfr AUXR1 = 0xA2; */sfr SADDR = 0xA9;sfr IPH = 0xB7;sfr SADEN = 0xB9;sfr T2CON = 0xC8;sfr T2MOD = 0xC9;sfr RCAP2L = 0xCA;sfr RCAP2H = 0xCB;sfr TL2 = 0xCC;sfr TH2 = 0xCD;/* BIT Registers */* PSW */sbit CY = PSW7;sbit AC = PSW6;sbit F0 = PSW5;sbit RS1 = PSW4;sbit RS0 = PSW3;sbit OV = PSW2;sbit P = PSW0;/* TCON */sbit TF1 = TCON7;sbit TR1 = TCON6;sbit TF0 = TCON5;sbit TR0 = TCON4;sbit IE1 = TCON3;sbit IT1 = TCON2;sbit IE0 = TCON1;sbit IT0 = TCON0;/* P3 */sbit RD = P37;sbit WR = P36;sbit T1 = P35;sbit T0 = P34;sbit INT1 = P33;sbit INT0 = P32;sbit TXD = P31;sbit RXD = P30;/* SCON */sbit SM0 = SCON7; / alternatively "FE"sbit FE = SCON7;sbit SM1 = SCON6;sbit SM2 = SCON5;sbit REN = SCON4;sbit TB8 = SCON3;sbit RB8 = SCON2;sbit TI = SCON1;sbit RI = SCON0;sbit T2EX = P11;sbit T2 = P10;/* T2CON */sbit TF2 = T2CON7;sbit EXF2 = T2CON6;sbit RCLK = T2CON5;sbit TCLK = T2CON4;sbit EXEN2 = T2CON3;sbit TR2 = T2CON2;sbit C_T2 = T2CON1;sbit CP_RL2= T2CON0;/* PCA Pin */sbit CEX3 = P24;sbit CEX2 = P20;sbit CEX1 = P35;sbit CEX0 = P37;sbit ECI = P34;/* IE */sbit EA = IE7;sbit EPCA_LVD = IE6;sbit EADC_SPI = IE5;sbit ES = IE4;sbit ET1 = IE3;sbit EX1 = IE2;sbit ET0 = IE1;sbit EX0 = IE0;/* IP */ sbit PPCA_LVD = IP6;sbit PADC_SPI = IP5; sbit PS = IP4;sbit PT1 = IP3;sbit PX1 = IP2;sbit PT0 = IP1;sbit PX0 = IP0;三:VC串口通信软件微软通过的通信控件MSCOMM虽然只能在同步操作方式下工作,但是程序设计简单,在一些要求不高的应用场合使用较多。在对话框的程序结构中对控件有较好的支持,所需要的代码也比较少,程序结构清楚简洁。本设计将针对对话框方式下的通信控件应用给出具体的程序设计,采用了通信事件映射的方法启动接收数据,接收的数据在控件上显示。同时显示图形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事件前发送缓冲区中的最少字符数。界面设计:具体VC程序:void CADCommDlg:OnOnCommMscomm1() / TODO: Add your control notification handler code hereVARIANT vRecv;CString cs;double vol;unsigned short AD_ref,AD_dest,head;int i;if(m_cMSComm.GetCommEvent()=2) vRecv = m_cMSComm.GetInput(); /读输入缓冲区,获得接收到的容*(char*)(vRecv).parray->pvData+12)=0;for(i=0;i<11;i+)memcpy(&head,(char*)vRecv.parray->pvData+i,2);if(head=0xffff)memcpy(char*)&AD_ref+1,(char*)vRecv.parray->pvData+i+2,1);memcpy(&AD_ref,(char*)vRecv.parray->pvData+i+3,1);memcpy(char*)&AD_dest+1,(char*)vRecv.parray->pvData+i+4,1);memcpy(&AD_dest,(char*)vRecv.parray->pvData+i+5,1);vol=2.5*(double)AD_dest/AD_ref);cs.Format("%1.2fV",vol);m_Vol=vol;SetDlgItemText(IDC_STATIC_RECV,cs);break;bool CADCommDlg:MSCommInit()m_cMSComm.SetCommPort(m_CBN_PORT.GetCurSel()+1); /选择COMif(m_cMSComm.GetPortOpen() /假如串口是打开的,则强行关闭串口 m_cMSComm.SetPortOpen(FALSE); m_cMSComm.SetInBufferSize(1024); /接收缓冲区 m_cMSComm.SetOutBufferSize(1024);/发送缓冲区 m_cMSComm.SetInputLen(0);/设置当前接收区数据长度为0,表示全部读取 m_cMSComm.SetInputMode(1);/以二进制方式读写数据 m_cMSComm.SetRThreshold(12);/接收缓冲区有1个与1个以上字符时,将引发接收数据的OnComm事件 m_cMSComm.SetSettings("57600,n,8,1");/波特率9600无检验位,8个数据位,1个停止位 if(!m_cMSComm.GetPortOpen()/假如串口没有打开则打开 m_cMSComm.SetPortOpen(TRUE);/打开串口 else m_cMSComm.SetOutBufferCount(0);return true;void CADCommDlg:OnBtnOpenCom() / TODO: Add your control notification handler code hereif (!MSCommInit()AfxMessageBox("Init Failed!");elsem_timer=SetTimer(1,100,0);void CADCommDlg:OnBtnCloseCom() / TODO: Add your control notification handler code hereif(m_cMSComm.GetPortOpen()m_cMSComm.SetPortOpen(0);else AfxMessageBox("串口未开");KillTimer(m_timer);void CADCommDlg:OnOK() / TODO: Add extra validation hereif(m_cMSComm.GetPortOpen()m_cMSComm.SetPortOpen(0);KillTimer(m_timer);CDialog:OnOK();void CADCommDlg:DrawDiagram(CPaintDC *pDC)CRect rect;int W,H,x,y;float xinterval,yinterval;CPen curpen,*oldpen;CBrush newbrush,*oldbrush;m_btnView.GetWindowRect(rect);ScreenToClient(rect);rect.top+=15;W=rect.Width();H=rect.Height();xinterval=(float)W/99;yinterval=(float)H/100;newbrush.CreateSolidBrush(RGB(0,0,0);oldbrush=pDC->SelectObject(&newbrush);pDC->Rectangle(rect);newbrush.DeleteObject();pDC->SelectObject(oldbrush);curpen.CreatePen(PS_SOLID,2,RGB(0,255,0);oldpen=pDC->SelectObject(&curpen);pDC->MoveTo(rect.left,rect.bottom);for(int i=0;i<100;i+)x=rect.left+(int)(i*xinterval);y=rect.bottom-(int)(20*m_VolHistoryi*yinterval)-3;pDC->LineTo(x,y);pDC->SelectObject(oldpen);curpen.DeleteObject();void CADCommDlg:OnDestroy() CDialog:OnDestroy();/ TODO: Add your message handler code hereKillTimer(m_timer);void CADCommDlg:OnTimer(UINT nIDEvent) / TODO: Add your message handler code here and/or call defaultdouble per;per=m_Vol;for(int i=0;i<99;i+)m_VolHistoryi=m_VolHistoryi+1;m_VolHistoryi=per;UpdateData(FALSE);Invalidate();CDialog:OnTimer(nIDEvent);CDialog:OnTimer(nIDEvent);四:测试结果 基准电压2.5V显示电源电压显示接地电压显示五:实验小结本次课程设计,我们做的是基于单片机的AD串口采集,并由VC面向对象界面进行电压输出,并显示电压波形。VC与C语言有很大的区别,VC主要是面向对象,基于C,而又不同于C。刚开始的时候编程有一定的难度,在看了一段时间VC+方面的书籍以后,对VC有了一定的了解,开始编程。本次设计的难点就是采样的精度与频率。采样频率不够,在采样高频电压的时候,波形会有明显的失真,精度不够,则会有明显的误差。六:参考书籍C程序设计. 清华大学Visual C+从入门到精通. 清华大学网上资料16 / 16

注意事项

本文(使用串行接口的数据采集系统的设计与实现)为本站会员(x****)主动上传,装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知装配图网(点击联系客服),我们立即给予删除!

温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!