温度传感器与串口

点击打开在线编译器,边学边练

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.串口打印截图

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

温度传感器


本文固定URL:https://www.dotcpp.com/course/401

第一章 单片机入门
第二章 LED
第三章 蜂鸣器
第四章 数码管
第五章 独立按键
第六章 多文件编程
第七章 外部中断
第八章 定时器
第九章 舵机与超声波模块
第十章 串口通信
第十一章 1602液晶屏
第十二章 IIC通信
第十三章 红外遥控与温度传感器
第十四章 AD与DA
第十五章 混合例程
第十六章 完结
Dotcpp在线编译      (登录可减少运行等待时间)