stc90c51单片机开发板和sht11温湿度传感器连接测量温湿度的具体程序
1个回答
展开全部
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uint hum,temp,i; //定义湿度、温度(全局)
uchar hum_h,hum_l,temp_h,temp_l,check,cnt=0; //湿度高、低8位,温度高、低8位,校验位
uchar bai,shi,ge,bai1,shi1,ge1; //数码管 ,cnt=0
uchar code table[]={0xfb,0xfd,0xfe};//位选数组
uchar code table1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //无小数点
uchar code table2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //有小数点
sbit dht=P2^4;
/******************************
邮保╱s级)函数
******************************/
void delay_us(uint i)
{
while(i--);
}
/******************************
延时(ms级)函数
******************************/
void delay(uint z)
{
uint x,y;
for (x=z;x>0;x--)
for(y=100;y>0;y--);
}
/***********************************
温湿度初始化(准备传送数据)函数
***********************************/
void dht_init()
{
dht=0;
delay_us(50); //拉低延时500微秒,发送开始信号
dht=1; //释放总线,延时30微秒
delay_us(4);
while(!dht); //拉低等待
while(dht); // 拉高等待,即将传送数据
}
/************************************
读取字节函数
************************************/
uchar read_byte()
{
uchar n,byte=0,dat;
for(n=0;n<8;n++)
{
while(!dht);
delay_us(4); //理论上28us<延时<70us,此处写2--6都可以
dat=0;
if(dht)
dat=1;
while(dht);
byte<<=1;
byte|=dat;
}
return byte;
}
/********************************
读40位数据函数
********************************/
void read_hum_temp()
{
dht_init();
hum_h=read_byte(); //读湿度
hum_l=read_byte();
temp_h=read_byte(); //读温度
temp_l=read_byte();
check=read_byte(); //读校验
while(!dht);// 等待低电平结束
dht=1; //最后拉高总线
}
/************************************
数据转化函数
提取各位数字
************************************/
void zhuanhuan()
{
uchar a;
a=hum_h+hum_l+temp_h+temp_l;
if(a==check)
{
hum=temp=0;
hum=((hum|hum_h)<<8)|hum_l;
temp=((temp|temp_h)<<8)|temp_l;
bai=temp/100;
shi=temp%100/10;
ge=temp%10;
bai1=hum/100;
shi1=hum%100/10;
ge1=hum%10;
}
else bai=shi=ge=bai1=shi1=ge1=0;
}
void saomiao1()//温度
{
P2=table[0];
P0=table1[ge];
delay(1);
P0=0X00;
P2=table[1];
P0=table2[shi];
delay(1);
P0=0X00;
P2=table[2];
P0=table1[bai];
delay(1);
P0=0X00;
}
void saomiao2()//湿度
{
P2=table[0];
P0=table1[ge1];
delay(1);
P2=table[1];
P0=table2[shi1];
delay(1);
P2=table[2];
P0=table1[bai1];
delay(1);
}
//===================================================
void main()
{
delay(200);
while(1)
{
read_hum_temp();
zhuanhuan();
for(i=0;i<1500;i++)
{
saomiao1() ;
}
delay(500);
}
}
#define uchar unsigned char
#define uint unsigned int
uint hum,temp,i; //定义湿度、温度(全局)
uchar hum_h,hum_l,temp_h,temp_l,check,cnt=0; //湿度高、低8位,温度高、低8位,校验位
uchar bai,shi,ge,bai1,shi1,ge1; //数码管 ,cnt=0
uchar code table[]={0xfb,0xfd,0xfe};//位选数组
uchar code table1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //无小数点
uchar code table2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //有小数点
sbit dht=P2^4;
/******************************
邮保╱s级)函数
******************************/
void delay_us(uint i)
{
while(i--);
}
/******************************
延时(ms级)函数
******************************/
void delay(uint z)
{
uint x,y;
for (x=z;x>0;x--)
for(y=100;y>0;y--);
}
/***********************************
温湿度初始化(准备传送数据)函数
***********************************/
void dht_init()
{
dht=0;
delay_us(50); //拉低延时500微秒,发送开始信号
dht=1; //释放总线,延时30微秒
delay_us(4);
while(!dht); //拉低等待
while(dht); // 拉高等待,即将传送数据
}
/************************************
读取字节函数
************************************/
uchar read_byte()
{
uchar n,byte=0,dat;
for(n=0;n<8;n++)
{
while(!dht);
delay_us(4); //理论上28us<延时<70us,此处写2--6都可以
dat=0;
if(dht)
dat=1;
while(dht);
byte<<=1;
byte|=dat;
}
return byte;
}
/********************************
读40位数据函数
********************************/
void read_hum_temp()
{
dht_init();
hum_h=read_byte(); //读湿度
hum_l=read_byte();
temp_h=read_byte(); //读温度
temp_l=read_byte();
check=read_byte(); //读校验
while(!dht);// 等待低电平结束
dht=1; //最后拉高总线
}
/************************************
数据转化函数
提取各位数字
************************************/
void zhuanhuan()
{
uchar a;
a=hum_h+hum_l+temp_h+temp_l;
if(a==check)
{
hum=temp=0;
hum=((hum|hum_h)<<8)|hum_l;
temp=((temp|temp_h)<<8)|temp_l;
bai=temp/100;
shi=temp%100/10;
ge=temp%10;
bai1=hum/100;
shi1=hum%100/10;
ge1=hum%10;
}
else bai=shi=ge=bai1=shi1=ge1=0;
}
void saomiao1()//温度
{
P2=table[0];
P0=table1[ge];
delay(1);
P0=0X00;
P2=table[1];
P0=table2[shi];
delay(1);
P0=0X00;
P2=table[2];
P0=table1[bai];
delay(1);
P0=0X00;
}
void saomiao2()//湿度
{
P2=table[0];
P0=table1[ge1];
delay(1);
P2=table[1];
P0=table2[shi1];
delay(1);
P2=table[2];
P0=table1[bai1];
delay(1);
}
//===================================================
void main()
{
delay(200);
while(1)
{
read_hum_temp();
zhuanhuan();
for(i=0;i<1500;i++)
{
saomiao1() ;
}
delay(500);
}
}
追问
是不是直接写入单片机就行啊?
追答
恩 可以的
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询