福州布衣 发表于 2019-5-14 17:48:01

热敏电阻采样显示温度

热敏电阻采样显示温度代码:#include <avr/pgmspace.h>#include <MsTimer2.h>#define RS232_DUBEG         //开启/关闭 串口调试/* ATMega328(比如UNO)有三个计时器timer 0-2, 一些延时语句比如delay(), millis() micros() 用的是timer0,6个PWM输出脚当然也要用这些计时器,它们是这样分配的:Pins 5 and 6: timer0Pins 9 and 10: timer1Pins 11 and 3: timer2 */#define PWM1_PIN       9          //3PIN PWMOUT#define PWM2_PIN       10         //5PIN PWMOUT#define AD_IN          A0         //电路连接方式:+5V----10K上拉电阻----NTC(10K,B3950)----GND#define NANO_LED       13         //NANO板载LED连接13脚//定义数据传输时间 (ATMega328P运行在16MHz下,一个时钟周期的时间为1/16,000,000s = 1/16,000m s= 1/16us = 62.5ns ,一个nop是62.5ns)#define NOP         asm("nop") boolean _1msFlg = 0;boolean bBlinkSta = 0;unsigned int uiAD_Value;unsigned char ucPWM_Value;char cNTC_Temp = 0;struct NTC_TEMP{        char cTemp;        unsigned int uiAD;};
const struct NTC_TEMP NTC_Temp_Tab[] PROGMEM =    //电路连接方式:+5V----10K上拉电阻----NTC(10K,B3950)----GND{        {-40,0x3E3},{-39,0x3E1},{-38,0x3DF},{-37,0x3DD},{-36,0x3DA},{-35,0x3D8},{-34,0x3D5},{-33,0x3D3},{-32,0x3D0},{-31,0x3CD},        {-30,0x3CA},{-29,0x3C6},{-28,0x3C3},{-27,0x3BF},{-26,0x3BB},{-25,0x3B8},{-24,0x3B3},{-23,0x3AF},{-22,0x3AA},{-21,0x3A6},        {-20,0x3A1},{-19,0x39C},{-18,0x396},{-17,0x391},{-16,0x38B},{-15,0x385},{-14,0x37F},{-13,0x378},{-12,0x372},{-11,0x36B},        {-10,0x364},{-9 ,0x35C},{-8 ,0x355},{-7 ,0x34D},{-6 ,0x345},{-5 ,0x33D},{-4 ,0x334},{-3 ,0x32C},{-2 ,0x323},{-1 ,0x31A},        {0,0x310},{1,0x307},{2,0x2FD},{3,0x2F3},{4,0x2E9},{5,0x2DF},{6,0x2D5},{7,0x2CA},{8,0x2C0},{9,0x2B5},        {10 ,0x2AA},{11 ,0x29F},{12 ,0x294},{13 ,0x289},{14 ,0x27D},{15 ,0x272},{16 ,0x267},{17 ,0x25B},{18 ,0x250},{19 ,0x244},        {20 ,0x239},{21 ,0x22D},{22 ,0x222},{23 ,0x217},{24 ,0x20B},{25 ,0x200},{26 ,0x1F5},{27 ,0x1EA},{28 ,0x1DF},{29 ,0x1D4},        {30 ,0x1C9},{31 ,0x1BE},{32 ,0x1B3},{33 ,0x1A9},{34 ,0x19E},{35 ,0x194},{36 ,0x18A},{37 ,0x180},{38 ,0x176},{39 ,0x16D},        {40 ,0x163},{41 ,0x15A},{42 ,0x151},{43 ,0x148},{44 ,0x13E},{45 ,0x137},{46 ,0x12E},{47 ,0x126},{48 ,0x11E},{49 ,0x116},        {50 ,0x10E},{51 ,0x107},{52 ,0x100},{53 ,0xF8 },{54 ,0xF1 },{55 ,0xEB },{56 ,0xE4 },{57 ,0xDE },{58 ,0xD7 },{59 ,0xD1 },        {60 ,0xCB },{61 ,0xC5 },{62 ,0xC0 },{63 ,0xBA },{64 ,0xB5 },{65 ,0xB0 },{66 ,0xAB },{67 ,0xA6 },{68 ,0xA1 },{69 ,0x9C },        {70 ,0x98 },{71 ,0x93 },{72 ,0x8F },{73 ,0x8B },{74 ,0x87 },{75 ,0x83 },{76 ,0x80 },{77 ,0x7C },{78 ,0x78 },{79 ,0x75 },        {80 ,0x72 },{81 ,0x6E },{82 ,0x6B },{83 ,0x68 },{84 ,0x65 },{85 ,0x62 },{86 ,0x60 },{87 ,0x5D },{88 ,0x5A },{89 ,0x58 },        {90 ,0x55 },{91 ,0x53 },{92 ,0x51 },{93 ,0x4E },{94 ,0x4C },{95 ,0x4A },{96 ,0x48 },{97 ,0x46 },{98 ,0x44 },{99 ,0x42 },        {100,0x41 },{101,0x3F },{102,0x3D },{103,0x3B },{104,0x3A },{105,0x38 },};
/*********************************************//NTC-温度转换*********************************************/char NTC2Temp(unsigned int NTC_AD_Value){        unsigned char i;        char temp = 0;      // -40 --- 105 C                for(i = 0; i < sizeof(NTC_Temp_Tab) / (sizeof(NTC_Temp_Tab.cTemp) + sizeof(NTC_Temp_Tab.uiAD)); i++){          if(pgm_read_word(&NTC_Temp_Tab.uiAD) <= NTC_AD_Value){                        temp = pgm_read_byte(&NTC_Temp_Tab.cTemp);                        break;                }        }        return(temp);} /*********************************************//TIMER2中断任务*********************************************/void Timer2Task(void){_1msFlg = 1;}/*********************************************//初始化*********************************************/void setup(){#ifdef RS232_DUBEGSerial.begin(9600);#endif pinMode(PWM1_PIN,OUTPUT);pinMode(PWM2_PIN,OUTPUT);pinMode(NANO_LED,OUTPUT);pinMode(AD_IN,INPUT);MsTimer2::set(1, Timer2Task); // 1msMsTimer2::start();}/*********************************************//主程序*********************************************/void loop(){if ( _1msFlg){          #define _500MS_CNT    500          #define _100MS_CNT    100          static unsigned int ui500msCnt = _500MS_CNT;          static unsigned char uc100msCnt = _100MS_CNT;          unsigned char i;             _1msFlg = 0;              if (--ui500msCnt == 0){               ui500msCnt = _500MS_CNT;               if (bBlinkSta){                       bBlinkSta = 0;                       digitalWrite(NANO_LED,0);               }else{                       bBlinkSta = 1;                       digitalWrite(NANO_LED,1);               }                              uiAD_Value = analogRead(AD_IN);                cNTC_Temp = NTC2Temp(uiAD_Value);                #ifdef RS232_DUBEG     Serial.print("采样AD值 = 0x");     Serial.print(uiAD_Value,HEX);     Serial.print("H;温度 = ");     Serial.print(cNTC_Temp,DEC);    Serial.println("℃");                 #endif               }          if (--uc100msCnt == 0){      uc100msCnt = _100MS_CNT;                          }}}

lllangxx 发表于 2019-7-8 10:29:17

不错收藏了
页: [1]
查看完整版本: 热敏电阻采样显示温度