OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5161|回复: 1

求DHT21(AM2301)温湿度传感器 驱动程序一份 谢谢!!!

[复制链接]

2

主题

2

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2014-12-3
在线时间
0 小时
发表于 2014-12-15 10:49:47 | 显示全部楼层 |阅读模式
5金钱
这是我自己写的,芯片采用stc12c5a60s2。最大的问题就是不能实时显示温湿度,单片机掉电后无法保存。
/*--------------------延时(10us级)------------------*/
void delay_us(uint i)
{
while(i--);
}
/*--------------------延时(ms级)------------------*/
void delay(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}

/*--------------温湿度初始化(准备传送数据)----------*/
void dht_init()
{
// delay(1000); //延时一会,避开不稳定区域
dht=0;  //拉低延时800微秒,发送开始信号
delay(5);
dht=1;  //释放总线,延时80微秒
delay_us(40);
while(!dht); //拉低等待
while(dht); //拉高等待,即将传送数据
}

uchar read_byte()
{
uchar n,byte=0,dat;
for(n=0;n<8;n++)
{
   while(!dht);
delay_us(40);   //理论上28us<延时<70us,此处写2--6都可以
dat=0;
if(dht)  
dat=1;
while(dht);
byte<<=1;
byte|=dat; 
//byte=(byte<<=1)|dat; //0
}
return byte;
}    
/*----------------------读40位数据---------------------*/
void read_hum_temp()
{
    
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() //提取各位数字
{    uint hum,temp;
uchar a;
a=hum_h+hum_l+temp_h+temp_l;
if(a==check)
{

hum=temp=0;   //hum湿度 temp温度  全局
hum=((hum|hum_h)<<8)|hum_l;
temp=((temp|temp_h)<<8)|temp_l;
bai3=hum/100;
shi3=hum%100/10;
ge3=hum%100%10;
bai4=temp/100;
shi4=temp%100/10;
ge4=temp%100%10;
}
else bai3=shi3=ge3=bai4=shi4=ge4=1;
    
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-12-15 19:36:59 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 08:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表