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

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

代码:

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

#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);
 
 }


  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值