标题:
IAP15F2K61S2单片机+DHT11源程序
[打印本页]
作者:
15936895147
时间:
2019-7-17 13:29
标题:
IAP15F2K61S2单片机+DHT11源程序
IAP15F2K61S2单片机 + DHT11 亲测可以实现功能,欢迎大家下载
单片机源程序如下:
/*********************************************************************************************
程序名: DHT11驱动程序
*********************************************************************************************
说明:1、单片机是IAP15F61S2,晶振频率12MHz,实验成功。换用12T单片机或别的晶振的时候要修改
延时函数和JUDGE。程序里判断超时的变量t的阀值也要改。15F单片机处理速度快一点,51的慢,
2、好东西要共享,大家随意折腾~~
*********************************************************************************************/
char Check (void);
typedef unsigned char uchar;
typedef unsigned int uint;
#define JUDGE 30 //用于判断通信的0和1,与单片机速度和晶振频率有关
sbit DATA = P1^1; //定义数据引脚
uchar dat_r[5],checkout; //用于存放从DHT11读取到的数值
/* checkout 为校验位;
dat_r[0]->温度整数
dat_r[1]->温度小数
dat_r[2]->湿度整数
dat_r[3]->湿度小数
dat_r[4]->校验位
dat_r[1]->温度小数
*/
/*********************************************************************************************
函数名:延时函数
调 用:Delay30us();/Delay20ms();/Delay1s();
参 数:无
返回值:无
结 果:延时相应时间
备 注:振荡晶体为12MHz(所有延时函数Copy自STC-ISP(v6.85).exe)
**********************************************************************************************/
void Delay30us() //@12.000MHz
{
unsigned char i;
i = 87;
while (--i);
}
void Delay20ms() //@12.000MHz
{
unsigned char i, j, k;
i = 1;
j = 234;
k = 113;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay1s() //@12.000MHz
{
unsigned char i, j, k;
i = 46;
j = 153;
k = 245;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
/*********************************************************************************************
函数名:DHT11读数据函数
调 用:? = GetData();
参 数:无
返回值:失败->-1,-2,-3,-4;成功->0
结 果:读DHT11数据并保存到数组dat_r[]
备 注:
**********************************************************************************************/
char GetData (void)
{
uchar i,j; //for循环变量
uchar t; //超时判断
uchar dat8=0; //一次读取的8位数据,需要读5次
DATA = 0; //主机发起始信号
Delay20ms(); //主机拉低总线至少18ms
DATA = 1; //主机拉高总线20~40us
Delay30us();
t = 80; //设置超时等待时间
while(DATA && t--); //等待DHT11拉低总线
if(t == 0) //超时
{
DATA = 1;
return -1; //通信错误退出,返回错误信号:-1
}
//等80us响应信号
t = 250; //设置超时等待时间
while(!DATA && t--); //等待DHT11拉高总线
if(t == 0) //超时
{
DATA = 1;
return -2; //通信错误退出,返回错误信号:-2
}
//等80us响应信号
t = 250; //设置超时等待时间
while(DATA && t--); //等待DHT11拉低总线
if(t == 0) //超时
{
DATA = 1;
return -3; //通信错误退出,返回错误信号:-3
}
for(j=0; j<5; j++) //5次读取
{
for(i=0; i<8; i++) //1次8个位
{
//等待50us开始时隙
t = 150; //设置超时等待时间
while(!DATA && t--); //等待DHT11拉高总线
if(t == 0) //超时
{
DATA = 1;
return -4; //通信错误退出,返回错误信号:-4
}
t = 0; //记录时间清零
while(DATA && ++t); //等待并记录高电平持续时间
dat8 <<= 1;
if(t > JUDGE) //高电平持续时间较长(70us)
dat8 += 1; //传输值为1
//else dat8 += 0;
}
dat_r[j] = dat8;
}
Delay30us(); //等待DHT11拉低50us
Delay30us();
DATA = 1; //结束,拉高总线
checkout = Check();
if(checkout == 0)return 0; //校验成功,返回成功信号
else return(88); //返回不成功
}
/*********************************************************************************************
函数名:数据校验函数
调 用:? = Check();
参 数:无
返回值:成功->0;失败->-1;
结 果:数据校验
备 注:数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。
**********************************************************************************************/
char Check (void)
{
uchar i; //for循环变量
uint chk=0; //校验和
for(i=0; i<4; i++)
chk += dat_r[i]; //累加
if((uchar)chk != dat_r[4]) //比对
return -1; //返回错误信号:-1
else
return 0; //返回正确信号:0
}
复制代码
#include <REGX51.H>
#include <init.c>
#include <DHT11.c>
unsigned int cp,adc,cp1;
char kk,mm,temp,hum;
void display()
{
unsigned char j;
P0 = 0xff;
switch(j)
{
case 0:display_mm(0x01,0xc0);break;
case 1:display_mm(0x02,0xc0);break;
case 2:display_mm(0x04,seg[hum/10]);break;
case 3:display_mm(0x08,seg[hum%10]);break;
case 4:display_mm(0x10,0xbf);break;
case 5:display_mm(0x20,0xbf);break;
case 6:display_mm(0x40,seg[temp/10]);break;
case 7:display_mm(0x80,seg[temp%10]);break;
}j++;if(j >= 8) j = 0;
}
void T0_isr()interrupt 1
{
TH0 = (65536-2000)/256;
TL0 = (65536-2000)%256;
cp++;
display();
}
void T0_init()
{
TMOD = 0x01;
TH0 = (65536-2000)/256;
TL0 = (65536-2000)%256;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void main()
{
T0_init();
ULN2003(0x00);
led(0x00);
Delay1s();
while(1)
{
if(cp >= 1000) //读取数据时间不能小于1秒 时间 > 1s
{
cp = 0;
kk = GetData();//读取数据
}
if(kk == 0) //数据读取成功
{
hum = dat_r[0];
temp = dat_r[2];
}
}
}
复制代码
所有资料51hei提供下载:
温湿度传感器—DHT11.zip
(27.06 KB, 下载次数: 20)
2019-7-17 13:26 上传
点击文件名下载附件
温度传感器DHT11用的是IAP15F2K61S2单片机
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1