温度采集是产品开发过程中必不可少的,读取温度的方法有很多种,有专用温度采集芯片,温度传感器,热敏电阻等,各种方法来获取温度。今天总结一下使用热敏电阻来采集温度。

先看看热敏电阻的概念

也就是将温度变化转换为电阻阻值变化,通过通过阻值大小就能间接地判断到当前温度值。而读取电阻值实际应用中是很不方便的。如果将电阻值转换为电压值,然后通过单片机AD采样功能,读取电压值。这样相当于间接的读取到了温度值。

下面总结一下用STM8单片机,通过NTC热敏电阻读取温度值得方法。

首先看看热敏电阻的样子

选用的是5K阻值的NTC热敏电阻,它的阻值和温度对照表如下:

通过一个固定电阻和NTC热敏电阻串联分压,然后将两个电阻中间节点接入到单片机AD采样口。

ADC口接单片机AD采样口,通过AD采样功能,读取采样的电压值,然后将电压值、电阻值、温度值三个对应起来,这样就能通过电压值得变化来反应出温度的变化。

原理图中的ADC口接单片机PD6口,也就是模拟输入6口,PD5口作为串口输出口,输出读取到的采样值。硬件上电路比较简单,只需要一个最小系统,然后外部一个5K固定电阻和NTC热敏电阻就行了。下面看一下代码的实现:

首先将PD6口设置为ADC功能,通过中断读取ADC采样值。

#include "adc.h"
#include "main.h"u16  DATAH = 0;                          //ADC转换值高8位
u16  DATAL = 0;                          //ADC转换值低8位
_Bool ADC_flag = 0;                      //ADC转换成功标志//AD通道引脚初始化
void ADC_GPIO_Init( void )
{PD_DDR &= ~( 1 << 6 );              //PD6 设置为输入     AIN6 PD_CR1 &= ~( 1 << 6 );              //PD6 设置为悬空输入}//ADC输入通道初始化入口参数表示通道选择
void ADC_CH_Init( u8 ch )
{char l = 0;ADC_CR1  = 0x00;                    //fADC = fMASTER/2, 8Mhz  单次转换,禁止转换ADC_CSR  = ch + 1;                  //控制状态寄存器 选择要 AD输入通道  如:PD2(AIN3)ADC_CR2  = 0x00;                    //默认左对齐 读数据时先读高在读低ADC_TDRL = ( 1 << ( ch + 1 ) );     //禁止相应通道 施密特触发功能 1左移ch+1位ADC_CR1 |= 0x01;                    //使能ADC并开始转换ADC_CSR |= 0x20;                    //EOCIE 使能转换结束中断  EOC中断使能for( l = 0; l < 100; l++ );         //延时,保证ADC模块的上电完成 至少7usADC_CR1 = ADC_CR1 | 0x01;           //再次将CR1寄存器的最低位置1 使能ADC 并开始转换
}//采集PD6电压值  AIN6
u16 ReadVol_CH6( void )
{u16 voltage = 0;ADC_CH_Init( 5 );if( ADC_flag ){ADC_flag = 0;voltage = ( DATAH << 2 ) + DATAL ; //得到十位精度的数据  0--1024//ADC_CR1 = ADC_CR1 | 0x01;          //再次将CR1寄存器的最低位置1  启动下一次转换};return voltage;
}//AD中断服务函数 中断号22
#pragma vector = 24                              // IAR中的中断号,要在STVD中的中断号上加2
__interrupt void ADC_Handle( void )
{ADC_CSR &= ~0x80;                            // 转换结束标志位清零  EOC//默认左对齐 读数据时先读高高8位 再读低8位DATAH = ADC_DRH;                             // 读出ADC结果的高8位DATAL = ADC_DRL;                             // 读出ADC结果的低8位ADC_flag = 1;                                // ADC中断标志 置1
}

接下来将PD5口设置为串口发送功能:

#include "uart.h"
#include "main.h"//在Library Options中将Printf formatter改成Large
//重新定向putchar函数,使支持printf函数
int putchar( int ch )
{while( !( UART1_SR & 0X80 ) );              //循环发送,直到发送完毕UART1_DR = ( u8 ) ch;return ch;
}
//串口只用发送口,不用接收口
void Uart1_IO_Init( void )
{PD_DDR |= ( 1 << 5 );                       //输出模式 TXDPD_CR1 |= ( 1 << 5 );                       //推挽输出
}//波特率最大可以设置为38400
void Uart1_Init( unsigned int baudrate )
{unsigned int baud;baud = 16000000 / baudrate;Uart1_IO_Init();UART1_CR1 = 0;      //禁止发送和接收UART1_CR2 = 0;      //8 bitUART1_CR3 = 0;      //1 stopUART1_BRR2 = ( unsigned char )( ( baud & 0xf000 ) >> 8 ) | ( ( unsigned char )( baud & 0x000f ) );UART1_BRR1 = ( ( unsigned char )( ( baud & 0x0ff0 ) >> 4 ) );
//    UART1_CR2_bit.REN = 1;                      //接收使能UART1_CR2_bit.TEN = 1;                      //发送使能
//    UART1_CR2_bit.RIEN = 1;                     //接收中断使能
}

串口只用到了发送功能,所以串口只需要初始化发送口和设置波特率就行。此处putchar(),函数是用于将printf()打印功能重映射到串口1。

下面看主函数代码

void main( void )
{__asm( "sim" );                             //禁止中断SysClkInit();delay_init( 16 );  Uart1_IO_Init();Uart1_Init( 9600 );ADC_GPIO_Init();__asm( "rim" );                             //开启中断while( 1 ){      val_ch6 = ReadVol_CH6();               printf( "%d\r\n", val_ch6);delay_ms( 200 );}
}

主函数中每隔0.2s读取一次电压值,并通过串口发送出来。

下面通过串口波形显示软件看看采样的温度曲线。

通过曲线可以看到,温度刚开始时发生了波动,然后就趋于稳定,稳定后的采样值为500。STM8单片机的AD采样分辨率为10位,也就是采样最大值为2^10=1024,单片机为5V供电,也就是5V对应的采样值为1024,那么采样值500对应的电压值就为 500/1024*5=2.44V

       

可以计算出NTC当前电阻值为4.77K,通过NTC阻值和温度对照表可以看出4.77K对应的温度值在26℃左右。说明当前测量的温度值为26℃。为了方便显示温度,可以将采样的电压值和温度值做成一个表格存储在单片机中,这样每次采样到数据后,通过查表就能得到温度值了。

STM8学习笔记---NTC热敏电阻的使用相关推荐

  1. STM8学习笔记----普通IO口模拟串口功能

    串口在产品应用中很常见,但是单片机的默认带的串口往往比较少,有时候就会出现串口不够用,所以就想着能不能用普通IO口模拟串口来实现串口的功能. 要模拟串口首先要清楚串口数据传输过程中的原理. 常用的串口 ...

  2. STM8学习笔记---寄存器操作之位或和位与运算

    刚开始学习STM8单片机时,看别人的代码,在设置寄存器的时候经常使用,位或.位与.左移.右移等运算,就很不理解,为什么不直接给寄存器赋值,非要搞的这么复杂.直到后来程序写的多了,才明白这样写的好处.比 ...

  3. STM8学习笔记3 STM8简介

    概述 STM8单片机的开发商是意法半导体(ST),于2009年推出.它具有3级流水线架构.性价比高.开发方便的等优点.根据应用场合的不同,分为三个系列:STM8S,STM8L和STM8A. 个人认为, ...

  4. STM8学习笔记1:STM8简介

    文章目录 前言 从大学开始接触单片机,但对他的理解一直处于很表面,现在进入公司也有半年多的时间了,由于工作就是做底层驱动开发,现在更需要认真去学习一款单片机的使用.目前工作接触最多的单片机是英飞凌TC ...

  5. STM8学习笔记---PWM互补波形输出

    脉宽调制(PWM,Pulse Width Modulation)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量.通信到功率控制与变换的许多领域中. 常见的用法是输出 ...

  6. STM8学习笔记---串口printf函数的实现

    在使用单片机的时候,串口是要经常使用的功能,特别是在调试代码的过程中,经常需要使用串口打印出某些变量值,来判断程序执行流程是否正常.但是单片机默认情况下没有printf函数,如果需要使用printf函 ...

  7. STM8学习笔记---PWM变频输出

    在使用STM8的PWM功能时,一般都是改变占空比来改变输出电压大小.但是有时候不需要改变PWM的占空比,而是需要按照一定的规律改变输出PWM的频率,而占空比保持不变.现在总结一下如何实现STM8单片机 ...

  8. STM8学习笔记---利用PWM功能输出SPWM波

    要生成SPWM波,其关键是要生成一组正弦规律变化的数字,然后将数字对应成PWM输出的占空比,按照顺序输出占空比就行.生成正弦波的方法在 使用C语言产生正弦波数据 这篇博客有详细说明,这里就不说了. 本 ...

  9. STM8学习笔记---定时器输出7路PWM波

    STM8S003F3P6单片机共有三个定时器定时器1.定时器2.定时器4.其中定时器1为16位高级定时器,定时器2为16位通用定时器,定时器4为8位基本定时器.定时器1和定时器2可以输出PWM波.其中 ...

最新文章

  1. 校验正确获取对象或者数组的属性方法(babel-plugin-idx/_.get)
  2. 企业靠这些 云端数据就能得到企业级的安全守护
  3. 011_学生管理系统二
  4. 【opencv】3.在一个opencv窗口中显示多个视频界面、画箭头、画掉头箭头
  5. QT判断操作系统版本
  6. driver.class.php line: 109,thinkphp3.2.3 无法加载数据库驱动: Think\Db\Driver\
  7. C# winform引用com组件,创建AXHOST组件失败解决方案
  8. 模拟一次CSRF(跨站请求伪造)例子,适合新手
  9. 二叉树的遍历(堆栈)
  10. 荷兰牛栏 荷兰售价_荷兰研究小组授予的数据共享项目
  11. C++类设计的一些心得
  12. 江浙沪地区计算机考研高效排名,京津冀,江浙沪地区院校盘点!
  13. L1-044 稳赢-PAT团体程序设计天梯赛GPLT
  14. Object.assign 浅拷贝还是深拷贝
  15. 宁可多花1000元租房,也绝不要去挤半小时地铁
  16. 东财《社会统计学》综合作业
  17. 阿里云的端口映射问题
  18. 【自制壁纸生成器】2022新年壁纸领取,换一张手机壁纸,迎接2022叭~
  19. linux启用NAT功能,双网卡共享网络,iptables简单实现
  20. 5个商用字体网站分享

热门文章

  1. 图形数据库、NOSQL和Neo4j
  2. IT行业为什么需要更多的女性?
  3. jquery Ajax应用
  4. codeforces hack
  5. 用IDEA开发一个简单的Spring MVC的Hello World程序,表单程序
  6. SpriteKit游戏开发适配iPad/iPhone6/7/8/Plus及iPhoneX的尺寸及安全区域
  7. CF540 B 贪心
  8. Nginx + tornado + supervisor部署
  9. VC++ (四)动态内存
  10. 双核CPU揭密:英特尔/AMD没有告诉你的五项事实【ZZ】