c
复制代码
#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 P0
void 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 // !__LCD1602__H__
#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);
}
}
c
复制代码
#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 // __DHT11_H__
#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++);
// 超时则跳出for循环
if (Flag == 1)
break;
// 判断数据位是0还是1
// 如果高电平高过预定0高电平值则数据位为 1
dat <<= 1;
dat |= temp; // 0
}
DATA = dat;
}
void DHT11_Read_Data(void)
{
// 主机拉低18ms
DHT11_DATA = 0;
Delay(180);
DHT11_DATA = 1;
// 总线由上拉电阻拉高 主机延时20us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
// 主机设为输入 判断从机响应信号
DHT11_DATA = 1;
// 判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
if (!DHT11_DATA)// 判断从机是否响应
{
Flag = 2;
// 判断从机是否发出 80us 的低电平响应信号是否结束
while ((!DHT11_DATA) && Flag++);
Flag = 2;
// 判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
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);
}