单片机——读取DS18B20检测到的温度

如题:

单片机开机读取 ds18b20 检测到的温度,并显示在 1602 上,精确到0.1度;能显示超过100的温度和零下温度。温度值后面要加上符号:℃

思路:

①其中的.和℃都是固定位置的固定符号,可在程序里写好。(如果不提前写好仿真会乱码)

②当温度为零下时,最高位?号处显示为-号;

③当温度为0及以上时,最高位不显示+号,且不为0;其中当温度值>=100,该处显示1。

仿真图:

bb5dda2b894249c0840dd0f13f74970c.png

代码:

#include <reg52.H>
#include<intrins.h>
#include "lcd1602.h"
#include "ds18b20.h"
#define uchar unsigned char
#define uint unsigned int
bit flag_temp_fu;			  
void main(void)
 {
 	 unsigned int tmpvalue;
	 float t;
     int TL;     		//储存暂存器的温度低位
     int TH;     		//储存暂存器的温度高位
     int TN;     		//储存温度的整数部分
     int TD;     		//储存温度的小数部分
	 LCD_init();         
	 delaynms(4);        	
	 if(Init_DS18B20()==1)
	    Display_Error();
		Display_Explain();
   	 Display_Symbol();    //显示温度说明   
	 LCD_w_com(0xC0+0x0B);LCD_w_data(0xDF);LCD_w_data('C');	//显示温度的单位
   while(1)                //循环,不断检测并显示温度
	 {	
		ReadyReadTemp();      //读温度准备
	   	TL=ReadOneByte();     //读温度值低位
		TH=ReadOneByte();     //读温度值高位
		if((TH&0xf8)==0xf8){flag_temp_fu=1;} //高字节的高5位为1时,温度为负		 
		else {flag_temp_fu=0;}
		TN=TH*16+TL/16;       //实际温度值=(TH*256+TL)/16,即:TH*16+TL/16
			                  //得出温度的整数部分,小数部分丢弃
	    TD=(TL%16)*10/16;      //计算温度的小数部分,将余数乘以10再除以16取整,
		if(flag_temp_fu==0) //正温度
		{
			LCD_w_com(0xC0+0x06);
			if(TN>=100)LCD_w_data(TN/100+0x30);else LCD_w_data(' ');
			LCD_w_data(TN/10%10+0x30); 
			LCD_w_data(TN%10+0x30);
			LCD_w_data('.');
			LCD_w_data(TD+0x30);
		}
		else //负温度
		{
		    tmpvalue = TH;
		    tmpvalue <<= 8;
		    tmpvalue |= TL;
		    TN = tmpvalue;
			TN=(~TN)+1; //取反再加1
			t = TN * 0.0625;
			TN = t * 10 + (TN > 0 ? 0.5 : -0.5); //t*10精确到一位小数
			LCD_w_com(0xC0+0x06);
			LCD_w_data('-');
			LCD_w_data((TN/10)/10+0x30);
			LCD_w_data((TN/10)%10+0x30);
			LCD_w_data('.');
			LCD_w_data(TN%10+0x30);
		} 
        delaynms(10);               
    }
}

 运行图:

ac4a181dabad41a3a04827a4eb2bb389.png

想要整个项目可私聊免费获取~

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值