找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1703|回复: 23
收起左侧

单片机+数码管显示温度刷新率问题

[复制链接]
ID:322939 发表于 2021-11-1 20:48 | 显示全部楼层 |阅读模式
各位有没有做过这类单片机项目,数码管显示温度每隔5度就刷新一次显示,包括在加热和控温状态时都是这样的刷新率时间,这种显示方式的原理逻辑是什么呢?以我的理解如果在数据表里面隔5度就填一个数值,另外就刷新时间延长方式,但觉得始终行不通,有那位大神做过不?有劳指点一下。
回复

使用道具 举报

ID:752974 发表于 2021-11-2 08:50 | 显示全部楼层
这个要看你用的是动态扫描显示电路还是静态显示电路,静态显示电路可以这么做。动态扫描显示电路也分两种情况,一是过去教科书的例子,用8255或8155组成显示电路,这种电路每20ms左右就要刷新一次,如果使用如类似TM1640的显示驱动芯片的显示电路也可以按楼主的想法做。
回复

使用道具 举报

ID:322939 发表于 2021-11-2 09:31 | 显示全部楼层
我目前是用IO口直接动态驱动8位数码管,不知这方式是怎样做的?
回复

使用道具 举报

ID:322939 发表于 2021-11-2 09:36 | 显示全部楼层
如在5度范围内数值就显示不变,超出5度就变成10度,例如:从常温加热(25,30,35,40)这样显示,在达到目标温度数值在5度范围内数值显示不变。
回复

使用道具 举报

ID:752974 发表于 2021-11-2 09:54 | 显示全部楼层
用IO口直接驱动的动态电路,如果是一个口驱动八个段,另一个口驱动八个位,这种电路需要20ms左右刷新一次,刷新时实时更新数据就可以了。
回复

使用道具 举报

ID:161164 发表于 2021-11-2 10:17 | 显示全部楼层
纯粹一个if判断就可以完成
if(New_Temp > (Old_Temp + 5) || Old_Temp > (New_Temp + 5)){
//更新显示数组
Old_Temp = New_Temp;
}
回复

使用道具 举报

ID:624769 发表于 2021-11-2 10:41 | 显示全部楼层
这种显示方式的原理逻辑是:

温感精度不够,又不想有些人钻牛角尖抬杠, 那么这样显示, 你就没活说了,因为,我是“故意”的。

以我的理解,这种显示连数据表都不用,他计算出来的值就是一个 char型,带符号的那种, *5 就是显示温度了。
回复

使用道具 举报

ID:322939 发表于 2021-11-2 11:30 | 显示全部楼层
多谢各位了,方式从复杂到简便,佩服。
回复

使用道具 举报

ID:322939 发表于 2021-11-2 11:46 | 显示全部楼层
188610329 发表于 2021-11-2 10:41
这种显示方式的原理逻辑是:

温感精度不够,又不想有些人钻牛角尖抬杠, 那么这样显示, 你就没活说了, ...

这位大佬,不知你那有没这方面的相关资料,学习下
回复

使用道具 举报

ID:322939 发表于 2021-11-6 19:06 | 显示全部楼层
目前温度可以5度刷新一次,但显示方式又不对,因感温信号在常温下不是固定25度的,要求常温固定在25度然后差不多同步感温信号每5度加热刷新显示一次,不知道是如何做到同步的?我试过定义一个常量用定时器计3秒+5这样显示,但不知却如何与感温信号差不多同步?
回复

使用道具 举报

ID:824490 发表于 2021-11-8 13:48 | 显示全部楼层
本帖最后由 名字不是重点 于 2021-11-8 14:41 编辑

温度变化达到5度才刷新显示?
这个也太粗糙了吧?
按人体温度来说,36.5正常,持续40度就要进急诊了。相差不过3.5度!
当然你这个的应用场景或许没这么精细,但做成产品就不应该了。。

正确的做法是:定时采集温度(比如5秒一次),显示。一定时间内(5分钟)高低温差超5度则启动修正处理或声光报警。。
回复

使用道具 举报

ID:624769 发表于 2021-11-8 14:42 | 显示全部楼层
加热器没有工作的时候,你就固定显示25,不要去解析温感数据。
加热器开始工作后,只要在工作,你就让温度显示只进不退,即:温度升高到28度+ 你显示30之后,即使温感识别问题变成解析成27,甚至25,你都依然显示30,直到温感解析出能显示35的阀值,你再更新显示信息。
加热器停止工作后,你的温度显示,同理,只退不进,直到显示25为止,进入到常温模式,永远显示25,就好了。
温度显示5度步进,本来就是“忽悠”一下看的人,不用去捉摸如果提高准确率,只要琢磨怎么能“忽悠”,能看起来舒服就可以了。
回复

使用道具 举报

ID:322939 发表于 2021-11-9 10:47 | 显示全部楼层
名字不是重点 发表于 2021-11-8 13:48
温度变化达到5度才刷新显示?
这个也太粗糙了吧?
按人体温度来说,36.5正常,持续40度就要进急诊了。相 ...

这位大佬,我是用来做发热工具检测的,不是用来检测人体的
回复

使用道具 举报

ID:322939 发表于 2021-11-9 10:58 | 显示全部楼层
188610329 发表于 2021-11-8 14:42
加热器没有工作的时候,你就固定显示25,不要去解析温感数据。
加热器开始工作后,只要在工作,你就让温度 ...

多谢这位大佬解答,如果当温度加热到如150度,突然关机温度会下降,再开机时温度下降到122度,却不是显示125度或120度,那又怎样去判断它呢?能让它以5度的进率显示啊?
回复

使用道具 举报

ID:322939 发表于 2021-11-9 11:52 | 显示全部楼层
能不能这样方式做?如下:
做一个数组uchar code Tabo[]={35,40,45,50,55,60,65,70,75,80,.............150...........200};
uint code T_vuel[]={1,2,3,4,5.............................................................400};//热电偶数据表
uint Temp=0;//AD采样值
uint  Num=25;//固定初始温度
Temp=T_vuel[Temp-1];//热电偶查表
if(Temp>=(Num+5)||Num>=(Temp+5));//加热,5度进率更新一次
{
   if(Temp>=35)
{
  Num=Temp;//更新一次
}
else//不更新还是25度
{
  Num=Num;
}
}
当温度在150度时,突然关机停止加热,温度下降
再开机加热时,怎样识别感温刚好在‘5’的进率显示?
回复

使用道具 举报

ID:624769 发表于 2021-11-9 12:59 | 显示全部楼层
假定,你热电偶返回值  128~ 230  为 25度~150 度 (非线性)
其中 128~ 145 为25~30度      146~ 155 为30~35度 那么 你可以返回值  -128 得到  0~102 这个值 作为基础值做查询表。 那么表的内容如下:
uint code T_vuel[]={25,25,25,25,25,25..............30,30,30...............................................150}
                 //对应:128 129 130 131 132 .........146,147,148..........................................230
           //表中位置:0,1,2,3,4,5..............18,19,20,..............................................102
回复

使用道具 举报

ID:322939 发表于 2021-11-9 13:41 | 显示全部楼层
188610329 发表于 2021-11-9 12:59
假定,你热电偶返回值  128~ 230  为 25度~150 度 (非线性)
其中 128~ 145 为25~30度      146~ 155 为 ...

多谢了,我先测试做个数据表,遇到不懂的再向你们请教。
回复

使用道具 举报

ID:322939 发表于 2021-11-10 14:51 | 显示全部楼层

以下为做好的表,但显示不正常,加热时数值不会动;
u16  Tepmi=0;//AD采样值
u16   Tempera=0;//得出温度值
16 code T_value[195]={
              //1  2  3   4   5
             //25 25 25 25 25  温度
               29,30,31,32,33,//AD值
              //6  7  8  9  10    索引标志
             //30 30 30 30 30   温度
               34,35,36,37,38,
             //11 12 13 14 15
            //35 35 35 35 35
               39,40,41,42,43,
            //16 17 18 19 20
          //35 35 35 35 35 35
            44,45,46,47,48,49,
        ...............................
        ...............................
        //201 202 203 201 205  位置
        //205 205 205 205 205  温度
        //201 202 203 204 205};
void  Tems_otk(void)
{
static bit Lock_Flag=0;
u16 L,H,k,M;
  u8 i;

L=0;
H=195;
for(i=0;i<5;i++)//对分查表
  {
   M=(L+H)/2;
   if(Tepmi<=T_value[M])
    L=M-1;
   else
    H=M+1;
  }
  if(Tepmi==T_value[L])
  {
   Tempera=L-5;  //索引值
    }
  else
   if(Tepmi==T_value[H])
  {
   Tempera=H-5;//索引值
  }
  else
  {
   while(L<=H)
   {
    L++;
   if(Tepmi<=T_value[L]&&Tepmi>T_value[L+1])
   {
    Tempera=L-5;//索引值
    break;
   }
  }
  }
}
void main()
{
init();
ADinit();
while(1)
{
display(Tempera);
}
}
回复

使用道具 举报

ID:624769 发表于 2021-11-10 21:34 | 显示全部楼层
你告诉我,你AD取高8位, 25度的时候是多少读数?150度的时候多少读数?
回复

使用道具 举报

ID:322939 发表于 2021-11-11 09:24 | 显示全部楼层
188610329 发表于 2021-11-10 21:34
你告诉我,你AD取高8位, 25度的时候是多少读数?150度的时候多少读数?

我是取10位的,25度时,AD读34,150度时AD读158
回复

使用道具 举报

ID:213173 发表于 2021-11-11 09:48 | 显示全部楼层
LAW1100 发表于 2021-11-10 14:51
以下为做好的表,但显示不正常,加热时数值不会动;
u16  Tepmi=0;//AD采样值
u16   Tempera=0;//得出温 ...

你这个简单查表根本用不着对分,直接for循环,满足条件即跳出。此表是150K NTC温敏电阻与27K电阻分压,10位ADC取样值,仅做参考。温度值小于25还是等于25。
u16  Tepmi=0;//AD采样值
u8   Tempera=0;//得出温度值
u16 code T_value[26]={
868 ,//        25
832 ,//        30
792 ,//        35
748 ,//        40
700 ,//        45
650 ,//        50
598 ,//        55
547 ,//        60
496 ,//        65
447 ,//        70
400 ,//        75
357 ,//        80
317 ,//        85
281 ,//        90
248 ,//        95
218 ,//        100
192 ,//        105
169 ,//        110
149 ,//        115
131 ,//        120
116 ,//        125
102 ,//        130
90 ,//        135
80 ,//        140
71 ,//        145
63 },//        150

void  Tems_otk(void)
{
        u8 i;
        for(i=0;i<25;i++)
        {
                if(Tepmi>=T_value)
                {
                        Tempera=i*5+25;
                        break;//跳出当前循环
                }
        }
}
回复

使用道具 举报

ID:322939 发表于 2021-11-11 11:34 | 显示全部楼层
wulin 发表于 2021-11-11 09:48
你这个简单查表根本用不着对分,直接for循环,满足条件即跳出。此表是150K NTC温敏电阻与27K电阻分压,10 ...

这位大佬,这样查表数值会有偏差,这句:if(Tepmi>=T_value[????])有问题
回复

使用道具 举报

ID:213173 发表于 2021-11-11 12:36 | 显示全部楼层
LAW1100 发表于 2021-11-11 11:34
这位大佬,这样查表数值会有偏差,这句:if(Tepmi>=T_value[????])有问题

直接发代码,中括号被吞了。这个方法本身没有问题,数值偏差完全在于制表。这个数组的数值只是表达意图,不可以直接引用。就算是用对分法查表,最后还得用比较和插补,你这5度进阶已经无精度可言。代码补充完整如下:
  1. u16  Tepmi=0;//AD采样值
  2. u8   Tempera=0;//得出温度值
  3. u16 code T_value[27]={
  4. 868 ,//        25
  5. 832 ,//        30
  6. 792 ,//        35
  7. 748 ,//        40
  8. 700 ,//        45
  9. 650 ,//        50
  10. 598 ,//        55
  11. 547 ,//        60
  12. 496 ,//        65
  13. 447 ,//        70
  14. 400 ,//        75
  15. 357 ,//        80
  16. 317 ,//        85
  17. 281 ,//        90
  18. 248 ,//        95
  19. 218 ,//        100
  20. 192 ,//        105
  21. 169 ,//        110
  22. 149 ,//        115
  23. 131 ,//        120
  24. 116 ,//        125
  25. 102 ,//        130
  26. 90 ,//        135
  27. 80 ,//        140
  28. 71 ,//        145
  29. 63 ,//        150
  30. 51 };

  31. void  Tems_otk(void)
  32. {
  33.         u8 i;
  34.         for(i=0;i<25;i++)
  35.         {
  36.                 if(Tepmi>=T_value[0])
  37.                 {
  38.                         Tempera=25;
  39.                         break;//跳出当前循环
  40.                 }
  41.                 else if(Tepmi<=T_value[i] && Tepmi>=T_value[i+1])
  42.                 {
  43.                         Tempera=i*5+25;
  44.                         break;//跳出当前循环
  45.                 }
  46.         }
  47. }
复制代码
回复

使用道具 举报

ID:322939 发表于 2021-11-11 14:13 | 显示全部楼层
wulin 发表于 2021-11-11 12:36
直接发代码,中括号被吞了。这个方法本身没有问题,数值偏差完全在于制表。这个数组的数值只是表达意图, ...

多谢了,我研究下
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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