前言:软件延时真的很坑,校园网真的很烂
直接上码
LCD1602部分
(1).LCD1602.C
#include <reg52.h>
#include <LCD1602.h>
#include <INTRINS.h>
sbit LCD_RS=P2^6;
sbit LCD_RW=P2^5;
sbit LCD_E=P2^7;
#define LCD_DatrPort P0
//指令函数
void LCD_WeitrCommand(unsigned char Command)
{
LCD_RS=0;//0写指令,1写数据
LCD_RW=0;//write mode
LCD_DatrPort=Command;
LCD_E=1;
LCD_Delay();
LCD_E=0;
LCD_Delay();
}
void LCD_Delay() //@11.0592MHz
{
unsigned char i, j;
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
//数据函数
void LCD_WriteData(unsigned char Data)
{
LCD_RS=1;//0写指令,1写数据
LCD_RW=0;//write mode
LCD_DatrPort=Data;
LCD_E=1;
LCD_Delay();
LCD_E=0;
LCD_Delay();
}
void LCD_Init()
{
LCD_WeitrCommand(0x38);//八位数据接口,两行显示,5x7点阵
LCD_WeitrCommand(0x0c);//显示开,光标关,闪烁关
LCD_WeitrCommand(0x06);//读写后光标加1
LCD_WeitrCommand(0x01);//清屏
}
//显示字符函数
void LCD_Showchar(unsigned char Line,unsigned char Columu,unsigned char Char)
{
LCD_SetCursor(Line,Columu);
LCD_WriteData(Char);
}
//显示字符串
void LCD_Showstr(unsigned char Line,unsigned char Columu,unsigned char *str)
{
unsigned char i;
LCD_SetCursor(Line,Columu);
for(i=0;str[i]!='\0';i++)
{
LCD_WriteData(str[i]);
}
}
//设置光标
void LCD_SetCursor(unsigned char Line,unsigned char Columu)
{
if(Line==1)
{
LCD_WeitrCommand(0x80|(Columu-1));
}
else
{
LCD_WeitrCommand(0x80|(Columu-1)+0x40);
}
}
//显示DHT11返回的数字
void LCD_ShowNum(unsigned char Line,unsigned char Columu,unsigned int Number,unsigned int Lenth)
{
unsigned int i;
LCD_SetCursor(Line,Columu);
for(i=Lenth;i>0;i--){
LCD_WriteData(0x30+Number/LCD_Pow(10,i-1)%10);
}
}
//显示次方函数 x^y
int LCD_Pow(int x,int y)
{
unsigned char i;
int Result=1;
for(i=0;i<y;i++)
{
Result *=x;
}
return Result;
}
(2)LCD1602.H
#ifndef _LCD1602_H_
#define _LCD1602_H_
#include <reg52.h>
void LCD_WeitrCommand(unsigned char Command);
void LCD_Delay();
void LCD_WriteData(unsigned char Data);
void LCD_Init();
void LCD_Showchar(unsigned char Line,unsigned char Columu,unsigned char Char);
void LCD_Showstr(unsigned char Line,unsigned char Columu,unsigned char *str);
void LCD_SetCursor(unsigned char Line,unsigned char Columu);
int LCD_Pow(int x,int y);
void LCD_ShowNum(unsigned char Line,unsigned char Columu,unsigned int Number,unsigned int Lenth);
#endif
(3)DHT11.C
#include <reg52.h>
#include <DHT11.h>
#include <usart.h>
sbit Temp_data= P1^0;
unsigned int rec_dat[4];
unsigned char rec_dat_lcd0[6];
unsigned char rec_dat_lcd1[6];
unsigned char rec_dat_lcd2[6];
unsigned char rec_dat_lcd3[6];
//DHT11开始信号
void DHT11_START()
{
Temp_data=1;
DHT11_delay_us(100);
Temp_data=0; //拉低总线
DHT11_delay_ms(20);//至少18ms
Temp_data=1;
DHT11_delay_us(30);
}
//接收字节函数
unsigned char DHT11_rec_byte()
{
unsigned char i;
unsigned char dat;
dat=0;
for(i=0;i<8;i++){
while(!Temp_data);//等待低电平时间过去
DHT11_delay_us(10);//若仍为高电平则为数据1
dat <<= 1;
if(Temp_data == 1)
{
dat|=0x01;
}
while(Temp_data) ;//等待拉低,准备下一位
}
return dat;
}
//接收温湿度数据
void DHT11_recive()
{
unsigned int R_H,R_L,T_H,T_L;
unsigned char RH,RL,TH,TL,revise;
DHT11_START();//DHT11开始信号
while(!Temp_data);//等待从机80us低电平响应信号过去
while(Temp_data);
R_H=DHT11_rec_byte();//湿度高八位
R_L=DHT11_rec_byte();//湿度低八位
T_H=DHT11_rec_byte();//温度高八位
T_L=DHT11_rec_byte();//温度低八位
revise=DHT11_rec_byte();//检验位
DHT11_delay_us(25);
if((R_H+R_L+T_H+T_L)==revise)//是否等于校验位
{
RH = R_H;
RL = R_L;
TH = T_H;
TL = T_L;
}
rec_dat[0]=RH;
rec_dat[1]=RL;
rec_dat[2]=TH;
rec_dat[3]=TL;
}
//us delay
/**************************************************************************/
// us延时函数有三个汇编指令实际时间和所需时间差相差大概三倍 //
// reporter:LYQ //
// date:2022/4/20 //
// 建议用定时器延时 //
// //
/**************************************************************************/
void DHT11_delay_us(unsigned char n)
{
while(--n);
}
//ms delay
void DHT11_delay_ms(unsigned int z)
{
unsigned int i,j;
for(i=z;i>0;i--)
for(j=114;j>0;j--);
}
(4)DHT11.H
#ifndef _DHT11_H_
#define _DHT11_H_
#include <reg52.h>
void DHT11_START();
unsigned char DHT11_rec_byte();
void DHT11_recive();
void DHT11_delay_us(unsigned char n);
void DHT11_delay_ms(unsigned int z);
#endif
(5)正常的采集(用一个io口做检测采集的信号,当其采集一次就反转一次电平)
(6)不正常采集,由于延时函数不对,30ms延时实际搞到90ms导致后面几次无法采集8次,会卡死在while(Temp_data);里面出不来(看了一下汇编,他一次n--执行三次指令所以这个软件延时有问题,整个经验值算了)
(7)显示效果(桌面好乱,算是做完作业了)