亲测可行。头文件网上随便搜都有。LCD 数据口是P4端口。
单片机源程序如下:
- #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)
|