#include <reg52.h>
#include <intrins.h>
//#include"12864.h"
#define uchar unsigned char
#define uint unsigned int
sbit TRH = P3^3;//温湿度传感器DHT11数据接入
sbit rs=P2^5; //1602的数据/指令选择控制线
sbit rw=P2^4; //1602的读写控制线
sbit en=P2^3; //1602的使能控制线
//uchar code table[]="Ya Qiong"; //要显示的内容1放入数组tablel
//uchar code table1[]="Zhang Qi"; //要显示的内容2放入数组table1
void delay(uint n) //延时函数
{
uint x,y;
for(x=n;x>0;x--)
for(y=100;y>0;y--);
}
void lcd_wcom(uchar com) //1602写命令函数
{
rs=0; //选择指令寄存器
rw=0; //选择写
P0=com; //把命令字送入P0
delay(5); //延时一小会儿,让1602准备接收数据
en=1; //使能线电平变化,命令送入1602的8位数据口
en=0;
}
void lcd_wdat(uchar dat) //1602写数据函数
{
rs=1; //选择数据寄存器
rw=0; //选择写
P0=dat; //把要显示的数据送入P0
delay(5); //延时一小会儿,让1602准备接收数据
en=1; //使能线电平变化,数据送入1602的8位数据口
en=0;
}
void lcd_init() //1602初始化函数
{
lcd_wcom(0x38); //8位数据,双列,5*7字形
lcd_wcom(0x0c); //开启显示屏,关光标,光标不闪烁
lcd_wcom(0x06); //显示地址递增,即写一个数据后,显示位置右移一位
lcd_wcom(0x01); //清屏
}
/*void main() //主函数
{
uchar n,m=0;
lcd_init(); //液晶初始化
//lcd_wcom(0x80+0x05); //显示地址设为80H(即00H,)上排第一位
lcd_wcom(0x80+0x15);
for(m=0;m<8;m++) //将table[]中的数据依次写入1602显示
{
lcd_wdat(table[m]);
//delay(200);
}
//lcd_wcom(0x80+0x40); //重新设定显示地址为0xc4,即下排第5位
lcd_wcom(0x80+0x50);
for(n=0;n<8;n++) //将table1[]中的数据依次写入1602显示
{
lcd_wdat(table1[n]);
//delay(200);
}
for(n=0;n<16;n++)
{
lcd_wcom(0x18); //整屏左移
delay(200);
}
//delay(200);
//lcd_wcom(0x01); //清屏
while(1); //动态停机
} */
void display(int num)
{
char qian,bai,shi,ge;
//qian=num/1000;
//bai=num%1000/100;
shi=num%1000%100/10;
ge=num%10;
lcd_wdat(0x30+shi); //自动光标右移了
lcd_wdat(0x30+ge);
}
//主程序
uint TH_data,TL_data,RH_data,RL_data,CK_data;
uint TH_temp,TL_temp,RH_temp,RL_temp,CK_temp;
uint com_data,untemp,temp;
uint respond;
// 毫秒级延时子程序 ,前面有了
//5us级延时程序
void delay_us()
{
uint i = 5;
while(i--);
}
//收发信号检测,数据读取
char receive()
{
uint i;
com_data=0;
for(i=0;i<=7;i++)
{
respond=2;
while((!TRH)&&respond++);
delay_us();
delay_us();
delay_us();
if(TRH)
{
temp=1;
respond=2;
while((TRH)&&respond++);
}
else
temp=0;
com_data<<=1;
com_data|=temp;
}
return(com_data);
}
//湿度读取子程序
//温度高8位== TH_data
//温度低8位== TL_data
//湿度高8位== RH_data
//湿度低8位== RL_data
//校验 8位 == CK_data
//调用的程序有 delay();, Delay_5us();,RECEIVE();
void read_TRH()
{
//主机拉低18ms
TRH=0;
delay(18);
TRH=1;
//DATA总线由上拉电阻拉高主机延时20us
delay_us();
delay_us();
delay_us();
delay_us();
//delay_us();
//delay_us();delay_us();delay_us();delay_us();
//主机设为输入判断从机响应信号
TRH=1;
//判断DHT11是否有低电平响应信号如不响应则跳出,响应则向下运行
if(!TRH)
{
respond=2;
//判断DHT11发出 80us 的低电平响应信号是否结束
while((!TRH)&& respond++);
respond=2;
//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
while(TRH && respond++);
//数据接收状态
RH_temp = receive();
RL_temp = receive();
TH_temp = receive();
TL_temp = receive();
CK_temp = receive();
TRH=1;
//数据校验
untemp=(RH_temp+RL_temp+TH_temp+TL_temp);
if(untemp==CK_temp)
{
RH_data = RH_temp;
RL_data = RL_temp;
TH_data = TH_temp;
TL_data = TL_temp;
CK_data = CK_temp;
}
}
}
//主函数
//TH,TL,RH,RL分别代表温湿度的整数和小数部分
void main()
{
lcd_init() ;
delay(2000);
while(1)
{
read_TRH(); //
delay(2000);
//写字符
display(TH_data);
lcd_wcom(0x80+0x02); //移光标
display(TL_data);
lcd_wcom(0x80+40);
display(RH_data);
lcd_wcom(0x80+42);
display(RL_data);
/*lcd_pos(0,0);
display(TH_temp);
lcd_pos(0,2);
display(TL_temp);
lcd_pos(2,0);
display(RH_temp);
lcd_pos(2,2);
display(RL_temp);*/
}
}
dht11.zip_1602,dht11_DHT11_dht11 1602_dht11,1602
版权申诉
168 浏览量
2022-09-22
23:15:51
上传
评论
收藏 2KB ZIP 举报
局外狗
- 粉丝: 66
- 资源: 1万+
最新资源
- JSP Explorer 文件浏览器 v1.0-fileexplorer.zip
- JS+Flash让网页元素发光的插件 glow! 0.1-glow.zip
- JdonFramework开源框架 v5.1 Build20071025-jdonframework-5.1.zip
- 汽车行驶工况数据,excel,m文件
- Xshell6是一款功能强大的终端模拟器软件,主要用于远程管理和访问多种网络设备和服务器
- OPA548运放E/S脚使能后,输入电压为零时,输出电压为0.6V;电路如何设计才能使输出电压偏置为:0V
- MicrosoftRootCertificateAuthority2011.rar
- ISOSAE21434.D1-2020SAE美国汽车标准
- 奥比中光RGBD在JETSON ORIN NX的ROS程序
- SerialNumberUtil.java
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈