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

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

[复制链接]

该用户从未签到

550

主题

9321

回帖

1万

积分

管理员

积分
13904
发表于 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 来自手机 | 显示全部楼层
顶一顶,看看有没有大佬能提供一下对应数值
回复 支持 反对 送花

使用道具 举报

该用户从未签到

46

主题

2934

回帖

6619

积分

超级版主

积分
6619
发表于 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值都一样,不会影响精度。
回复 支持 反对 送花

使用道具 举报

  • TA的每日心情
    开心
    12 小时前
  • 签到天数: 150 天

    [LV.7]常住居民III

    9

    主题

    128

    回帖

    744

    积分

    高级会员

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

    使用道具 举报

  • TA的每日心情
    开心
    3 小时前
  • 签到天数: 42 天

    [LV.5]常住居民I

    11

    主题

    112

    回帖

    232

    积分

    中级会员

    积分
    232
    发表于 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
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    10 小时前
  • 签到天数: 163 天

    [LV.7]常住居民III

    9

    主题

    837

    回帖

    3275

    积分

    论坛元老

    积分
    3275
    发表于 2024-3-26 11:31:30 | 显示全部楼层
    本帖最后由 angmall 于 2024-3-26 11:34 编辑
    huhuan 发表于 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

    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    2934

    回帖

    6619

    积分

    超级版主

    积分
    6619
    发表于 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会发现,温度值不变的。

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-5 12:31 , Processed in 0.068376 second(s), 62 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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