本帖最后由 wulin 于 2018-12-12 13:36 编辑
在你的程序基础上修改,每次按下键后只执行一次,程序没有跑完再按无效。
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED=P1^0;
sbit LED1=P1^1;
sbit LED2=P1^2;
sbit LED3=P1^3;
sbit LED4=P1^4;
sbit LED5=P1^5;
sbit LED6=P1^6;
sbit LED7=P1^7;
sbit LED20=P2^0;
sbit LED21=P2^1;
sbit LED22=P2^2;
sbit LED23=P2^3;
sbit P3_4=P3^4;
uint time,i;
bit j=0;//启动位变量
void initT0( )
{
TMOD = 0x01; //定时器0,工作方式1
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256; //50ms中断一次 中断20次,1s 改数值等于改秒数 20=1s
EA = 1;
ET0 = 1;
TR0 = 0;//初始化关闭定时器
}
void T0int( ) interrupt 1
{
TH0 = (65536-65536)/256;
TL0 = (65536-65536)%256;
time++;
}
void main(void)
{
initT0();
while(1) //循环程序
{
if(P3_4==0) //按键启动
{
i=500;
while(i--); //消抖延时
if((P3_4==0)&&(j==0)) //再次判断按键(程序没有跑完按键无效)
{
j=1; //启动位变量1
while(!P3_4);//等待按键释放
TR0=1; //启动定时器
}
}
if(j==1)
{
if(time==1) //如果中断为1
{
LED=0; //机械手得电
}
if(time==40) //启动后2S
{
LED1=0; //导轨正
}
if(time==140) //启动后7S(上一部后5S)
{
LED=1; //机械手放
LED1=1; //导轨正失电
LED2=0; //导轨反
LED3=0; //推杆正
}
if(time==240) //启动后12S(上一部后5S)
{
LED2=1; //导轨反失电
}
if(time==340) //启动后17S(上一部后5S)
{
LED3=1; //推杆正失电
LED4=0; //右侧电机正
LED5=0; //左侧电机正
}
if(time==360) //启动后18S(上一部后1S,电机停1S)
{
LED4=1; //右侧电机正失电
LED5=1; //左侧电机正失电
}
if(time==380) //启动后19S(上一部后1S)
{
LED6=0; //右侧电机反
LED7=0; //左侧电机反
}
if(time==400) //启动后20S(上一部后1S)
{
LED6=1; //右侧电机失电
LED7=1; //左侧电机失电
LED20=0; //推杆反
}
if(time==600) //启动后30S(上一部后10S)
{
LED20=1; //推杆反失电
LED21=0; //下侧电机正
}
if(time==620) //启动后31S(上一部后1S)
{
LED21=1; //下侧电机正失电
}
if(time==640) //启动后32S(上一部后1S)
{
LED22=0; //下侧电机反
}
if(time==660) //启动后33S(上一部后1S)
{
LED22=1; //下侧电机反失电
j=0; //启动位变量0
TR0=0; //关闭定时器
time=0; //中断清零
}
}
}
}
|