1602液晶显示温湿度

#include 
#include
#define uchar unsigned char  //宏定义
#define uint unsigned int
sbit  DHTIO = P2^7;   //管脚定义,DHT11总线输入输出;
sbit  LCDRS = P3^4;   //管脚定义,1602液晶RS控制端;
sbit  LCDWR = P3^3;   //管脚定义,1602液晶W/R控制端;
sbit  LCDEN = P3^2;   //管脚定义,1602液晶EN使能端;
uchar code table[]={'0','1','2','3','4','5','6','7','8','9'};
uchar data_byte;
uchar Tem_Z,Tem_X,Hum_Z,Hum_X,Check;
void LCD_Init();                //声明LCD_Init液晶初始化函数;
void LCD_Display();              //声明LCD_Display液晶显示函数;
void Rec_DHT();                 //声明Rec_DHT,DHT11接收数据函数;
void DHT11_Start();
void write_data(uchar date);
uchar receive_data();
void delay(uchar ms);
void delay1();
 
//主函数
void main()
{
         LCD_Init();
         while(1)                
         {
                Rec_DHT();
                LCD_Display();   
         }
}
/*********延时函数********/
void delay(uchar ms)
{       
         uchar i ;
         while(ms--)
         {
           for(i=0;i<250;i++);
         }
}
/***延时10us***/
void delay1()
{
         uchar i;
         i--;i--;i--;
         i--;i--;i--;
}
 
/********主机发出开始信号*******/
void DHT11_Start()          //请结合时序图分析
{
         DHTIO=1;
         delay1();
         DHTIO=0;
         delay(20);           //保持电平时间大于18ms
         DHTIO=1;
         delay1();             //延迟等待20-40us
         delay1();
         delay1();
         delay1();
         delay1();
}
/********DHT11接收一个字节数据*******/
uchar receive_data()
{
         uchar i,temp,count;
         data_byte=0;
         for(i=0;i<8;i++)
         {
                count=2;
                while((!DHTIO)&&count++);//等待50us低电平结束
                temp=0;
                delay1();delay1();delay1();delay1();
                if(DHTIO==1)    
                {
                       temp=1;
                       count=2;
                   while((DHTIO)&&count++);
                }      
                if(count==1)      break;
                data_byte<<=1;  
                data_byte|=temp;
         }
         return data_byte;
}
/********DHT11接收数据*******/
void Rec_DHT()
{
         uchar flag;
         DHT11_Start();            //主机发出开始信号
         DHTIO=1;                  //拉高等待DHT11响应
            if(!DHTIO)                //从机发出响应信号
    {
        flag = 2;
        while((!DHTIO) && flag++);          //判断从机是否发出 80us 的低电平响应信号是否结束
        flag = 2;
        while(DHTIO && flag++);              //判断从机是否发出 80us 的高电平,若发出则开始采集数据
        Hum_Z = receive_data();   //采集湿度整数部分
        Hum_X = receive_data();   //采集湿度小数部分
        Tem_Z = receive_data();   //采集温度整数部分
        Tem_X = receive_data();   //采集温度小数部分
        Check = receive_data();   //采集校验位
                DHTIO = 1;
    }
}
/*******指令码*******/
void write_com(uchar com)
{
  com=((com&0x01)<<7)|((com&0x02)<<5)|((com&0x04)<<3)|((com&0x08)<<1)|((com&0x10)>>1)|((com&0x20)>>3)|((com&0x40)>>5)|((com&0x80)>>7);   //注:此部分因采用的最小系统板电路设计原因,需要将字节信息逆置;
         LCDRS=0;
         LCDEN=0;
         delay(2);
         LCDEN=1;
         P1=com;
         delay(2);
         LCDEN=0;   
}
/*******数据码*******/
void write_data(uchar date)
{
  date=((date&0x01)<<7)|((date&0x02)<<5)|((date&0x04)<<3)|((date&0x08)<<1)|((date&0x10)>>1)|((date&0x20)>>3)|((date&0x40)>>5)|((date&0x80)>>7);   //注:此部分因采用的最小系统板电路设计原因,需要将字节信息逆置;
         LCDRS=1;
         LCDEN=0;
         delay(2);
         LCDEN=1;
         P1=date;
         delay(2);
         LCDEN=0;
}
/*********************/
/********1602液晶显示初始化*******/
void LCD_Init()    
{
  LCDEN=0;             //使能低电平
  LCDWR=0;    
  write_com(0x38);   //显示模式设置,设置16*2显示,5*7点阵,8位数据接口
  delay(2);
  write_com(0x0c);   //显示开关及光标设置
  delay(2);
  write_com(0x06);
  delay(2);
  write_com(0x01);   //清屏
  delay(2);
}
/**********1602液晶显示*********/
void LCD_Display()
{
//液晶显示第一行:温度显示;
         write_com(0x0c);
         write_com(0x81);delay(2);
         write_data('T');delay(2);
         write_data('e');delay(2);
         write_data('m');delay(2);             
         write_data(':');delay(2);
         write_com(0x86);delay(2);
         write_data(table[(Tem_Z/10)]);delay(2);   //输出温度的十位
         write_data(table[(Tem_Z%10)]);delay(2);  //输出温度的个位
         write_data('.');delay(2);
         write_data('0');delay(2);
         write_data('0');delay(2);
         write_com(0x8c);delay(2);
         write_data(0xdf);delay(2);    //输出℃
         write_data(0x43);delay(2);
//液晶第二行:湿度显示;
         write_com(0xc1);delay(2);
         write_data('H');delay(2);
         write_data('u');delay(2);
         write_data('m');delay(2);
         write_data(':');delay(2);
         write_com(0xc6);delay(2);
         write_data(table[(Hum_Z/10)]);delay(2);       //输出湿度的十位
         write_data(table[(Hum_Z%10)]);delay(2);     //输出湿度的个位
         write_data('.');delay(2);
         write_data('0');delay(2);
         write_data('0');delay(2);
         write_com(0xcc);delay(2);
         write_data('%');delay(2);
}

 

你可能感兴趣的:(单片机)