欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
AM2302濕度測量單片機源程序
[打印本頁]
作者:
uhyiu
時間:
2017-12-14 20:33
標(biāo)題:
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; //收到起始標(biāo)志位
uchar Sensor_ErrorFlag; //讀取傳感器錯誤標(biāo)志
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);//無光標(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ā)送的單個字節(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;
}
}
//延時Min=26us Max50us 跳過數(shù)據(jù)"0" 的高電平
Delay_N10us(2); //延時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;
//主機拉低(Min=800US Max=20Ms)
Sensor_SDA = 0;
Delay_N1ms(2); //延時2Ms
//釋放總線 延時(Min=30us Max=50us)
Sensor_SDA = 1;
Delay_N10us(1);//延時30us
//主機設(shè)為輸入 判斷傳感器響應(yīng)信號
Sensor_SDA = 1;
Sensor_AnswerFlag = 0; // 傳感器響應(yīng)標(biāo)志
//判斷從機是否有低電平響應(yīng)信號 如不響應(yīng)則跳出,響應(yīng)則向下運行
if(Sensor_SDA == 0)
{
Sensor_AnswerFlag = 1;//收到起始信號
Sys_CNT = 0;
//判斷從機是否發(fā)出 80us 的低電平響應(yīng)信號是否結(jié)束
while((!Sensor_SDA))
{
if(++Sys_CNT>300) //防止進入死循環(huán)
{
Sensor_ErrorFlag = 1;
return 0;
}
}
Sys_CNT = 0;
//判斷從機是否發(fā)出 80us 的高電平,如發(fā)出則進入數(shù)據(jù)接收狀態(tài)
while((Sensor_SDA))
{
if(++Sys_CNT>300) //防止進入死循環(huán)
{
Sensor_ErrorFlag = 1;
return 0;
}
}
// 數(shù)據(jù)接收 傳感器共發(fā)送40位數(shù)據(jù)
// 即5個字節(jié) 高位先送 5個字節(jié)分別為濕度高位 濕度低位 溫度高位 溫度低位 校驗和
// 校驗和為:濕度高位+濕度低位+溫度高位+溫度低位
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];
//校驗成功
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(); // 清除收到數(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 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
siyaqq
時間:
2018-8-23 20:35
這個和
http://m.raoushi.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://m.raoushi.com/bbs/)
Powered by Discuz! X3.1