ds18b20温度传感器代码基于C51并在lcd1602显示
时间: 2023-10-30 14:08:49 浏览: 90
以下是基于C51的ds18b20温度传感器代码,并在lcd1602上显示温度:
```
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define DQ P2_0
#define LCD_DB P0
sbit LCD_RS = P1^1;
sbit LCD_RW = P1^2;
sbit LCD_EN = P1^3;
void delay(uint x) // 延时函数
{
uint i, j;
for(i=0; i<x; i++)
for(j=0; j<125; j++);
}
void ds18b20_init() // 初始化ds18b20
{
uchar i;
DQ = 1;
delay(1);
DQ = 0;
delay(500);
DQ = 1;
delay(60);
i = DQ;
delay(240);
}
uchar ds18b20_read_byte() // 读取一个字节
{
uchar i, dat = 0;
for(i=0; i<8; i++)
{
DQ = 0;
_nop_();
_nop_();
dat >>= 1;
DQ = 1;
_nop_();
_nop_();
if(DQ)
dat |= 0x80;
delay(1);
}
return dat;
}
void ds18b20_write_byte(uchar dat) // 写入一个字节
{
uchar i;
for(i=0; i<8; i++)
{
DQ = 0;
_nop_();
_nop_();
if(dat & 0x01)
DQ = 1;
delay(60);
DQ = 1;
dat >>= 1;
}
}
int ds18b20_read_temperature() // 读取温度
{
uchar TL, TH;
int temp;
ds18b20_init(); // 初始化ds18b20
ds18b20_write_byte(0xcc); // 跳过ROM操作,直接读取温度
ds18b20_write_byte(0x44); // 启动温度转换
while(!DQ); // 等待温度转换完成
ds18b20_init(); // 初始化ds18b20
ds18b20_write_byte(0xcc); // 跳过ROM操作,直接读取温度
ds18b20_write_byte(0xbe); // 读取温度寄存器
TL = ds18b20_read_byte(); // 读取温度低八位
TH = ds18b20_read_byte(); // 读取温度高八位
temp = TH;
temp <<= 8;
temp |= TL;
return temp;
}
void init_lcd() // 初始化lcd1602
{
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
delay(50000);
LCD_DB = 0x30;
LCD_EN = 1;
delay(50000);
LCD_EN = 0;
delay(10000);
LCD_DB = 0x30;
LCD_EN = 1;
delay(50000);
LCD_EN = 0;
delay(10000);
LCD_DB = 0x30;
LCD_EN = 1;
delay(50000);
LCD_EN = 0;
delay(10000);
LCD_DB = 0x38;
LCD_EN = 1;
delay(1000);
LCD_EN = 0;
delay(10000);
LCD_DB = 0x08;
LCD_EN = 1;
delay(1000);
LCD_EN = 0;
delay(10000);
LCD_DB = 0x01;
LCD_EN = 1;
delay(1000);
LCD_EN = 0;
delay(10000);
LCD_DB = 0x06;
LCD_EN = 1;
delay(1000);
LCD_EN = 0;
delay(10000);
LCD_DB = 0x0c;
LCD_EN = 1;
delay(1000);
LCD_EN = 0;
delay(10000);
}
void write_lcd(uchar dat, bit rs) // 写入数据或指令到lcd1602
{
LCD_RS = rs;
LCD_RW = 0;
LCD_DB = dat;
LCD_EN = 1;
delay(500);
LCD_EN = 0;
delay(100);
}
void write_str_lcd(uchar *str, uchar addr) // 在lcd1602上显示字符串
{
while(*str)
{
write_lcd(*str++, 1);
delay(100);
}
}
void main()
{
int temp;
uchar str[16];
init_lcd(); // 初始化lcd1602
write_lcd(0x80, 0); // 设置lcd1602光标位置为第一行第一列
write_str_lcd("Temperature: ", 0); // 在lcd1602上显示“Temperature: ”
while(1)
{
temp = ds18b20_read_temperature(); // 读取温度
temp = temp * 0.0625; // 计算温度值
sprintf(str, "%02d.%02d C", temp / 100, temp % 100); // 将温度值转换为字符串
write_lcd(0xc0, 0); // 设置lcd1602光标位置为第二行第一列
write_str_lcd(str, 0); // 在lcd1602上显示温度值
delay(500);
}
}
```
阅读全文