极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 16867|回复: 1

热敏电阻采样显示温度

[复制链接]
发表于 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: timer0
Pins 9 and 10: timer1
Pins 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[0].cTemp) + sizeof(NTC_Temp_Tab[0].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_DUBEG
  Serial.begin(9600);
  #endif
  pinMode(PWM1_PIN,OUTPUT);
  pinMode(PWM2_PIN,OUTPUT);
  pinMode(NANO_LED,OUTPUT);
  pinMode(AD_IN,INPUT);  
  MsTimer2::set(1, Timer2Task); // 1ms
  MsTimer2::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;       
                  }
  }  
}


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2019-7-8 10:29:17 | 显示全部楼层
不错收藏了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 02:52 , Processed in 0.042996 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表