找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4760|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

msp430g2231 dh11溫濕度報警

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:110653 發(fā)表于 2016-3-30 17:19 | 只看該作者 |只看大圖 回帖獎勵 |正序瀏覽 |閱讀模式
        溫濕度計dh11很常見,雖然精度不高,但對于日常生活溫濕度要求不高的場合,還是可以用的。我在百度查詢到,室溫一般15-25是比較合適的,濕度30-80是人體感覺舒適的條件,我看到gokit也有此項功能,所以我想,如果將一個簡單的溫濕度傳感器運用生活中,還是不錯的選擇。

          當然我在淘寶上和商店里看到此類產(chǎn)品還是比較多的,大多20-50元,雖然不貴,但對于理工男的我,當然是自己動手diy. ..                                 

                                                            
                        

                                                                                                   
                圖終于來了,我的想法很簡單,用msp430g22314個io口顯示溫濕度,報警功能。
                其中數(shù)碼管用cd4511顯示,6與9顯示的不好看(使用4個io口),4段數(shù)碼管片選用74hc138驅(qū)動(2個io口),一個dh11(一個io口),一個有源蜂鳴器(1個io口),想用xin xout 兩個特殊端口,按照網(wǎng)上的說法,沒有配置成功。當然對于一個精度不高,日常需要的顯示器件,不需太多的要求。
                我設(shè)計的就是dh11每2s掃描一次,數(shù)碼管每40ms更新數(shù)據(jù)一次。時鐘溫濕度超過一定范圍,鬧鐘響起。

           我用的是鋰電池供電,tp4056充電芯片給電池充電,4.2v給單片機不知道有什么有什么反應(yīng),用電流表測量電流為20ma,媽的,電流如此之大,在設(shè)計過程中,沒有 考慮數(shù)碼管限流電阻,電阻值小了點,功耗就大了。

部分程序預(yù)覽:
  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的握手協(xié)議模擬和數(shù)據(jù)的讀取
  51. uchar DHT11_GetData(void)
  52. {
  53.     uchar o,sum;
  54. //    DHT11_Dir |= DHT11_Bit;
  55. //    DHT11_Out &= ~DHT11_Bit;    //拉低,發(fā)出開始信號
  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響應(yīng)
  62.     {
  63.         while( !(DHT11_In & DHT11_Bit) );       //80us低電平,等待DHT11的響應(yīng)信號
  64.         while( (DHT11_In & DHT11_Bit) );        //DHT11準備發(fā)送數(shù)據(jù)
  65.         read_DHT11(DHT11_Data);                 //主機接收數(shù)據(jù)
  66.         sum = 0;
  67.         for(o = 0; o < 4; o++)                  //數(shù)據(jù)校驗
  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;    //拉低,發(fā)出開始信號
  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. }
復(fù)制代碼

                                                         


數(shù)碼管—溫濕度計.zip

174.04 KB, 下載次數(shù): 162, 下載積分: 黑幣 -5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:117823 發(fā)表于 2016-6-4 02:16 來自手機 | 只看該作者
只有cd4511就選擇4511和138驅(qū) 動數(shù)碼管,就是電池不耐用,反饋的信息表示這個設(shè)備可以連續(xù)工作幾個小時,低功耗還沒有注意設(shè)計,

評分

參與人數(shù) 1黑幣 +40 收起 理由
admin + 40 贊一個!

查看全部評分

回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表