1.题目要求
有时我们需要知道温度传感器在一段时间内测量的历史数据。之前的温度传感器例程只是实时显示在液晶屏上,无法查看其历史数据,所以我们使用我们以前学到的所有知识来完成这项任务。
首先,我们从一个简单的概念开始,每隔一秒就使用串打印当前的温度值。这样,所有的历史数据都可以在计算机窗口看到,但我们的开发板USB线不能离开电脑,测量温度只能与电脑相连,然后观察电脑端窗口数据的变化。
这一次,我们实时显示的温度用数字管显示,串口打印的数据格式如下所示
第1秒:10.2度
第2秒:15.7度
第3秒:7.6度
第4秒:0.5度
2.main.c测试代码#include
#include//详见第六章第八讲
#include//详见第八章第11讲
#include//详见第十章第四讲
#include//详见第十三章第五讲
u8flag1s=0;
voidmain()
{
u32x=1;
u8str[13];
u16temp;
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
elseLedBuff[3]=LedChar[str[1]-0;
if(str[0]=='0')LedBuff[4]=0xFF;///高位不显示0
elseLedBuff[4]=LedChar[str[0]-0;
}
}
Start18B20();///重启下一次转换
}
}
}
voidTIM0_IRQHandler()interrupt1
{
staticu16tmr1s=0;
TH0=T0RH;//重新加载重载值
TL0=T0RL;
tmr1s ;
SEG_Scan();
if(tmr1s>=1000)//定时1s
{
tmr1s=0;
flag1s=1;
}
}
voidInterruptUART()interrupt4
{
if(RI)//接收字节
{
RI=0;///手动清零接收中断标志
}
}
3.串口打印截图
作者上电后,故意向开发板上的温度传感器吹热空气,效果很好