傳感器課程設計之溫濕度傳感器


前言

  溫度傳感器:使用MF58熱敏電阻,非線性,直流電橋測電壓,經過放大電路輸出電壓。

  濕度傳感器:HS1101濕敏電容,用555定時器組成震盪電路,濕度變化->電容值變化->輸出頻率變化,用單片機捕獲頻率,繪出特性曲線。線性關系。

Proteus 仿真電路:

  (8/7/2017 博客園 IcDesignFred)

  濕度傳感器電路設計:

       

(8/7/2017 博客園 IcDesignFred)

  溫度傳感器電路設計:

    

(8/7/2017 博客園 IcDesignFred)

  ADC0809電路設計:

  

  ALE時鍾分頻電路設計:

  

keil51源碼:

  main.c

/*******************************************************************************
*                 
*                                電科15-1
--------------------------------------------------------------------------------
*                           溫濕度采集顯示系統
* 連接方式       : 濕度P3_2接555定時器
* 注    意         : 
*******************************************************************************/
#include"display.h"
#include"lcd.h"
#include "adc.h"
typedef  unsigned char u8;
typedef  unsigned int u16;
typedef  unsigned long u32;

sbit ADCSTART = P3^5;
sbit ADCEOC = P3^4;
sbit BEEP = P2^0;
#define ADCDATAPORT P1;
uint cnt,period;

bit flagSecond = 0;

/*******************************************************************************
* 函 數 名         : main
* 函數功能           : 主函數
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
void Delayms(u16 xms)
{
  u16 i,j;
  for(i=0;i<xms;i++)
  {
      for(j=0;j<120;j++)
    {
    }
  }
}
void ADC_init(){
  ADCSTART=0;
}
u16 ADConvert(){
    
    u8 i;
    unsigned long m;
    ADCSTART=1;    
    ADCSTART=0;
    //
    Delayms(1);
    while(ADCEOC==0);
    i=ADCDATAPORT;

    m=5000;
    m*=i;
    m/=256;
    return m;    
}
void main(void)
{
    u16 v;
    u16 humidity;
    u16 temperature;
    u8 beep_second = 0;
    LcdInit();
    //use T0
    TMOD &= 0xf0;
    TMOD |= 0x01;
    TH0 = (65536 - 20000)/256;
    TL0 = (65536 - 20000)%256;
    //外部中斷
    IT0 = 1;
    EX0 = 1;
    ET0 = 1;
    TR0 = 1;
    EA  = 1;
//LcdWriteCom(0xC0); //設置坐標在第二行
//    LcdWriteCom(0x07); //設置每寫一次整屏右移
    ADC_init();
    while(1)
    {
        if(flagSecond)
        {
            v = ADConvert();
            flagSecond = 0;
            temperature = (4.945*(double)v/1000 + 23.87)*10;
            humidity = (-0.0747*(double)period+552.75)*10+12-(double)temperature*0.00005;
            if(humidity >= 1000)
                humidity = 1000;
            display(humidity,temperature);
        }
//        BEEP = 1;
        if(humidity > 900 || temperature > 320)
        {
            BEEP = 0;
        }
        else
            BEEP = 1;
    }                
}

void int0isr(void) interrupt 0
{
    ++cnt;
}

void timer0isr(void) interrupt 1{
    static uint count = 0;
    TR0 = 0;
    TH0 = (65536 - 20000)/256;
    TL0 = (65536 - 20000)%256;
    TR0 = 1;
    ++count;
    if(count >= 50){
        count = 0;
        EA  = 0;
        period = cnt;
        cnt = 0;
        EA  = 1;
        flagSecond = 1;
    }
}

  display.c

#include "display.h"

void display(uint temperature,uint humidity)
{
    //Ambient Temperature
    LcdWriteCom(0x01);
    LcdWriteData('A');
    LcdWriteData('T');
    LcdWriteData(':');
    LcdWriteData(temperature/1000+0x30);
    LcdWriteData(temperature/100%10+0x30);
    LcdWriteData(temperature/10%10+0x30);
    LcdWriteData('.');
    LcdWriteData(temperature%10+0x30);
    LcdWriteData('%');
    LcdWriteCom(0xC0); //設置坐標在第二行
    LcdWriteData('A');
    LcdWriteData('H');
    LcdWriteData(':');
    LcdWriteData(humidity/1000+0x30);
    LcdWriteData(humidity/100%10+0x30);
    LcdWriteData(humidity/10%10+0x30);
    LcdWriteData('.');
    LcdWriteData(humidity%10+0x30);
    LcdWriteData('C');
}
(8/7/2017 博客園 IcDesignFred)

小結:

  這次傳感器課設比較充實,雖然比較簡單,不過還是惡補了一下模電知識,焊接過程也收獲不小,盡量少用或者不用飛線。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM