1589016293.png (103.81 KB, 下載次數: 50)
下載附件
2020-5-10 17:35 上傳
這是我的原理圖,四個繼電器常開,常閉,IO口控制,第一個按鍵想實現按一下開,按一下關,長按加速,松開保持這個速度不變,在長按減速的功能,第二個按鍵按下反轉,第三個按下停止,我現在開,關,反轉,停止寫出來了,但是長按加速,減速處理不過來,通過pwm mos管來控制,就有些搞不清楚了,我也寫了代碼,各位大神們指點一下
#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) //延時函數
{
while(i--);
}
void delayu (u16 x) //精確延時函數
{
u16 i,j;
for(i=x;i>0;i--)
for(j=120;j>0;j--);
}
void inversion()
{
u8 i;
u8 dat; //定義一個變量
if(ke==0) //判斷開關是否按下
{
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) //判斷 周期跟占空比開關pwm
pwm=0;
else pwm=1;
Count++;
if(Count>=100) //占空比清空
{
Count =0;
flay=~flay; //標志位
}
if(flay)
{
while(!ke) //判斷按鍵是否真的按下,
{
if(num<100) //當大于100,
num ++;
delayu(50);
}
}
else //反之則
{
while(!ke)
{
if(num>0)
num--;
delayu(50);
}
}
}
}
if(k2==0) //按鍵是否按下,消抖
{
delay(1000);
if(k2==0) //開關繼電器
{
J1 = 0;
J2 = 1;
J3 = 1;
J4 = 0;
}
while(!k2);
} //按鍵是否觸碰,
if(k3==0)
{
delay(1000);
if(k3==0) //繼電器全關
{
J1 = 1;
J2 = 1;
J3 = 1;
J4 = 1;
}
}
}
void InitIimer0() //定時函數
{
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++; //進入中斷,時間加一,占空比加一
Count++;
}
|