压强温度测试与显示WORD.docx
《压强温度测试与显示WORD.docx》由会员分享,可在线阅读,更多相关《压强温度测试与显示WORD.docx(21页珍藏版)》请在冰豆网上搜索。
压强温度测试与显示WORD
吕梁学院
压强、温度测试与显示
专业:
物理系物理学
学生姓名:
陈剑文(组长)
组员:
马腾王光军
指导教师:
摘要
随着我国经济快速发展,在很多经济领域都需要测量温度与压强,例如火箭的返回舱等。
而目前生活中测压强普遍用测压计,测温度普遍用温度计,这种方法存在精准度差等特点。
我们组设计项目:
以STC89C52单片机为控制;通过数字式气温气压模块测量温度与压强;然后将温度、压强等参数在LCD1602液晶屏上进行显示。
课题完成了单片机,数字式气温气压模块,LCD1602液晶屏采购接口电路的设计和连接以传感器和电路的安装位置和方式的安排,并完成了整个硬件的安装工作。
除此之外,还对整个控制软件进行设计和程序的编制以及程序的调试,并最终完成了软件和硬件的融合,基本实现了测试及显示要求实现的预期的功能。
关键词:
温度压强单片机数字式气温气压模块LCD1602液晶屏
目录
1系统方案4
1.1LCD1602液晶显示的论证与选择4
1.2数字式气温气压BMP085模块的论证与选择4
1.3控制系统的论证与选择4
2电路与程序设计5
2.1电路的设计5
2.1.1系统总体框图5
2.1.2LCD1602液晶显示子系统框图与电路原理图5
2.1.3数字式气温气压BMP085子系统框图与电路原理图6
2.1.4电源6
2.2程序的设计7
3.2.1程序功能描述与设计思路7
3.2.2程序流程图3
3测试方案与测试结果3
3.1测试方案3
3.2测试结果与分析...............................................................................................
附录1:
电路原理图5
附录2:
源程序6
1系统方案
本系统主要由LCD1602显示模块、数字式气温气压BMP085模块、控制系统模块、电源模块组成,下面分别论证这几个模块的选择。
1.1LCD1602液晶显示的论证与选择
方案一:
数码管显示
方案二:
LCD1602液晶显示
系统采用1602液晶显示,它可以显示2*16个字符,同时只用11个I/O端口,它不仅节省了单片机的资源,相比较数码管液晶显示更加直观、节能,同时在硬件上面液晶的驱动电路比数码管简单的多,故采用LCD显示。
综合以上两种方案,选择方案二。
Lcd1602基本操作时序如下表所示
1读状态输入:
RS=L,
RW=H,E=H
输出:
D0-D7=状态字
2写指令输入:
RS=L,
RW=L,D0-D7=指令码,E=脉冲
输出:
无
3读数据输入:
RS=H,
RW=H,E=H
输出:
D0-D7=数据
4写数据输入:
RS=H,
RW=1,D0-D7=数据,E=H
输出:
无
1.2数字式气温气压BMP085模块的论证与选择
方案一:
BMP180
方案二:
BMP085
BMP085与BPP180都遵从I2C协议,BMP085是一款高精度、超低能耗的压力传感器,可以应用在移动设备中。
它的性能卓越,绝对精度最低可以达到0.03hPa,并且耗电极低,只有3μA。
BMP085采用强大的8-pin陶瓷无引线芯片承载(LCC)超薄封装,可以通过I2C总线直接与各种微处理器相连。
综合以上二种方案,选择方案二。
BMP085数字式气温气压传感器主要特点:
(1).压力范围:
300-1100hPa(海拔9000米至-500米)
(2).电源电压:
1.8V-3.6V(VDDA)1.62V-3.6V(VDDD)
LCC8封装:
无铅陶瓷载体封装(LCC)
(3).尺寸:
5.0mmx5.0x1.2mm
(4).低功耗:
5μA在标准模式
高精度:
低功耗模式下,分辨率为0.06hPa(0.5米)
高线性模式下,分辨率为0.03hPa(0.25米)
(5).含温度输出
IIC接口
温度补偿
(6).反应时间:
7.5ms
待机电流:
0.1μA
无需外部时钟电路
1.3控制系统的论证与选择
STC89C52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、非常有效的解决方案。
具有以下标准功能:
8k字节Flash,512字节RAM,32位I/O口线,看门狗定时器,内置4KBEEPROM,MAX810复位电路,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口。
另外STC89X52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
最高运作频率35MHz,6T/12T可选。
2电路与程序设计
2.1电路的设计
2.1.1系统总体框图
系统总体框图如图(a)所示
电源
数字式气温气压模块LCD1602液晶屏
图(a)系统总体框图
2.1.2LCD1602液晶显示子系统框图与电路原理图
1、LCD1602液晶显示子系统框图
图(b)LCD1602液晶显示子系统框图
2、LCD1602液晶显示子系统电路
图(c)LCD1602液晶显示子系统电路
2.1.3数字式气温气压BMP085模块子系统框图与电路原理图
1、数字式气温气压BMP085模块子系统框图
图(d)数字式气温气压BMP085模块子系统框图
2、数字式气温气压BMP085模块子系统电路
图(e)数字式气温气压BMP085模块子系统电路
2.1.4电源
电源由变压部分、滤波部分、稳压部分组成。
为整个系统提供
5V或者
12V电压,确保电路的正常稳定工作。
这部分电路比较简单,都采用三端稳压管实现,故不作详述。
2.2程序的设计
2.2.1程序功能描述与设计思路
1、程序功能描述
1)显示部分:
在LCD1602液晶显示温度与气压。
2、程序设计思路
用单片机STC89C52控制,通过数字式气温气压BMP085传感器,将温度与气压值通过LCD1602液晶上显示出来。
2.2.2程序流程图
1、LCD1602液晶子程序流程图
图(f)
2、主程序流程图
图(g)
3测试方案与测试结果
3.1测试方案
1、硬件测试:
按电路图组装硬件。
2、软件仿真(由于proteus没有BMP085模块,用MPX4250代替)图(h)
3.2测试结果及分析
根据上述测试数据,lcd1602可以显示温度与压强示数,由此可以得出以下结论:
1、本项目电路图设计正确。
2、本项目C程序编写正确。
3、本项目可以实现硬件与软件联调。
综上所述,本设计达到设计要求。
附录一
电路原理图:
图(i)
附录2
2.1源程序:
//*********************************
//BMP085IIC测试程序
//使用单片机STC89C51
//晶振:
11.0592M
//编译环境KeiluVision4
//*********************************
#include
#include
#include
#include
#include//Keillibrary
#defineucharunsignedchar
#defineuintunsignedint
#defineDataPortP2//LCD1602数据端口
sbitSCL=P1^0;//IIC时钟引脚定义
sbitSDA=P1^1;//IIC数据引脚定义
sbitLCM_EN=P0^0;//Lcd1602命令端口
sbitLCM_RS=P0^2;//Lcd1602命令端口
sbitLCM_RW=P0^1;//Lcd1602命令端口
#defineBMP085_SlaveAddress0xee//定义器件在IIC总线中的从地址
#defineOSS0
typedefunsignedcharBYTE;
typedefunsignedshortWORD;
ucharge,shi,bai,qian,wan,shiwan;//显示变量
intdis_data;//变量
shortac1;
shortac2;
shortac3;
unsignedshortac4;
unsignedshortac5;
unsignedshortac6;
shortb1;
shortb2;
shortmb;
shortmc;
shortmd;
voiddelay(unsignedintk);
voidInitLcd();//初始化lcd1602
voidWriteDataLCM(uchardataW);
voidWriteCommandLCM(ucharCMD,ucharAttribc);
voidDisplayOneChar(ucharX,ucharY,ucharDData);
voidconversion(longtemp_data);
voidSingle_Write(ucharSlaveAddress,ucharREG_Address,ucharREG_data);
ucharSingle_Read(ucharREG_Address);voidMultiple_Read(uchar,uchar);
//******************************
voidDelay5us();
voidDelay5ms();
voidBMP085_Start();
voidBMP085_Stop();
voidBMP085_SendACK(bitack);
bitBMP085_RecvACK();
voidBMP085_SendByte(BYTEdat);
BYTEBMP085_RecvByte();
voidBMP085_ReadPage();
voidBMP085_WritePage();
//*******************************
voidconversion(longtemp_data)
{
shiwan=temp_data/100000+0x30;
temp_data=temp_data%100000;
wan=temp_data/10000+0x30;
temp_data=temp_data%10000;
qian=temp_data/1000+0x30;
temp_data=temp_data%1000;
bai=temp_data/100+0x30;
temp_data=temp_data%100;
shi=temp_data/10+0x30;
temp_data=temp_data%10;//取余运算
ge=temp_data+0x30;
}
/******************************/
voiddelay(unsignedintk)
{
unsignedinti,j;
for(i=0;i{
for(j=0;j<121;j++)
{;}
}
}
/******************************/
voidWaitForEnable(void)
{
DataPort=0xff;
LCM_RS=0;LCM_RW=1;_nop_();
LCM_EN=1;_nop_();_nop_();
while(DataPort&0x80);
LCM_EN=0;
}
/******************************/
voidWriteCommandLCM(ucharCMD,ucharAttribc)
{
if(Attribc)WaitForEnable();
LCM_RS=0;LCM_RW=0;_nop_();
DataPort=CMD;_nop_();
LCM_EN=1;_nop_();_nop_();LCM_EN=0;
}
/*************************************/
voidWriteDateLCM(uchardataW)
{
WaitForEnable();
LCM_RS=1;LCM_RW=0;_nop_();
DataPort=dataW;_nop_();
LCM_EN=1;_nop_();_nop_();LCM_EN=0;
}
/************************************/
voidInitLcd()
{
WriteCommandLCM(0x38,1);
WriteCommandLCM(0x08,1);
WriteCommandLCM(0x01,1);
WriteCommandLCM(0x06,1);
WriteCommandLCM(0x0c,1);
}
/**********************************/
voidDisplayOneChar(ucharX,ucharY,ucharDData)
{
Y&=1;
X&=15;
if(Y)X|=0x40;
X|=0x80;
WriteCommandLCM(X,0);
WriteDataLCM(DData);
}
/*********************************
延时5微秒(STC90C52RC@12M)
********************************/
voidDelay5us()
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
/*********************************
延时5毫秒(STC90C52RC@12M)
********************************/
voidDelay5ms()
{
WORDn=560;
while(n--);
}
/**************************************
起始信号
**************************************/
voidBMP085_Start()
{
SDA=1;//拉高数据线
SCL=1;//拉高时钟线
Delay5us();//延时
SDA=0;//产生下降沿
Delay5us();//延时
SCL=0;//拉低时钟线
}
/**************************************
停止信号
**************************************/
voidBMP085_Stop()
{
SDA=0;//拉低数据线
SCL=1;//拉高时钟线
Delay5us();//延时
SDA=1;//产生上升沿
Delay5us();//延时
}
/***********************************
发送应答信号
************************************/
voidBMP085_SendACK(bitack)
{
SDA=ack;//写应答信号
SCL=1;//拉高时钟线
Delay5us();//延时
SCL=0;//拉低时钟线
Delay5us();//延时
}
/***********************************
接收应答信号
***********************************/
bitBMP085_RecvACK()
{
SCL=1;//拉高时钟线
Delay5us();//延时
CY=SDA;//读应答信号
SCL=0;//拉低时钟线
Delay5us();//延时
returnCY;
}
/**********************************
向IIC总线发送一个字节数据
**********************************/
voidBMP085_SendByte(BYTEdat)
{
BYTEi;
for(i=0;i<8;i++)//8位计数器
{
dat<<=1;//移出数据的最高位
SDA=CY;//送数据口
SCL=1;//拉高时钟线
Delay5us();//延时
SCL=0;//拉低时钟线
Delay5us();//延时
}
BMP085_RecvACK();
}
/**************************************
从IIC总线接收一个字节数据
**************************************/
BYTEBMP085_RecvByte()
{
BYTEi;
BYTEdat=0;
SDA=1;//使能内部上拉,准备读取数据,
for(i=0;i<8;i++)//8位计数器
{
dat<<=1;
SCL=1;//拉高时钟线
Delay5us();//延时
dat|=SDA;//读数据
SCL=0;//拉低时钟线
Delay5us();//延时
}
returndat;
}
/***********************************
读出BMP085内部数据,连续两个
***********************************/
shortMultiple_read(ucharST_Address)
{
ucharmsb,lsb;
short_data;
BMP085_Start();//起始信号
BMP085_SendByte(BMP085_SlaveAddress);//发送设备地址+写信号
BMP085_SendByte(ST_Address);//发送存储单元地址
BMP085_Start();//起始信号
BMP085_SendByte(BMP085_SlaveAddress+1);//发送设备地址+读信号
msb=BMP085_RecvByte();//BUF[0]存储
BMP085_SendACK(0);//回应ACK
lsb=BMP085_RecvByte();
BMP085_SendACK
(1);//最后一个数据需要回NOACK
BMP085_Stop();//停止信号
Delay5ms();
_data=msb<<8;
_data|=lsb;
return_data;
}
//****************
longbmp085ReadTemp(void)
{
BMP085_Start();//起始信号
BMP085_SendByte(BMP085_SlaveAddress);//发送设备地址+写信号
BMP085_SendByte(0xF4);
BMP085_SendByte(0x2E);
BMP085_Stop();//发送停止信号
delay(10);
return(long)Multiple_read(0xF6);
}
//*********************************************************
longbmp085ReadPressure(void)
{
longpressure=0;
BMP085_Start();//起始信号
BMP085_SendByte(BMP085_SlaveAddress);//发送设备地址+写信号
BMP085_SendByte(0xF4);
BMP085_SendByte(0x34);
BMP085_Stop();//发送停止信号
delay(20);
pressure=Multiple_read(0xF6);
pressure&=0x0000FFFF;
returnpressure;
}
//*************************
voidInit_BMP085()
{
ac1=Multiple_read(0xAA);
ac2=Multiple_read(0xAC);
ac3=Multiple_read(0xAE);
ac4=Multiple_read(0xB0);
ac5=Multiple_read(0xB2);
ac6=Multiple_read(0xB4);
b1=Multiple_read(0xB6);
b2=Multiple_read(0xB8);
mb=Multiple_read(0xBA);
mc=Multiple_read(0xBC);
md=Multiple_read(0xBE);
}
//**************************
voidbmp085Convert()
{
intut;
longup;
longx1,x2,b5,b6,x3,b3,p;
unsignedlongb4,b7;
longtemperature;
longpressure;
ut=bmp085Read