找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4795|回复: 2
打印 上一主题 下一主题
收起左侧

msp430g2231 dh11温湿度报警

[复制链接]
跳转到指定楼层
楼主
        温湿度计dh11很常见,虽然精度不高,但对于日常生活温湿度要求不高的场合,还是可以用的。我在百度查询到,室温一般15-25是比较合适的,湿度30-80是人体感觉舒适的条件,我看到gokit也有此项功能,所以我想,如果将一个简单的温湿度传感器运用生活中,还是不错的选择。

          当然我在淘宝上和商店里看到此类产品还是比较多的,大多20-50元,虽然不贵,但对于理工男的我,当然是自己动手diy. ..                                 

                                                            
                        

                                                                                                   
                图终于来了,我的想法很简单,用msp430g22314个io口显示温湿度,报警功能。
                其中数码管用cd4511显示,6与9显示的不好看(使用4个io口),4段数码管片选用74hc138驱动(2个io口),一个dh11(一个io口),一个有源蜂鸣器(1个io口),想用xin xout 两个特殊端口,按照网上的说法,没有配置成功。当然对于一个精度不高,日常需要的显示器件,不需太多的要求。
                我设计的就是dh11每2s扫描一次,数码管每40ms更新数据一次。时钟温湿度超过一定范围,闹钟响起。

           我用的是锂电池供电,tp4056充电芯片给电池充电,4.2v给单片机不知道有什么有什么反应,用电流表测量电流为20ma,妈的,电流如此之大,在设计过程中,没有 考虑数码管限流电阻,电阻值小了点,功耗就大了。

部分程序预览:
  1. #include"config.h"


  2. void send_char(uchar weizhi,uchar byte)
  3. {
  4.   P1OUT&=~0X3F;
  5.   P1OUT|=(weizhi&0x03)<<4;
  6.   P1OUT|=(byte&0x0f);
  7. }

  8. void wenshidu_clock_init()
  9. {
  10.   P1DIR|=BIT7;
  11.   P1OUT&=~0x80;
  12. }
  13. void shumaguan()
  14. {
  15.    ++t;
  16. if(t>=4)
  17.    t=0;
  18.   send_char(t,dis_play[t]);
  19. }

  20. void read_DHT11(uchar *Data)
  21. {
  22.     uchar re,m,n,Time_out;
  23.     DHT11_Dir &= (~DHT11_Bit);        //引脚为输入
  24.     for(n = 0; n < 5; n++)
  25.     {
  26.         for(m = 0; m < 8; m++)
  27.         {
  28.             while( !(DHT11_In & DHT11_Bit) );     //每1bit以50us低电平时限开始,直到高电平到来
  29.             delay_us(30);                     
  30.             re = 0;            
  31.             if((DHT11_In & DHT11_Bit))          //30us后还是高电平说明是1
  32.             {
  33.                 re = 1;
  34.             }
  35.             Time_out = 2;
  36.             while((DHT11_In & DHT11_Bit) && (Time_out++ ));
  37.             if(Time_out == 1)                   //超时处理
  38.             {
  39.                 break;
  40.             }
  41.             *Data <<= 1;
  42.             if(re)
  43.             {
  44.                 *Data |= 0x01;
  45.             }
  46.         }
  47.         Data++;
  48.     }
  49. }

  50. //DHT11的握手协议模拟和数据的读取
  51. uchar DHT11_GetData(void)
  52. {
  53.     uchar o,sum;
  54. //    DHT11_Dir |= DHT11_Bit;
  55. //    DHT11_Out &= ~DHT11_Bit;    //拉低,发出开始信号
  56.    
  57. //    delay_ms(18);               //拉低18ms
  58.     DHT11_Out |= DHT11_Bit;     //拉高20us等待
  59.     delay_us(20);
  60.     DHT11_Dir &= (~DHT11_Bit);
  61.     if( !(DHT11_In & DHT11_Bit) )       //DHT11响应
  62.     {
  63.         while( !(DHT11_In & DHT11_Bit) );       //80us低电平,等待DHT11的响应信号
  64.         while( (DHT11_In & DHT11_Bit) );        //DHT11准备发送数据
  65.         read_DHT11(DHT11_Data);                 //主机接收数据
  66.         sum = 0;
  67.         for(o = 0; o < 4; o++)                  //数据校验
  68.         {
  69.           sum += DHT11_Data[o];
  70.         }
  71.         if(sum != DHT11_Data[4])
  72.         {
  73.           return 0;
  74.         }
  75.         else
  76.         {
  77.           return 1;
  78.         }
  79.     }
  80.     return 0;
  81. }

  82. //对温度湿度进行格式化(如果获取温度成功)
  83. void DHT11_format(char *Des_str)
  84. {
  85.     Des_str[0] = DHT11_Data[0]/10 ;
  86.     Des_str[1] = DHT11_Data[0]%10 ;
  87.   
  88.     Des_str[2] = DHT11_Data[2]/10 ;
  89.     Des_str[3] = DHT11_Data[2]%10 ;
  90.    
  91. }


  92. void wenshidu_oclock()
  93. {
  94.   P1OUT&=~0x80;
  95.   if((DHT11_Data[0]<30)||(DHT11_Data[0]>80))
  96.    P1OUT^=0x80;
  97.   else P1OUT&=~0x80;
  98.   if((DHT11_Data[2]<10)||(DHT11_Data[2]>30))
  99.     P1OUT|=0x80;
  100.   else P1OUT&=~0x80;
  101. }

  102. void dh11_read()
  103. {
  104.   if(DHT11_GetData())
  105.   {
  106.    DHT11_format(dis_play);
  107.    wenshidu_oclock();
  108.   }
  109. }
  110. void dh11_read1()
  111. {
  112.   ++tt;
  113.   if(tt>=100)//1秒扫描一次
  114.     tt=0;
  115.   switch(tt)
  116.   {
  117.    case 1:DHT11_Dir |= DHT11_Bit;
  118.           DHT11_Out &= ~DHT11_Bit;    //拉低,发出开始信号
  119.           break;
  120.    case 3: dh11_read();
  121.            break;
  122.   default:break;
  123.   }
  124. }

  125. #pragma vector=TIMER0_A0_VECTOR  
  126. __interrupt void TIMERA0_ISR() // the interrupt source is CC0
  127. {
  128.   shumaguan();
  129.   dh11_read1();
  130. }
复制代码

                                                         


数码管—温湿度计.zip

174.04 KB, 下载次数: 162, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:117823 发表于 2016-6-4 02:16 来自触屏版 | 只看该作者
只有cd4511就选择4511和138驱 动数码管,就是电池不耐用,反馈的信息表示这个设备可以连续工作几个小时,低功耗还没有注意设计,

评分

参与人数 1黑币 +40 收起 理由
admin + 40 赞一个!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表