前言
溫度傳感器:使用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)
小結:
這次傳感器課設比較充實,雖然比較簡單,不過還是惡補了一下模電知識,焊接過程也收獲不小,盡量少用或者不用飛線。