标题:
基于15w系列单片机的温湿度传感器DHT11程序
[打印本页]
作者:
苏海
时间:
2020-2-18 09:07
标题:
基于15w系列单片机的温湿度传感器DHT11程序
亲测可行。头文件网上随便搜都有。LCD 数据口是P4端口。
IMG_20200218_090405.jpg
(2.01 MB, 下载次数: 37)
下载附件
2020-2-18 09:06 上传
单片机源程序如下:
#include<15w.H>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS = P5^5; //定义端口
sbit RW = P5^4;
sbit EN = P5^3;
sbit io=P1^0;//dht11data端接单片机的P1^0口//
typedef bit BOOL;//此声明一个布尔型变量即真或假//
uchar data_byte;
uchar RH,RL,TH,TL;
void Delay25ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 2;
j = 13;
k = 237;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay8us() //@11.0592MHz
{
unsigned char i;
_nop_();
_nop_();
i = 19;
while (--i);
}
void Delay27us() //@11.0592MHz
{
unsigned char i;
_nop_();
i = 72;
while (--i);
}
/**************************dht11测试某块*************************************/
void start()//开始信号
{
io=1;
Delay8us();
io=0;
Delay25ms();// 主机把总线拉低必须大于18ms保证DHT11能检测到起始信号
io=1; //发送开始信号结束后拉高电平延时20-40us
Delay8us();//以下三个延时函数差不多为24us符合要求
Delay8us();
Delay8us();
}
uchar receive_byte()//接收一个字节//
{
uchar i,temp;
for(i=0;i<8;i++)//接收8bit的数据
{
while(!io);//等待50us的低电平开始信号结束
Delay27us();//开始信号结束之后延时26us-28us以下三个延时函数
temp=0;//时间为26us-28us表示接收的为数据'0'
if(io==1)
temp=1; //如果26us-28us之后还为高电平则表示接收的数据为'1'
while(io);//等待数据信号高电平'0'为26us-28us'1'为70us
data_byte<<=1;//接收的数据为高位在前右移
data_byte|=temp;
}
return data_byte;
}
void receive()//接收数据//
{
uchar T_H,T_L,R_H,R_L,check,num_check,i;
start();//开始信号//
io=1; //主机设为输入判断从机DHT11响应信号
if(!io)//判断从机是否有低电平响应信号//
{
while(!io);//判断从机发出 80us 的低电平响应信号是否结束//
while(io);//判断从机发出 80us 的高电平是否结束如结束则主机进入数据接收状态
R_H=receive_byte();//湿度高位
R_L=receive_byte();//湿度低位
T_H=receive_byte();//温度高位
T_L=receive_byte();//温度低位
check=receive_byte();//校验位
io=0; //当最后一bit数据接完毕后从机拉低电平50us//
for(i=0;i<7;i++)//差不多50us的延时
Delay8us();
io=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;
}
}
}
/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
长度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
void DelayMs(unsigned char t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
/*------------------------------------------------
判忙函数
------------------------------------------------*/
bit LCD_Check_Busy(void)
{
P4= 0xFF;
RS=0;
RW=1;
EN=0;
_nop_();
EN=1;
return (bit)(P4 & 0x80);
}
/*------------------------------------------------
写入命令函数
------------------------------------------------*/
void LCD_Write_Com(unsigned char com)
{
while(LCD_Check_Busy()); //忙则等待
RS=0;
RW=0;
EN=1;
P4= com;
_nop_();
EN=0;
}
/*------------------------------------------------
写入数据函数
------------------------------------------------*/
void LCD_Write_Data(unsigned char Data)
{
while(LCD_Check_Busy()); //忙则等待
RS=1;
RW=0;
EN=1;
P4= Data;
_nop_();
EN=0;
}
/*------------------------------------------------
清屏函数
------------------------------------------------*/
void LCD_Clear(void)
{
LCD_Write_Com(0x01);
DelayMs(5);
}
/*------------------------------------------------
写入字符串函数
------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
{
if (y == 0)
{
LCD_Write_Com(0x80 + x); //表示第一行
}
else
{
LCD_Write_Com(0xC0 + x); //表示第二行
}
while (*s)
{
LCD_Write_Data( *s);
s ++;
}
}
/*------------------------------------------------
写入字符函数
------------------------------------------------*/
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)
{
if (y == 0)
{
LCD_Write_Com(0x80 + x);
}
else
{
LCD_Write_Com(0xC0 + x);
}
LCD_Write_Data( Data);
}
/*------------------------------------------------
初始化函数
------------------------------------------------*/
void LCD_Init(void)
{
LCD_Write_Com(0x38); /*显示模式设置*/
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
LCD_Write_Com(0x08); /*显示关闭*/
LCD_Write_Com(0x01); /*显示清屏*/
LCD_Write_Com(0x06); /*显示光标移动设置*/
DelayMs(5);
LCD_Write_Com(0x0C); /*显示开及光标设置*/
}
void main()
{
P0M0 = 0x00;
P0M1 = 0x00;
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
全部资料51hei下载地址:
DHT11.rar
(25.27 KB, 下载次数: 16)
2020-2-18 09:06 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1