真12位ADC, 热敏电阻/NTC 测温 视频教程
真12位ADC, 热敏电阻/NTC 测温 《STC32位8051单片机原理及C语言程序设计 视频教程》,第19集上线https://www.stcaimcu.com/forum.php?mod=viewthread&tid=323
这个例程vref好像是2.5v,我
现在vref是vcc,请问那个adc表的数值应该怎么得到哦 顶一顶,看看有没有大佬能提供一下对应数值 iop789zxc 发表于 2023-6-4 02:50
这个例程vref好像是2.5v,我
现在vref是vcc,请问那个adc表的数值应该怎么得到哦 ...
只要NTC供电来自ADC的AV_REF,REF的电压从2.5V~VCC,ADC值都一样,不会影响精度。 {:4_181:}ntc的程序在哪里 ,借鉴的 梁工 发表于 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: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
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]