标题:
AM2302湿度测量单片机源程序
[打印本页]
作者:
uhyiu
时间:
2017-12-14 20:33
标题:
AM2302湿度测量单片机源程序
使用AM2302温湿度传感器模块,达到测量湿度和温度目的,并在1602上显示出来。
单片机源程序如下:
#include<reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]=" WELCOME ";
uchar code table1[]="RH: %";
uchar code table2[]="Sensor Not";
uchar code table3[]="Connected";
uchar code table4[]="Check wrong";
sbit Sensor_SDA = P2^0;
sbit key_set=P2^1;
sbit key_up=P2^2;
sbit key_down=P2^3;
sbit key_ok=P2^4;
sbit lcdrs=P2^6;
sbit lcdwr=P2^5;
sbit lcden=P2^7;
uchar Sensor_Data[5]={0x00,0x00,0x00,0x00,0x00};
uchar Sensor_AnswerFlag; //收到起始标志位
uchar Sensor_ErrorFlag; //读取传感器错误标志
uchar Sensor_Check; //校验和
uint Sys_CNT;
uint Tmp;
uint t0;
uchar num;
uchar flag;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=123;y>0;y--);
}
/********************************************\
|* 功能: 延时 晶振为12M时 *|
|* t = 1 为 20us 然后成倍增加10us左右 *|
\********************************************/
void Delay_N10us(unsigned char t)
{
while(t--)
{
_nop_();
}
}
/********************************************\
|* 功能: 延时 晶振为12M时 *|
|* 延时大约 1ms *|
\********************************************/
void Delay_N1ms(unsigned int t)
{
unsigned int i;
unsigned int j;
for(j=t;j>0;j--)
for(i=124;i>0;i--); //延时大约 1ms
}
void write_com(uchar com)
{
lcdrs=0;
P0=com;
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date)
{
lcdrs=1;
P0=date;
lcden=1;
delay(5);
lcden=0;
}
void diyihang(uint z)
{
z--;
write_com(0x80+z);
}
void dierhang(uint z)
{
z--;
write_com(0x80+0x40+z);
}
void init_1602()
{
lcdwr=0;
lcden=0;
write_com(0x38);//模式
write_com(0x0c);//无光标不闪
write_com(0x01);//清屏
diyihang(1);//显示位置
for(num=0;num<11;num++)
{
write_date(table[num]);
//delay(10);
}
dierhang(1);//换行显示
for(num=0;num<10;num++)
{
write_date(table1[num]);
//delay(10);
}
}
void Clear_Data (void)
{
int i;
for(i=0;i<5;i++)
{
Sensor_Data[i] = 0x00;
}//接收数据清零
}
/********************************************\
|* 功能: 读传感器发送的单个字节 *|
\********************************************/
unsigned char Read_SensorData(void)
{
unsigned char i,cnt;
unsigned char buffer,tmp;
buffer = 0;
for(i=0;i<8;i++)
{
cnt=0;
while(!Sensor_SDA) //检测上次低电平是否结束
{
if(++cnt >= 300)
{
break;
}
}
//延时Min=26us Max50us 跳过数据"0" 的高电平
Delay_N10us(2); //延时30us
//判断传感器发送数据位
tmp =0;
if(Sensor_SDA)
{
tmp = 1;
}
cnt =0;
while(Sensor_SDA) //等待高电平 结束
{
if(++cnt >= 200)
{
break;
}
}
buffer <<=1;
buffer |= tmp;
}
return buffer;
}
/********************************************\
|* 功能: 读传感器 *|
\********************************************/
unsigned char Read_Sensor(void)
{
unsigned char i;
//主机拉低(Min=800US Max=20Ms)
Sensor_SDA = 0;
Delay_N1ms(2); //延时2Ms
//释放总线 延时(Min=30us Max=50us)
Sensor_SDA = 1;
Delay_N10us(1);//延时30us
//主机设为输入 判断传感器响应信号
Sensor_SDA = 1;
Sensor_AnswerFlag = 0; // 传感器响应标志
//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
if(Sensor_SDA == 0)
{
Sensor_AnswerFlag = 1;//收到起始信号
Sys_CNT = 0;
//判断从机是否发出 80us 的低电平响应信号是否结束
while((!Sensor_SDA))
{
if(++Sys_CNT>300) //防止进入死循环
{
Sensor_ErrorFlag = 1;
return 0;
}
}
Sys_CNT = 0;
//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
while((Sensor_SDA))
{
if(++Sys_CNT>300) //防止进入死循环
{
Sensor_ErrorFlag = 1;
return 0;
}
}
// 数据接收 传感器共发送40位数据
// 即5个字节 高位先送 5个字节分别为湿度高位 湿度低位 温度高位 温度低位 校验和
// 校验和为:湿度高位+湿度低位+温度高位+温度低位
for(i=0;i<5;i++)
{
Sensor_Data[i] = Read_SensorData();
}
}
else
{
Sensor_AnswerFlag = 0; // 未收到传感器响应
}
return 1;
}
void display()
{
Tmp = Sensor_Data[2]*256+Sensor_Data[3];
diyihang(6);
/*write_date(Tmp/100%10 + '0');
write_date(Tmp/10%10 + '0');
write_date('.');
write_date(Tmp%10 + '0'); */
Tmp = Sensor_Data[0]*256+Sensor_Data[1];
dierhang(6);
write_date(Tmp/100%10 + '0');
write_date(Tmp/10%10 + '0');
write_date('.');
write_date(Tmp%10 + '0');
}
void check_and_display()
{
if(Sensor_AnswerFlag == 1)
{
Sensor_Check = Sensor_Data[0]+Sensor_Data[1]+Sensor_Data[2]+Sensor_Data[3];
//校验成功
if(Sensor_Check ==Sensor_Data[4])
{
if(flag == 1)
{
flag = 0;
write_com(0x01);//清屏
diyihang(1);//显示位置
for(num=0;num<11;num++)
{
write_date(table[num]);
//delay(10);
}
dierhang(1);//换行显示
for(num=0;num<10;num++)
{
write_date(table1[num]);
//delay(10);
}
}
display();
}
else //校验失败
{
write_com(0x01);//清屏
diyihang(1);//显示位置
for(num=0;num<11;num++)
{
write_date(table4[num]);
//delay(10);
}
flag=1;
}
}
else //没有连接上
{
key_set=0;
write_com(0x01);//清屏
diyihang(1);//显示位置
for(num=0;num<10;num++)
{
write_date(table2[num]);
//delay(10);
}
dierhang(1);//换行显示
for(num=0;num<9;num++)
{
write_date(table3[num]);
//delay(10);
}
flag=1;
}
}
/*void init_t0()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}*/
void main()
{
init_1602();
while(1)
{
Delay_N1ms(2000); // 延时 2S(两次读取间隔至少2S)
Clear_Data(); // 清除收到数据
Read_Sensor(); // 读取传感器数据
check_and_display(); // 检测并显示数据
}
}
…………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
湿度.zip
(35.71 KB, 下载次数: 99)
2017-12-14 20:33 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
siyaqq
时间:
2018-8-23 20:35
这个和
http://www.51hei.com/bbs/dpj-103762-1.html
的程序是一样的
作者:
myuanyuli
时间:
2019-5-5 14:47
好资料,51黑有你更精彩!!!
作者:
xzddkk
时间:
2019-6-9 12:13
谢谢感谢
作者:
llxxyy
时间:
2021-5-7 16:09
无法在LCD1602上显示温湿度,不知道是我电路有问题 还是程序有问题
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1