多点粮库温度监控管理系统实习报告.docx

上传人:b****3 文档编号:12715633 上传时间:2023-04-21 格式:DOCX 页数:25 大小:1.13MB
下载 相关 举报
多点粮库温度监控管理系统实习报告.docx_第1页
第1页 / 共25页
多点粮库温度监控管理系统实习报告.docx_第2页
第2页 / 共25页
多点粮库温度监控管理系统实习报告.docx_第3页
第3页 / 共25页
多点粮库温度监控管理系统实习报告.docx_第4页
第4页 / 共25页
多点粮库温度监控管理系统实习报告.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

多点粮库温度监控管理系统实习报告.docx

《多点粮库温度监控管理系统实习报告.docx》由会员分享,可在线阅读,更多相关《多点粮库温度监控管理系统实习报告.docx(25页珍藏版)》请在冰豆网上搜索。

多点粮库温度监控管理系统实习报告.docx

多点粮库温度监控管理系统实习报告

 

粮库温度监控管理系统实习报告

 

系别:

电气工程系

班级:

学号:

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;i

for(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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 电子电路

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1