为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

基于ATMEGA88的红外测温仪

2011-10-25 11页 doc 393KB 18阅读

用户头像

is_176012

暂无简介

举报
基于ATMEGA88的红外测温仪基于ATMEGA88的红外测温仪 作品采用ATMEL公司的ATMGEA88 作为MCU,内部有8K FLASH,1kram。工作在内部8M RC振荡下,耗电仅为2MA左右。采用RISC指令集的AVR核心,运算速度大大超过传统的51单片机。内部带有3个定时器,8路10位AD(模数转换器),串口,硬件SPI,方便使用。大批量采购价格目前由于炒货的原因涨价到12RMB。(具体问题可以搜索下,网上吹捧得很多)推荐你看一下中文的PDF,到处都有下载的。采用这块芯片主要来说就有一点,比51先进,功耗低,内带AD,而且外部不需要加晶振。 使...
基于ATMEGA88的红外测温仪
基于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: 50V max LOW DRIFT: 0.25V/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 #include "lcd5110.h" #include 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 }; }
/
本文档为【基于ATMEGA88的红外测温仪】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
热门搜索

历史搜索

    清空历史搜索