资源描述
基于ATMEGA88红外测温仪
作品采用ATMEL公司ATMGEA88 作为MCU,内部有8K FLASH,1kram。工作在内部8M RC振荡下,耗电仅为2MA左右。采用RISC指令集AVR核心,运算速度大大超过老式51单片机。内部带有3个定期器,8路10位AD(模数转换器),串口,硬件SPI,以便使用。大批量采购价格当前由于炒货因素涨价到12RMB。(详细问题可以搜索下,网上吹捧得诸多)推荐你看一下中文PDF,处处均有下载。采用这块芯片重要来说就有一点,比51先进,功耗低,内带AD,并且外部不需要加晶振。
使用一块LCD5110手机屏作为显示设备,可以显示输出电压以及当前状态。液晶屏参数为72*48,点阵式,使用一种驱动库作为支持,以便开发,工作在3.3V电压下。耗电极低,不大于1MA,背光耗电为20MA。
使用一片LDO(低压差线性稳压源)作为系统电源,LM1117-3.3V,输出电压为3.3V,最大电流500MA
如下为单片机复位电路和烧录程序用接口
使用OTP-538U红外传感器,该传感器是一种红外线感应型温度探测器。重要工作原理是运用红外线波长在硅片上产生相应电压,依照检测到电压不同来检测不同温度。由于只要是发热光源就会辐射红外线,因此可以对温度进行非接触式检测。传感器由一种热敏电阻和传感器某些构成。传感器某些依照外部温度产生相应电压,而热敏电阻依照外部温度不同,电阻值产生变化,由此来补充由于外界环境对传感器影响,因而可以做到比较高精度。价格为RMB40每颗,如下是接口电路
下表是温度与电压输出比例
下表是热敏电阻变化比率
由于这两个值变化很难算。。。。应用电路上都是4个电阻做,并且没有电压偏移和温度关系。。因此我直接舍弃了温度补偿。。。。
这个图电阻值我完全计算不出来。。。泪流满面。。。
采用TI公司仪表放大器INA114,采用仪表放大器最大好处是增长了输入阻抗,并且放大倍数比较好调节,高CMRR,并且噪声极低,最核心是,输入失调电压小。价格为RMB32。。
如下是仪放基本参数
LOW OFFSET VOLTAGE:50mV max
LOW DRIFT:0.25mV/°C max
LOW INPUT BIAS CURRENT:2nA max
HIGH COMMON-MODE REJECTION:115dB min
INPUT OVER-VOLTAGE PROTECTION:±40V
WIDE SUPPLY RANGE:±2.25 to ±18V
LOW QUIESCENT CURRENT:3mA max
当R5=100时,放大倍数为500倍。G=50K/R5。运放为双电源运放,因此提供了双电源。
放大后电压大概为75MV(26度),145MV(37度)。由于没有精确校准,因此必然有偏差。
采用美信公司反相电荷泵芯片MAX889T作为负向电源输出。最大输出电流为200MA,可以满足运放需求,留有足够余量。电荷泵工作在2M开关频率下,只需要1UF电容就可以工作。不需要外加电感,最大工作电压为5.5V ,漏电流为20MA。RMB20一种。。。
软件流程图
程序带注释
#include <mega88.h>
#include "lcd5110.h"
#include <delay.h>
float wendu;//定义float型函数保存温度,以便计算小数
#define FIRST_ADC_INPUT 5
#define LAST_ADC_INPUT 5
unsigned int adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
#define ADC_VREF_TYPE 0xC0
//AD初始化,时钟62.5K,内部1.1V基准,采用自动扫描模式,扫描通道AD通道5
// ADC interrupt service routine
// with auto input scanning
interrupt [ADC_INT] void adc_isr(void)
{
static unsigned char input_index=0;
// Read the AD conversion result
adc_data[input_index]=ADCW;
// Select next ADC input
if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
input_index=0;
ADMUX=(FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff))+input_index;
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
}
// Declare your global variables here
void main(void) //系统初始化
{
// Declare your local variables here
// Crystal Oscillator division factor:1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0xff;
// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source:System Clock
// Clock value:Timer 0 Stopped
// Mode:Normal top=FFh
// OC0A output:Disconnected
// OC0B output:Disconnected
TCCR0A=0x00;
TCCR0B=0x00;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
// Timer/Counter 1 initialization
// Clock source:System Clock
// Clock value:Timer1 Stopped
// Mode:Normal top=FFFFh
// OC1A output:Discon.
// OC1B output:Discon.
// Noise Canceler:Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt:Off
// Input Capture Interrupt:Off
// Compare A Match Interrupt:Off
// Compare B Match Interrupt:Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source:System Clock
// Clock value:Timer2 Stopped
// Mode:Normal top=FFh
// OC2A output:Disconnected
// OC2B output:Disconnected
ASSR=0x00;
TCCR2A=0x00;
TCCR2B=0x00;
TCNT2=0x00;
OCR2A=0x00;
OCR2B=0x00;
// External Interrupt(s) initialization
// INT0:Off
// INT1:Off
// Interrupt on any change on pins PCINT0-7:Off
// Interrupt on any change on pins PCINT8-14:Off
// Interrupt on any change on pins PCINT16-23:Off
EICRA=0x00;
EIMSK=0x00;
PCICR=0x00;
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x00;
// Timer/Counter 1 Interrupt(s) initialization
TIMSK1=0x00;
// Timer/Counter 2 Interrupt(s) initialization
TIMSK2=0x00;
// Analog Comparator initialization
// Analog Comparator:Off
// Analog Comparator Input Capture by Timer/Counter 1:Off
ACSR=0x80;
ADCSRB=0x00;
// ADC initialization
// ADC Clock frequency:1000.000 kHz
// ADC Voltage Reference:Int.,cap. on AREF
// ADC Auto Trigger Source:Free Running
// Digital input buffers on ADC0:On,ADC1:On,ADC2:On,ADC3:On
// ADC4:On,ADC5:On
DIDR0=0x00;
ADMUX=FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff);
ADCSRA=0xEF;
ADCSRB&=0xF8;
LCD_init(); //液晶初始化
PORTB.5=1; //打开背光
// Global enable interrupts
#asm("sei")
while (1)
{//LCD_write_6_8string(0,0," ");
// LCD_write_number(24,0,adc_data[0]);
wendu=adc_data[0]; //采集电压
wendu=wendu/6+12; //计算温度
LCD_write_6_8string(0,1," Temperature ");
LCD_write_6_8string(0,2," ");
LCD_write_float(24,2,wendu); //将计算后温度输出到屏幕上
LCD_write_6_8string(0,4," Just for a ");
LCD_write_6_8string(0,5," simple test ");
delay_ms(200); //延时0.2S
// Place your code here
};
}
展开阅读全文