51单片机LCD1602显示温湿度

LCD1602简述

LCD1602 (LiquidCrystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其他的一些内置特殊符号,还可以有8个自定义字符。显示容量:16X2个字符,每个字符为5*7点阵

引脚接线

内部结构单元

存储器结构

DDARM数据显示区

CGRAM+CGROM(字模库)

时序结构

RS:设置指令/数据,数据-高,指令-低
R/W :读写,写-高,读-低,E: 使能高电平有效
DB0-DB7:数据

LCD1602显示字符、字符串、数字的代码

#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_DataPort  P0

void LCD_Delay()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	i = 2;
	j = 199;
	do
	{
		while (--j);
	} while (--i);
}


//写指令
void LCD_WriteCommand(unsigned char Command)
{
    LCD_RS = 0;             //设置指令模式
    LCD_RW = 0;             //设置为写模式
	LCD_DataPort = Command; //写指令
    LCD_E  = 1;             
	LCD_Delay();
    LCD_E  = 0;             //使能
	LCD_Delay();            //初始化

}
//дÊý¾Ýº¯Êý
void LCD_WriteData(unsigned char Data)
{

    LCD_RS = 1;             //设置为数据模式
    LCD_RW = 0;             //设置为写模式
	LCD_DataPort = Data;    //写数据
    LCD_E  = 1;             
	LCD_Delay();
    LCD_E  = 0;             //使能
	LCD_Delay();            //初始化
}
//LCD显示屏初始化
void LCD_Init()
{
      LCD_WriteCommand(0x38); //配置八位数据接口
	  LCD_WriteCommand(0x0c); //显示开,光标关,闪烁开
	  LCD_WriteCommand(0x06); //光标+1,画面不动
	  LCD_WriteCommand(0x01); //清屏

}

//设置光标
void LCD_SetCursor(unsigned char Line,unsigned char Colmu)
{

 if(Line == 1)
	{  
	LCD_WriteCommand(0x80 | (Colmu-1));
	}
 else
 {
 	LCD_WriteCommand(0x80 | (Colmu-1) + 0x40); 
 }
}

//显示字符函数
void LCD_ShowChar(unsigned char Line,unsigned char Colmu,unsigned char Char)
{
   LCD_SetCursor(Line,Colmu);
   LCD_WriteData(Char);
}

//显示字符串函数
void LCD_ShowString(unsigned char Line,unsigned char Colmu,unsigned char *String)
{
	  unsigned char i;
    LCD_SetCursor(Line,Colmu);
    for(i=0;String[i]!='\0';i++)
    {
 
     LCD_WriteData(String[i]);
 
    }

}
//次方函数
int LCD_Pow(int x,int y)
{
    unsigned char i;
	int result = 1;
	for(i = 0;i<y;i++)
	{
	  result *= x;
	
	}
    return result;
}
	
//显示数字函数
void LCD_ShowNumber(unsigned char Line,unsigned char Colmu,unsigned int Number,unsigned int Length)
{
       unsigned int i;
       LCD_SetCursor(Line,Colmu);
	   for(i=Length;i>0;i--)
	   {
       LCD_WriteData('0'+Number/LCD_Pow(10,i-1)%10);
     }

}

温湿度传感器时序代码

dht11.c

#include <REG52.H>
#include "DHT11.h"
#include "delay.h"

sbit Temp_data = P2^0; 

unsigned int rec_dat[5];


//接收一个字节函数
unsigned char DHT11_rec_byte()
{
  unsigned char i,dat=0;
	for(i=0;i<8;i++)
	{
	   while(!Temp_data);//等待DHT11高电平
	   Delay30us();//延时30us,如果还是高电平则DHT11输出1
	   dat<<=1;
		if(Temp_data==1)
		{
		  dat|=0x01;
		}
		while(Temp_data);//等待DHT11低电平
	}
   return dat;
}
//接收温湿度数据
void DHT11_receive()
{
   unsigned char R_H,R_L,T_H,T_L,revise;
 
	//起始信号
   Temp_data = 1;//高电平维持一小段时间
   Delay30us();//维持30us
	
   Temp_data = 0;//主机拉低总线电平至少18ms
   Delay20ms();//给了20ms
	
   Temp_data = 1;
   Delay30us();
	
   Temp_data=1;//拉高电平
   if(Temp_data==0)//判断DHT11是否响应
   {
	   while(Temp_data == 0);//等待从机80us低电平响应信号过去
	   while(Temp_data == 1);//等待从机80us高电平信号过去
	   R_H = DHT11_rec_byte();//接收湿度高八位
	   R_L = DHT11_rec_byte();//接收湿度低八位
	   T_H = DHT11_rec_byte();//接收温度高八位
	   T_L = DHT11_rec_byte();//接收温度低八位
	   revise = DHT11_rec_byte(); //接收校验位
		 
		 Temp_data = 0;
		 delay55us();
		 Temp_data = 1;
		 
	   if((R_H+R_L+T_H+T_L) == revise)//判断接收数据是否准确
	   {
	    rec_dat[0] = R_H;
	    rec_dat[1] = R_L;
	    rec_dat[2] = T_H;
	    rec_dat[3] = T_L;
	    rec_dat[4] = revise;
	   }
	         
   }	

}

main.c

extern unsigned int rec_dat[4];

void main()
{

	LCD_Init();
	LCD_ShowString(1,1,"Humi:");
	LCD_ShowString(2,1,"Temp:");

	while(1)
	{
	  delay1s();	
		DHT11_receive();
		
		
    //显示温度
	LCD_WriteCommand(0x85);
	LCD_WriteData(rec_dat[0]/10 + 0x30);//显示温度整数部分十位,并+0x30转换成ASCLL码
	LCD_WriteCommand(0x86);
	LCD_WriteData(rec_dat[0]%10 + 0x30);//显示温度整数部分个位,并+0x30转换成ASCLL码
	
	LCD_WriteCommand(0x87);
	LCD_WriteData('.');	

	LCD_WriteCommand(0x88);
	LCD_WriteData(rec_dat[1]/10 + 0x30);
	LCD_WriteCommand(0x89);
	LCD_WriteData('%');

	//显示湿度
	LCD_WriteCommand(0xC5);
	LCD_WriteData(rec_dat[2]/10 + 0x30);
	LCD_WriteCommand(0xC6);
	LCD_WriteData(rec_dat[2]%10 + 0x30);
	
	LCD_WriteCommand(0xc7);
	LCD_WriteData('.');

	LCD_WriteCommand(0xC8);
	LCD_WriteData(rec_dat[3]/10 + 0x30);
	
	LCD_WriteCommand(0xC9);
	LCD_WriteData(0xDF); //¶È
	LCD_WriteCommand(0xca);		
	LCD_WriteData('C');
	}
			
	}

实现结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值