如题:
单片机开机读取 ds18b20 检测到的温度,并显示在 1602 上,精确到0.1度;能显示超过100的温度和零下温度。温度值后面要加上符号:℃
思路:
①其中的.和℃都是固定位置的固定符号,可在程序里写好。(如果不提前写好仿真会乱码)
②当温度为零下时,最高位?号处显示为-号;
③当温度为0及以上时,最高位不显示+号,且不为0;其中当温度值>=100,该处显示1。
仿真图:
代码:
#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);
}
}
运行图:
想要整个项目可私聊免费获取~