1.题目要求

有时候我们需要知道在一段时间里温度传感器测量的温度的历史数据,之前的温度传感器例程只是在液晶屏上实时显示出数据而已,并不能查看它的历史数据,所以我们运用之前所有学过的知识来完成这个任务。

首先我们先从简单的理念入手,利用串口每隔一秒打印出来当前的温度值,这样的话,所有历史数据在电脑端的窗口都可以看到了,只不过我们的开发板的USB线不能离开电脑,测温度只能连着电脑测,然后观察电脑端窗口数据的变化。

这一次我们实时显示的温度用数码管显示,串口打印的数据格式大体如下所示

第1秒:10.2度

第2秒:15.7度

第3秒:7.6度

第4秒:0.5度


2.main.c测试代码

#include <reg52.h>
#include <function.h> //详见第六章第8讲
#include <timer.h>    //详见第八章第11讲
#include <uart.h>     //详见第十章第4讲
#include <ds18b20.h>  //详见第十三章第5讲

u8 flag1s = 0;
void main()
{
    u32 x=1;
    u8 str[13];    
    u16 temp;
    EA = 1;  
    LED_Init();
    Start18B20();        //启动DS18B20
    TIM0_Init(1000,33);  //定时1ms,33是微调使定时精度更高,每次微调都由中断函数里的内容而决定
    ConfigUART(9600);
    while (1)
    {    
        if (flag1s)      //每秒更新一次温度
        {
            flag1s = 0;
            if( TEMP_CONV(&temp,str)==1 ) //返回值为1代表读取温度成功
            {
                printf_str("第");
                printf_num(x);
                x++;
                printf_str("秒:");
                printf_str(str+temp_i);
                printf_str("度");
                printf_rn();              //回车换行
                temp_i=0;

                //以下是处理数码管显示的内容
                LedBuff[0]=LedChar[str[4]-'0'];
                LedBuff[1]=0x7F;                         //显示小数点
                LedBuff[2]=LedChar[str[2]-'0'];

                if(str[0]=='-')                          //温度小于0
                {
                    if(str[1]=='0')
                    { 
                        LedBuff[3]=0xBF;                 //数码管显示“-”
                        LedBuff[4]=0xFF;
                    }
                    else
                    { 
                        LedBuff[3]=LedChar[str[1]-'0'];
                        LedBuff[4]=0xBF;                 //数码管显示“-”
                    }
                }

                else                                     //温度大于等于0
                { 
                    if(str[1]=='0')LedBuff[3]=0xFF;      //高位不显示0
                    else LedBuff[3]=LedChar[str[1]-'0'];

                    if(str[0]=='0')LedBuff[4]=0xFF;      //高位不显示0
                    else LedBuff[4]=LedChar[str[0]-'0'];
                }
            }
            Start18B20();                                //重新启动下一次转换
        }
    }
}
 
void TIM0_IRQHandler() interrupt 1
{ 
    static u16 tmr1s = 0;
    TH0 = T0RH;           //重新加载重载值
    TL0 = T0RL;
  
    tmr1s++;
    SEG_Scan();
    if (tmr1s >= 1000)    //定时1s
    {
        tmr1s = 0;
        flag1s= 1;
    }
}
 
void InterruptUART() interrupt 4
{
    if (RI)       //接收到字节
    {
        RI = 0;   //手动清零接收中断标志位                     
    }
}


3.串口打印截图

笔者上电之后,故意向开发板上的温度传感器吹热气,效果很棒

温度传感器

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)