传感器课程设计之温湿度传感器

白昼怎懂夜的黑 提交于 2020-02-24 13:20:26

前言

  温度传感器:使用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)

小结:

  这次传感器课设比较充实,虽然比较简单,不过还是恶补了一下模电知识,焊接过程也收获不小,尽量少用或者不用飞线。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!