C51使用ds18b20检测温度,使用霍尔转速传感器检测转速并有蜂鸣器的C语言程序
时间: 2024-02-05 14:11:34 浏览: 79
DS18B20驱动程序.rar
以下是使用C51单片机的程序,可以通过ds18b20传感器检测温度并使用霍尔转速传感器检测转速,并在需要时使用蜂鸣器发出提示音。
```c
#include <reg52.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define DQ P2_7 // DS18B20 数据线
#define SP P3_2 // 霍尔传感器信号线
#define BZ P3_7 // 蜂鸣器
uchar temperature[2]; // 存储温度值
void delay(uint z) // 延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void ds18b20_init() // DS18B20 初始化
{
uchar i;
DQ = 1; // 数据线初始状态为高电平
delay(1); // 延时 1us
DQ = 0; // 拉低数据线
delay(500); // 延时 500us
DQ = 1; // 拉高数据线
delay(30); // 延时 30us
i = DQ; // 读取 DS18B20 的应答信号
delay(500); // 再次延时 500us
}
void ds18b20_write(uchar dat) // DS18B20 写数据
{
uchar i;
for(i=0;i<8;i++)
{
DQ = 0; // 拉低数据线
delay(1); // 延时 1us
DQ = dat & 0x01; // 写入数据位
delay(30); // 延时 30us
DQ = 1; // 拉高数据线
dat >>= 1; // 移位准备写入下一个数据位
}
}
uchar ds18b20_read() // DS18B20 读数据
{
uchar i,dat = 0;
for(i=0;i<8;i++)
{
dat >>= 1; // 移位准备读取下一个数据位
DQ = 0; // 拉低数据线
delay(1); // 延时 1us
DQ = 1; // 拉高数据线
delay(1); // 延时 1us
if(DQ) dat |= 0x80; // 读取数据位
delay(30); // 延时 30us
}
return dat;
}
void ds18b20_start() // DS18B20 启动温度转换
{
ds18b20_init(); // 先初始化
ds18b20_write(0xcc); // 跳过 ROM 命令
ds18b20_write(0x44); // 启动温度转换命令
}
void ds18b20_read_temp() // DS18B20 读取温度值
{
uchar temp_l,temp_h;
ds18b20_init(); // 先初始化
ds18b20_write(0xcc); // 跳过 ROM 命令
ds18b20_write(0xbe); // 读取温度值命令
temp_l = ds18b20_read(); // 读取低字节
temp_h = ds18b20_read(); // 读取高字节
temperature[0] = temp_l;
temperature[1] = temp_h;
}
void init_timer0() // 初始化定时器0
{
TMOD |= 0x01; // 设置定时器0为模式1
TH0 = 0xff; // 定时 1ms
TL0 = 0x9c;
ET0 = 1; // 允许定时器0中断
TR0 = 1; // 启动定时器0
EA = 1; // 允许总中断
}
void main()
{
uchar flag = 0; // 转速检测标志位
uint t = 0; // 定时计数器
float rpm = 0; // 转速值
init_timer0(); // 初始化定时器0
while(1)
{
ds18b20_start(); // 启动温度转换
ds18b20_read_temp(); // 读取温度值
// 计算温度值
printf("Temperature: %d.%d Celsius\n", temperature[1], temperature[0]/10);
// 检测转速
if(SP == 0) // 霍尔传感器输出低电平
{
if(!flag) // 若未检测到齿轮,则置标志位
{
flag = 1;
t = 0; // 定时计数器清零
}
}
else // 霍尔传感器输出高电平
{
if(flag) // 若检测到齿轮,则计算转速值
{
rpm = 60.0 / (t/1000.0); // 计算转速值
flag = 0; // 清零标志位
}
}
// 发出提示音
if(rpm > 1000 || temperature[1] > 30) // 若转速或温度过高
{
BZ = 0; // 蜂鸣器鸣叫
delay(100);
BZ = 1;
delay(100);
}
else
{
BZ = 1;
delay(200);
}
}
}
void timer0_isr() interrupt 1 // 定时器0中断服务程序
{
TH0 = 0xff; // 定时 1ms
TL0 = 0x9c;
t++; // 定时计数器加1
}
```
阅读全文