標(biāo)題:
AM2302濕度測量單片機(jī)源程序
[打印本頁]
作者:
uhyiu
時(shí)間:
2017-12-14 20:33
標(biāo)題:
AM2302濕度測量單片機(jī)源程序
使用AM2302溫濕度傳感器模塊,達(dá)到測量濕度和溫度目的,并在1602上顯示出來。
單片機(jī)源程序如下:
#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; //收到起始標(biāo)志位
uchar Sensor_ErrorFlag; //讀取傳感器錯(cuò)誤標(biāo)志
uchar Sensor_Check; //校驗(yàn)和
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--);
}
/********************************************\
|* 功能: 延時(shí) 晶振為12M時(shí) *|
|* t = 1 為 20us 然后成倍增加10us左右 *|
\********************************************/
void Delay_N10us(unsigned char t)
{
while(t--)
{
_nop_();
}
}
/********************************************\
|* 功能: 延時(shí) 晶振為12M時(shí) *|
|* 延時(shí)大約 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--); //延時(shí)大約 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);//無光標(biāo)不閃
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;
}//接收數(shù)據(jù)清零
}
/********************************************\
|* 功能: 讀傳感器發(fā)送的單個(gè)字節(jié) *|
\********************************************/
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) //檢測上次低電平是否結(jié)束
{
if(++cnt >= 300)
{
break;
}
}
//延時(shí)Min=26us Max50us 跳過數(shù)據(jù)"0" 的高電平
Delay_N10us(2); //延時(shí)30us
//判斷傳感器發(fā)送數(shù)據(jù)位
tmp =0;
if(Sensor_SDA)
{
tmp = 1;
}
cnt =0;
while(Sensor_SDA) //等待高電平 結(jié)束
{
if(++cnt >= 200)
{
break;
}
}
buffer <<=1;
buffer |= tmp;
}
return buffer;
}
/********************************************\
|* 功能: 讀傳感器 *|
\********************************************/
unsigned char Read_Sensor(void)
{
unsigned char i;
//主機(jī)拉低(Min=800US Max=20Ms)
Sensor_SDA = 0;
Delay_N1ms(2); //延時(shí)2Ms
//釋放總線 延時(shí)(Min=30us Max=50us)
Sensor_SDA = 1;
Delay_N10us(1);//延時(shí)30us
//主機(jī)設(shè)為輸入 判斷傳感器響應(yīng)信號
Sensor_SDA = 1;
Sensor_AnswerFlag = 0; // 傳感器響應(yīng)標(biāo)志
//判斷從機(jī)是否有低電平響應(yīng)信號 如不響應(yīng)則跳出,響應(yīng)則向下運(yùn)行
if(Sensor_SDA == 0)
{
Sensor_AnswerFlag = 1;//收到起始信號
Sys_CNT = 0;
//判斷從機(jī)是否發(fā)出 80us 的低電平響應(yīng)信號是否結(jié)束
while((!Sensor_SDA))
{
if(++Sys_CNT>300) //防止進(jìn)入死循環(huán)
{
Sensor_ErrorFlag = 1;
return 0;
}
}
Sys_CNT = 0;
//判斷從機(jī)是否發(fā)出 80us 的高電平,如發(fā)出則進(jìn)入數(shù)據(jù)接收狀態(tài)
while((Sensor_SDA))
{
if(++Sys_CNT>300) //防止進(jìn)入死循環(huán)
{
Sensor_ErrorFlag = 1;
return 0;
}
}
// 數(shù)據(jù)接收 傳感器共發(fā)送40位數(shù)據(jù)
// 即5個(gè)字節(jié) 高位先送 5個(gè)字節(jié)分別為濕度高位 濕度低位 溫度高位 溫度低位 校驗(yàn)和
// 校驗(yàn)和為:濕度高位+濕度低位+溫度高位+溫度低位
for(i=0;i<5;i++)
{
Sensor_Data[i] = Read_SensorData();
}
}
else
{
Sensor_AnswerFlag = 0; // 未收到傳感器響應(yīng)
}
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];
//校驗(yàn)成功
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 //校驗(yàn)失敗
{
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); // 延時(shí) 2S(兩次讀取間隔至少2S)
Clear_Data(); // 清除收到數(shù)據(jù)
Read_Sensor(); // 讀取傳感器數(shù)據(jù)
check_and_display(); // 檢測并顯示數(shù)據(jù)
}
}
…………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
濕度.zip
(35.71 KB, 下載次數(shù): 99)
2017-12-14 20:33 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
siyaqq
時(shí)間:
2018-8-23 20:35
這個(gè)和
http://www.torrancerestoration.com/bbs/dpj-103762-1.html
的程序是一樣的
作者:
myuanyuli
時(shí)間:
2019-5-5 14:47
好資料,51黑有你更精彩!!!
作者:
xzddkk
時(shí)間:
2019-6-9 12:13
謝謝感謝
作者:
llxxyy
時(shí)間:
2021-5-7 16:09
無法在LCD1602上顯示溫濕度,不知道是我電路有問題 還是程序有問題
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1