標(biāo)題:
單片機智能風(fēng)扇程序 人體紅外模塊感應(yīng)
[打印本頁]
作者:
xiaoxiaoyuzau
時間:
2021-2-26 10:56
標(biāo)題:
單片機智能風(fēng)扇程序 人體紅外模塊感應(yīng)
單片機源程序如下:
#include<reg52.h> //注:本題所用為5V電機(實際可以為l298n可以輸出的30多V)
#include"18b20.h" //溫度顯示有問題————解決方法為1.提高晶振頻率到24mhZ之前運行速度較慢(提高cpu運行速度即可)。
#include"1602.h" //temp最好變成全局變量
#define uint unsigned int //現(xiàn)在是40攝氏度以上風(fēng)速達到最大,0-40攝氏度自動調(diào)速的風(fēng)扇.
#define uchar unsigned char //關(guān)于紅外控制————可以設(shè)置按下按鍵后,某個值加一,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)----一直按下后才可以加減速,防止與自動溫度控制沖突
sbit renti=P3^6; //人體識別輸入
sbit s4=P0^4; //溫度自動控制總開關(guān)
uint pwm,sum; //待比較數(shù)
void LcdDisplay(int temp); //lcd顯示
void delay(uint t); //延時聲明
void anjian(); //按鍵處理函數(shù)
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()); //溫度顯示及自動控制風(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ù)
{
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) //注:此處不可更改---否則會出現(xiàn)減速或加速加減不到最大或最小的情況
{
ena=1; //pwm信號
}
else
{
ena=0; //pwm占空比
}
TR0=1; //起動定時器0
}
void LcdDisplay(int temp) //lcd顯示
{
unsigned char datas[] = {0,0,0,0,0}; //定義數(shù)組
float tp;
float xujia; //自動溫控變量
if(temp>0) //當(dāng)溫度為負值時
{
Writecommanda(0x80); //寫地址 80表示初始地址
Writedata('+'); //顯示正
tp=temp;//因為數(shù)據(jù)處理有小數(shù)點所以將溫度賦給一個浮點型變量
//如果溫度是正的那么,那么正數(shù)的原碼就是補碼它本身
xujia=tp*0.0625*1+0.5;
temp=tp*0.0625*100+0.5;
//留兩個小數(shù)點就*100,+0.5是四舍五入,因為C語言浮點數(shù)轉(zhuǎn)換為整型的時候把小數(shù)點
//后面的數(shù)自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
//算加上0.5,還是在小數(shù)點后面。
if(renti==1&xujia>30&s1!=0&s2!=0&s3!=0&s4!=0)//人體檢測&溫度大于30度時風(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)速自動跟隨程序
{
if(s4==0&s3!=0)
{
if(xujia>pwm) //加速 溫度提高1攝氏度————轉(zhuǎn)速提高約100轉(zhuǎn)
{
in1=0; //正轉(zhuǎn)條件
in2=1;
pwm++;
delay(10000); //還可以加一個按鍵控制&s4==0
}
if(xujia<pwm) //減速
{
in1=0; //正轉(zhuǎn)條件
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]); //顯示小數(shù)點
Writecommanda(0x86); //寫地址 80表示初始地址
Writedata('0'+datas[4]); //顯示小數(shù)點
}
//注:在一個工程中相同的函數(shù)名字只能出現(xiàn)一次 (劃重點)
復(fù)制代碼
2.智能風(fēng)扇.rar
2021-2-26 10:54 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
734.45 KB, 下載次數(shù): 22, 下載積分: 黑幣 -5
作者:
admin
時間:
2021-2-26 15:57
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1