51单片机电脑通过串口发送整数给单片机,利用DS18B20检测温度,当温度大于串口发送的整数时,蜂鸣器发声
时间: 2024-03-09 10:44:28 浏览: 48
下面是一个简单的示例代码,可以帮助你实现通过串口发送整数给单片机,利用DS18B20检测温度,当温度大于串口发送的整数时,蜂鸣器发声:
```c
#include <reg52.h>
#include <stdio.h>
#define BAUDRATE 9600
#define FOSC 11059200L
#define TIMER_1 (65536L - FOSC / 12 / BAUDRATE)
sbit DQ = P1^0; // DS18B20的数据引脚
sbit beep = P1^1; // 蜂鸣器引脚
unsigned char code Table[] = { // 数码管显示0-9的值
0xC0, 0xF9, 0xA4, 0xB0, 0x99,
0x92, 0x82, 0xF8, 0x80, 0x90
};
void InitUART() {
TMOD |= 0x20;
SCON = 0x50;
TH1 = TIMER_1 / 256;
TL1 = TIMER_1 % 256;
TR1 = 1;
TI = 0;
}
void SendData(char dat) {
SBUF = dat;
while (!TI);
TI = 0;
}
void delay(unsigned int t) { // 延时函数
unsigned int i;
while (t--) {
for (i = 0; i < 120; i++);
}
}
void Ds18b20Init() { // 初始化DS18B20
DQ = 1;
delay(1);
DQ = 0;
delay(500);
DQ = 1;
delay(60);
}
void Ds18b20WriteByte(unsigned char dat) { // 向DS18B20写入一个字节
unsigned char i;
for (i = 0; i < 8; i++) {
DQ = 0;
DQ = dat & 0x01;
delay(5);
DQ = 1;
dat >>= 1;
}
}
unsigned char Ds18b20ReadByte() { // 从DS18B20读取一个字节
unsigned char i, dat = 0;
for (i = 0; i < 8; i++) {
DQ = 0;
dat >>= 1;
DQ = 1;
if (DQ) {
dat |= 0x80;
}
delay(5);
}
return dat;
}
void Ds18b20Start() { // 开始温度转换
Ds18b20Init();
Ds18b20WriteByte(0xcc);
Ds18b20WriteByte(0x44);
}
void Ds18b20ReadTemp() { // 读取温度值
unsigned char temp = 0;
unsigned char TL, TH;
Ds18b20Init();
Ds18b20WriteByte(0xcc);
Ds18b20WriteByte(0xbe);
TL = Ds18b20ReadByte();
TH = Ds18b20ReadByte();
temp = TH;
temp <<= 8;
temp |= TL;
if (temp > 0x7fff) { // 判断温度是否为负数
temp = ~temp + 1;
temp = (float)temp / 16.0; // 计算温度值
temp |= 0x80;
} else {
temp = (float)temp / 16.0; // 计算温度值
}
P0 = Table[temp % 10]; // 数码管显示温度值的个位数
}
void main() {
unsigned char dat;
InitUART();
while (1) {
if (RI) {
dat = SBUF; // 读取串口发送的整数
RI = 0;
}
Ds18b20Start(); // 开始温度转换
Ds18b20ReadTemp(); // 读取温度值
if (P0 > dat) { // 判断温度是否大于串口发送的整数
beep = 0; // 蜂鸣器发声
} else {
beep = 1;
}
}
}
```
这段代码通过串口发送整数给单片机,利用DS18B20检测温度,当温度大于串口发送的整数时,蜂鸣器发声。注意,为了使程序简单,这里只实现了温度为正数的情况。如果你需要考虑温度为负数的情况,需要进行额外的处理。
阅读全文