这是我的原理图,四个继电器常开,常闭,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++;
}
|