51单片机温控风扇程序
时间: 2023-08-13 12:06:38 浏览: 127
下面是一个基于51单片机的温控风扇程序,供您参考:
```
#include <reg52.h>
sbit FAN = P1^0; // 风扇控制引脚
sbit DQ = P3^7; // 温度传感器引脚
unsigned char temp[2]; // 存储温度值的数组
// 延时函数
void Delay(unsigned int i)
{
unsigned int j;
for (j = 0; j < i; j++);
}
// 从DS18B20读取温度值
void GetTemp()
{
unsigned char code ReadTemp[] = {0xcc, 0x44, 0xcc, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
unsigned char i;
DQ = 1; // 总线空闲
Delay(5);
DQ = 0; // 发送复位脉冲
Delay(500);
DQ = 1; // 释放总线
Delay(50);
DQ = 0; // 发送读命令
Delay(12);
DQ = 1; // 释放总线
Delay(1);
for (i = 0; i < 2; i++) // 读取温度值
{
temp[i] = 0;
for (j = 0; j < 8; j++)
{
DQ = 0;
Delay(1);
temp[i] >>= 1;
DQ = 1;
Delay(1);
if (DQ)
{
temp[i] |= 0x80;
}
Delay(5);
}
}
}
// 控制风扇转速
void ControlFan()
{
if (temp[0] >= 30) // 温度高于30度,风扇全速运转
{
FAN = 1;
}
else if (temp[0] >= 25) // 温度高于25度,风扇半速运转
{
FAN = 0;
Delay(500);
FAN = 1;
}
else // 温度低于25度,风扇停止运转
{
FAN = 0;
}
}
// 主函数
void main()
{
while (1)
{
GetTemp(); // 读取温度值
ControlFan(); // 控制风扇转速
Delay(500);
}
}
```
以上代码仅供参考,具体实现方式和参数需要根据实际情况进行调整。
阅读全文