標(biāo)題:
單片機(jī)風(fēng)扇風(fēng)速控制電路 求指導(dǎo)一下我的代碼!
[打印本頁(yè)]
作者:
cwm5744
時(shí)間:
2019-3-4 15:18
標(biāo)題:
單片機(jī)風(fēng)扇風(fēng)速控制電路 求指導(dǎo)一下我的代碼!
設(shè)計(jì)一個(gè)風(fēng)扇風(fēng)速控制電路,用三個(gè)按鍵控制風(fēng)速、風(fēng)種、啟動(dòng)/停止;運(yùn)轉(zhuǎn)狀態(tài)用指示燈顯示。
風(fēng)速:強(qiáng)、中、弱對(duì)應(yīng)電扇的不同轉(zhuǎn)速。 風(fēng)種:睡眠、自然、正常。睡眠時(shí),電扇運(yùn)轉(zhuǎn)10秒,間斷10秒;自然時(shí),自然風(fēng)運(yùn)轉(zhuǎn)5秒,間斷5秒;正常時(shí)電扇連續(xù)運(yùn)轉(zhuǎn)。
現(xiàn)在代碼出現(xiàn)的問(wèn)題是:選擇風(fēng)種那里,停轉(zhuǎn)5秒那里沒(méi)問(wèn)題,但是一旦進(jìn)入停轉(zhuǎn)10秒那里就變成轉(zhuǎn)10秒,只停止3秒左右,模式3直接進(jìn)入不了,一直在模式1和2之間變換。
代碼如下:
#include<reg52.h>
#include<intrins.h>
#include<stdio.h>
#include<uart.h>
#define uchar unsigned char
#define uint unsigned int
uchar zkb,aa;
uchar t=0,snum=0,s1num=0,tt=0; //t記錄中斷次數(shù),確定PWM的周期
sbit IN1=P2^1;
sbit IN2=P2^2;
sbit ENA=P2^5; //產(chǎn)生PWM波?
sbit dula=P2^6;
sbit wela=P2^7;
sbit zs=P3^7; //轉(zhuǎn)速
sbit ms=P3^6; //模式
sbit d1=P1^0;
sbit d2=P1^1;
sbit d3=P1^2;
sbit d4=P1^3;
sbit d5=P1^4;
sbit lcden=P3^4;
sbit rs=P3^5;
void delayms(uint xms) //延時(shí)子程序
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
//液晶顯示模塊的讀寫(xiě)以及控制
void write_com(uchar com) //寫(xiě)命令函數(shù)
{
rs=0;
lcden=0;
P0=com;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
void write_data(uchar date) //寫(xiě)數(shù)據(jù)函數(shù)
{
rs=1;
lcden=0;
P0=date;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
//函數(shù)功能:顯示檔數(shù)和模式
void display_sym()
{
write_com(0x80);
write_data('v');
write_data(':');
write_com(0x80+0x40);
write_data('m');
write_data(':');
}
void keyscan()
{
if(zs==0) //控制電機(jī)的四個(gè)轉(zhuǎn)速
{
delayms(5);//消抖
if(zs==0) //zs鍵確實(shí)按下
{
snum++; //每按一次加1
while(!zs); //等待松開(kāi)
if(snum==3) //當(dāng)snum=5時(shí),回到第一檔
{
snum=0; //0檔,速度最大
}
switch(snum)
{
case 0:zkb=40;break; //snum為0時(shí),1檔
case 1:zkb=60;break; //snum為1時(shí),2檔
case 2:zkb=90;break; //snum為2時(shí),3檔
default: break;
}
}
}
if(ms==0) //控制電機(jī)的四個(gè)轉(zhuǎn)速
{
delayms(5);//消抖
if(ms==0) //zs鍵確實(shí)按下
{
while(!ms); //等待松開(kāi)
s1num++; //每按一次加1
if(s1num==1) //
{
tt=0;
aa=100;
IN1=1; //
IN2=0;
}
if(s1num==2) //
{
tt=0;
aa=200;
IN1=1; //
IN2=0;
}
if(s1num==3) //
{
s1num=0; //清零下次計(jì)算
IN1=1;
IN2=0;
}
}
}
}
void init()
{
dula=0;
wela=0;
lcden=1;
IN1=1;
IN2=0;
write_com(0x38); //設(shè)置16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口
write_com(0x0c); //設(shè)置開(kāi)顯示,不顯示光標(biāo)
write_com(0x06); // 寫(xiě)一個(gè)字符后地址指針加1
write_com(0x01); //顯示清0,數(shù)據(jù)指針清0
write_com(0x80); //通電時(shí),指針知道顯示屏第一行首位處
TMOD=0x21; //
TH1=(65536-917)/256; //定時(shí)器1賦初值100us
TL1=(65536-917)%256;
TH0=(65536-45872)/256; //定時(shí)器0賦初值50ms
TL0=(65536-45872)%256;
ET1=1; // 定時(shí)器1打開(kāi)
ET0=1; // 定時(shí)器0打開(kāi)
TR0=1; // 啟動(dòng)定時(shí)器0
TR1=1; // 啟動(dòng)定時(shí)器1
EA=1; // 打開(kāi)總中斷
}
void main()
{
init(); //初始化
display_sym(); //上電時(shí),顯示v: m:
while(1)
{
keyscan(); //按鍵掃描,實(shí)現(xiàn)轉(zhuǎn)速轉(zhuǎn)向調(diào)節(jié)的功能
}
}
void timer0()interrupt 1 //
{
TH0=(65536-45872)/256; //每次中斷為50ms
TL0=(65536-45872)%256;
tt++;
if(tt<aa)
IN1=1;
else
IN1=0;
if(tt==2*aa)
tt=0;
}
void timer1()interrupt 3 //該定時(shí)器1用于占空比調(diào)速
{
TH1=(65536-917)/256; //重新裝入初值 100us
TL1=(65536-917)%256;
t++; //每產(chǎn)生一次中斷+1
if(t<zkb) //當(dāng)占空比大于t時(shí),輸出高電平,否則輸出低電平
ENA=1; //在t<zkb時(shí),使能端開(kāi)啟,否則使能端關(guān)閉
else
ENA=0;
if(t>=100)
t=0;
}
復(fù)制代碼
作者:
cwm5744
時(shí)間:
2019-3-4 15:38
漏說(shuō)了,注釋沒(méi)寫(xiě)好,是第二個(gè)if那里出問(wèn)題,對(duì)應(yīng)的是定時(shí)器0那里。
作者:
cwm5744
時(shí)間:
2019-3-4 18:34
現(xiàn)在發(fā)現(xiàn)好像是定時(shí)器0溢出標(biāo)志位tt溢出次數(shù)太多會(huì)出錯(cuò),達(dá)到某個(gè)溢出數(shù)后,tt就會(huì)自動(dòng)清零
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1