欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > DOCX文档下载  

    上、下位机结构的温度控制系统的设计与实现专业.docx

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

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

    上、下位机结构的温度控制系统的设计与实现专业.docx

    电子工程设计报告 第五组 电子工程设计报告题目:上、下位机结构的温度控制系统的设计与实现专业: 通信工程小组: 第五组姓名学号:王胥航 10024120 兰青 10024103指导教师:司农完成日期:2013年03月26日摘要系统设计是以实现系统的总体功能、指标要求为目标的一系列设计工作。以电路系统设计为例,指的是对实现系统的总体功能、指标起决定性作用的核心电路及其外围电路的设计工作。在原有温度控制系统上扩展串行通信接口,在PC机上进行高级语言程序设计,通过有线点对点通信实现温度控制系统的运行管理。单片机负责现场的温度测量与控制执行操作,PC机负责数据处理和控制管理工作,组成典型的上下位机控制系统。目录1.需求分析- 4 -1.1知识背景- 4 -1.2基本要求- 4 -1.2.1功能要求- 4 -1.2.2任务要求- 4 -2.设计方案- 4 -2.1电路设计- 4 -2.1.1芯片选择- 4 -2.1.2电路设计- 5 -2.2 通信协议- 5 -2.2.1 传输协议- 5 -2.2.2命令格式- 5 -2.2.3 操作命令表- 6 -2.3主要工作内容72.4主要难点73.上位机程序设计73.1串口部分程序73.2采集温度部分83.3温度发送部分103.4温度曲线绘制部分114 下位机设计135调试问题分析及解决206心得体会20上、下位机结构的温度控制系统的设计与实现1.需求分析1.1知识背景分布式控制系统是一种自动控制系统组成的典型模式,由上位机和下位机二部分组成。下位机负责现场的信号采集及控制实施工作,上位机负责数据处理和控制管理工作。采用单片机作为下位机,通过点对点通信与上位机组成分布式控制系统是一种低开发成本的分布式控制系统实施方案。UART通用异步收发器,是一种通用的点对点有线通信接口,可以在一定距离上实现二个设备之间以字节为单位的串行数据传输,是组成分布式控制系统的通信手段之一。几乎所有的单片机都内建有UART通信接口,很容易与上位机组成分布式控制系统。1.2基本要求 建立上位机与下位机之间的通信联络,实现串行数据收发功能。 设计PC机操作界面,向下位机发送控制命令、接收下位机回传的现场测控数据。 在下位机原温度控制程序中添加串行通信功能,接收上位机的控制命令,按照上位机命令的要求进行现场温度数据传送与温度控制操作。1.2.1功能要求在单片机与PC机串行通信的基础上实现:温度采集、显示,温度闭环控制。1.2.2任务要求 设计单片机系统板与PC机之间的串行通信电路。 编写串行通信程序,实现PC机与单片机串行通信的基本功能。 在PC机上显示单片机系统的测量温度。 在PC机上编程实现单片机闭环控制温度设置, 闭环温度控制启动/停止。2.设计方案2.1电路设计2.1.1芯片选择MAX232芯片司专为RS-232标准串口设计的单电源电平转换芯片,使用+5v单电源供电。2.1.2电路设计图2.1 MAX 232 引脚图及电路设计图其中TXD,RXD分别与单片机1,2管脚相连;2.2 通信协议2.2.1 传输协议 a. 波特率 600bps 。 b. 传输格式 8个数据位,1个起始位,1个停止位,无校验位。2.2.2命令格式UART通信采用定长命令,每个命令由6个字节组成,其中3个字节为同步字,1个字节为操作码,2个字节为操作数。a. 同步字:串行数据收发的最小单位为字节,基本单位为命令。每个命令为若干字节称为一个数据包。一包数据以由若干字节组成的同步字开头称为包头。UART通信的同步字为 C O M。b. 操作码:分为二部分,前4位用16进制数A、B、C、D表示受控的4个通道或4个不同的下位机,后4位16进制数0F表示不同的操作内容。c. 操作数:为不同操作过程的数据,范围、格式随操作内容而定。仅有1个操作数或没有操作数的命令,空缺的部分用16进制数FFH填充。212.2.3 操作命令表上位机发送命令下位机应答数据命 令同步字操作码操作数1操作数2同步字操作码数据1数据2温度设定C O MA(B,C,D)000H63H(整数)00H63H(小数)温度设定值增1A(B,C,D)1FFHFFH温度设定值减1A(B,C,D)2FFHFFH温度控制启动/停止A(B,C,D)3FFHFFH延时启动时间设置A(B,C,D)400H3BH(分)00H3BH(秒)延时停止时间设置A(B,C,D)500H3BH(分)00H3BH(秒)定时启动时间设置A(B,C,D)600H17H(时)00H3BH(分)定时停止时间设置A(B,C,D)700H17H(时)00H3BH(分)当前温度查询A(B,C,D)8FFHFFHC O MA(B,C,D)800H63H(整数)00H63H(小数)延时启动时间查询 延时时间为启动延时操作以后的倒计时剩余时间。A(B,C,D)AFFHFFHA(B,C,D)A00H3BH(分)00H3BH(秒)延时停止时间查询A(B,C,D)BFFHFFHA(B,C,D)B00H3BH(分)00H3BH(秒)当前时间查询A(B,C,D)CFFHFFHA(B,C,D)C00H17H(时)00H3BH(分)控制工作状态查询A(B,C,D)EFFHFFHA(B,C,D)E00HF8H D7:1-启动/0-停止 D6:延时启动 1-有效/0-无效 D5:延时停止 1-有效/0-无效 D4:定时启动 1-有效/0-无效 D3:定时停止 1-有效/0-无效 D2-D0保留FFH2.3主要工作内容 使用RS232-TTL电平转换电路,为原有温度控制系统扩展与上位机进行串行通信的接口。编写程序,实现与上位机之间的串行数据通信。 编写程序,对上位机发出的各种命令进行解析,完成相应的控制操作。 通过高级语言程序设计,创建PC机操作界面,发送温度控制命令、接收并显示下位机传送的温度数据。2.4主要难点 与上位机建立通信联系,正常收发数据。 需要掌握一种高级语言程序设计方法。3.上位机程序设计3.1串口部分程序图 3.1 VB引用控件链接com口需对Microsoft Common控件进行调用,如图3.1所示。调用成功后在工具栏显示 图标。应用Com口具体语句如下:Private Sub Form_Load()Dim xlapp As Excel.ApplicationDim xlbook As Excel.WorkbookDim xlsheet As Excel.WorksheetTxtcom.AddItem "COM1"Txtcom.AddItem "COM2"Txtcom.AddItem "COM3"Txtcom.AddItem "COM4"Txtcom.AddItem "COM5"Txtcom.AddItem "COM6"timemark = 0Label10.FontSize = 12Label15.FontSize = 18Label27.FontSize = 25On Error GoTo err: MSComm1.CommPort = 1 设置串口 MSComm1.InputMode = comInputModeBinary 二进制输入模式 MSComm1.RThreshold = 2 接收2个字符触法OnComm 事件 MSComm1.SThreshold = 0 发送1个字符触法OnComm 事件 MSComm1.Settings = "600,n,8,2" 设置波特率 CmdStop.Enabled = False 停止采集按钮不可用 Call tabinit 调用表格初始化子程序 Call ScaleSys 绘制坐标系 If MSComm1.PortOpen = False Then MSComm1.PortOpen = True 打开串口 mark = True mark3 = 0 CmdStop.Enabled = False Exit Suberr: Select Case err.Number Case comPortAlreadyOpen 如果串口已经打开,则提示 MsgBox "没有发现此串口或被占用", 49, "温度采集控制系统" Case Else MsgBox "没有发现此串口或被占用", 49, "温度采集控制系统" End Select err.Clear End Sub3.2采集温度部分由于从单片机接收到的数据为16进制字符型,所以接收后要对数据进行进制转换。具体程序如下:- 接收触法事件-获取温度测量值并显示每发送一次指令,触发下面事件,返回数据串Private Sub MSComm1_OnComm() Dim Inbyte() As Byte 接收数据暂存 Dim buffer As String 温度数据缓冲 Dim datatemp2a, datatemp2b As String 两字节进制温度数据 Dim datatemp2 As String 十六进制温度数据 Dim count As Integer 接收个数计数 If mark3 = 0 Then If num > Txttimes.Text - 1 Then 接收个数判断 Timer1.Enabled = False 接收完毕 CmdStop.Enabled = False CmdStart.Caption = "开始采集" Shpstate.FillColor = &H808080 MSComm1.PortOpen = False timemark = 0 Exit Sub End If 读取仪表返回数据串 Select Case MSComm1.CommEvent Case comEvReceive count = MSComm1.InBufferCount 接收温度数据个数,两字节,低位在前 Inbyte = MSComm1.Input 接收温度数据 If count <> 2 Then Exit Sub 不是两字节,表示接收错误,跳出程序 counter = counter + 1 基数器加1 For i = LBound(Inbyte) To UBound(Inbyte) 把接收的数据按十六进制格式放入缓冲中 buffer = buffer + Hex(Inbyte(i) + Chr(32) wendu = Val(Inbyte(i) / 255 * 100 Next i End Select datatemp(num) = wendu If counter = num + 1 Then If datatemp(num) <> 0 Then 不能显示零度,别的正常 Grid.Col = 1: Grid.Row = num + 1 Grid.Text = Format$(wendu, "0.0") 将数据转换成格式0.0 If counter > 13 Then Grid.TopRow = counter - 12 控制滚动条的滚动 TempText = Format$(datatemp(num), "0.0") 10进制显示,保留一位小数 num = num + 1 Call cal 调用计算极值、平均值子程序 Call draw 调用绘曲线过程 End If End IfEnd Sub3.3温度发送部分与温度接收部分类似,发送数据时同样涉及到温度进制转换的问题,需要对发送的温度进行调整。程序如下: - 设定温度值 Private Sub settemp_Click() Dim i As Variant Call setCom mark3 = 1 On Error GoTo err: If mark2 <> 1 Then If MSComm1.PortOpen = False Then MSComm1.PortOpen = True 打开串口 intreturn = InputBox("请输入一个整数温度值(199)", "温度设定", , 7500, 5500) i = Chr(intreturn) If intreturn > 99 Or intreturn < 1 Then MsgBox "超出限定值", 48, "温度采集控制系统" Else MSComm1.Output = i Shpstate.FillColor = &H808080 MSComm1.PortOpen = False mark3 = 0 mark2 = 0 End If End Iferr: mark2 = 0 If MSComm1.PortOpen = True Then MSComm1.PortOpen = False Shpstate.FillColor = &H808080 mark3 = 0End Sub3.4温度曲线绘制部分在温度实时采集的同时绘制温度变化曲线,并显示当前稳定。程序如下:- 建立图像坐标系-Sub ScaleSys() 坐标系 Picture1.AutoRedraw = True 自动重绘有效 Picture1.DrawWidth = 1 线宽1个像素 Picture1.ScaleMode = vbPixels 像素为单位 Picture1.Scale (0, 100)-(200, 20) 坐标系 Picture1.DrawStyle = vbDot 点线 横坐标 Picture1.Line (0, 20)-(200, 20), RGB(130, 130, 130) Picture1.Line (0, 40)-(200, 40), RGB(130, 130, 130) Picture1.Line (0, 60)-(200, 60), RGB(130, 130, 130) Picture1.Line (0, 80)-(200, 80), RGB(130, 130, 130) Picture1.Line (0, 100)-(200, 100), RGB(130, 130, 130) 纵坐标 Picture1.Line (40, 100)-(40, 20), RGB(130, 130, 130) Picture1.Line (80, 100)-(80, 20), RGB(130, 130, 130) Picture1.Line (120, 100)-(120, 20), RGB(130, 130, 130) Picture1.Line (160, 100)-(160, 20), RGB(130, 130, 130) Picture1.Line (200, 100)-(200, 20), RGB(130, 130, 130) End Sub- 温度曲线绘制-绘制温度实时变化曲线Private Sub draw() Picture1.DrawWidth = 2 设置线宽 Picture1.DrawStyle = vbSolid 线条样式选择实线 For i = 1 To num - 1 X1 = (i - 1): Y1 = datatemp(i - 1) X2 = i: Y2 = datatemp(i) Picture1.Line (X1, Y1)-(X2, Y2), QBColor(0) 绘制温度曲线 If (X1 = 200) Then Picture1.Cls Picture1.AutoRedraw = True 自动重绘有效 Picture1.DrawWidth = 1 线宽1个像素 Picture1.ScaleMode = vbPixels 像素为单位 Picture1.Scale (0, 100)-(200, 20) 坐标系 Picture1.DrawStyle = vbDot 点线 横坐标 Picture1.Line (0, 20)-(200, 20), RGB(130, 130, 130) Picture1.Line (0, 40)-(200, 40), RGB(130, 130, 130) Picture1.Line (0, 60)-(200, 60), RGB(130, 130, 130) Picture1.Line (0, 80)-(200, 80), RGB(130, 130, 130) Picture1.Line (0, 100)-(200, 100), RGB(130, 130, 130) 纵坐标 Picture1.Line (40, 100)-(40, 20), RGB(130, 130, 130) Picture1.Line (80, 100)-(80, 20), RGB(130, 130, 130) Picture1.Line (120, 100)-(120, 20), RGB(130, 130, 130) Picture1.Line (160, 100)-(160, 20), RGB(130, 130, 130) Picture1.Line (200, 100)-(200, 20), RGB(130, 130, 130) End If If (X1 > 200) Then Picture1.Line (X1 - 200, Y1)-(X2 - 200, Y2), QBColor(0) 绘制温度曲线 End If Next i End Sub图 3.2 上位机程序运行截图4 下位机设计上位机部分沿用已经完成的闭环温控电路,如图4.1 。只需对com口部分进行相应修改。图 4.1 闭环温控8051单片机内程序如下:#include "C8051F020.h"#include "absacc.h"#include "data_define.c"#define DP1 XBYTE0x0000#define DP2 XBYTE0x0001#define DP3 XBYTE0x0002#define DP4 XBYTE0x0003#define KEY_WR XBYTE0x0010#define KEY_RD XBYTE0x0020#define DA XBYTE0x4000 #define AD XBYTE0x2000#define linescan1 0xfe#define linescan2 0xfd#define linescan3 0xfb#define linescan4 0xf7#define TIMER 0x80#include "Init_Device.c"int value2;int value1;int i;int a;int b;int c;float d;int x;int y;int ji;int z;int e;int k = 0;sfr16 TMR3RL = 0x92; /定时器3重装载寄存器sfr16 TMR3 = 0x94; /定时器3计数器#define uchar unsigned char#define uint unsigned int/-/参数设置区/-#define BAUDRATE 1200 /波特率bps#define CLKOUT 22118400 /外部晶振,修改也要修改OSCXCN#define SMODVAL 0 /SMOD的值,修改请也修改PCONVAL#define PCONVAL 0x00 /PCON的值,=0x00时SMOD0=0; =0x80时SMOD0=1#define TXVAL (256-CLKOUT*(SMODVAL+1)/BAUDRATE/384) /定时器初值#define MAX_LEN 10 /每次接收/发送字符串的长度/-/全局变量/-bit readFlag = 0; /读标志uchar readCounts = 0; /已经读取的字符个数,与MAX_LEN比较uchar idata trdataMAX_LEN; /要接收/发送的字符串uchar rxch;/-/子函数声明/-void SYSCLK_Init(void); /系统时钟初始化void PORT_Init(void); /端口初始化void UART0_Init(void); /串口UART0初始化void Send_Char(uchar ch); /发送单个字符void Send_String(uchar * str, uint len); /发送一个字符串void UART0_ISR(); /串口中断服务程序,接收字符void Timer3_Init(uint counts); /定时器3初始化void Timer3_ISR(void); /定时器3中断服务程序unsigned char table=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90;int value44=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15;void display(unsigned char x,y);void delay();void main(void) unsigned char l_val,r_val,r_state,temp,conter; int i1,sum1=0,len1,h; int p; int z; value1=0; Init_Device(); DP1 = DP2 = 0xff; i=0; WDTCN = 0xde; /禁止看门狗 WDTCN = 0xad;SYSCLK_Init(); /时钟初始化PORT_Init(); /端口初始化UART0_Init(); /串口初始化Timer3_Init(CLKOUT/12/10); /定时器初始化EA = 1; /开全局中断 while(1) for( l_val = 1;l_val < 5;+l_val ) switch( l_val ) case 1: KEY_WR = linescan1; break; case 2: KEY_WR = linescan2; break; case 3: KEY_WR = linescan3; break; default: KEY_WR = linescan4; if(r_state=KEY_RD&0x1f) i+; if(i>2) i=1; for(conter=1,r_val=1,temp=1;conter<5;+conter,+r_val,temp=temp<<1) if(r_state&temp)!=0) value1=valuer_val-1l_val-1; switch(i) case 1: DP1=tablevalue1%10;a=value1;break; case 2: DP2=tablevalue1%10;b=value1;break; if(i=2) /c=10*a+b; AD=x; for(z=0;z<18000;z+) x=AD; ji=AD; x=(x*100)/256; display(4,x%10); display(3,x/10);Send_Char(AD); sum1=rxch;h=x-sum1;if(x<(sum1+1) p=2; DA=0xFF; else if(x>(sum1-1) p=1; DA=0x40;else p=0; DA=0x80; void display(unsigned char x,y) if (x=1) DP1=tabley; else if (x=2) DP2=tabley; else if(x=3) DP3=tabley; else if(x=4) DP4=tabley; void delay(void) long i; for(i=0;i<33000;+i); void SYSCLK_Init(void)uint i;OSCXCN = 0x67; /采用外部晶振22.1184MHz,不分频. 选型OSCXCN=0110,0111for(i=0;i<256;i+); /等待>1mswhile(!(OSCXCN&0x80); /查询直到XTLVLD=1,晶振稳定OSCICN = 0x88; /切换到外部振荡器,允许时钟失效监测器. OSCICN=1000,1000/端口初始化void PORT_Init(void)XBR0 = 0x04; /允许UART0,RX,TX连到2个端口引脚. XBR0=0000,0100XBR1 = 0x00;XBR2 = 0x40; /交叉开关使能/串口初始化void UART0_Init(void)SCON0 = 0x50; /选择串口方式1,波特率可变 SCON0=0101,0000TMOD =

    注意事项

    本文(上、下位机结构的温度控制系统的设计与实现专业.docx)为本站会员(啊飒飒)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

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




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开