找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5126|回复: 5
收起左侧

单片机智能风扇设计与制作 有人在附近,温度高自动开启风扇 附源程序

  [复制链接]
ID:491450 发表于 2019-10-18 12:43 | 显示全部楼层 |阅读模式
智能风扇
一、任务
设计并制作一个基于MCS51系列单片机控制的小风扇。
二、要求
1.基本部分:
(1)按钮开关可以控制风扇的启停及调速;
(2)自动随温度的高低调节风扇的风速。

2.扩展部分:

(2)有人在附近,且温度较高时,自动开启风扇。

设计思路
1.本设计采用机械开关控制风扇启停,采用PWM加减调速按键控制调速。
2.本设计采用DS18B20获取温度并显示在1602屏幕上,并把温度值赋给PWM参数。
3.本设计采用热释电传感器检测人体。
设计图

原理图.png
实物图

IMG_20191018_120812.jpg

IMG_20191018_120749.jpg

IMG_20191018_120715.jpg

IMG_20191018_120657.jpg

热释电传感器
接口.png
电路.png

主程序
#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)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:599674 发表于 2019-10-25 11:26 | 显示全部楼层
1.所用为5V电机(实际可以为l298n可以输出的30多V)
2.s3和s4是开关,s1和s2是按钮。
3.L298N是模块,没有画出模块图。
4.人体检测模块,检测到人后输出3.3v,
经2个NPN三极管(开关)输入到51 IO口,
转化为高电平5V,低电平0V.
5.热释电传感器是5V以上到15V以上供电,我用5V.

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:829602 发表于 2020-10-19 09:17 | 显示全部楼层
L298N模块加入仿真之后会显示错误 请问怎那么解决
回复

使用道具 举报

ID:869719 发表于 2020-12-28 22:32 | 显示全部楼层
仿真错误,谁能解决一下:
51hei.png
回复

使用道具 举报

ID:869719 发表于 2020-12-28 23:23 | 显示全部楼层
这个有逻辑图吗
回复

使用道具 举报

ID:871749 发表于 2021-1-1 13:25 | 显示全部楼层
程序写的不错
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表