数码管显示的温湿度计——DHT11

来源:互联网 发布:六肖公式算法大公开 编辑:程序博客网 时间:2024/05/16 18:24

 这个是用数码管显示的温湿度,原理跟液晶显示是一样的,只是处理显示有所不同。

代码:

//前三位显示湿度,后三位显示温度

#include<reg52.h>
#include <intrins.h>sbit duan=P2^6;sbit wei=P2^7;typedef unsigned char unint8;typedef unsigned char unint16;unsigned char table0[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//不带小数点unsigned char table[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,};//带小数点unsigned char str1[]={"        "};unsigned char str2[]={"        "};sbit TRH = P3^0;//温湿度传感器DHT11数据接入sbit LCD_RS = P2^6;            sbit LCD_RW = P2^5;sbit LCD_EN = P2^7;void disp(unint8 str1,unint8 str2,unint8 str3,unint8 str4,unint8 str5,unint8 str6);unint8 TH_data,TL_data,RH_data,RL_data,CK_data;unint8 TH_temp,TL_temp,RH_temp,RL_temp,CK_temp;unint8 com_data,untemp,temp;unint8 respond;void delayNOP(){         _nop_();         _nop_();         _nop_();         _nop_();}// 毫秒级延时子程序void delay_ms(unsigned char ms){                 unsigned char i;          while(ms--)          {                    for(i = 0; i< 150; i++)                    {                              _nop_();                              _nop_();                              _nop_();                              _nop_();                    }          }}//5us级延时程序void delay_us(){          unint8 i;          i--;          i--;          i--;          i--;          i--;          i--;}char receive(){              unint8 i;          com_data=0;          for(i=0;i<=7;i++)             {                    respond=2;                    while((!TRH)&&respond++);                    delay_us();                    delay_us();                    delay_us();                    if(TRH)                    {                              temp=1;                              respond=2;                              while((TRH)&&respond++);                     }                     else                              temp=0;                    com_data<<=1;                    com_data|=temp;              }          return(com_data); }void read_TRH(){         //主机拉低18ms          TRH=0;         delay_ms(18);         TRH=1;         //DATA总线由上拉电阻拉高主机延时20us         delay_us();         delay_us();         delay_us();         delay_us();         TRH=1;         //判断DHT11是否有低电平响应信号如不响应则跳出,响应则向下运行            if(!TRH)            {                respond=2;                //判断DHT11发出 80us 的低电平响应信号是否结束                 while((!TRH)&& respond++);                respond=2;                //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态                while(TRH && respond++);                //数据接收状态                  RH_temp = receive();                RL_temp = receive();                TH_temp = receive();                TL_temp = receive();                CK_temp = receive();                TRH=1;                     //数据校验                 untemp=(RH_temp+RL_temp+TH_temp+TL_temp);                if(untemp==CK_temp)                {                         RH_data = RH_temp;                         RL_data = RL_temp;                         TH_data = TH_temp;                          TL_data = TL_temp;                         CK_data = CK_temp;                }        }        //湿度整数部分         str1[0] = table0[RH_data/10];          str1[1] = table[RH_data%10];         //湿度小数部分         str1[2] = table0[RL_data/10];          //温度整数部分         str2[0] =table0[TH_data/10];         str2[1] =table[TH_data%10];   //温度小数部分         str2[2] = table0[TL_data/10]; }//主函数//TH,TL,RH,RL分别代表温湿度的整数和小数部分void main(){     delay_us();  TMOD=0X01;//选择定时器工作方式  TH0=(65536-12000)/256;  TL0=(65536-12000)%256;  EA=1;//开总中断  ET0=1;//开定时器中断  TR0=1;//启动定时器           while(1)          {              read_TRH();        }     }void T0_timer() interrupt 1{  TH0=(65536-20000)/256;  TL0=(65536-20000)%256;  disp(str1[0],str1[1],str1[2],str2[0],str2[1],str2[2]);}void disp(unint8 str1,unint8 str2,unint8 str3,unint8 str4,unint8 str5,unint8 str6){ P0=0xff; wei=1; P0=0xfe; wei=0;  duan=1; P0=str1; duan=0; delay_ms(1); P0=0xff; wei=1; P0=0xfd; wei=0; duan=1; P0=str2; duan=0; delay_ms(1); P0=0xff; wei=1; P0=0xfb; wei=0; duan=1; P0=str3; duan=0;  delay_ms(1);  P0=0xff; wei=1; P0=0xf7; wei=0; duan=1; P0=str4; duan=0;  delay_ms(1);   P0=0xff; wei=1;P0=0xef; wei=0;  duan=1; P0=str5; duan=0; delay_ms(1); P0=0xff; wei=1;  P0=0xdf; wei=0; duan=1; P0=str6; duan=0; delay_ms(1);  }


原创粉丝点击