找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 6056|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)智能風(fēng)扇設(shè)計(jì)與制作 有人在附近,溫度高自動(dòng)開啟風(fēng)扇 附源程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:491450 發(fā)表于 2019-10-18 12:43 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
智能風(fēng)扇
一、任務(wù)
設(shè)計(jì)并制作一個(gè)基于MCS51系列單片機(jī)控制的小風(fēng)扇。
二、要求
1.基本部分:
(1)按鈕開關(guān)可以控制風(fēng)扇的啟停及調(diào)速;
(2)自動(dòng)隨溫度的高低調(diào)節(jié)風(fēng)扇的風(fēng)速。

2.擴(kuò)展部分:

(2)有人在附近,且溫度較高時(shí),自動(dòng)開啟風(fēng)扇。

設(shè)計(jì)思路
1.本設(shè)計(jì)采用機(jī)械開關(guān)控制風(fēng)扇啟停,采用PWM加減調(diào)速按鍵控制調(diào)速。
2.本設(shè)計(jì)采用DS18B20獲取溫度并顯示在1602屏幕上,并把溫度值賦給PWM參數(shù)。
3.本設(shè)計(jì)采用熱釋電傳感器檢測人體。
設(shè)計(jì)圖


實(shí)物圖





熱釋電傳感器



主程序
#include<reg52.h>            //注:本題所用為5V電機(jī)(實(shí)際可以為l298n可以輸出的30多V)
#include"18b20.h"               //溫度顯示有問題————解決方法為1.提高晶振頻率到24mhZ之前運(yùn)行速度較慢(提高cpu運(yùn)行速度即可)。
#include"1602.h"                //temp最好變成全局變量
#define uint  unsigned int      //現(xiàn)在是40攝氏度以上風(fēng)速達(dá)到最大,0-40攝氏度自動(dòng)調(diào)速的風(fēng)扇.
#define uchar unsigned char     //關(guān)于紅外控制————可以設(shè)置按下按鍵后,某個(gè)值加一,if判斷為(1or2or3or4后執(zhí)行某種操作互不沖突)
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;           //按鍵調(diào)速總開關(guān)----一直按下后才可以加減速,防止與自動(dòng)溫度控制沖突
sbit renti=P3^6;        //人體識(shí)別輸入
sbit s4=P0^4;                  //溫度自動(dòng)控制總開關(guān)  
uint pwm,sum;             //待比較數(shù)
void LcdDisplay(int temp);    //lcd顯示
void delay(uint t);       //延時(shí)聲明
void anjian();          //按鍵處理函數(shù)
void ledone();          //減速到最低后紅燈閃
void ledtwo();          //加速到最高后綠燈閃
void main()
{  
initialize();         //1602初始化
EA=1;              //總中斷
ET0=1;             //T0開
TMOD=0X01;          //工作方式16位定時(shí)
TH0=(65536-400)/256;
TL0=(65536-400)%256;     //200us
TR0=1;            //開始定時(shí)
sum=0;
pwm=0;            //此處不可更改    ————     解決了之前按減速時(shí)會(huì)加速的問題
while(1)
{   
  renti=1;                    //51讀引腳時(shí)先把那個(gè)引腳拉高
  delay(10);
  LcdDisplay(Ds18b20ReadTemp());   //溫度顯示及自動(dòng)控制風(fēng)速  
  anjian();               //按鍵速度控制函數(shù)
}
}

void anjian()           //按鍵處理函數(shù)
{
if(s2==0&s3==0&s4!=0)           //減速
{
  delay(10);
  if(s2==0&s3==0&s4!=0)
  {
   in1=0;            //正轉(zhuǎn)條件
   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;             //正轉(zhuǎn)條件
   in2=1;
   if(pwm<41)
   {
    pwm++;
    delay(10000);      //100ms
   }
   else
   {
    ledtwo();
   }
  }
}
}
void delay(uint t)       //延時(shí)函數(shù)
{
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     //定時(shí)器0
{
TR0=0;
TH0=(65536-400)/256;
TL0=(65536-400)%256;     //200s
sum++;
if(sum>40)
{
  sum=0;            //如果num的值大于40,歸0
}
if(sum<pwm)                   //注:此處不可更改---否則會(huì)出現(xiàn)減速或加速加減不到最大或最小的情況
{
   ena=1;           //pwm信號(hào)
}
else
{
  ena=0;           //pwm占空比
}
TR0=1;             //起動(dòng)定時(shí)器0
}

void LcdDisplay(int temp)     //lcd顯示
{
  unsigned char datas[] = {0,0,0,0,0}; //定義數(shù)組
float tp;
float xujia;         //自動(dòng)溫控變量
  if(temp>0)          //當(dāng)溫度為負(fù)值時(shí)
   {   
   Writecommanda(0x80);  //寫地址 80表示初始地址
   Writedata('+');   //顯示正
  tp=temp;//因?yàn)閿?shù)據(jù)處理有小數(shù)點(diǎn)所以將溫度賦給一個(gè)浮點(diǎn)型變量
  //如果溫度是正的那么,那么正數(shù)的原碼就是補(bǔ)碼它本身
  xujia=tp*0.0625*1+0.5;
  temp=tp*0.0625*100+0.5;
  //留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)
  //后面的數(shù)自動(dòng)去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
  //算加上0.5,還是在小數(shù)點(diǎn)后面。
   if(renti==1&xujia>30&s1!=0&s2!=0&s3!=0&s4!=0)//人體檢測&溫度大于30度時(shí)風(fēng)扇轉(zhuǎn)程序其中一條不滿足風(fēng)扇不轉(zhuǎn)
   {
    in1=0;             //正轉(zhuǎn)條件
    in2=1;
    pwm=40;
    delay(10000);
   }
   else if(renti==0&xujia>30&s1!=0&s2!=0&s3!=0&s4!=0)
   {
    in1=0;             //正轉(zhuǎn)條件
    in2=1;
    pwm=0;
    delay(10000);
   }
   else if(renti==1&xujia<30&s1!=0&s2!=0&s3!=0&s4!=0)
   {
    in1=0;             //正轉(zhuǎn)條件
    in2=1;
    pwm=0;
    delay(10000);
   }
   if(s4==0&s3!=0)                  //溫度檢測風(fēng)速自動(dòng)跟隨程序
   {
   
    if(s4==0&s3!=0)
    {
     if(xujia>pwm)        //加速              溫度提高1攝氏度————轉(zhuǎn)速提高約100轉(zhuǎn)
     {
      in1=0;            //正轉(zhuǎn)條件
      in2=1;
      pwm++;
      delay(10000);       //還可以加一個(gè)按鍵控制&s4==0
     }
     if(xujia<pwm)        //減速
     {
      in1=0;            //正轉(zhuǎn)條件
      in2=1;
      pwm--;
      delay(10000);       //還可以加一個(gè)按鍵控制&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]); //個(gè)位
Writecommanda(0x84);  //寫地址 80表示初始地址
Writedata('.');   //顯示 ‘.’
Writecommanda(0x85);   //寫地址 80表示初始地址
Writedata('0'+datas[3]); //顯示小數(shù)點(diǎn)  
Writecommanda(0x86);   //寫地址 80表示初始地址
Writedata('0'+datas[4]); //顯示小數(shù)點(diǎn)
}



全部資料51hei下載地址:
完整版HC-SR501人體感應(yīng)模塊.zip (696.46 KB, 下載次數(shù): 94)
程序.zip (44.5 KB, 下載次數(shù): 97)
仿真不知道為什么有錯(cuò),求大神指導(dǎo).7z (26.69 KB, 下載次數(shù): 86)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏10 分享淘帖 頂3 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:599674 發(fā)表于 2019-10-25 11:26 | 只看該作者
1.所用為5V電機(jī)(實(shí)際可以為l298n可以輸出的30多V)
2.s3和s4是開關(guān),s1和s2是按鈕。
3.L298N是模塊,沒有畫出模塊圖。
4.人體檢測模塊,檢測到人后輸出3.3v,
經(jīng)2個(gè)NPN三極管(開關(guān))輸入到51 IO口,
轉(zhuǎn)化為高電平5V,低電平0V.
5.熱釋電傳感器是5V以上到15V以上供電,我用5V.

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

板凳
ID:829602 發(fā)表于 2020-10-19 09:17 | 只看該作者
L298N模塊加入仿真之后會(huì)顯示錯(cuò)誤 請(qǐng)問怎那么解決
回復(fù)

使用道具 舉報(bào)

地板
ID:869719 發(fā)表于 2020-12-28 22:32 | 只看該作者
仿真錯(cuò)誤,誰能解決一下:

51hei.png (10.52 KB, 下載次數(shù): 34)

51hei.png
回復(fù)

使用道具 舉報(bào)

5#
ID:869719 發(fā)表于 2020-12-28 23:23 | 只看該作者
這個(gè)有邏輯圖嗎
回復(fù)

使用道具 舉報(bào)

6#
ID:871749 發(fā)表于 2021-1-1 13:25 | 只看該作者
程序?qū)懙牟诲e(cuò)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表