将DS18B20表示的温度值显示在1602液晶中并保留一位小数
时间: 2024-03-05 14:52:55 浏览: 25
以下是一个将DS18B20温度值显示在1602液晶中并保留一位小数的示例程序。需要注意的是,该程序仅供参考,具体的实现方式和硬件电路配置可能因情况而异,需要根据实际情况进行调整。
```c
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define DQ P2^3 //DS18B20数据引脚
#define LCD_EN P2^5 //LCD使能引脚
#define LCD_RS P2^6 //LCD寄存器选择引脚
#define LCD_RW P2^7 //LCD读写选择引脚
sbit beep = P1^5; //蜂鸣器引脚
uchar code tempStr[] = "Temp:"; //温度字符串
uchar code degreeStr[] = "C"; //温度单位字符串
uchar tempHigh, tempLow; //温度值的高8位和低8位
float temperature; //实际温度值
void delay(uint t)
{
while(t--);
}
void init()
{
TMOD = 0x01; //定时器0工作方式1
TH0 = 0xFC; //定时器0初值
TL0 = 0x67;
TR0 = 1; //启动定时器0
ET0 = 1; //使能定时器0中断
EA = 1; //使能总中断
}
void sendCommand(uchar cmd)
{
LCD_RS = 0;
LCD_RW = 0;
P0 = cmd;
LCD_EN = 1;
_nop_();
_nop_();
LCD_EN = 0;
delay(5);
}
void sendData(uchar dat)
{
LCD_RS = 1;
LCD_RW = 0;
P0 = dat;
LCD_EN = 1;
_nop_();
_nop_();
LCD_EN = 0;
delay(5);
}
void initLCD()
{
sendCommand(0x38); //设置数据总线为8位,显示模式为2行*16列
sendCommand(0x0C); //开启显示,关闭光标
sendCommand(0x06); //光标右移,不移动显示
sendCommand(0x01); //清屏
}
void displayTemp()
{
uchar tempStr1[10];
sprintf(tempStr1, "%.1f", temperature); //将温度值转换成字符串
sendCommand(0x80); //设置光标位置为第1行第1列
for(uchar i = 0; i < sizeof(tempStr); i++)
{
sendData(tempStr[i]); //显示“Temp:”字符串
}
for(uchar i = 0; i < sizeof(tempStr1); i++)
{
sendData(tempStr1[i]); //显示温度值字符串
}
for(uchar i = 0; i < sizeof(degreeStr); i++)
{
sendData(degreeStr[i]); //显示温度单位字符串
}
}
void main()
{
init();
initLCD();
while(1)
{
beep = 0; //关闭蜂鸣器
delay(500);
beep = 1; //开启蜂鸣器
delay(500);
}
}
void interruptTimer0() interrupt 1
{
static uint count = 0;
static bit flag = 0;
TH0 = 0xFC; //定时器0初值
TL0 = 0x67;
count++;
if(count >= 5000) //延时1s
{
count = 0;
if(!flag) //开始转换温度
{
flag = 1;
DQ = 0; //拉低总线,开始发送指令
delay(1);
DQ = 1; //释放总线
delay(1);
DQ = 0; //拉低总线,发送读取温度指令
delay(1);
DQ = 1; //释放总线,开始转换温度
}
else //读取温度值
{
flag = 0;
DQ = 0; //拉低总线,开始发送指令
delay(1);
DQ = 1; //释放总线
delay(1);
DQ = 1; //拉高总线,读取温度值
delay(1);
tempLow = DQ; //读取温度值的低8位
tempHigh = DQ; //读取温度值的高8位
temperature = (float)(tempHigh << 8 | tempLow) / 16.0; //计算温度值
displayTemp(); //显示温度值
}
}
}
```
以上代码仅供参考,具体的实现方式和硬件电路配置可能因情况而异,需要根据实际情况进行调整。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)