基于51单片机DS18B20温度传感器,实现当温度超过40摄氏度时蜂鸣器响应,显示实时温度在1602LCD上面,当蜂鸣器响应之后发送命令到串口实现8个LED依次点亮
时间: 2024-03-13 17:42:29 浏览: 119
好的,这是一个嵌入式系统的问题。首先,我们需要将DS18B20温度传感器连接到51单片机上,并编写相应的程序来读取温度值。然后,我们需要将读取到的温度值显示在1602LCD上,并判断是否超过40摄氏度,如果超过则触发蜂鸣器响应。最后,我们需要在触发蜂鸣器响应后,通过串口发送命令来控制8个LED依次点亮。
以下是一些参考代码,供您参考:
```c
#include <reg52.h>
#include <intrins.h>
#define DS18B20_DQ P1_4
#define BEEP P1_5
#define LED P2
typedef unsigned char byte;
typedef unsigned int word;
bit DS18B20_init();
void DS18B20_write(byte dat);
byte DS18B20_read();
void delay_us(word us);
void delay_ms(word ms);
void display(byte addr, byte dat);
void beep(word ms);
void send_command(byte cmd);
void light_led();
void main() {
byte temperature = 0;
byte high = 0;
byte low = 0;
DS18B20_init();
display(0x80, 'T');
display(0x81, ':');
display(0x82, ' ');
while (1) {
DS18B20_write(0xcc);
DS18B20_write(0x44);
delay_ms(750);
DS18B20_init();
DS18B20_write(0xcc);
DS18B20_write(0xbe);
low = DS18B20_read();
high = DS18B20_read();
temperature = (high << 4) | (low >> 4);
display(0x83, temperature / 10 + '0');
display(0x84, temperature % 10 + '0');
if (temperature > 40) {
beep(500);
light_led();
}
}
}
bit DS18B20_init() {
bit presence = 0;
DS18B20_DQ = 1;
delay_us(2);
DS18B20_DQ = 0;
delay_us(500);
DS18B20_DQ = 1;
delay_us(60);
presence = DS18B20_DQ;
delay_us(240);
return ~presence;
}
void DS18B20_write(byte dat) {
byte i;
for (i = 0; i < 8; i++) {
DS18B20_DQ = 0;
_nop_();
DS18B20_DQ = dat & 0x01;
delay_us(60);
DS18B20_DQ = 1;
dat >>= 1;
}
delay_us(240);
}
byte DS18B20_read() {
byte i;
byte dat = 0;
for (i = 0; i < 8; i++) {
DS18B20_DQ = 0;
_nop_();
DS18B20_DQ = 1;
_nop_();
dat >>= 1;
if (DS18B20_DQ) {
dat |= 0x80;
}
delay_us(60);
}
return dat;
}
void delay_us(word us) {
while (us--) {
_nop_();
_nop_();
}
}
void delay_ms(word ms) {
while (ms--) {
delay_us(1000);
}
}
void display(byte addr, byte dat) {
send_command(addr);
send_command(dat);
}
void beep(word ms) {
BEEP = 1;
delay_ms(ms);
BEEP = 0;
}
void send_command(byte cmd) {
SBUF = cmd;
while (!TI);
TI = 0;
}
void light_led() {
byte i;
for (i = 0; i < 8; i++) {
LED = 1 << i;
delay_ms(200);
}
}
```
需要注意的是,以上代码仅供参考,并不一定适用于所有的硬件环境。您需要根据自己的实际情况进行修改和调试。
阅读全文