神农鼎 发表于 2023-2-1 11:30:32

真12位ADC, 热敏电阻/NTC 测温 视频教程

真12位ADC, 热敏电阻/NTC 测温 《STC32位8051单片机原理及C语言程序设计 视频教程》,第19集上线


https://www.stcaimcu.com/forum.php?mod=viewthread&tid=323

iop789zxc 发表于 2023-6-4 02:50:23

这个例程vref好像是2.5v,我
现在vref是vcc,请问那个adc表的数值应该怎么得到哦

iop789zxc 发表于 2023-8-1 02:08:03

顶一顶,看看有没有大佬能提供一下对应数值

梁工 发表于 2023-8-1 14:35:51

iop789zxc 发表于 2023-6-4 02:50
这个例程vref好像是2.5v,我
现在vref是vcc,请问那个adc表的数值应该怎么得到哦 ...

只要NTC供电来自ADC的AV_REF,REF的电压从2.5V~VCC,ADC值都一样,不会影响精度。

huhuan 发表于 2023-11-30 19:30:53

{:4_181:}ntc的程序在哪里 ,借鉴的

qepuemc 发表于 2024-3-26 10:48:11

梁工 发表于 2023-8-1 14:35
只要NTC供电来自ADC的AV_REF,REF的电压从2.5V~VCC,ADC值都一样,不会影响精度。 ...

一个是0~2.5。一个是2.5~5。怎么可能会一样呢?

angmall 发表于 2024-3-26 11:31:30

本帖最后由 angmall 于 2024-3-26 11:34 编辑

huhuan 发表于 2023-11-30 19:30
ntc的程序在哪里 ,借鉴的
这个是主程序。

#include "COMM/stc.h"                //调用头文件
#include "COMM/usb.h"
#include "seg_led.h"
#include "key.h"
#include "beep.h"
#include "tim0.h"
#include "exit.h"
#include "adc.h"
#include "ntc.h"


#define MAIN_Fosc 24000000UL      //定义主时钟

char *USER_DEVICEDESC = NULL;
char *USER_PRODUCTDESC = NULL;
char *USER_STCISPCMD = "@STCISP#";

bitTIM_10MS_Flag;                        //10ms的标志位
u16 Tme_CountDown = 0;                //全局变量

bit RUN_STATE = 0;                //0:正常运行1:参数设置
u8 S_HOUR = 0;
u8 S_MINUTE = 0;
u8 S_SECOND = 0;

void sys_init();      //函数声明
void delay_ms(u16 ms);      //unsigned int

void TIME_SET_Second(void)
{
      S_SECOND ++;
      if( S_SECOND>60 )
      {
                S_SECOND = 0;
                S_MINUTE++;
      }      
}
void main()                                        //程序开始运行的入口
{
      int TEMP_VAL;
      int count = 0;
      
      sys_init();                              //USB功能+IO口初始化
      usb_init();                              //usb库初始化
      
      delay_ms(500);
      Timer0_Init();                        //定时器0初始化
      ADC_Init();      
      
      P1M0 = 0x00; P1M1 = 0x08;

      
      EA = 1;                                        //CPU开放中断,打开总中断。

      while(1)                //死循环
      {
                delay_ms(2);
                if( DeviceState != DEVSTATE_CONFIGURED )         //
                        continue;
                if( bUsbOutReady )                                                               
                {
                        usb_OUT_done();
                        
                        
                        printf("当前温度:%d\r\n",TEMP_VAL);
                }
               
                if( TIM_10MS_Flag==1 )                                                                        //如果10ms到了
                {
                        TIM_10MS_Flag = 0;                                                                        //清空标志位
                        
                        count++;
                        if( count>=30 )
                        {
                              count = 0;
                              
                              TEMP_VAL = Temp_Cal(ADC_Read(3));
                              
                              SEG0 = TEMP_VAL/1000%10;
                              SEG1 = TEMP_VAL/100%10;
                              SEG2 = TEMP_VAL/10%10 +10;
                              SEG3 = TEMP_VAL/1%10;
                        }
                              
                }               

      }
}

void Timer0_Isr(void) interrupt 1
{
      static timcount = 0;
      
      SEG_LED_Show();                        //数码管刷新的
      
      timcount++;                              //1ms+1
      if( timcount>=10 )                //如果这个变量大于等于10,10ms计数到达
      {
                timcount = 0;
                TIM_10MS_Flag = 1;      //10ms时间到了
      }
}


void sys_init()                //函数定义
{
    WTST = 0;//设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1; //扩展寄存器(XFR)访问使能
    CKCON = 0; //提高访问XRAM速度

      P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
    P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
    P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
    P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
    P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
    P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
    P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
    P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
      
    P3M0 = 0x00;
    P3M1 = 0x00;
   
    P3M0 &= ~0x03;
    P3M1 |= 0x03;

    //设置USB使用的时钟源
    IRC48MCR = 0x80;    //使能内部48M高速IRC
    while (!(IRC48MCR & 0x01));//等待时钟稳定

    USBCLK = 0x00;      //使用CDC功能需要使用这两行,HID功能禁用这两行。
    USBCON = 0x90;
}


void delay_ms(u16 ms)      //unsigned int
{
      u16 i;
      do
      {
                i = MAIN_Fosc/6000;
                while(--i);
      }while(--ms);
}
15.NTC温度采集.zip
15.NTC温度采集.zip

梁工 发表于 2024-3-26 11:49:28

qepuemc 发表于 2024-3-26 10:48
一个是0~2.5。一个是2.5~5。怎么可能会一样呢?

假设,某个温度下NTC阻值为2.5K,串联10K电阻到AVREF,则输出电压为AVREF*2.5/(10+2.5)
= 0.2*AVREF, AVREF从2.5~5V都是这个比值,而ADC的值就是一样的:4096*0.2*AVREF/AVREF = 819。STC官方的例子直接下载就可以测试,并不难,你调整AVREF会发现,温度值不变的。

您认为不一样,请您给出不一样的计算结果。
页: [1]
查看完整版本: 真12位ADC, 热敏电阻/NTC 测温 视频教程