dht11在12864上显示
发布时间:2024-10-18
发布时间:2024-10-18
仅供初学者使用
//此程序仅供初学者使用在观看时请上网上自行下载说明书
//如有解释有误或者看不懂地方可通过百度账号与我联系
// 此程序为本人刚刚开始学习单片机时写的本人建议初学者不要挑此类传感器浪费时间耽误学习
//此处用到的实验板是郭天祥51单片机
#include<reg52.h>
#include <intrins.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
uchar busy; //12864判忙标志
uchar dis0[]={"以下是当前温湿度"};
uchar dis1[]={"湿度温度"};
uchar dis2[]={"阀值"};
sbit LCM_CS = P3^5; //12864片选段(命令数据选择端)
sbit LCM_RW = P3^6; //12864读些段
sbit LCM_EN = P3^4; //12864使能端
sbit LCM_POS = P1^3; //12864串并口选择端
#define Lcd_data P0 //定义12864数据总线为P0口
sbit p33= P2^1;//dht11数据输入口
//延时程序部分//dht11数据口
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=114;j>0;j--);
}
//12864部分
void chk_busy() //测忙{
do
{
LCM_EN=0;
LCM_RW=1;
LCM_CS=0;
LCM_EN=1;
busy=Lcd_data;
LCM_EN=0;
delayms(1);
} while(busy&&0x80==1);
}
仅供初学者使用
//写指令到LCD(底层)
void write_com(uchar cmdcode)
{
LCM_CS=0;
LCM_RW=0;
LCM_EN=1;
Lcd_data=cmdcode;
LCM_EN=0;
delayms(5);
}
//写数据到LCD(底层)
void write_data(uchar Dispdata)
{
chk_busy();
LCM_CS=1;
LCM_RW=0;
LCM_EN=1;
Lcd_data=Dispdata;
LCM_EN=0;
delayms(5);
}
/*set position*/
void lcd_pos(uchar X,uchar Y) //地址{
uchar pos;
if(X==0)
{
X=0x80;
}
else if(X==1)
{
X=0x90;
}
else if(X==2)
{
X=0x88;
}
else if(X==3)
{
仅供初学者使用
X=0x98;
}
pos=X+Y;
write_com(pos);//diaplay the address
}
//dht11程序部分
typedef unsigned char U8;//全局变量uchar类型意思是可接收8位二进制
typedef unsigned int U16;//全局变量uint类型意思是可接受16位二进制
U8 U8FLAG;
U8 U8temp;
U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;//分别代表高8位温度,低八位温度,高八位湿度,低八位湿度,校验和
U8
U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_t emp;//同上
U8 U8comdata;
U8 count; //数据接收变量
void Delay(U16 j) //100us延时
{
U8 i;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
void Delay_10us(void) //进入函数3us
{
U8 i;
i--;
i--;
i--;
i--;
i--;
i--;
}
void COM(void)
{
U8 i;
for(i=0;i<8;i++)
{
U8FLAG=2;//将其赋值为2所以下段程序中其变量只能执行253此每次约1us 做延时用的
仅供初学者使用
while((!p33)&&U8FLAG++);//由于初始时主机将数据线拉低大约时间记不清了自己看时序图吧其中U8FLAG最多可加到255
Delay_10us();
Delay_10us();
Delay_10us();
U8temp=0;
if(p33)//此处代表dht11与单片机连接上了选择接收到的数据是一还是零
U8temp=1;
U8FLAG=2;
while((p33)&&U8FLAG++);
//超时则跳出for循环
// if(U8FLAG==1)break;
U8comdata<<=1;
U8comdata|=U8temp;
}
}
//按照说明上接到的顺序是温度高八位温度低八位湿度高八位湿度低八位
void RH(void)
{
//主机拉低18ms
p33=0;
Delay(180);
p33=1;
//总线由上拉电阻拉高主机延时20us
Delay_10us();
Delay_10us();
Delay_10us();
//主机设为输入判断从机响应信号
p33=1;
//判断从机是否有低电平响应信号如不响应则不读数据,响应则向下运行if(!p33) //p20==0往下执行
{
U8FLAG=2;
//判断从机发出80us 的低电平响应信号是否结束
while((!p33)&&U8FLAG++); //强制低电平信号最长为254us
U8FLAG=2;
//判断从机发出80us 的高电平,如发出则进入数据接收状态
while((p33)&&U8FLAG++);
//数据接收状态
COM();
U8RH_data_H_temp=U8comdata;//将得到的数据传送给变量
COM();
U8RH_data_L_temp=U8comdata;
COM();
仅供初学者使用
U8T_data_H_temp=U8comdata;
COM();
U8T_data_L_temp=U8comdata;
COM();
U8checkdata_temp=U8comdata;
p33=1;
//数据校验
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
if(U8temp==U8checkdata_temp)//如果校验成功则重新赋值
{
U8RH_data_H=U8RH_data_H_temp;//将的到的数据在赋给变量
U8RH_data_L=U8RH_data_L_temp; //低八位为0
U8T_data_H=U8T_data_H_temp;
U8T_data_L=U8T_data_L_temp; //低八位为0
U8checkdata=U8checkdata_temp;
//湿度值
}
}
}
//显示程序部分
//初始化LCD屏(被调用层)
void lcd_init()
{ chk_busy();
LCM_POS=1; //bingkoufangshi
write_com(0x30); //选择8bit数据流
delayms(5);
write_com(0x0c); //开显示(无游标、不反白)
delayms(5);
write_com(0x01); //清除显示,并且设定地址指针为00H
delayms(5);
}
void display()
{
uchar i;
lcd_pos(0,0);
for(i=0;i<15;i++)
{
write_data(dis0[i]);
}
dis1[4]=U8RH_data_H/10%10+0x30;
dis1[5]=U8RH_data_H%10+0x30;
dis1[12]=U8T_data_H/10%10+0x30;
仅供初学者使用
dis1[13]=U8T_data_H%10+0x30;
lcd_pos(1,0);
for(i=0;i<15;i++)
{
write_data(dis1[i]); //此步为dht11在12864上显示数据}
}
void main()
{
lcd_init();
while(1)
{
RH(); //dht11数据读取
display(); //dht11显示部
}
}
上一篇:医院3年发展规划
下一篇:5广西大学新办专业建设管理规定