基于AT89C51设计温度监控系统代码
时间: 2023-10-20 15:05:51 浏览: 106
以下是基于AT89C51设计温度监控系统的代码示例:
```c
#include <reg52.h>
#define LCD_data P0
sbit RS = P2^0; //LCD的RS引脚
sbit RW = P2^1; //LCD的RW引脚
sbit EN = P2^2; //LCD的EN引脚
sbit DQ = P3^7; //DS18B20的数据引脚
void delay(unsigned int t) //延时函数
{
unsigned int i, j;
for(i=0; i<t; i++)
for(j=0; j<120; j++);
}
void LCD_send_command(unsigned char cmd) //向LCD发送命令
{
LCD_data = cmd;
RS = 0;
RW = 0;
EN = 1;
delay(1);
EN = 0;
}
void LCD_send_data(unsigned char dat) //向LCD发送数据
{
LCD_data = dat;
RS = 1;
RW = 0;
EN = 1;
delay(1);
EN = 0;
}
void LCD_init() //初始化LCD
{
LCD_send_command(0x38); //设置显示模式: 8位数据总线,2行显示,5x7点阵字符
LCD_send_command(0x0C); //显示开启: 显示开,光标关,闪烁关
LCD_send_command(0x06); //设置输入方式: 光标自动加1,整屏不移动
LCD_send_command(0x01); //清屏
}
unsigned char DS18B20_init() //初始化DS18B20
{
unsigned char i;
DQ = 1;
delay(1);
DQ = 0;
delay(500);
DQ = 1;
delay(60);
i = DQ;
delay(240);
return i;
}
void DS18B20_write_byte(unsigned char dat) //向DS18B20写入字节
{
unsigned char i;
for(i=0; i<8; i++)
{
DQ = 0;
delay(1);
DQ = dat&0x01;
delay(60);
DQ = 1;
dat >>= 1;
}
}
unsigned char DS18B20_read_byte() //从DS18B20读取字节
{
unsigned char i, dat = 0;
for(i=0; i<8; i++)
{
DQ = 0;
delay(1);
DQ = 1;
delay(5);
dat |= DQ << i;
delay(50);
}
return dat;
}
void main()
{
unsigned char temp_l, temp_h;
int temp;
LCD_init(); //初始化LCD
while(1)
{
if(DS18B20_init() == 0) //如果DS18B20存在
{
DS18B20_write_byte(0xCC); //跳过ROM操作
DS18B20_write_byte(0x44); //开始温度转换
delay(750); //等待温度转换完成
DS18B20_init(); //初始化DS18B20
DS18B20_write_byte(0xCC); //跳过ROM操作
DS18B20_write_byte(0xBE); //读取温度寄存器
temp_l = DS18B20_read_byte(); //读取温度低字节
temp_h = DS18B20_read_byte(); //读取温度高字节
temp = (temp_h << 8) | temp_l; //计算温度值
temp = temp*0.0625*10; //转换为0.1度单位的整数
LCD_send_command(0x80); //光标移至第1行第1列
LCD_send_data('T');
LCD_send_data(':');
LCD_send_data(temp/1000+'0'); //输出整数部分
LCD_send_data('.');
LCD_send_data(temp%1000/100+'0'); //输出小数点后一位
LCD_send_data(temp%100/10+'0'); //输出小数点后两位
LCD_send_data(temp%10+'0'); //输出小数点后三位
LCD_send_data(0xDF); //输出温度符号
LCD_send_data('C');
}
else
{
LCD_send_command(0x80); //光标移至第1行第1列
LCD_send_data('E');
LCD_send_data('r');
LCD_send_data('r');
LCD_send_data('o');
LCD_send_data('r');
}
delay(1000); //延时1秒
}
}
```
这段代码中使用了AT89C51单片机、DS18B20温度传感器和16x2字符LCD显示屏。程序通过向DS18B20发送命令,读取温度值并转换为整数,然后将温度值显示在LCD上。如果DS18B20不存在或通信出现错误,则在LCD上显示"Error"。
阅读全文