找回密码
 立即注册
查看: 2225|回复: 7

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

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

718

主题

1万

回帖

1万

积分

管理员

积分
15630
发表于 2023-2-1 11:30:32 | 显示全部楼层 |阅读模式
真12位ADC, 热敏电阻/NTC 测温 《STC32位8051单片机原理及C语言程序设计 视频教程》,第19集上线

真12位ADC, 热敏电阻/NTC 测温 视频教程-1.png
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=323
回复

使用道具 举报 送花

2

主题

4

回帖

50

积分

注册会员

积分
50
发表于 2023-6-4 02:50:23 来自手机 | 显示全部楼层
这个例程vref好像是2.5v,我
现在vref是vcc,请问那个adc表的数值应该怎么得到哦

点评

只要NTC供电来自ADC的AV_REF,REF的电压从2.5V~VCC,ADC值都一样,不会影响精度。  详情 回复 发表于 2023-8-1 14:35
回复 支持 反对

使用道具 举报 送花

2

主题

4

回帖

50

积分

注册会员

积分
50
发表于 2023-8-1 02:08:03 来自手机 | 显示全部楼层
顶一顶,看看有没有大佬能提供一下对应数值
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12079
发表于 2023-8-1 14:35:51 | 显示全部楼层
iop78*** 发表于 2023-6-4 02:50
这个例程vref好像是2.5v,我
现在vref是vcc,请问那个adc表的数值应该怎么得到哦 ...

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:388
  • 最近打卡:2025-05-01 12:18:53

10

主题

143

回帖

348

积分

中级会员

积分
348
发表于 2023-11-30 19:30:53 | 显示全部楼层
ntc的程序在哪里 ,借鉴的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:379
  • 最近打卡:2025-05-02 11:40:42

43

主题

336

回帖

595

积分

高级会员

积分
595
发表于 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。怎么可能会一样呢?

点评

假设,某个温度下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官方的例子直接下载就  详情 回复 发表于 2024-3-26 11:49
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:522
  • 最近打卡:2025-05-02 00:29:54

10

主题

1159

回帖

5121

积分

论坛元老

积分
5121
发表于 2024-3-26 11:31:30 | 显示全部楼层
本帖最后由 angmall 于 2024-3-26 11:34 编辑
huh*** 发表于 2023-11-30 19:30
ntc的程序在哪里 ,借鉴的

这个是主程序。

  1. #include "COMM/stc.h"                //调用头文件
  2. #include "COMM/usb.h"
  3. #include "seg_led.h"
  4. #include "key.h"
  5. #include "beep.h"
  6. #include "tim0.h"
  7. #include "exit.h"
  8. #include "adc.h"
  9. #include "ntc.h"
  10. #define MAIN_Fosc 24000000UL        //定义主时钟
  11. char *USER_DEVICEDESC = NULL;
  12. char *USER_PRODUCTDESC = NULL;
  13. char *USER_STCISPCMD = "@STCISP#";
  14. bit  TIM_10MS_Flag;                        //10ms的标志位
  15. u16 Tme_CountDown = 0;                //全局变量
  16. bit RUN_STATE = 0;                //0:正常运行  1:参数设置
  17. u8 S_HOUR = 0;
  18. u8 S_MINUTE = 0;
  19. u8 S_SECOND = 0;
  20. void sys_init();        //函数声明
  21. void delay_ms(u16 ms);        //unsigned int
  22. void TIME_SET_Second(void)
  23. {
  24.         S_SECOND ++;
  25.         if( S_SECOND>60 )
  26.         {
  27.                 S_SECOND = 0;
  28.                 S_MINUTE++;
  29.         }        
  30. }
  31. void main()                                        //程序开始运行的入口
  32. {
  33.         int TEMP_VAL;
  34.         int count = 0;
  35.         
  36.         sys_init();                                //USB功能+IO口初始化
  37.         usb_init();                                //usb库初始化
  38.         
  39.         delay_ms(500);
  40.         Timer0_Init();                        //定时器0初始化
  41.         ADC_Init();        
  42.         
  43.         P1M0 = 0x00; P1M1 = 0x08;
  44.         
  45.         EA = 1;                                        //CPU开放中断,打开总中断。
  46.         while(1)                //死循环
  47.         {
  48.                 delay_ms(2);
  49.                 if( DeviceState != DEVSTATE_CONFIGURED )         //
  50.                         continue;
  51.                 if( bUsbOutReady )                                                               
  52.                 {
  53.                         usb_OUT_done();
  54.                         
  55.                         
  56.                         printf("当前温度:%d\r\n",TEMP_VAL);
  57.                 }
  58.                
  59.                 if( TIM_10MS_Flag==1 )                                                                        //如果10ms到了
  60.                 {
  61.                         TIM_10MS_Flag = 0;                                                                        //清空标志位
  62.                         
  63.                         count++;
  64.                         if( count>=30 )
  65.                         {
  66.                                 count = 0;
  67.                                 
  68.                                 TEMP_VAL = Temp_Cal(ADC_Read(3));
  69.                                 
  70.                                 SEG0 = TEMP_VAL/1000%10;
  71.                                 SEG1 = TEMP_VAL/100%10;
  72.                                 SEG2 = TEMP_VAL/10%10 +10;
  73.                                 SEG3 = TEMP_VAL/1%10;
  74.                         }
  75.                                 
  76.                 }               
  77.         }
  78. }
  79. void Timer0_Isr(void) interrupt 1
  80. {
  81.         static timcount = 0;
  82.         
  83.         SEG_LED_Show();                        //数码管刷新的
  84.         
  85.         timcount++;                                //1ms+1
  86.         if( timcount>=10 )                //如果这个变量大于等于10,10ms计数到达
  87.         {
  88.                 timcount = 0;
  89.                 TIM_10MS_Flag = 1;        //10ms时间到了
  90.         }
  91. }
  92. void sys_init()                //函数定义
  93. {
  94.     WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
  95.     EAXFR = 1; //扩展寄存器(XFR)访问使能
  96.     CKCON = 0; //提高访问XRAM速度
  97.         P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
  98.     P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
  99.     P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
  100.     P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
  101.     P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
  102.     P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
  103.     P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
  104.     P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口
  105.         
  106.     P3M0 = 0x00;
  107.     P3M1 = 0x00;
  108.    
  109.     P3M0 &= ~0x03;
  110.     P3M1 |= 0x03;
  111.     //设置USB使用的时钟源
  112.     IRC48MCR = 0x80;    //使能内部48M高速IRC
  113.     while (!(IRC48MCR & 0x01));  //等待时钟稳定
  114.     USBCLK = 0x00;        //使用CDC功能需要使用这两行,HID功能禁用这两行。
  115.     USBCON = 0x90;
  116. }
  117. void delay_ms(u16 ms)        //unsigned int
  118. {
  119.         u16 i;
  120.         do
  121.         {
  122.                 i = MAIN_Fosc/6000;
  123.                 while(--i);
  124.         }while(--ms);
  125. }
复制代码
15.NTC温度采集.zip
15.NTC温度采集.zip

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12079
发表于 2024-3-26 11:49:28 | 显示全部楼层
qepu*** 发表于 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会发现,温度值不变的。

您认为不一样,请您给出不一样的计算结果。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 18:05 , Processed in 0.168455 second(s), 111 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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