51单片机如何用一个按键控制一段程序的运行与停止

小白求助!请看程序,按下k1后能运行,但不能停止,请问要如果改,谢谢高手!
#include <REG51.h> //通用89C51头文件
sbit LED1 = P1^0; //定义闪烁LED
sbit LED2 = P1^1; //定义闪烁LED
sbit LED3 = P1^2; //定义闪烁LED
sbit LED4 = P1^3; //定义闪烁LED
sbit K1 = P3^2;
/*********************************************************************************************
函数名:毫秒级CPU延时函数
调 用:DELAY_MS (?);
参 数:1~65535(参数不可为0)
返回值:无
结 果:占用CPU方式延时与参数数值相同的毫秒时间
备 注:应用于1T单片机时i<600,应用于12T单片机时i<125
/*********************************************************************************************/
void DELAY_MS (unsigned int a){
unsigned int i;
while( --a != 0){
for(i = 0; i < 600; i++);
}
}
/*********************************************************************************************/
/*********************************************************************************************/

void main (void){ //主程序

if(K1==0)//假设按键低电平有效
{DELAY_MS(5);
if(K1==0);

while(1)

{

LED1=1;
LED3=1;
DELAY_MS(10);
LED1=0;
LED3=0;
DELAY_MS(20);
LED1=1;
LED3=1;
DELAY_MS(10);
LED1=0;
LED3=0;
DELAY_MS(20);
LED1=1;
LED3=1;
DELAY_MS(10);
LED1=0;
LED3=0;
DELAY_MS(20);
LED1=1;
LED3=1;
DELAY_MS(10);
LED1=0;
LED3=0;
DELAY_MS(100);

}
}

1、创建项目文件。

2、按键:S1=P3^2,点亮: led=P1^5。

3、创建C语言主函数。

4、创建循环效果,检测效果。while(1)    {}。

5、选择输出的效果。

6、当按下一个按键时,关闭灯,整个程序运行,再按一次,程序停止。

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-11-26
你这段程序,如果按下按键,则程序会进入 while(1) 里面一直运行,不会跳出,所以除非断电,无论按什么按键都不会影响灯闪程序。

如果要求K1=0时灯闪烁,K1=1时灯灭掉,可以在DELAY_MS程序之后改为以下内容:

#define light 1
#define black 2
void main (void)
{ //主程序

unsigned char key=0;
while(1)
{
if(K1==0)//假设按键低电平有效
{
DELAY_MS(5);
if(K1==0) key=lignt;
}
else key=black;

if(key==light)
{
LED1=1;
LED3=1;
DELAY_MS(10);

LED1=0;
LED3=0;
DELAY_MS(20);

LED1=1;
LED3=1;
DELAY_MS(10);

LED1=0;
LED3=0;
DELAY_MS(20);

LED1=1;
LED3=1;
DELAY_MS(10);

LED1=0;
LED3=0;
DELAY_MS(20);

LED1=1;
LED3=1;
DELAY_MS(10);

LED1=0;
LED3=0;
DELAY_MS(100);
}
else
{
/* 不知你灯是怎么接的,此处假设LED1=0时灯灭 */
LED1=0;
LED3=0;
}
}
}追问

这句if(K1==0) key=lignt; 报LED.C(53): 错误 C202: 'lignt': undefined identifier。谢谢!

追答

哦,抱歉,拼写错误,是 light 把 “n” 改成 “h” 就可以了

追问

程序只运行一遍,运行到 LED1=0;
LED3=0;
停止,按键也没反应了。求解,谢谢!

追答

你是说,上电开始,按按键,灯闪烁,然后松开按键,灯灭;然后再按按键就没有任何反应了吗?

追问

你·写的程序是上电开始,按键,灯闪,运行程序一遍,停止不再运行,按键没反应。我要的是上电开始,按键一次循环运行程序,松开按键继续运行,直到再按键一次暂停程序。再按键一次循环运行程序,松开按键继续运行,直到再按键一次暂停程序。谢谢!

追答

会出现按键没反应情况,可能是按键读取出现错误。
我的程序中,按键部份处理确实比较简单,如果有硬件干扰可能会造成按键出错。

而单看程序,逻辑应该是没问题的。 而且我用Keil Debug了一次,没发现逻辑问题。

PS:若按你的要求:按一次按键,灯闪;再按一次按键,灯灭。 上述程序只需修改以下地方:
1、#define black 2 修改为 #define black 0
2、unsigned char key; 修改为 bit key;
3、if(K1==0) key=light; 修改为 if(K1==0) key=~key;

本回答被提问者采纳
第2个回答  2013-09-25
你的程序有问题,当按下K1后程序就进入死循环了。所以无法停止。
你需要把判断条件放入while循环里面。
以下是修改过的程序。希望能帮到你,望采纳

#include <REG51.h> //通用89C51头文件
sbit LED1 = P1^0; //定义闪烁LED
sbit LED2 = P1^1; //定义闪烁LED
sbit LED3 = P1^2; //定义闪烁LED
sbit LED4 = P1^3; //定义闪烁LED
sbit K1 = P3^2;
void DELAY_MS (unsigned int a)
{
unsigned int i;
while( --a != 0){
for(i = 0; i < 600; i++);
}
}

void main ()
{ while(1)
{
if(K1==0)//假设按键低电平有效
{DELAY_MS(5);
if(K1==0);
{
LED1=1;
LED3=1;
DELAY_MS(10);
LED1=0;
LED3=0;
DELAY_MS(20);
LED1=1;
LED3=1;
DELAY_MS(10);
LED1=0;
LED3=0;
DELAY_MS(20);
LED1=1;
LED3=1;
DELAY_MS(10);
LED1=0;
LED3=0;
DELAY_MS(20);
LED1=1;
LED3=1;
DELAY_MS(10);
LED1=0;
LED3=0;
DELAY_MS(100);
}
}
}
}追问

这样程序只运行一遍,不循环的。谢谢!

追答

恩,是的,按一下运行一边。然后停止。

追问

我需要的是按k二次,一次运行一次暂停·,如此循环!

第3个回答  2013-09-25
楼上方法有误,假如程序段含有较长延时的 程序
比如延时 一小时 那岂不是 按住一小时测能检测得到?
应该利用 外部中断 按下开关 进入中断给予 停止条件状态
使其复位 然后判断状态 是否运行 这样才能保证实时性。。,,追问

请问应该如何实现?谢谢!

追答

你说的是 暂停后继续接着运行的话 那我的方法不行
我的只能是 重新运行 你说的还没想到

追问

能否将k作为大循环,运行程序作为大循环内的小循环?这样能否实现?

追答

我已经说了 那样的话除非 程序单循环周期比较短至少在0.5s以内 才可以那么做 否则 按键会很迟钝 实时性很差。。就你这段程序延时来说 还勉强可以 。。。

第4个回答  2013-09-25
很简单

if(key==1)
{
//程序段1
}
else
{
//程序段2
}追问

我程序只有一段,开关也只有一个,这个应该怎样写?谢谢!

追答

if(key==0)
{
LED1=1;
LED3=1;
DELAY_MS(10);
LED1=0;
LED3=0;
DELAY_MS(20);
LED1=1;
LED3=1;
DELAY_MS(10);
LED1=0;
LED3=0;
DELAY_MS(20);
LED1=1;
LED3=1;
DELAY_MS(10);
LED1=0;
LED3=0;
DELAY_MS(20);
LED1=1;
LED3=1;
DELAY_MS(10);
LED1=0;
LED3=0;
DELAY_MS(100);}

追问

这样是k按下程序就运行。我要的是k按下运行放开继续运行,k再按下程序停止,如此循环。

追答

k再按下程序停止,是说永远停止吗?

追问

暂停也可以!按k2次,按一次循环运行程序直到再按一次暂停程序。再按一次循环运行程序直到再按一次暂停程序。

相似回答