视频教程::https://www.bilibili.com/video/BV1xb4y187rF
#include< reg51.h >
#define uchar unsigned char
#define uint unsigned int
#define LCD1602_DATAPINS P0
sbit LCD1602_E=P2^2;
sbit LCD1602_RW=P2^1;
sbit LCD1602_RS=P2^0;
sbit Data=P3^0; //定义数据线
uchar T_RH,T_TH;
/*******************************************************************************
* 函 数 名 : Lcd1602_Delay1ms
* 函数功能 : 延时函数,延时1ms
* 输 入 : c
* 输 出 : 无
* 说 名 : 该函数是在12MHZ晶振下,12分频单片机的延时。
*******************************************************************************/
void Lcd1602_Delay1ms(uint c) //误差 0us
{
uchar a,b;
for (; c>0; c--)
{
for (b=199;b>0;b--)
{
for(a=1;a>0;a--);
}
}
}
/*******************************************************************************
* 函 数 名 : LcdWriteCom
* 函数功能 : 向LCD写入一个字节的命令
* 输 入 : com
* 输 出 : 无
*******************************************************************************/
void LcdWriteCom(uchar com) //写入命令
{
LCD1602_E = 0; //使能
LCD1602_RS = 0; //选择发送命令
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = com; //放入命令
Lcd1602_Delay1ms(1); //等待数据稳定
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5); //保持时间
LCD1602_E = 0;
}
/*******************************************************************************
* 函 数 名 : LcdWriteData
* 函数功能 : 向LCD写入一个字节的数据
* 输 入 : dat
* 输 出 : 无
*******************************************************************************/
void LcdWriteData(uchar dat) //写入数据
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //选择输入数据
LCD1602_RW = 0; //选择写入
LCD1602_DATAPINS = dat; //写入数据
Lcd1602_Delay1ms(1);
LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5); //保持时间
LCD1602_E = 0;
}
/*******************************************************************************
* 函 数 名 : LcdInit()
* 函数功能 : 初始化LCD屏
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void LcdInit() //LCD初始化子程序
{
LcdWriteCom(0x38); //开显示
LcdWriteCom(0x0c); //开显示不显示光标
LcdWriteCom(0x06); //写一个指针加1
LcdWriteCom(0x01); //清屏
LcdWriteCom(0x80); //设置数据指针起点
}
//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
X |= 0x80; // 算出指令码
LcdWriteCom(X); //这里不检测忙信号,发送地址码
LcdWriteData(DData);
}
//按指定位置显示一串字符
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
unsigned char ListLength;
ListLength = 0;
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
while (DData[ListLength]>=0x20) //若到达字串尾则退出
{
if (X <= 0xF) //X坐标应小于0xF
{
DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
ListLength++;
X++;
}
}
}
void DHT11_delay_ms(uint z)
{
uint i,j;
for(i=z;i >0;i--)
for(j=110;j>0;j--);
}
void DHT11_delay_us(uchar n)
{
while(--n);
}
void DHT11_start()
{
Data=1;
DHT11_delay_us(2);
Data=0;
DHT11_delay_ms(30); //延时18ms以上
Data=1;
DHT11_delay_us(30);
}
uchar DHT11_rec_byte() //接收一个字节
{
uchar i,dat=0;
for(i=0;i< 8;i++) //从高到低依次接收8位数据
{
while(!Data); ////等待50us低电平过去
DHT11_delay_us(8); //延时60us,如果还为高则数据为1,否则为0
dat< <=1; //移位使正确接收8位数据,数据为0时直接移位
if(Data==1) //数据为1时,使dat加1来接收数据1
dat+=1;
while(Data); //等待数据线拉低
}
return dat;
}
void DHT11_receive() //接收40位的数据
{
uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
DHT11_start();
if(Data==0)
{
while(Data==0); //等待拉高
DHT11_delay_us(40); //拉高后延时80us
R_H=DHT11_rec_byte(); //接收湿度高八位
R_L=DHT11_rec_byte(); //接收湿度低八位
T_H=DHT11_rec_byte(); //接收温度高八位
T_L=DHT11_rec_byte(); //接收温度低八位
revise=DHT11_rec_byte(); //接收校正位
DHT11_delay_us(25); //结束
if((R_H+R_L+T_H+T_L)==revise) //校正
{
RH=R_H;
RL=R_L;
TH=T_H;
TL=T_L;
}
T_RH = RH;
T_TH = TH;
}
}
void main()
{
LcdInit();
DisplayListChar(0,0,"asd");
while(1)
{
DHT11_receive();
DisplayOneChar(0,1,(char)(T_RH/10 + '0'));
DisplayOneChar(1,1,(char)(T_RH%10 + '0'));
DisplayOneChar(5,1,(char)(T_TH/10 + '0'));
DisplayOneChar(6,1,(char)(T_TH%10 + '0'));
Lcd1602_Delay1ms(100);
}
}
审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
传感器
+关注
关注
2545文章
50384浏览量
750670 -
Proteus
+关注
关注
79文章
1692浏览量
106254 -
DHT11
+关注
关注
19文章
276浏览量
57507
发布评论请先 登录
相关推荐
采用STMCubeMX+Proteus仿真DHT11的方法
本文说明开发工具:STM32CubeMX+Keil5开发芯片:STM32F103R6采温模块:DHT11数显屏幕:LCD1602仿真软件:Proteus 8.12项目目标:DHT11读取
发表于 11-30 08:03
dht11的工作原理_dht11接线图
本文介绍了DHT11技术参数、DHT11的特性与dht11典型应用电路,其次详细的介绍了dht11工作原理与引脚说明,最后介绍了dht11温
发表于 01-22 16:11
•23.6w次阅读
DHT11的使用注意事项
本文介绍了DHT11传感器性能参数、DHT11传感器电气特性以及 DHT11封装形式及接口说明,最后详细用例子来说明DHT11的使用以及DHT11
发表于 01-26 14:27
•6.2w次阅读
为什么加入dht11的例程读取不到dht11的数据应该如何解决
最近遇到了一个十分坑爹的问题,就是在调试我的毕业设计时候。在加入dht11的例程时,怎么都读取不到dht11的数据。
发表于 07-02 17:42
•24次下载
STMCubeMX+Proteus仿真DHT11(LCD1602显示)
本文说明开发工具:STM32CubeMX+Keil5开发芯片:STM32F103R6采温模块:DHT11数显屏幕:LCD1602仿真软件:Proteus 8.12项目目标:DHT11读取
发表于 11-21 14:06
•49次下载
DHT11温湿度传感器(详细)
DHT11温度传感器——使用LCD1602显示先上效果图,以及简单的和室内温度对比图,相交而言测量的值还是非常准的。原理讲解◎外设读取步骤主机和从机之间的通信可通过如下几个步骤完成(外设(如微处理器
发表于 12-02 21:06
•85次下载
Stm32 DHT11
DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性与卓越的长期稳定性。Stm32 驱动DHT11读取环境温湿度
发表于 12-17 18:23
•79次下载
FPGA在OLED上显示DHT11数据
这是FPGA之旅设计的第十三例啦,本例是一个综合性的例程,基于OLED屏幕显示,和DHT11温湿度采集,将DHT11采集到的温湿度显示到OLED屏幕上。
Arduino Nano 和 NodeMCU ESP8266 读取 DHT11 环境温湿度数据及 OLED显示
Arduino Nano 和 NodeMCU ESP8266 读取 DHT11 环境温湿度数据及 OLED显示
评论