DS18B20扩展:在数码管上显示温度时包含小数部分

上一篇博客的例子中,讲解了用DS18B20读取温度时保留整数部分,现在讲解一下,如何保留小数部分,并在数码管上显示出来。

原来的读取温度的代码:

unsigned char temperature;
unsigned char cnt_temp;
void Read_DS18B20(void)
{
  if(cnt_temp>=100)  //每0.1s读取一次温度
  {
   cnt_temp=0;
   temperature=(unsigned char)Read_Temperature(); //这里使用强制类型转换,使读到的温度是整数
  }
}

修改后的代码如下:(以保留一位小数为例)

程序解释:

1.这里Read_Temperature()读取温度后的数值*10,是为了将数字扩大10倍,从而保留第一位小数。例如:读到的温度为23.5554度,那么*10后得到的值就是235.554,再使用强制类型转换,转换成unsigned int型,保留整数部分。然后再在数码管显示模块时/10就可以得到正确的温度值了

2.temperature这里使用unsigned int是因为unsigned int的取值范围更大(0~65535),而unsigned char的取值范围只有(0~255)。例如:当我读到的温度是30度时,在扩大10倍就超出了unsigned char的取值范围了,这时就会出现问题。

unsigned int temperature;
void Read_DS18B20(void)
{
  if(cnt_temp>=100)  //每0.1s读取一次温度
  {
   cnt_temp=0;
   temperature=(unsigned int)(Read_Temperature()*10); //
  }
}

 数码管显示部分:

大家可以参考一下我之前讲的数码管那一篇博文

C51:数码管的动态显示-优快云博客

完整的代码如下:

#include <STC15F2K60S2.H>
#include <intrins.h>
void Timer2_Init(void)
{
    AUXR &= 0xFB;		
	T2L = 0x18;			
	T2H = 0xFC;			
	AUXR |= 0x10;		
	IE2 |= 0x04;        
	EA = 1;		
}

unsigned char smg_code[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};	//0-9
unsigned char smg_buf[8]; //保存显示在8位数码管的值
unsigned int temperature;

//读取温度函数
void Read_DS18B20(void)
{
  if(cnt_temp>=100)  //每0.1s读取一次温度
  {
   cnt_temp=0;
   temperature=(unsigned int)(Read_Temperature()*10); 
  }
}

//数码管读取函数
void SMG_Display()
{
 
 static u8 i=0;
 vDevice_Ctrl(0xc0,0);
 vDevice_Ctrl(0xe0,~smg_buf[i]);
 vDevice_Ctrl(0xc0,0x01<<i);
 i=(i+1)%8;
}

//数码管显示函数
void SMG_process()
{
 smg_buf[0]=smg_code[temperature/100];
 smg_buf[1]=smg_code[temperature/10%10]|0x80;
 smg_buf[2]=smg_code[temperature%10];
//这里我们保留一位数字,所以显示前三位即可
}


void main(void)
{

	Timer2_Init();
	while(1)
	{
		SMG_Process();
		DS18B20_Read();
	}
}


void vTimer2_ISR() interrupt 12     
{
	cnt_temp++;
	SMG_Display();
}

注意:

1.要让数码管某位显示小数,在smg_code[位数]后面 |0x80即可

2.因为在读取温度时将温度*10,所以在计算的时候需要 /100,才能得到温度的十位数字,后面的数字同理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱写代码的倒霉蛋

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值