#include <reg51.h>
// 定义DS18B20的数据引脚
sbit DS18B20 = P3^7;
// LCD控制端口定义
sbit RS = P2^0;
sbit RW = P2^1;
sbit E = P2^2;
// 延时函数
void delay(unsigned int time) {
while(time--);
}
// 初始化DS18B20
void DS18B20_Init() {
DS18B20 = 0; // 拉低总线
delay(100); // 延时
DS18B20 = 1; // 释放总线
delay(10); // 延时
}
// 发送1位数据
void DS18B20_WriteBit(unsigned char data) {
if (data != 0) {
DS18B20 = 0;
delay(1); // 保持时间
DS18B20 = 1;
delay(1); // 保持时间
} else {
DS18B20 = 0;
delay(1); // 保持时间
DS18B20 = 1;
delay(10); // 保持时间
}
}
// 读取1位数据
unsigned char DS18B20_ReadBit() {
unsigned char data;
DS18B20 = 0;
delay(1); // 拉低总线,等待
DS18B20 = 1;
delay(10); // 释放总线,等待总线稳定
data = DS18B20;
delay(1); // 等待
return data;
}
// 发送一个字节的数据
void DS18B20_WriteByte(unsigned char byte) {
unsigned char i;
for (i = 0; i < 8; i++) {
DS18B20_WriteBit(byte & 0x01); // 发送最低位
byte >>= 1; // 右移
}
}
// 读取一个字节的数据
unsigned char DS18B20_ReadByte() {
unsigned char i, byte = 0;
for (i = 0; i < 8; i++) {
byte >>= 1;
if (DS18B20_ReadBit()) {
byte |= 0x80;
}
}
return byte;
}
// 启动温度转换
void DS18B20_StartConversion() {
DS18B20_Init();
DS18B20_WriteByte(0xCC); // Skip ROM
DS18B20_WriteByte(0x44); // Start conversion
}
// 读取温度
unsigned int DS18B20_ReadTemperature() {
unsigned char temp_low, temp_high;
unsigned int temp;
DS18B20_Init();
DS18B20_WriteByte(0xCC); // Skip ROM
DS18B20_WriteByte(0xBE); // Read scratchpad
temp_low = DS18B20_ReadByte(); // 读取低字节
temp_high = DS18B20_ReadByte(); // 读取高字节
temp = ((unsigned int)temp_high << 8) | temp_low; // 组合温度数据
return temp;
}
// 写LCD命令
void LCD_WriteCommand(unsigned char command) {
P2 = command;
RS = 0; // 选择命令寄存器
RW = 0; // 写数据
E = 1; // 产生使能脉冲
delay(10);
E = 0;
}
// 写LCD数据
void LCD_WriteData(unsigned char data) {
P2 = data;
RS = 1; // 选择数据寄存器
RW = 0; // 写数据
E = 1; // 产生使能脉冲
delay(10);
E = 0;
}
// LCD初始化
void LCD_Init() {
LCD_WriteCommand(0x38); // 设置为8位数据线模式
LCD_WriteCommand(0x0C); // 显示开,光标关
LCD_WriteCommand(0x06); // 输入模式设置:光标右移
LCD_WriteCommand(0x01); // 清屏
delay(100);
}
// LCD显示字符串
void LCD_DisplayString(unsigned char x, unsigned char y, unsigned char *str) {
if (x == 1) {
LCD_WriteCommand(0x80); // 第一行
} else {
LCD_WriteCommand(0xC0); // 第二行
}
while (*str != '\0') { // 修改此处判断条件,更规范些
LCD_WriteData(*str++);
}
}
void main() {
unsigned int temp_value;
float temperature;
LCD_Init(); // 初始化LCD
while (1) {
DS18B20_StartConversion(); // 启动温度转换
delay(500); // 等待转换完成
temp_value = DS18B20_ReadTemperature(); // 读取温度值
temperature = (float)temp_value * 0.0625; // 转换为摄氏度(12-bit温度数据,强制类型转换保证精度)
LCD_DisplayString(1, 1, "Temp:"); // 显示"Temp:"
// 处理并显示温度值
LCD_WriteData((unsigned char)(temperature / 10) + '0'); // 显示整数部分
LCD_WriteData((unsigned char)(temperature) % 10 + '0'); // 显示小数部分
LCD_WriteData('C'); // 显示摄氏度符号
delay(1000); // 延时,控制更新频率
}
}
出现温度传感器.c(25): error C141: syntax error near ')'
温度传感器.c(26): error C141: syntax error near 'data'
温度传感器.c(41): error C141: syntax error near ';'
温度传感器.c(46): error C141: syntax error near 'data'
温度传感器.c(48): error C141: syntax error near 'data', expected ';'
温度传感器.c(106): error C141: syntax error near ')'
温度传感器.c(107): error C141: syntax error near 'data'该怎么解决