多点粮库温度监控管理系统实习报告.docx
《多点粮库温度监控管理系统实习报告.docx》由会员分享,可在线阅读,更多相关《多点粮库温度监控管理系统实习报告.docx(25页珍藏版)》请在冰豆网上搜索。
多点粮库温度监控管理系统实习报告
粮库温度监控管理系统实习报告
系别:
电气工程系
班级:
学号:
25号
实习时间:
2014.11.24~2014.12.6
指导教师:
一、实习名称:
粮库温度监控管理系统
二、实习目的:
1、能够正确使用相关软件编写上位机、下位机程序实现数据的采集;
2、要求系统界面美观、大方,颜色、字体等选择合适,控件选择合理;
3、本系统能够控制下位机的启动与停止,同时应具有实时显示、曲线绘制、数据保存、数据浏览、分析(上下限提示、平均值、直方图或饼图等)等基本功能,并配置菜单、工具栏等;
4、下位机提供粮库中八个粮仓的温度数据,用数码管或液晶循环显示;
三、实训过程:
1.设计的内容
本次设计所做的是基于VB的温度数据采集与控制系统,它采用DS18B20作为温度传感器,以微机作为主控计算机。
通过仿真电路,由串行通讯线把数据直接传送给上位机,让上位机对所得到的数据进行分析处理,并且应用VB语言编程实现温度的显示。
硬件方面是由上位机和仿真电路来实现的,DS18B20采集到的温度数据通过串行通讯线传送给上位机,运行在上位机上的编程软件VB利用串行通讯线提供给硬件的接口,对整个单总线进行操作控制,并且对测量数据进行处理。
软件方面主要是通过对系统参数的设置,通信控件的应用,最终实现对DS18B20的控制和温度数据的读取。
2.仿真电路
此次下位机主要是由8个温度传感器DS18B20构成,在此系统中应用DS18B20温度传感器检测温度,经信号处理后,通过仿真运行,最终在上位机上应用编程软件VB语言实现温度的显示。
3.登录界面
通过输入用户名和密码来进行登录进入主界面,并有用户名注册和找回密码功能。
登录界面
主界面
4.串口编写
在主界面中打开串口参数对串口参数进行设置。
(程序如下)
PrivateSubForm2_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.Load
Me.Text="串口参数"
EndSub
PrivateSubComboBox1_SelectedIndexChanged(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesComboBox1.SelectedIndexChanged
Form3.SerialPort1.PortName=ComboBox1.Tex
EndSub
PrivateSubComboBox2_SelectedIndexChanged(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesComboBox2.SelectedIndexChanged
Form3.SerialPort1.BaudRate=ComboBox2.Text
EndSub
PrivateSubComboBox3_SelectedIndexChanged(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesComboBox3.SelectedIndexChanged
ComboBox3.Text=Form3.SerialPort1.Parity
EndSub
PrivateSubComboBox4_SelectedIndexChanged(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesComboBox4.SelectedIndexChanged
ComboBox4.Text=Form3.SerialPort1.DataBits
EndSub
PrivateSubComboBox5_SelectedIndexChanged(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesComboBox5.SelectedIndexChanged
ComboBox5.Text=Form3.SerialPort1.StopBits
EndSub
PrivateSubButton1_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton1.Click
Form3.TextBox1.Text=ComboBox1.TextForm3.TextBox2.Text=ComboBox2.Text
Form3.TextBox3.Text=ComboBox3.TextForm3.TextBox4.Text=ComboBox4.Text
Form3.TextBox5.Text=ComboBox5.Text
Me.Hide()
EndSub
5.曲线绘图
通过打开串口和下位机仿真电路进行数据传递,实现在上位机进行监控各粮仓温度,还可以通过曲线把各个粮仓的温度直观的显示在界面。
并附有上下限温度报警系统,使用户可以快速的对粮仓的温度进行调整。
(程序如下)
DimgAsGraphics=PictureBox1.CreateGraphics'曲线绘图
h=PictureBox1.Height
g.TranslateTransform(30,h-165)
Dimp1AsPen=NewPen(Color.Maroon)
z=Val(TextBox6.Text)
q=5i=30x21=x11+iy21=-z*q
g.DrawLine(p1,x11,y11,x21,y21)
x11=x21y11=y21
Ifx21=450Thenx11=0
PictureBox1.Refresh()
EndIf
Ifx22=450Orx23=450Orx24=450Orx25=450Orx26=450Orx27=450Orx28=450Then
x11=0
PictureBox1.Refresh()
EndIf
g.Dispose()p1.Dispose()
EndSub
PrivateSub打开串口ToolStripMenuItem_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)Handles打开串口ToolStripMenuItem.Click
IfSerialPort1.IsOpen=FalseThen'串口通信
SerialPort1.Open()Timer3.Enabled=TrueSerialPort1.Write(TextBox6.Text)
EndIf
EndSub
PrivateSub关闭串口ToolStripMenuItem_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)Handles关闭串口ToolStripMenuItem.Click
IfSerialPort1.IsOpen=TrueThen
SerialPort1.Close()Timer3.Enabled=FalseTextBox6.Text="1"
TextBox7.Text="0"TextBox8.Text="0"TextBox9.Text="0"
TextBox10.Text="0"TextBox11.Text="0"TextBox12.Text="0"
TextBox13.Text="0"
EndIf
EndSub
PrivateSubTimer3_Tick(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesTimer3.Tick
DimcAsDoubleDimdat,rAsStringDimb(3)AsSingler=SerialPort1.ReadExisting()
IfLen(r)<3OrLen(r)>3Then
ExitSub
Elsec=r
Ifc<>0Thenb(0)=c\100b
(1)=c\10Mod10b
(2)=cMod10
EndIf
Ifb
(2)=1Thendat=b(0)*10+b
(1)TextBox6.Text=dat
EndIf
Ifb
(2)=2Thendat=b(0)*10+b
(1)TextBox7.Text=dat
EndIf
Ifb
(2)=3Thendat=b(0)*10+b
(1)TextBox8.Text=dat
EndIf
Ifb
(2)=4Thendat=b(0)*10+b
(1)TextBox9.Text=dat
EndIf
Ifb
(2)=5Thendat=b(0)*10+b
(1)TextBox10.Text=dat
EndIf
Ifb
(2)=6Thendat=b(0)*10+b
(1)TextBox11.Text=dat
EndIf
Ifb
(2)=7Thendat=b(0)*10+b
(1)TextBox12.Text=dat
EndIf
Ifb
(2)=8Thendat=b(0)*10+b
(1)TextBox13.Text=dat
EndIf
EndIf
SerialPort1.DiscardInBuffer()'把串口缓存清空
EndSub
6.图形数据显示
直方图显示和饼图显示
每一个颜色都代表一个粮库温度可以使用户更一步直观的了解各粮仓的温度。
(各颜色对应于主界面中粮仓按钮旁的颜色)
7.数据统计和保存
统计每秒各粮仓的温度情况并保存,方便用户随时调看每天的温度历史记录。
四、实习体会:
在做课程设计之前,整个人对课程设计的流程可谓是一头雾水。
在结课之前,我们学了VB的串口通信。
在课上积累的基础上,我开始了串口通信课程设计的制作。
设计时,最初想到的是界面如何更加美观。
在好奇心的驱使下,到网上下载好多图片作为背景。
慢慢地,开始读入编程阶段。
要进入一个系统,最开始需要写一段代码运行进入系统。
这让我想起了平常的很多登录界面,比如QQ登录。
每次人的登录界面,现在终于自己面临设计界面,刚开始确实迷茫,但是想想平常的很多界面的运行方式方法问题就迎楞而解了。
在曲线绘图、温度报警、数据显示、数据查询这一方面的代码是不尽相同的。
为了实现这些功能,我查找了书上的各个章节的练习题,希望能够找到点灵感。
终于功夫不负有心人,我也成功地让这些按钮能够运行。
总而言之,这次的课程设计让我体验了编写城中的酸与苦。
也学到了很多东西。
(程序源码)
#include
#defineLCD1602_DBP0
sbitLCD1602_RS=P2^5;
sbitLCD1602_RW=P2^6;
sbitLCD1602_E=P2^7;
/*等待液晶准备好*/
voidLcdWaitReady()
{
unsignedcharsta;
LCD1602_DB=0xFF;
LCD1602_RS=0;
LCD1602_RW=1;
do{
LCD1602_E=1;
sta=LCD1602_DB;//读取状态字
LCD1602_E=0;
}while(sta&0x80);//bit7等于1表示液晶正忙,重复检测直到其等于0为止
}
/*向LCD1602液晶写入一字节命令,cmd-待写入命令值*/
voidLcdWriteCmd(unsignedcharcmd)
{
LcdWaitReady();
LCD1602_RS=0;
LCD1602_RW=0;
LCD1602_DB=cmd;
LCD1602_E=1;
LCD1602_E=0;
}
/*向LCD1602液晶写入一字节数据,dat-待写入数据值*/
voidLcdWriteDat(unsignedchardat)
{
LcdWaitReady();
LCD1602_RS=1;
LCD1602_RW=0;
LCD1602_DB=dat;
LCD1602_E=1;
LCD1602_E=0;
}
/*设置显示RAM起始地址,亦即光标位置,(x,y)-对应屏幕上的字符坐标*/
voidLcdSetCursor(unsignedcharx,unsignedchary)
{
unsignedcharaddr;
if(y==0)//由输入的屏幕坐标计算显示RAM的地址
addr=0x00+x;//第一行字符地址从0x00起始
else
addr=0x40+x;//第二行字符地址从0x40起始
LcdWriteCmd(addr|0x80);//设置RAM地址
}
/*在液晶上显示字符串,(x,y)-对应屏幕上的起始坐标,str-字符串指针*/
voidLcdShowStr(unsignedcharx,unsignedchary,unsignedchar*str)
{
LcdSetCursor(x,y);//设置起始地址
while(*str!
='\0')//连续写入字符串数据,直到检测到结束符
{
LcdWriteDat(*str++);
}
}
/*初始化1602液晶*/
voidInitLcd1602()
{
LcdWriteCmd(0x38);//16*2显示,5*7点阵,8位数据接口
LcdWriteCmd(0x0C);//显示器开,光标关闭
LcdWriteCmd(0x06);//文字不动,地址自动+1
LcdWriteCmd(0x01);//清屏
}
#include
#include
unsignedcharcodeID[8][8]={{0x28,0x30,0xc5,0xb8,0x00,0x00,0x00,0x8e},//第一个DS18B20的序列号
{0x28,0x31,0xc5,0xb8,0x00,0x00,0x00,0xb9},//第2个DS18B20的序列号
{0x28,0x32,0xc5,0xb8,0x00,0x00,0x00,0xe0},
{0x28,0x33,0xc5,0xb8,0x00,0x00,0x00,0xd7},
{0x28,0x34,0xc5,0xb8,0x00,0x00,0x00,0x52},
{0x28,0x35,0xc5,0xb8,0x00,0x00,0x00,0x65},
{0x28,0x36,0xc5,0xb8,0x00,0x00,0x00,0x3c},
{0x28,0x37,0xc5,0xb8,0x00,0x00,0x00,0x0b},
};
unsignedcharlcdadd=0;
sbitIO_18B20=P3^7;//DS18B20通信引脚
/*软件延时函数,延时时间(t*10)us*/
voidDelayX10us(unsignedchart)
{
do{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}while(--t);
}
/*复位总线,获取存在脉冲,以启动一次读写操作*/
bitGet18B20Ack()
{
bitack;
EA=0;//禁止总中断
IO_18B20=0;//产生500us复位脉冲
DelayX10us(50);
IO_18B20=1;
DelayX10us(6);//延时60us
ack=IO_18B20;//读取存在脉冲
while(!
IO_18B20);//等待存在脉冲结束
EA=1;//重新使能总中断
returnack;
}
/*向DS18B20写入一个字节,dat-待写入字节*/
voidWrite18B20(unsignedchardat)
{
unsignedcharmask;
EA=0;//禁止总中断
for(mask=0x01;mask!
=0;mask<<=1)//低位在先,依次移出8个bit
{
IO_18B20=0;//产生2us低电平脉冲
_nop_();
_nop_();
if((mask&dat)==0)//输出该bit值
IO_18B20=0;
else
IO_18B20=1;
DelayX10us(6);//延时60us
IO_18B20=1;//拉高通信引脚
}
EA=1;//重新使能总中断
}
/*从DS18B20读取一个字节,返回值-读到的字节*/
unsignedcharRead18B20()
{
unsignedchardat;
unsignedcharmask;
EA=0;//禁止总中断
for(mask=0x01;mask!
=0;mask<<=1)//低位在先,依次采集8个bit
{
IO_18B20=0;//产生2us低电平脉冲
_nop_();
_nop_();
IO_18B20=1;//结束低电平脉冲,等待18B20输出数据
_nop_();//延时2us
_nop_();
if(!
IO_18B20)//读取通信引脚上的值
dat&=~mask;
else
dat|=mask;
DelayX10us(6);//再延时60us
}
EA=1;//重新使能总中断
returndat;
}
/*启动一次18B20温度转换,返回值-表示是否启动成功*/
bitStart18B20()
{
bitack;
ack=Get18B20Ack();//执行总线复位,并获取18B20应答
if(ack==0)//如18B20正确应答,则启动一次转换
{
Write18B20(0xCC);
Write18B20(0x44);//启动一次温度转换
}
return~ack;//ack==0表示操作成功,所以返回值对其取反
}
/*读取DS18B20转换的温度值,返回值-表示是否读取成功*/
bitGet18B20Temp(int*temp)
{
bitack;
unsignedcharLSB,MSB,i;//16bit温度值的低字节和高字节
staticunsignedcharadder=0;
ack=Get18B20Ack();//执行总线复位,并获取18B20应答
if(ack==0)//如18B20正确应答,则读取温度值
{
//Write18B20(0xCC);//跳过ROM操作
Write18B20(0x55);
for(i=0;i<8;i++)
{
Write18B20(ID[adder][i]);
lcdadd=adder;
}
adder++;
if(adder>=8)
adder=0;
Write18B20(0xBE);//发送读命令
LSB=Read18B20();//读温度值的低字节
MSB=Read18B20();//读温度值的高字节
*temp=((int)MSB<<8)+LSB;//合成为16bit整型数
}
return~ack;//ack==0表示操作应答,所以返回值为其取反值
#include
unsignedchari=0,z;
unsignedcharIDD[8][5]={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},
{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},};
voidDelayMs(unsignedcharn)
{
unsignedchari=0,j=0;
for(i=0;ifor(j=0;j<123;j++);
}
bitflag1s=0;//1s定时标志
unsignedcharT0RH=0;//T0重载值的高字节
unsignedcharT0RL=0;//T0重载值的低字节
voidConfigTimer0(unsignedintms);
externvoidConfigUART(unsignedintbaud);
unsignedcharIntToString(unsignedchar*str,intdat);
externbitStart18B20();
externunsignedcharlcdadd,tmp;
externbitGet18B20Temp(int*temp);
externvoidInitLcd1602();
externvoidLcdShowStr(unsigned