单片机c51编写程序将温度数据通过串口发送给电脑
时间: 2023-12-21 11:06:16 浏览: 223
好的,以下是一个基于C51单片机的例子代码,可将DS18B20温度传感器获取到的温度值通过串口发送给电脑:
```C
#include <STC12C5A60S2.H> //引入单片机头文件
#define uchar unsigned char
#define uint unsigned int
//定义数据线口
sbit DQ=P3^7;
void delay(uint t) {
while(t--);
}
void Delay1ms() {
uchar i, j;
i = 12;
j = 169;
do {
while(--j);
} while(--i);
}
void Start18B20() {
DQ = 1;
Delay1ms();
DQ = 0;
Delay1ms();
DQ = 1;
Delay1ms();
}
uchar ReadOneChar() {
uchar i, j;
uchar dat = 0;
for(i = 1; i <= 8; i++) {
DQ = 0;
j = *(&i);
DQ = 1;
Delay1ms();
if(DQ) {
dat |= 0x01;
}
dat <<= 1;
Delay1ms();
}
return dat;
}
void WriteOneChar(uchar dat) {
uchar i, j;
for(i = 1; i <= 8; i++) {
DQ = 0;
j = dat & 0x01;
dat >>= 1;
*(&i) = j;
DQ = j;
Delay1ms();
DQ = 1;
}
}
void Init18B20() {
uchar x;
DQ = 1;
Delay1ms();
DQ = 0;
Delay1ms();
DQ = 1;
Delay1ms();
x = DQ;
Delay1ms();
}
void main() {
uchar temperature = 0;
uchar tempH, tempL;
float temp;
TMOD = 0x20; //定时器1,模式2
TH1 = 0xFD; //波特率9600
TL1 = 0xFD;
TR1 = 1; //启动定时器1
SM0 = 0;
SM1 = 1;
REN = 1; //串口接收使能
EA = 1; //总中断使能
ES = 1; //串口中断使能
while(1) {
Start18B20();
Init18B20();
WriteOneChar(0xCC); //忽略ROM操作,直接读取DS18B20的温度值
WriteOneChar(0x44); //DS18B20开始转换温度
Delay1ms();
Start18B20();
Init18B20();
WriteOneChar(0xCC); //忽略ROM操作,直接读取DS18B20的温度值
WriteOneChar(0xBE); //DS18B20读取温度值
tempL = ReadOneChar(); //读取温度值低8位
tempH = ReadOneChar(); //读取温度值高8位
temp = tempH;
temp *= 256;
temp += tempL;
temp *= 0.0625; //计算温度值
temperature = temp; //将浮点温度值转换为整型
SBUF = temperature; //将温度数据通过串口发送给电脑
while(!TI); //等待发送完成
TI = 0; //清除发送完成标志位
Delay1ms();
}
}
void UART() interrupt 4 {
if(RI) {
RI = 0; //清除接收标志位
}
}
```
以上代码中,我们使用C51单片机的GPIO口读取DS18B20温度传感器的数据,并通过串口将温度值发送给电脑。需要在Keil C51编译器中进行编译和烧录。在串口调试工具中,接收到的数据应该为温度值,例如:25。
阅读全文