智能風(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ì)圖
原理圖.png (86.76 KB, 下載次數(shù): 85)
下載附件
2019-10-18 12:05 上傳
實(shí)物圖
IMG_20191018_120812.jpg (1.08 MB, 下載次數(shù): 80)
下載附件
2019-10-18 12:13 上傳
IMG_20191018_120749.jpg (1.53 MB, 下載次數(shù): 104)
下載附件
2019-10-18 12:12 上傳
IMG_20191018_120715.jpg (1.47 MB, 下載次數(shù): 71)
下載附件
2019-10-18 12:12 上傳
IMG_20191018_120657.jpg (1.37 MB, 下載次數(shù): 90)
下載附件
2019-10-18 12:10 上傳
熱釋電傳感器
接口.png (837.05 KB, 下載次數(shù): 74)
下載附件
2019-10-18 12:19 上傳
電路.png (46.93 KB, 下載次數(shù): 93)
下載附件
2019-10-18 12:42 上傳
主程序
#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)
2019-10-18 12:42 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
程序.zip
(44.5 KB, 下載次數(shù): 97)
2019-10-18 12:27 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
仿真不知道為什么有錯(cuò),求大神指導(dǎo).7z
(26.69 KB, 下載次數(shù): 86)
2021-3-22 01:30 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|