51单片机电脑通过串口发送整数给单片机,利用DS18B20检测温度,当温度大于串口发送的整数时,蜂鸣器发声 代码
时间: 2024-03-08 18:50:54 浏览: 81
以下是一个简单的51单片机程序示例,可以实现你的需求:
```c
#include <reg51.h>
#include <intrins.h>
#define DQ P2_0 // DS18B20接口
// 函数声明
void DelayUs(unsigned int t);
void DelayMs(unsigned int t);
unsigned char Ds18b20Init();
void Ds18b20WriteByte(unsigned char dat);
unsigned char Ds18b20ReadByte();
int Ds18b20ReadTemp();
void UartInit();
void UartSendByte(unsigned char dat);
void UartSendString(unsigned char *buf);
unsigned char UartReceiveByte();
void BeepOn();
void BeepOff();
// 主函数
void main()
{
UartInit(); // 初始化串口
BeepOff(); // 关闭蜂鸣器
while (1) {
// 从串口接收整数
unsigned char num = UartReceiveByte();
// 读取温度
int temp = Ds18b20ReadTemp();
// 比较并控制蜂鸣器
if (temp > num) {
BeepOn();
} else {
BeepOff();
}
}
}
// DS18B20初始化函数
unsigned char Ds18b20Init()
{
unsigned char flag = 0;
DQ = 1;
DelayUs(2);
DQ = 0;
DelayUs(80);
DQ = 1;
DelayUs(15);
flag = DQ;
DelayUs(30);
return flag;
}
// DS18B20写数据函数
void Ds18b20WriteByte(unsigned char dat)
{
unsigned char i;
for (i = 0; i < 8; i++) {
DQ = 0;
_nop_();
DQ = dat & 0x01;
_nop_();
DelayUs(5);
DQ = 1;
dat >>= 1;
}
}
// DS18B20读数据函数
unsigned char Ds18b20ReadByte()
{
unsigned char i;
unsigned char dat = 0;
for (i = 0; i < 8; i++) {
DQ = 0;
_nop_();
DQ = 1;
_nop_();
dat >>= 1;
if (DQ) {
dat |= 0x80;
}
DelayUs(5);
DQ = 1;
}
return dat;
}
// DS18B20读温度函数
int Ds18b20ReadTemp()
{
unsigned char temp_l, temp_h;
int temp;
Ds18b20Init();
Ds18b20WriteByte(0xcc);
Ds18b20WriteByte(0x44);
DelayMs(500);
Ds18b20Init();
Ds18b20WriteByte(0xcc);
Ds18b20WriteByte(0xbe);
temp_l = Ds18b20ReadByte();
temp_h = Ds18b20ReadByte();
temp = temp_h;
temp <<= 8;
temp |= temp_l;
return temp;
}
// 串口初始化函数
void UartInit()
{
TMOD = 0x20; // 定时器1为模式2
TH1 = 0xfd; // 波特率为9600bps
TL1 = 0xfd;
TR1 = 1; // 启动定时器1
SM0 = 0; // 禁止串口模式0
SM1 = 1; // 启动串口模式1
REN = 1; // 启用串口接收
EA = 1; // 全局中断使能
ES = 1; // 串口中断使能
}
// 串口发送单个字节函数
void UartSendByte(unsigned char dat)
{
SBUF = dat;
while (!TI);
TI = 0;
}
// 串口发送字符串函数
void UartSendString(unsigned char *buf)
{
while (*buf) {
UartSendByte(*buf++);
}
}
// 串口接收单个字节函数
unsigned char UartReceiveByte()
{
unsigned char dat;
while (!RI);
dat = SBUF;
RI = 0;
return dat;
}
// 控制蜂鸣器开启函数
void BeepOn()
{
P1 = 0x01;
}
// 控制蜂鸣器关闭函数
void BeepOff()
{
P1 = 0x00;
}
// 延时函数,微秒级别
void DelayUs(unsigned int t)
{
while (t--) {
_nop_();
_nop_();
}
}
// 延时函数,毫秒级别
void DelayMs(unsigned int t)
{
while (t--) {
DelayUs(1000);
}
}
// 串口中断服务函数,不需要修改
void UartInterrupt() interrupt 4
{
if (RI) {
RI = 0;
}
if (TI) {
TI = 0;
}
}
```
这段代码通过串口接收整数,并使用DS18B20检测温度。如果温度高于接收到的整数,蜂鸣器将发出声音。请注意,代码中的一些细节可能需要根据你的具体硬件和开发环境进行修改。
阅读全文