找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3993|回复: 3
收起左侧

怎么让我按下启动程序只运行一次?51单片机程序请教

[复制链接]
ID:304151 发表于 2018-12-11 14:36 | 显示全部楼层 |阅读模式
怎么让我按下启动程序只运行一次  我试过去掉while(1)他就不执行之后的程序了
各位大佬出出主意谢谢了




#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;
void initT0( )
{
TMOD = 0x01;                    //定时器0,工作方式1
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;        //50ms中断一次   中断20次,1s  改数值等于改秒数  20=1s
EA = 1;
ET0 = 1;
TR0 = 1;
}

void T0int( ) interrupt 1
{
TH0 = (65536-65536)/256;
TL0 = (65536-65536)%256;
time++;
}


void main(void)
{
initT0();

if(P3_4==0)      //启动
{

while(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;         //下侧电机反失电
time=0;          //中断清零
}

  }


}
}




回复

使用道具 举报

ID:213173 发表于 2018-12-12 09:32 | 显示全部楼层
本帖最后由 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;          //中断清零
                        }
                }
        }
}

回复

使用道具 举报

ID:277374 发表于 2018-12-11 22:22 | 显示全部楼层


while(1)         //循环程序
{
if(P3_4==0)      //启动
{
}
回复

使用道具 举报

ID:277374 发表于 2018-12-11 22:25 | 显示全部楼层
while(1)
{
if(P3_4==0)      //启动
{
    //在这里添加你的处理函数
}
}

这样存在的问题:
1. 你按下P3_4时间长的话,程序会多执行几次
建议:
在按键部分增加一个延时,按键的延时扫描程序咱们论坛中有很多,希望你能自己寻找一下。
如果 还有疑问,我们继续沟通
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表