温度采集项目文档格式.docx
- 文档编号:20085869
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:22
- 大小:48.81KB
温度采集项目文档格式.docx
《温度采集项目文档格式.docx》由会员分享,可在线阅读,更多相关《温度采集项目文档格式.docx(22页珍藏版)》请在冰豆网上搜索。
'
-------------------------------------------------------------------------------------
WithMSComm1
If.PortOpen=TrueThen
.PortOpen=False
EndIf
.CommPort=3'
使用COM2
.Settings=BaudRate&
"
9600,n,8,1"
设置通信口参数
.InBufferSize=1024'
设置MSComm1接收缓冲区为1024字节
.OutBufferSize=1024'
设置MSComm1发送缓冲区为1024字节
.InputMode=comInputModeBinary'
设置接收数据模式为二进制形式
'
-----------------------------------------------------------------------------------------------------
.InputLen=0'
设置Input一次从接收缓冲读取全部字节数
.SThreshold=0'
设置发送完所有产生OnComm事件
.InBufferCount=0'
清除接收缓冲区
.OutBufferCount=0'
清除发送缓冲区
.RThreshold=8'
设置接收一个字节产生OnComm事件
.RTSEnable=True
IfNotForm1.MSComm1.PortOpenThen'
判断通信口是否打开
OnErrorResumeNext
Form1.MSComm1.PortOpen=True'
打开通信口
IfErrThen'
错误处理
MsgBox"
串口被占用或此串口不存在!
通信无效!
"
16,"
错误提示"
ExitSub
EndWith
PrivateSubMSComm1_OnComm()
SelectCaseMSComm1.CommEvent
Case2
DimInByte,iAsInteger
Dimtemp1AsString,temp2AsInteger
InByte=MSComm1.Input
IfHex(InByte(0))=81Then
Text1.Text="
Fori=1ToUBound(InByte)'
UBound函数返回一个Long型数据,其值为指定的数组维可用的最大下标。
Text1.Text=Text1.Text&
Chr$(InByte(i))
Next
temp1=Mid((Text1.Text),3,2)'
把接收的温度值转换为整数小数部分舍弃
temp2=Text2.Text
IfVal(temp1)>
=Val(temp2)Then
Beep
Label2.BackColor=vbRed
Else
Label2.BackColor=vbGreen
IfHex(InByte(0))=82Then
Text3.Text="
Text3.Text=Text3.Text&
temp1=Mid((Text3.Text),3,2)'
temp2=Text4.Text
Label11.BackColor=vbRed
Label11.BackColor=vbGreen
EndSelect
PrivateSubTimer1_Timer()
Label1.Caption=Time$
Dimv
(1)AsByte
v(0)=&
H81
v
(1)=&
HFF
MSComm1.Output=v
H82
下位机单片机原理图:
单片机程序:
/*******************************************************************************
*
*电梯温度监测2015年8月31日晚
--------------------------------------------------------------------------------
*实验名:
18B20温度显示试验
*实验说明:
LCD1602显示温度值,并且将温度值通过串口发送到电脑上。
*连接方式:
见连接图
*注意:
*******************************************************************************/
#include<
reg51.h>
#include"
lcd.h"
temp.h"
#defineadd0x82//地址
sbitkz485=P3^7;
//485通信控制端1是发送0是接收
ucharreceive[2]={0,0};
//接收数据缓存
ucharkzml;
//控制命令
bituart_flag;
//串口接收成功标志
bitwendu_flag;
//传温度标志
unsignedchardatas[5]={0,0,0,0,0};
//定义数组
voidLcdDisplay(int);
voidUsartConfiguration();
voidFS(uchar);
*函数名:
main
*函数功能:
主函数
*输入:
无
*输出:
voidmain()
{
UsartConfiguration();
kz485=0;
LcdInit();
//初始化LCD1602
LcdWriteCom(0x88);
//写地址80表示初始地址
LcdWriteData('
C'
);
while
(1)
{
LcdDisplay(Ds18b20ReadTemp());
if(uart_flag==1&
&
wendu_flag==1)
{
FS(add);
FS(0X2B);
//发送“+”
FS(datas[0]+0x30);
//发送温度值
FS(datas[1]+0x30);
FS(datas[2]+0x30);
FS(0X2E);
//发送“.”
FS(datas[3]+0x30);
FS(datas[4]+0x30);
kz485=0;
uart_flag=0;
wendu_flag=0;
}
}
}
LcdDisplay()
LCD显示读取到的温度
v
voidLcdDisplay(inttemp)//lcd显示
floattp;
if(temp<
0)//当温度值为负数
{
LcdWriteCom(0x80);
//写地址80表示初始地址
-'
//显示负
//因为读取的温度是实际温度的补码,所以减1,再取反求出原码
temp=temp-1;
temp=~temp;
tp=temp;
temp=tp*0.0625*100+0.5;
//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
//算由?
.5,还是在小数点后面。
}
else
{
+'
//显示正
//因为数据处理有小数点所以将温度赋给一个浮点型变量
//如果温度是正的那么,那么正数的原码就是补码它本身
//算加上0.5,还是在小数点后面。
datas[0]=temp/10000;
datas[1]=temp%10000/1000;
datas[2]=temp%1000/100;
datas[3]=temp%100/10;
datas[4]=temp%10;
LcdWriteCom(0x82);
0'
+datas[0]);
//百位
LcdWriteCom(0x83);
+datas[1]);
//十位
LcdWriteCom(0x84);
+datas[2]);
//个位
LcdWriteCom(0x85);
.'
//显示‘.’
LcdWriteCom(0x86);
+datas[3]);
//显示小数点
LcdWriteCom(0x87);
+datas[4]);
//显示小数点
*函数名:
UsartConfiguration()
设置串口
*输入:
*输出:
voidUsartConfiguration()
SCON=0X50;
//设置为工作方式1
TMOD=0X20;
//设置计数器工作方式2
//PCON=0X80;
//波特率加倍
TH1=0XFD;
//计数器初始值设置,注意波特率是9600的
TL1=0XFD;
ES=1;
//打开接收中断
EA=1;
//打开总中断
TR1=1;
//打开计数器
/*发送数据函数*******************************************/
voidFS(ucharddate)
kz485=1;
SBUF=ddate;
while(!
TI);
//等待发送结束
TI=0;
//发送标志位软件复位
voiduata()interrupt4using1//串口中断
staticunsignedcharcount;
//串口接收计数变量
RI=0;
receive[count]=SBUF;
if(count==0&
receive[count]==add)//同时判断count跟接收到得数据
count=1;
elseif(count==1)
kzml=receive[1];
receive[count]=0;
switch(kzml)
case0xff:
//传温度命令
wendu_flag=1;
break;
default:
break;
count=0;
uart_flag=1;
//串口接收成功标志,为1时在主程序中回复,然后清0
else
count=0;
//判断不满足条件就将计数值清零
Lcd1602_Delay1ms
延时函数,延时1ms
c
*说名:
该函数是在11.0592MHZ晶振下。
voidLcd1602_Delay1ms(uinty)//误差0us
intx;
while(--y!
=0)
for(x=0;
x<
600;
x++);
LcdWriteCom
向LCD写入一个字节的命令
com
#ifndefLCD1602_4PINS//当没有定义这个LCD1602_4PINS时
voidLcdWriteCom(ucharcom)//写入命令
LCD1602_E=0;
//使能
LCD1602_RS=0;
//选择发送命令
LCD1602_RW=0;
//选择写入
LCD1602_DATAPINS=com;
//放入命令
Lcd1602_Delay1ms
(1);
//等待数据稳定
LCD1602_E=1;
//写入时序
Lcd1602_Delay1ms(5);
//保持时间
#else
//使能清零
//选择写入命令
//由于4位的接线是接到P0口的高四位,所以传送高四位不用改
//Lcd1602_Delay1ms
(1);
LCD1602_DATAPINS=com<
<
4;
//发送低四位
#endif
LcdWriteData
向LCD写入一个字节的数据
dat
*******************************************************************************/
#ifndefLCD1602_4PINS
voidLcdWriteData(uchardat)//写入数据
LCD1602_RS=1;
//选择输入数据
LCD1602_DATAPINS=dat;
//写入数据
#else
//选择写入数据
LCD1602_DATAPINS=dat<
//写入低四位
LcdInit()
初始化LCD屏
#ifndefLCD1602_4PINS
voidLcdInit()//LCD初始化子程序
LcdWriteCom(0x38);
//开显示
LcdWriteCom(0x0c);
//开显示不显示光标
LcdWriteCom(0x06);
//写一个指针加1
LcdWriteCom(0x01);
//清屏
LcdWriteCom(0x80);
//设置数据指针起点
LcdWriteCom(0x32);
//将8位总线转为4位总线
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 温度 采集 项目
![提示](https://static.bdocx.com/images/bang_tan.gif)