|
這是我的原理圖,四個(gè)繼電器常開(kāi),常閉,IO口控制,第一個(gè)按鍵想實(shí)現(xiàn)按一下開(kāi),按一下關(guān),長(zhǎng)按加速,松開(kāi)保持這個(gè)速度不變,在長(zhǎng)按減速的功能,第二個(gè)按鍵按下反轉(zhuǎn),第三個(gè)按下停止,我現(xiàn)在開(kāi),關(guān),反轉(zhuǎn),停止寫出來(lái)了,但是長(zhǎng)按加速,減速處理不過(guò)來(lái),通過(guò)pwm mos管來(lái)控制,就有些搞不清楚了,我也寫了代碼,各位大神們指點(diǎn)一下
#include <reg51.h>
typedef unsigned char u8;
typedef unsigned int u16;
unsigned char Count,num; //全局變量
sbit ke = P1^0; //定義管腳
sbit k2 = P1^1;
sbit k3 = P1^2;
sbit J1 = P0^0;
sbit J2 = P0^1;
sbit J3 = P0^2;
sbit J4 = P0^3;
sbit pwm= P0^4;
bit flay;
void delay(u16 i) //延時(shí)函數(shù)
{
while(i--);
}
void delayu (u16 x) //精確延時(shí)函數(shù)
{
u16 i,j;
for(i=x;i>0;i--)
for(j=120;j>0;j--);
}
void inversion()
{
u8 i;
u8 dat; //定義一個(gè)變量
if(ke==0) //判斷開(kāi)關(guān)是否按下
{
delay(1000); //消抖
if(ke==0) //再次判斷按鍵是否按下
{
i++;
dat=1; //按鍵按下 變量就加一次
if(i>=2) //判斷變量是否大于或者等于2
{
i=0;
} //變量等于0
while(!ke); //按鍵松
}
switch(i) //掃描
{
case 0:J1=1;J2=1;J3=1;J4=1;break; //第一此掃描
case 1:J1=1;J2=0;J3=0;J4=1;break; //第二次掃描
}
if(ke==0) //判斷按鍵是否按下
{
if(num>Count) //判斷 周期跟占空比開(kāi)關(guān)pwm
pwm=0;
else pwm=1;
Count++;
if(Count>=100) //占空比清空
{
Count =0;
flay=~flay; //標(biāo)志位
}
if(flay)
{
while(!ke) //判斷按鍵是否真的按下,
{
if(num<100) //當(dāng)大于100,
num ++;
delayu(50);
}
}
else //反之則
{
while(!ke)
{
if(num>0)
num--;
delayu(50);
}
}
}
}
if(k2==0) //按鍵是否按下,消抖
{
delay(1000);
if(k2==0) //開(kāi)關(guān)繼電器
{
J1 = 0;
J2 = 1;
J3 = 1;
J4 = 0;
}
while(!k2);
} //按鍵是否觸碰,
if(k3==0)
{
delay(1000);
if(k3==0) //繼電器全關(guān)
{
J1 = 1;
J2 = 1;
J3 = 1;
J4 = 1;
}
}
}
void InitIimer0() //定時(shí)函數(shù)
{
TMOD =0X02; //8位重裝模式
TH0 =163; //初始值 加90的溢出值
TL0 =163;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void main()
{
J1 = 1; //繼電器初始閉合
J2 = 1;
J3 = 1;
J4 = 1;
Count=0;
num=0;
flay=0;
InitIimer0();
while(1)
{
inversion();
}
}
void Timer0Interrupt() interrupt 1
{
TH0 =163;
TL0 =163;
num++; //進(jìn)入中斷,時(shí)間加一,占空比加一
Count++;
}
|
|