智能风扇 一、任务 设计并制作一个基于MCS51系列单片机控制的小风扇。 二、要求 1.基本部分: (1)按钮开关可以控制风扇的启停及调速; (2)自动随温度的高低调节风扇的风速。
2.扩展部分:
(2)有人在附近,且温度较高时,自动开启风扇。
设计思路
1.本设计采用机械开关控制风扇启停,采用PWM加减调速按键控制调速。
2.本设计采用DS18B20获取温度并显示在1602屏幕上,并把温度值赋给PWM参数。
3.本设计采用热释电传感器检测人体。
设计图
实物图
热释电传感器
主程序
#include<reg52.h> //注:本题所用为5V电机(实际可以为l298n可以输出的30多V)
#include"18b20.h" //温度显示有问题————解决方法为1.提高晶振频率到24mhZ之前运行速度较慢(提高cpu运行速度即可)。
#include"1602.h" //temp最好变成全局变量
#define uint unsigned int //现在是40摄氏度以上风速达到最大,0-40摄氏度自动调速的风扇.
#define uchar unsigned char //关于红外控制————可以设置按下按键后,某个值加一,if判断为(1or2or3or4后执行某种操作互不冲突)
sbit in1=P1^0; //L298N输入1
sbit in2=P1^1; //L298N输入2
sbit ena=P1^2; //L298N PWM输入
sbit led1=P1^3; //减速到最低后红灯亮
sbit led2=P1^4; //加速到最高后绿灯亮
sbit s1=P1^5; //加速按键
sbit s2=P1^6; //减速按键
sbit s3=P1^7; //按键调速总开关----一直按下后才可以加减速,防止与自动温度控制冲突
sbit renti=P3^6; //人体识别输入
sbit s4=P0^4; //温度自动控制总开关
uint pwm,sum; //待比较数
void LcdDisplay(int temp); //lcd显示
void delay(uint t); //延时声明
void anjian(); //按键处理函数
void ledone(); //减速到最低后红灯闪
void ledtwo(); //加速到最高后绿灯闪
void main()
{
initialize(); //1602初始化
EA=1; //总中断
ET0=1; //T0开
TMOD=0X01; //工作方式16位定时
TH0=(65536-400)/256;
TL0=(65536-400)%256; //200us
TR0=1; //开始定时
sum=0;
pwm=0; //此处不可更改 ———— 解决了之前按减速时会加速的问题
while(1)
{
renti=1; //51读引脚时先把那个引脚拉高
delay(10);
LcdDisplay(Ds18b20ReadTemp()); //温度显示及自动控制风速
anjian(); //按键速度控制函数
}
}
void anjian() //按键处理函数
{
if(s2==0&s3==0&s4!=0) //减速
{
delay(10);
if(s2==0&s3==0&s4!=0)
{
in1=0; //正转条件
in2=1;
if(pwm>0)
{
pwm--;
delay(10000);//100ms
}
else
{
ledone();
}
}
}
if(s1==0&s3==0&s4!=0) //加速
{
delay(10);
if(s1==0&s3==0&s4!=0)
{
in1=0; //正转条件
in2=1;
if(pwm<41)
{
pwm++;
delay(10000); //100ms
}
else
{
ledtwo();
}
}
}
}
void delay(uint t) //延时函数
{
while(t--);
}
void ledone() //减速到最低后红灯闪
{
led1=0;
delay(10000);
led1=1;
delay(10000);
}
void ledtwo() //加速到最高后绿灯闪
{
led2=0;
delay(10000);
led2=1;
delay(10000);
}
void time0() interrupt 1 //定时器0
{
TR0=0;
TH0=(65536-400)/256;
TL0=(65536-400)%256; //200s
sum++;
if(sum>40)
{
sum=0; //如果num的值大于40,归0
}
if(sum<pwm) //注:此处不可更改---否则会出现减速或加速加减不到最大或最小的情况
{
ena=1; //pwm信号
}
else
{
ena=0; //pwm占空比
}
TR0=1; //起动定时器0
}
void LcdDisplay(int temp) //lcd显示
{
unsigned char datas[] = {0,0,0,0,0}; //定义数组
float tp;
float xujia; //自动温控变量
if(temp>0) //当温度为负值时
{
Writecommanda(0x80); //写地址 80表示初始地址
Writedata('+'); //显示正
tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量
//如果温度是正的那么,那么正数的原码就是补码它本身
xujia=tp*0.0625*1+0.5;
temp=tp*0.0625*100+0.5;
//留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
//后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
//算加上0.5,还是在小数点后面。
if(renti==1&xujia>30&s1!=0&s2!=0&s3!=0&s4!=0)//人体检测&温度大于30度时风扇转程序其中一条不满足风扇不转
{
in1=0; //正转条件
in2=1;
pwm=40;
delay(10000);
}
else if(renti==0&xujia>30&s1!=0&s2!=0&s3!=0&s4!=0)
{
in1=0; //正转条件
in2=1;
pwm=0;
delay(10000);
}
else if(renti==1&xujia<30&s1!=0&s2!=0&s3!=0&s4!=0)
{
in1=0; //正转条件
in2=1;
pwm=0;
delay(10000);
}
if(s4==0&s3!=0) //温度检测风速自动跟随程序
{
if(s4==0&s3!=0)
{
if(xujia>pwm) //加速 温度提高1摄氏度————转速提高约100转
{
in1=0; //正转条件
in2=1;
pwm++;
delay(10000); //还可以加一个按键控制&s4==0
}
if(xujia<pwm) //减速
{
in1=0; //正转条件
in2=1;
pwm--;
delay(10000); //还可以加一个按键控制&s4==0
}
}
}
}
datas[0] = temp / 10000;
datas[1] = temp % 10000 / 1000;
datas[2] = temp % 1000 / 100;
datas[3] = temp % 100 / 10;
datas[4] = temp % 10;
Writecommanda(0x81); //写地址 80表示初始地址
Writedata('0'+datas[0]); //百位
Writecommanda(0x82); //写地址 80表示初始地址
Writedata('0'+datas[1]); //十位
Writecommanda(0x83); //写地址 80表示初始地址
Writedata('0'+datas[2]); //个位
Writecommanda(0x84); //写地址 80表示初始地址
Writedata('.'); //显示 ‘.’
Writecommanda(0x85); //写地址 80表示初始地址
Writedata('0'+datas[3]); //显示小数点
Writecommanda(0x86); //写地址 80表示初始地址
Writedata('0'+datas[4]); //显示小数点
}

全部资料51hei下载地址:
完整版HC-SR501人体感应模块.zip
(696.46 KB, 下载次数: 94)
|