文章目录
- 实现细节
- 1.public
- 2.LCD1602
- 3.DHT11
- 4.main
实现细节
1.public
#ifndef __PUBLIC_H__
#define __PUBLIC_H__
#include <REG51.H>
#include <INTRINS.H>typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;void Delay1ms(); #endif
#include "public.h"void Delay1ms()
{unsigned char i, j;_nop_();i = 2;j = 199;do{while (--j);} while (--i);
}
2.LCD1602
#ifndef __LCD1602__H__
#define __LCD1602__H__
#include "public.h"sbit LCD_E =P2^7;
sbit LCD_RW=P2^5;
sbit LCD_RS=P2^6;#define LCD_DATA_PORT P0void LCD_Init();
void LCD_Show_Char(u8 Line,u8 Column,u8 ch);
void LCD_Show_String(u8 Line,u8 Column,u8 *str);
void LCD_ShowNum(u8 Line,u8 Column,u16 num,u8 Length);
void LCD_Show_SigNum(u8 Line, u8 Column, int num, u8 Length);
void LCD_Show_HexNum(u8 Line, u8 Column, u8 num, u8 Length);
void LCD_Show_BinNum(u8 Line,u8 Column,u8 num,u8 Length);
void LCD_Show_FloatNum(u8 Line, u8 Column, float num, u8 Length);
void LCD_Write_CMD(u8 cmd);
void LCD_Write_Dat(u8 dat);#endif #include "LCD1602.h"
void LCD_Write_CMD(u8 cmd)
{LCD_RS = 0;LCD_RW = 0;LCD_E = 0;LCD_DATA_PORT = cmd;LCD_E = 1;Delay1ms();LCD_E = 0;Delay1ms();
}
void LCD_Write_Dat(u8 dat)
{LCD_RS = 1;LCD_RW = 0;LCD_E = 0;LCD_DATA_PORT = dat;LCD_E = 1;Delay1ms();LCD_E = 0;Delay1ms();
}
void LCD_Init()
{LCD_Write_CMD(0x38);LCD_Write_CMD(0x0C);LCD_Write_CMD(0x06);LCD_Write_CMD(0x01);
}void LCD_SetCursor(u8 Line, u8 Column)
{if (Line == 1){LCD_Write_CMD(0x80 | (Column - 1));}else if (Line == 2){LCD_Write_CMD(0x80 | (Column - 1) + 0x40);}
}void LCD_Show_Char(u8 Line, u8 Column, u8 ch)
{LCD_SetCursor(Line, Column);LCD_Write_Dat(ch);
}void LCD_Show_String(u8 Line, u8 Column, u8 *str)
{u8 i;LCD_SetCursor(Line, Column);for (i = 0; str[i] != '\0'; i++){LCD_Show_Char(Line, Column + i, str[i]);}
}int POW(int x, int y)
{u8 i;int res = 1;for (i = 0; i < y; i++){res *= x;}return res;
}
void LCD_ShowNum(u8 Line, u8 Column, u16 num, u8 Length)
{u8 i;LCD_SetCursor(Line, Column);for (i = Length; i > 0; i--){LCD_Write_Dat('0' + num / POW(10, i - 1) % 10);}
}void LCD_Show_SigNum(u8 Line, u8 Column, int num, u8 Length)
{u16 temp_Num;u8 i;LCD_SetCursor(Line, Column);if (num >= 0){LCD_Write_Dat('+');temp_Num = num;}else{LCD_Write_Dat('-');temp_Num = -num;}for (i = Length; i > 0; i--){LCD_Write_Dat('0' + temp_Num / POW(10, i - 1) % 10);}
}
void LCD_Show_HexNum(u8 Line, u8 Column, u8 num, u8 Length)
{u8 i;u8 SigNum;LCD_SetCursor(Line, Column);for (i = Length; i > 0; i--){SigNum=num / POW(16, i - 1) % 16;if(SigNum<10){LCD_Write_Dat('0' +SigNum);}else{LCD_Write_Dat('A' +SigNum-10);}}
}void LCD_Show_BinNum(u8 Line,u8 Column,u8 num,u8 Length)
{u8 i;LCD_SetCursor(Line, Column);for(i=Length;i>0;i--){LCD_Write_Dat('0' + num / POW(2, i - 1) % 2);}
}
3.DHT11
#ifndef __DHT11_H__
#define __DHT11_H__#include "public.h"
#include "LCD1602.h"void Delay(u16 j);
void Delay_10us(void);
void DHT11_Read_Byte(void);
void DHT11_Read_Data(void);#endif #include "DHT11.h"sbit DHT11_DATA = P2 ^ 0;
u8 Flag;
u8 temp;
u8 H_Temp, L_Temp, H_Humi, L_Humi, Check_Sum;
u8 H_Temp_temp, L_Temp_temp, H_Humi_temp, L_Humi_temp, Check_Sum_temp;u8 DATA;void Delay(u16 j)
{u8 i;for (; j > 0; j--){for (i = 0; i < 27; i++);}
}
void Delay_10us(void)
{u8 i;i--;i--;i--;i--;i--;i--;
}
void DHT11_Read_Byte(void)
{u8 i;u8 dat=0;for (i = 0; i < 8; i++){Flag = 2;while ((!DHT11_DATA) && Flag++);Delay_10us();Delay_10us();Delay_10us();temp = 0;if (DHT11_DATA)temp = 1;Flag = 2;while ((DHT11_DATA) && Flag++);if (Flag == 1)break;dat <<= 1;dat |= temp; }DATA = dat;
}void DHT11_Read_Data(void)
{DHT11_DATA = 0;Delay(180);DHT11_DATA = 1;Delay_10us();Delay_10us();Delay_10us();Delay_10us();DHT11_DATA = 1;if (!DHT11_DATA){Flag = 2;while ((!DHT11_DATA) && Flag++);Flag = 2;while ((DHT11_DATA) && Flag++);DHT11_Read_Byte();H_Humi_temp = DATA;DHT11_Read_Byte();L_Humi_temp = DATA;DHT11_Read_Byte();H_Temp_temp = DATA;DHT11_Read_Byte();L_Temp_temp = DATA;DHT11_Read_Byte();Check_Sum_temp = DATA;DHT11_DATA = 1;temp = (H_Temp_temp + L_Temp_temp + H_Humi_temp + L_Humi_temp);if (temp == Check_Sum_temp){H_Humi = H_Humi_temp;L_Humi = L_Humi_temp;H_Temp = H_Temp_temp;L_Temp = L_Temp_temp;Check_Sum = Check_Sum_temp;}}LCD_Show_String(1, 1, "Humi:");LCD_ShowNum(1, 7, H_Humi, 2);LCD_Write_Dat(0x25);LCD_Show_String(2, 1, "Temp:");LCD_ShowNum(2, 7, H_Temp, 2);LCD_Write_Dat(0xDF);LCD_Write_Dat(0x43);}
4.main
#include <REG51.H>
#include "LCD1602.h"
#include "DHT11.h"void main()
{LCD_Init();while (1){DHT11_Read_Data();Delay(20000);}
}