




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、湖北轻工职业技术学院 接口技术 课程设计报告 基于RS232串口的 数据采集系统设计与实现 姓名:何松 班级: 06 电信 1 班 一系统结构: 设计思路: 本课程设计通过使用带有 AD的单片机STC12C5616AD进行实时的 AD采样,并将采样到的值通过 RS232串口传输到PC机,由VC上 位机接收,显示当前的电压值,并描绘电压变化实时波形。 系统框图: 二.系统设计: (一)硬件电路设计: 硬件部分由STC12C5416AD和晶振构成的单片机最小电路和 MAX232构成的电平转换电路用于和 PC机串口进行电压匹配。 电路原理图如下: 工 030 vcc ONI TiOUT RjniT
2、TIM TlCrtJT TUX 12IN HEOUT 4 8 LOuf -y I 5TC12C J 丁一-1丿-i-rrr H Pll ; P2J 豳TF!?i,AlXr, 思那林4誉込飞 TXDra.P1J.!AlX?A WAL2 Pi.扣ADC XATjU_L Fl. VADO INTDTO.lPLiMTl JXTlTRi ri.LADC Pl.OMKlQ mjm KLSPIS (二)软件电路设计: (1)单片机C51程序设计 1.1设计思路 C51程序由RS232串口发送程序和 AD采样程序组成。AD采 样采用查询方式,为了提高采样的进度,我们应用的 2.5V的参考电 压,但是由于此单片
3、机没有直接的参考电压输入端,不能直接输入 参考电压。基于电源电压 VCC瞬间变换不大,因此我做了变通的方 法。每次测量时,先测量2.5V参考电压,得到10位参考AD值 ref,再采集需要测量的通道的电压值,得到另一个10位AD值 Vad,那么所测电压的计算公式就是:V=2.5*(Vad/ref)。 考虑到51单片机进行乘法、除法指令时速度较慢,故将10位 ref,Vad直接传输到PC机,由上位机VC软件进行处理。 考虑到数据传输时可能会出现错位,缺少数据等情况,导致最 终显示的电压值错误。因此在单片机传输有效数据的时候,加上了 起始字符和结束字符用于尽量减少错误。 1.2软件流程图 1.3程序
4、代码 见附录 (2) VC 程序设计 2.1 设计思路 VC上位机以Microsoft提供的MSCom控件来与单片机的串口进行 通信,获取采集数据。程序将接收到的数据放入缓冲区,经过起始 字符和结束字符校验后的数据被处理计算成实际的电压值05V,并 显示在静态文本框控件中。同时,当每次接收到一个有效数据时, 调用CDC类的成员函数LintTo ()。画出数据连续的曲线。 2.2 MSComn控 件介绍 Microsoft提供的用于串口操作的控件 MSCom共有27个属性。 CommPort设置并返回通信口号,缺省值为 COM。 Settings: 设置并返回波特率、奇偶校验、数据位、停止位的字
5、 符串。其中波特率的范围为 300b/s 19200b/s 。 PortOpe n:设置并返回通信口的状态,同时用来打开和关闭通信 口。 InputLen :决定每次 Input 读入的字符个数,缺省为 0,表示读 取接收缓冲区的全部内容。 Input :读入并清除接收缓冲区的字符。 InBufferCount :返回接收缓冲区已接收的字符数,通过置0可 清初接受缓冲区。 Output:将发送的字符串或数组写到发送缓冲区。 In putMode :定义In put属性获得数据的方式。 Rthreshold :设置、返回在通信控件置 ComEvRecieve并激发 On Com事件前要接收的字符
6、数。 SThreshold:设置、返回在通信控件置 ComEvSend并激发 On Comm事件前发送缓冲区中的最少字符数。 2.3界面设计 如上图所示,添加相应的控件 2.4主要函数说明 添加“打开串口”响应函数: void CWan gfei311Dlg:O nBtn Ope n() / TODO: Add your con trol no tificati on han dler code here InitComm()。设置串口。波特率 停止位端口选择 pictureinit() 。/画图界面初始化 画背景 X、 Y 轴坐标,标尺 MSComm 控件相应函数(画图、显示电压值功能在此事
7、件中) void CWangfei311Dlg:OnOnCommMscomm() / TODO: Add your control notification handler code here int 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。 /数据曲
8、线画笔 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 。
9、 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_RECDA TA) 。 pWnddata-SetWindowText(res
10、lut) 。 /在静态文本框中显示电压值 pDC-LineTo(X,Y) 。 /画线 X+=5 。 count+。 /接收数据个数值加 1 Ccount.Format(%16d,count)。 Ccount.TrimLeft()。 CWnd *pWndcou nt = GetDlgltem(IDC_COUNT) 。 pWndcount-SetWindowText(Ccount)。 if(X500)若画到X轴最右边 X=10。 pictureinit()。清除之前画的图 pDC1-MoveTo(10,Y)。/平移起始点到最左端 Else/若没有通过校验, 显示“ NO Data” CWnd *p
11、Wnddata = GetDlgltem(IDC_RECDA TA)。 pWnddata-SetWindowText(NO Data)。 .系统测试(最终测试的是2.5V标准电压) 当前电压:2,500000 串口设置 附录一:单片机程序代码 /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 rs23
12、2_init() TMOD=0 x20 。 TL1=0 xFD。/9600比特/秒 for 11.0592M TH1=0 xFD 。 PCON=0 x00 。 TR1=1。 SCON=0 x50 。 ES=1。 /允许串行口中断 EA=1 。 /开总中断 /发送字符 / void send(uchar i) SBUF=i 。 while(!TI) 。 TI=0。 void rs232_isr() interrupt 4 using 1 if(RI) rbuf = SBUF 。 RI = 0 。 if(rbuf = 0 xF0) start=0 。 if(rbuf = 0 x80) start=
13、1 。 /*=*/ /main.c 源代码 #include #include #include rs232.h #define uchar unsigned char #define uint unsigned int sfr P1M0=0 x91 。 sfr P1M1 =0 x92 。 sfr ADC_CONTR =0XC5 。 sfr AUXR = 0 x8e 。 sfr ADC_DATA =0 xC6 。 sfr ADC_LOW =0 xBE 。 uchar rbuf 。 uchar start。 uint V 。 uint Vref 。 delay(uchar count) ucha
14、r m,n 。 for(m=0。m=count。m+) for(n=0 。 n240。 n+) 。 /*ADC 初始化 */ void adc_init() P1M0=0 xff 。 P1M1=0 x00 。 ADC_DATA = 0 。/数据清零 ADC_LOW = 0 。 ADC_CONTR = 0 xe0 。 / 开 ADC 电源 ,采集速度选择最高 delay(200) 。 void get_adc(uchar ch) ADC_CONTR = (0 xe8 | ch) 。 / 开启转换 while(!(ADC_CONTR&0 x10) 。 / 等待转换完成 ADC_CONTR&=0 x
15、e7 。/清除 start,flag 标志 void main() rs232_init() 。 adc_init() 。 while(1) get_adc(0 x00) 。/通道 0 参考 Vref = (uint)(ADC_DATA2)|ADC_LOW) 。 get_adc(0 x01) 。 V = (uint)(ADC_DA TA8) 。 send(Vref) 。 send(V8) 。 send(V) 。 send(z)。 delay(250) 。 delay(250) 。 delay(250) 。 delay(250) 。 delay(250) 。 附录二:VC程序代码 定义的成员变量
16、: public: int X 。 CDC* pDC1 。 int m_BaundRate 。 int count 。 CWnd* pWndpicture 。 void pictureinit(void) 。 CDC* pDC 。 int m_port 。 / standard constructor CWangfei311Dlg(CWnd* pParent = NULL) 。 void InitComm() 。 添加的成员函数: void CWangfei311Dlg:InitComm() m_Comm.SetCommPort(m_port) 。 m_Comm.SetInputMode(1)
17、 。 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
18、,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.SetInBu
19、fferSize(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 here InitComm() 。 pictureinit() 。 void CWangfei311Dlg:OnBtnClose() / TODO: Add your con
20、trol 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_input 。 char *str 。 long temp,tempref 。 int Y 。 double v 。 static int i=10 。 CString resl
21、ut 。 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
22、) 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_RECDA TA) 。 pWnddata-SetWindowText(reslut) 。 pDC-LineTo(X,Y) 。 X+=5 。 count+。 Ccount.F
23、ormat(%16d,count) 。 Ccount.TrimLeft() 。 CWnd *pWndcount = GetDlgItem(IDC_COUNT) 。 pWndcount-SetWindowText(Ccount) 。 if(X500) X=10。 pictureinit() 。 pDC1-MoveTo(10,Y) 。 else CWnd *pWnddata = GetDlgItem(IDC_RECDA TA) 。 pWnddata-SetWindowText(NO Data) 。 void CWangfei311Dlg:OnSelchangeCombo1() / TODO: Ad
24、d your control notification handler code here m_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
25、。 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-LineT
26、o(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(1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- cdfi技师上岗证考试模拟试题及答案
- 透析患者发生溶血反应的试题及答案
- 2025年建筑信息模型(BIM)在工程项目全过程管理中的项目管理创新与实践案例报告
- 押题宝典高校教师资格证之《高等教育法规》通关考试题库附参考答案详解(a卷)
- 2025至2030年中国美甲行业市场深度评估及投资策略咨询报告
- 2025至2030年中国酱料行业市场全景调研及投资规划建议报告
- 押题宝典执业药师资格证之《西药学专业二》考试题库附参考答案详解【典型题】
- 考点解析-湖北省松滋市7年级上册期末测试卷专项练习试题(解析版)
- 解析卷人教版8年级数学上册《轴对称》同步测评试题(含答案及解析)
- 2025年医药企业存货质押贷款合同模板
- 机械租赁避税方案(3篇)
- 歌词写作教学课件下载
- 2025-2030年中国无人机行业市场深度调研及前景趋势与投资战略研究报告
- 卒中相关性肺炎的护理
- 2025-2030年中国动力耳鼻喉科手术器械行业市场现状供需分析及投资评估规划分析研究报告
- 2025年重庆市中考化学试卷真题(含标准答案)
- 生产车间新员工入职培训
- 社会化服务项目方案投标文件技术方案
- 电石中控岗位操作规程
- 如何清洁头皮可促进头发生长
- 班主任安全管理培训
评论
0/150
提交评论