环境检测仪B全解.docx
- 文档编号:7816184
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:33
- 大小:402.80KB
环境检测仪B全解.docx
《环境检测仪B全解.docx》由会员分享,可在线阅读,更多相关《环境检测仪B全解.docx(33页珍藏版)》请在冰豆网上搜索。
环境检测仪B全解
2015-2016学年第一学期
微机原理(单片机)课程设计
总结报告
项目名称:
环境检测仪B
班级:
姓名:
学号:
微机原理(单片机)课程设计任务书
项目名称:
环境检测仪B
内容与要求:
上位机:
完成界面设计与通讯程序
(1)能够显示测得温度值与湿度值,当测得温度值或湿度值超出报警阈值上下限时,相应值后有HIGH或LOW提示字母
(2)能够设定报警温度阈值、湿度阈值
(3)每隔1秒将温度湿度及当前阈值存入文档
(4)可以对串口进行设置
下位机:
完成电路设计与控制程序
(1)采用AM2302采集温度和湿度,当超出报警阈值上下限时,相应指示灯闪烁提示
(2)通过串口与上位机通讯
(3)将阈值保存至外部存储器,重新复位上电后,阈值不变
(4)将当前测得温度值和湿度值显示在LCD屏上,当超出报警阈值时,温度值或湿度值后有HIGH或LOW提示字母
项目组任务分担评价表
姓名
分担任务
组内评价
LCD显示模块设计与编程、下位机串口通讯程序、上位机串口通讯程序,外部存储器的设计与编程
5
上位机温湿度显示与设置,保存数据,下位机温度传感器与单片机的设计与编程
5
课程设计报告评分表
内容
总体方案
硬件设计
软件设计
结果分析
明细清单
问题分析
心得体会
参考文献
程序代码
格式规范
总分
得分
得分
一、总体方案
环境监测仪总体功能模块示意图如图1-1所示。
图1-1XXXXX总体功能模块示意图
图中,温度湿度采集模块由AM2302将温度湿度值输入至单片机中,单片机读取数据并存入内部存储器,数据接收过程中,由于传感器为单总线传输,因此需要及时存储数值,再分别计算得到温度、湿度值;
串口通信模块包括上位机串口、下位机串口初始化,波特率9600,数据位8,停止位1,校验位无,允许串行接受状态,串口工作模式1,定时器工作方式2,开串口中断,开总中断;
显示模块为显示屏显示当前传感器采集的温度湿度值,当温度湿度值超出阈值时,显示屏显示HIGH或LOW,同时采用两个LED等表示,分别表示温度和湿度是否正常工作;
存储模块将当前阈值存于外部存储器中,使重新上电后阈值不变;
上位机能够设置串口,调整波特率、数据位、校验位等,并将设定的阈值通过串口传送至下位机,下位机将读得的温度湿度值以及与阈值比较结果传送至上位机并显示,同时每隔1秒将阈值、温度湿度值、阈值比较结果保存至指定文件中;
二、硬件设计
2.11602液晶显示屏
2.1.1引脚说明
液晶显示屏有16个管脚,其中1管脚接电源地,2管脚接电源正极,3管脚接液晶显示偏压信号,4管脚接数据/命令选择端,5管脚接读/写选择端,6管脚接使能信号,7-14管脚为数据位,15管脚接背光源正极,16管脚接背光源负极。
2.1.2基本操作时序如下
读状态:
输入:
RS=L,RW=H,E=H输出:
D0-D7=状态字
写指令:
输入:
RS=L,RW=L,D0-D7=指令码,E=高脉冲输出:
无
写数据:
输入RS=H,RW=H,E=H输出:
D0-D7=数据
写数据:
输入:
RS=H,RW=L,D0-D7=数据,E=高脉冲输出:
无
2.1.3状态字说明
2.1.4初始化过程
延时15ms
写指令38H(不检测忙信号)
延时5ms
写指令38H(不检测忙信号)
延时5ms
写指令38H(不检测忙信号)
(以后每次写指令、读/写数据操作之前均需检测忙信号)
写指令38H:
显示模式设置
写指令08H:
显示关闭
写指令01H:
显示清屏
写指令06H:
显示光标移动设置
写指令0CH:
显示开及光标设置
2.1.5接口时序说明
2.2AM2302数字温湿度传感器
2.2.1概述
AM2302数字温湿度传感器是一款有已校准数字信号输出的温湿度符合传感器。
它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。
传感器包括一个电容式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。
因此该产品具有品质优越、超快响应、干扰能力强、性价比极高等优点。
每个AM2302传感器都在极为精确的湿度校验室中进行校准。
校准系数以程序的形式储存在OTP内存中,传感器内部在检测信号的处理过程中调用这些校准系数。
单线制串行接口,使系统集成变得简易快捷。
2.2.2引脚说明
接线时,1管脚接VCC,2管脚为串行数据单总线,3管脚接地、电源负极,4管脚悬空。
2.2.3单总线接口
DATA用于微处理器与AM2302之间的通讯同步,采用单总线数据格式,一次通讯时间5ms左右,数据传输为40bit,高位先出。
数据格式:
40bit数据=16bit湿度数据+16bit温度数据+8bit校验和。
用户主机(MCU)发送一次开始信号后,AM2302从低功耗模式转换到高速模式,等待主机信号结束后,AM2302发送响应信号,送出40bit的数据,并触发一次信号采集。
空闲时总线为高电平,通讯开始时主机(MCU)拉低总线500us后释放总线,延时20-40us后从主机开始检测从机的响应信号。
从机的响应信号是一个80us左右的低电平,随后从机在拉高总线80us左右的低电平,随后从机在拉高总线80us左右代表即将进入数据传送。
2.3LY5A-L2AV4
2.3.1电源部分
电源部份采用两种输入接口。
外电源供电,采用2.1电源座,可外电源DC5V,经单向保护D1接入开关S1。
USB供电,USB供电口输入电源也经D1单向保护,送到开关S1。
注:
两路电源输入是并连的,因此只选择一路就可以了,以免出问题。
2.3.2扩展电源
内部电路的5V电源引出接口,在电源开关之后(即受电源开关的控制),可用于外扩展电路供电。
提供三组方面各种场合使用。
2.3.3复位电路
51单片机与AVR单片机的复位电平不同,前者为高电平复位,后者为低电平复位,因此设计了插针J1来转换,这也是支持51和AVR的原因所在。
J1的下插针切换复位按键的连接方式VCC和GND,51单片机连接VCC,AVR单片机连接GND,J1的上插针是为了51单片机引入上电复位电路,电容和电阻组成简单的上电复位,而对于AVR单片机内部有上电复位电路且上电复位电平也不同就无需接入,因此J1的上插针有一个空脚。
2.4X5045
2.4.1芯片简介
CS为片选信号;SO为串行输出;Sl为串行输入;SCK为串行时钟输入;WP为EEPROM写保护输入;RESET为复位信号输出;vss为地;Vcc为电源电压。
X5045使用三线总线串行(SPI)外设接口,对芯片进行操作的所有操作码、字节地址及写入的数据都从SI引脚输人,写人数据在串行时钟SCK的上升沿被锁存;从芯片读取的数据从90引脚串行移出,并在SCK的下降沿读出数据。
芯片的把关定时器和电压监视器都对单片机提供独立的保护。
当电源电压降到4.5V以下时,RESET引脚立即自动产生高电平复位信号,并一直保持到电源电压恢复正常;当系统上电或掉电时,RE.SET引脚也自动产生一个高电平复位信号;当系统发生故障时,只要把关定时器达到其可编程的超时极限,RE疆『r引脚立即自动产生一个持续200ITtS的高电平复位信号。
这样,就可有效地防止死机、数据误写及误操作等故障的发生。
X5045芯片内部有2Kx8位的串行EEP—ROM,可以擦写10万次以上,内部数据可以保存100年以上。
应用时可以通过编程对指定的块进行锁定,以防止由于误操作等原因破坏保存的数据。
cPu每隔一段时间(可编程设定)向x5045发一个触发信号,否则它将使系统复位,以保证系统不死机。
2.4.2工作原理
1)指令:
指令X5045有7条指令,对芯片所有操作都是通过对指令寄存器写命令来完成的。
所有指令、地址、数据均以高位在前的方式串行传送。
2)状态寄存器:
X5045内有一个8位状态寄存器,在任何时间都可以通过指令访问其中的内容。
复位时为0.其格式如下表所示。
WIP:
只读位,用于指示芯片是否正忙于内部非易失性的写操作;
WEL:
写使能,指示当前写使能锁存器状态;
BLl、BL0:
设置EEPRoM块保护的地址范围,下表。
WDI、WD0:
设置把关定时器的超时周期,见下表。
2.5电路连线图
三、软件设计
3.1设计思路
1)首先完成下位机功能实现,对各个芯片进行初始化,阈值设为一常数
2)完成AM2302数据读取,由于温湿度传感器采用单总线传输,控制器以8位为单位读取数据,并保存在数组中,包括湿度高8位、低8位,温度高8位、低8位,校验和
3)完成向1602显示屏写数据,显示数据时依次将数据各个位转化为对应的ASCII码显示
4)将读取的温湿度值与阈值进行比较,将值和比较结果在显示屏上显示,当出现报警信息时,有对应的led灯闪烁
5)然后实现上位机功能,运用labview对串口进行初始化,上位机、下位机采用相同的波特率、数据位、校验位等。
6)上位机中增加设置,包括温湿度阈值、串口初始化,数据保存路径,若更改串口初始化,需在下位机串口初始化程序中做出相应调整
7)将下位机读取的温湿度值及报警信息通过串口传送至上位机并显示
8)每隔1秒在指定文件中保存上位机中的阈值、温湿度值和报警信息
9)外部存储器初始化,定义读写操作,将阈值由下位机保存在外部存储器中,同时在下位机每次工作前读取外部存储器中的值,保存在阈值对应的数组中。
3.2流程图
四、结果分析或项目所实现的功能、指标
4.1原始数据
波特率9600,数据位8,校验位无;温度上限13.3,温度下限12.2,湿度上限65.2,湿度下限55.5。
可以看出,液晶屏和上位机均显示了当前温湿度值以及湿度值低于湿度下限和温度值高于温度上限的报警信息,同时下位机D27和D26同时闪烁,表示湿度和湿度均超出阈值范围。
在上位机中指定的文件路径中,保存当前数据,在每行结尾是毫秒计数结果,相邻两行计数结果大约相差1000,即每隔一秒进行数据更新
4.2更改阈值
波特率9600,数据位8,校验位无;温度上限65.5,温度下限12.2,湿度上限65.2,湿度下限55.5可以看出,液晶屏和上位机均显示了当前温湿度值以及湿度值低于湿度下限的报警信息,同时下位机D26闪烁,表示湿度超出阈值范围。
在上位机中指定的文件路径中,由于上位机对阈值进行了修改,文件信息发生改变,在每行结尾是毫秒计数结果,相邻两行计数结果大约相差1000,即每隔一秒进行数据更新
4.3更改串口设置
波特率19200,数据位8,校验位无;温度上限65.5,温度下限12.2,湿度上限65.2,湿度下限55.5上位机调整串口设置,将波特率加倍后,需要在下位机程序中做出相同调整,重新烧写程序后,实验效果与实验一相同。
4.4检测外部存储器
记录当前液晶屏和上位机显示温湿度信息,断电,重新上点后发现液晶屏和上位机显示信息保持不变,表明阈值以写入外部存储器中并能够在重新上点后读取阈值。
五、明细清单
元器件名称
单价/元
个数
AM2302
17.10
1
X5045
5.10
1
1602液晶屏
4.80
1
LY5A-L2A
58.00
1
总成本:
85元
六、设计调试中遇到的疑难问题及解决方法
汪思云:
1、上位机保存温湿度信息时无法确定更新周期,在上位机中增加毫秒计数器,并将计数结果同样保存在指定路径中
2、上位机保存温湿度信息时无法更改更新周期,需配合下位机程序中的延时函数,在不影响其他芯片正常工作的基础上,更改延时时间可以改变更新周期
3、上位机不能检测到串口,需要在LabView中增加NIVISA补丁
4、传感器为单总线传输,需要通过移位相或的方式保存数据
王冠中:
1、外部存储器供电电压不足,不能使用USB供电,需要通过电源供电
2、进行串口通信时,数据类型的处理,上位机向下位机传送阈值信息时采用字符串类型,由下位机提取字符并计算能得到温湿度阈值
3、确定何时向外部存储器写数据,在中端服务程序中,当下位机读取上位机阈值信息后即向外部存储器写数据
七、心得体会与建议
王冠中:
本次课程设计通过上位机下位机配合实现环境监测功能,自己主要负责下位机的设计,较为熟练的掌握了Keil的使用,上位机下位机串口通讯设置方法以及外部存储器的读写原理。
项目仍可以做出如下改进:
当温湿度值超出了阈值范围后,可增加蜂鸣器提示。
在教学过程中,希望老师能够更多的对学生进行针对性的指导,由于大多数学生对这类项目尚不了解,会出现很多简单而不易发现的错误,导致耽误大量时间,希望老师能在项目过程中对各个小组可能出现的问题作出提示。
汪思云:
本次课程设计让我加深了对单片机的认识,通过对LabView的学习,基本掌握了上位机的设计,采用图形化编程的方式大幅降低了编程难度。
另外,对以单总线方式传输数据的传感器有了更深入的了解,学习了如何处理传感器传输的数据。
项目可以进一步完善。
例如:
在上位机中记录各个时刻的温湿度值,并作出温湿度变化曲线图。
在本次试验中,我们也碰到了许多问题,比如USB线供电不足导致显示结果出错,后来更换成5v电源线后问题得以解决。
在这次实验中我也懂得了,先检查核对实验器材是否错误或者不全在实验的整个过程中是十分重要的,实验器材有误会严重影响整个实验的进度。
八、参考文献
[1]雷升印,周元志.X5045芯片在单片机系统中应用的研究[J].武汉理工大学学报,2003,25(3):
28-31
[2]数字温湿度传感器AM2302说明书.济南联诚创发科技有限公司电子部
[3]SMC1602ALCM使用说明书.长沙太阳人电子有限公司
九、附录
附录A上位机程序框图
附录B下位机源程序
//头文件,声明,全局变量
#include
#include
#include
#include
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
#defineFOSC12000000
#defineBAUD9600
sbitSensor_SDA=P2^0;
sbitrs=P1^0;
sbitrw=P1^1;
sbiten=P1^2;
sbitled0=P2^7;
sbitled1=P2^6;
sbitled2=P2^4;
sbitled3=P2^3;
sbitled4=P2^2;
unsignedcharSensor_Data[5]={0x00,0x00,0x00,0x00,0x00};
unsignedcharSensor_Check;//校验和
unsignedcharSensor_AnswerFlag;//收到起始标志位
unsignedcharSensor_ErrorFlag;//读取传感器错误标志
unsignedintSys_CNT;
//x5045引脚定义
sbitSCK=P0^3;//将SCK位定义为P3.4引脚
sbitSI=P0^2;//将SI位定义为P3.5引脚
sbitSO=P0^1;//将SO位定义为P3.6引脚
sbitCS=P0^0;//将SCK位定义为P3.7引脚
//功能变量定义
#defineWREN0x06//写使能锁存器允许
#defineWRDI0x04//写使能锁存器禁止
#defineWRSR0x01//写状态寄存器
#defineREAD0x03//读出
#defineWRITE0x02//写入
voidUART_init();
ucharcodetable[]="Temperature";
ucharcodetable1[]="Humidity";
ucharcodetable2[]="High";
ucharcodetable3[]="Low";
ucharbuffer,tmp;
//ucharnum,flag;
uinttmp1,tmp2;
uintTmax=250,Tmin=200,Hmax=600,Hmin=100;
ucharReceive_buffer[16];
uintints=0;
//延时
/********************************************\
|*功能:
延时晶振为12M时*|
|*延时大约1ms*|
\********************************************/
voiddelay(unsignedintt)
{
unsignedinti;
unsignedintj;
for(j=t;j>0;j--)
for(i=124;i>0;i--);//延时大约1ms
}
/********************************************\
|*功能:
延时晶振为12M时*|
|*t=1为20us然后成倍增加10us左右*|
\********************************************/
voiddelay_us(unsignedchart)
{
while(t--)
{
_nop_();
}
}
//LCD初始化
voidwritecomand(ucharpp)
{
rs=0;
rw=0;
en=0;
P0=pp;
delay
(1);
en=1;
delay
(1);
en=0;
}
/*voidwritedata(uchardd)
{
rs=1;
rw=0;
en=0;
P0=dd;
delay
(1);
en=1;
delay
(1);
en=0;
}
*/
voidlcd_init()
{
delay(15);
writecomand(0X38);
delay(5);//第一次等待5ms
writecomand(0X38);
delay(5);//第二次等待5ms
writecomand(0X38);
//////显示设置
writecomand(0X38);
//////显示关闭,写08H
writecomand(0X08);
//////显示清屏,写01H
writecomand(0X01);
//////显示光标移动设置,写06H
writecomand(0X06);
//////显示开及光标设置,写0cH
writecomand(0X0c);
}
//LCD相关
voidlcd_wcom(ucharcom)//1602写命令函数
{
rs=0;
rw=0;
P0=com;
delay(5);
en=1;
delay(5);
en=0;
}
voidlcd_wdat(uchardat)//1602写入数据
{
rs=1;
rw=0;
P0=dat;
delay(5);
en=1;
delay(5);
en=0;
}
voidlcd_clr()
{
delay(5);
rs=0;
rw=0;
P0=0x01;
en=1;
en=0;
}
//温湿传感器相关
voidClear_Data(void)//接收数据清零
{
inti;
for(i=0;i<5;i++)
{
Sensor_Data[i]=0x00;
}
}
unsignedcharRead_SensorData(void)//读取8位2进制数据
{
unsignedchari;
buffer=0;
for(i=0;i<8;i++)
{
Sensor_AnswerFlag=2;
while((!
Sensor_SDA)&&Sensor_AnswerFlag++);//检测上次低电平是否结束
//延时Min=26usMax50us跳过数据"0"的高电平
delay_us
(2);//延时30us
tmp=0;
if(Sensor_SDA)
tmp=1;
Sensor_AnswerFlag=2;
while(Sensor_SDA&&Sensor_AnswerFlag++);//等待高电平结束
if(Sensor_AnswerFlag==1)break;
buffer<<=1;
buffer|=tmp;
}
returnbuffer;
}
unsignedcharRead_Sensor(void)
{
unsignedchari;
Sensor_SDA=0;
delay(10);//主机拉低(Min=800USMax=20Ms)
Sensor_SDA=1;
delay_us
(2);//释放总线延时(Min=30usMax=50us)延时30us
Sensor_SDA=1;//主机设为输入判断传感器响应信号
//Sensor_AnswerFlag=0;//传感器响应标志
if(!
Sensor_SDA)//判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行
{
Sensor_AnswerFlag=2;//收到起始信号
//Sys_CNT=0;
while((!
Sensor_SDA)&&Sensor_AnswerFlag++);
Sensor_AnswerFlag=2;//判断从机是否发出80us的低电平响应信号是否结束
//Sys_CNT=0;
while(Sensor_SDA&&Sensor_AnswerFlag++);//判断从机是否发出80us的高电平,如发出则进入数据接收状态
//数据接收传感器共发送40位数据
//即5个字节高位先送5个字节分别为湿度高位湿度低位温度高位温度低位校验和
//校验和为:
湿度高位+湿度低位+温度高位+温度低位
for(i=0;i<5;i++)
{
Sensor_Data[i]=Read_SensorData();
}
Sensor_SDA=1;
}
return1;
}
//****************************************************************//
//AM系列读单总线使用范例
//单片机:
AT89S52或STC89C52RC
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 环境 检测