标题:
51单片机18b20 dht11温湿度程序代码
[打印本页]
作者:
pdh
时间:
2016-1-11 11:29
标题:
51单片机18b20 dht11温湿度程序代码
18b20 dht11的51单片机驱动程序
00000.png
(31.11 KB, 下载次数: 191)
下载附件
2016-1-11 18:55 上传
dht11单片机源程序:
#include"DHT11.h"
#include"delay.h"
#define uchar unsigned char
#define uint unsigned uint
uchar onedata;
uchar rh,rl,th,tl;
sbit JS=P1^4;
void start(void)//起始信号
{
JS=1;
delay_us(8);
JS=0;
delay_ms(20);//主机总线拉低大于18毫秒
JS=1;
delay_us(25);//发送起始信号结束后,拉高电平25US
}
uchar Receive_Byte()//接收一个字节
{
uchar i,temp;
for(i=0;i<8;i++) //接收八位数据
{
while(!JS); //等待50us的低电平开始信号结束
delay_us(25);//开始信号结束之后延时25us
temp=0; //时间在26us—28us 接收数据为‘0’
if(JS==1)
temp=1; //时间在26us—28us之后还为高电平 接收数据为‘1’
while(JS); //等待数据信号高电平26us—28us 接收数据为‘0’,70us为‘1’
onedata<<=1;
onedata|=temp;
}
return onedata;
}
void receive(void)//接收数据
{
uchar t_h,t_l,r_h,r_l;
uchar check,num_check;
start(); //开始信号
JS=1; //主机何为输入,判断从机 DUL11 相应信号
if(!JS) //判断从机是否有低电平响应信号
{
while(!JS);//判断从机发出80us的低电平响应信号是否结束
while(JS); //判断从机80us的高电平是否结束 结束则主机进入接收状态
r_h=Receive_Byte();
r_l=Receive_Byte();
t_h=Receive_Byte();
t_l=Receive_Byte();
check=Receive_Byte(); //校验位
JS=0;
delay_us(50);//当最后一位数据接收完毕时从机拉低50us的低电平
JS=1; //主机有上啦电阻拉高进入空闲状态
num_check=r_h+r_l+t_h+t_l;
if(num_check==check)
{
rh=r_h;
rl=r_l;
th=t_h;
tl=t_l;
check=num_check;
}
}
}
void Get_Air_Humidity() //获取空气湿度
{
start(); //DHT11起始信号
receive();//获取DHT11温湿度
//SendData_Uart1(rh);//串口输出湿度值
}
复制代码
ds18b20单片机源程序:
#include"DS18B20.h"
#define uchar unsigned char
#define uint unsigned int
//18b20测温
sbit DQ=P3^6;
sbit boom=P3^5;
uchar fuhao; //判断温度的正负
uchar temp_int=0;//定义温度的整数部分
uint temp_point=0;//定义温度的小数部分
uint temp,tempflag=261;
//char a,b,c,d,e,f,g,h;
//void delay(uchar i)
//{
// while(i--);
//}
/*初始化18b20*/
void Init_18b20(void)
{
P3M1=0X00;
P3M0=0X40;
DQ=1; //复位18b20
delay_us(16);
DQ=0; //拉低DQ
delay_us(160);
DQ=1; //拉高DQ
delay_us(100);
}
/*读一个字节*/
ReadOneChar(void)
{
uchar i=0;
uchar dat=0;
P3M1=0X00;
P3M0=0X00;
for(i=8;i>0;i--)
{
DQ=0; //给脉冲信号
dat>>=1;
delay_us(1);
DQ=1; //给脉冲信号
if(DQ)
{
dat|=0x80;
}
delay_us(20);
}
return(dat);
}
/*写一个字节*/
void WriteOneChar(uchar dat)
{
uchar i=0;
P3M1=0X00;
P3M0=0X40;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay_us(20);
DQ=1;
dat>>=1;
}
delay_us(8);
}
/*写RAm中的三四字节的内容*/
void Write_Calm(void)
{
Init_18b20();
WriteOneChar(0xCC);//跳过读序列号操作
WriteOneChar(0x4E);//写温度上下限及配置寄存器
WriteOneChar(50); //写温度上限
WriteOneChar(0); //写温度下限
WriteOneChar(0x7f);//默认十二位精度
}
/*读取温度*/
void ReadTemperature(void)
{
uchar low=0;
uchar high=0;
uint t=0;
Init_18b20();
WriteOneChar(0xCC); //跳过读序列号操作
WriteOneChar(0x44); //启动温度转换
LCD_write_Num(36,1,temp_int);
Init_18b20();
WriteOneChar(0xCC); //跳过读序列号操作
WriteOneChar(0xBE); //读取温度寄存器等(共9个可读寄存器)前两个就是温度
low=ReadOneChar(); //读取温度最低值
high=ReadOneChar(); //读取温度最高值
fuhao=high&0xf0; //取得温度的符号,fuhao==0温度为正或0,否则为负
if(fuhao!=0)
{
t=65536-(high<<8|low)+1;
high=t/256;
low=t%256;
}
temp_point=(low&0x0f)*625;
low=low>>4; //低位右移4位,舍弃小数部分
high=high<<4; //高位左移4为,舍弃符号位
temp_int=high|low;
temp=temp_int%100*10+temp_point/1000;
}
复制代码
完整代码(包含头文件)下载:
温湿度.rar
(2.64 KB, 下载次数: 138)
2016-1-11 11:29 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
whengfu
时间:
2016-1-11 11:37
下载来学习一下楼主编程技巧
作者:
pdh
时间:
2016-1-13 12:28
可以的,其实我很菜的。
作者:
pengrubin
时间:
2016-8-7 05:51
喜欢。收下了。
作者:
Skylake
时间:
2016-12-13 14:03
感谢分享,十分有用
作者:
单片机热爱796
时间:
2017-2-1 11:07
顶楼主,赞一个
作者:
wbsazqnmam
时间:
2017-2-18 11:40
下载来学习一下楼主编程技巧,顶一下
作者:
lyf898
时间:
2017-4-3 15:18
这个很有用
作者:
zhu2233912
时间:
2017-4-18 11:11
51黑有你更精彩
作者:
倾国倾城123
时间:
2017-4-21 17:25
都需要黑币 好无奈
作者:
leifeng
时间:
2017-7-27 16:29
delay.h 文件怎么没有
作者:
老师金
时间:
2018-5-6 13:14
学习学习
作者:
卡萨丁斯柯达
时间:
2018-6-26 02:19
编译不过
作者:
huangzhiquan
时间:
2018-10-31 23:13
很给力哈
作者:
shyongc
时间:
2018-11-26 09:17
感谢楼主分享
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1