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

小白求助!请看程序,按下k1后能运行,但不能停止,请问要如果改,谢谢高手!#include<REG51.h>//通用89C51头文件sbitLED1=P1^0;//定义闪... 小白求助!请看程序,按下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);

}
}
展开
 我来答
刺友互
高粉答主

2019-07-05 · 每个回答都超有意思的
知道答主
回答量:3979
采纳率:100%
帮助的人:72.6万
展开全部

1、创建项目文件。

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

3、创建C语言主函数。

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

5、选择输出的效果。

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

元飞珍DR
推荐于2017-11-26 · TA获得超过2429个赞
知道小有建树答主
回答量:309
采纳率:95%
帮助的人:124万
展开全部
你这段程序,如果按下按键,则程序会进入 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”  就可以了
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
liliwei207
2013-09-25
知道答主
回答量:15
采纳率:0%
帮助的人:7.4万
展开全部
你的程序有问题,当按下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);
}
}
}
}
更多追问追答
追问
这样程序只运行一遍,不循环的。谢谢!
追答
恩,是的,按一下运行一边。然后停止。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
摆渡人生_2012
2013-09-25 · TA获得超过878个赞
知道小有建树答主
回答量:607
采纳率:50%
帮助的人:280万
展开全部
楼上方法有误,假如程序段含有较长延时的 程序
比如延时 一小时 那岂不是 按住一小时测能检测得到?
应该利用 外部中断 按下开关 进入中断给予 停止条件状态
使其复位 然后判断状态 是否运行 这样才能保证实时性。。,,
更多追问追答
追问
请问应该如何实现?谢谢!
追答
你说的是 暂停后继续接着运行的话 那我的方法不行  
我的只能是 重新运行 你说的还没想到
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
一万光年MEGn0
2013-09-25 · TA获得超过3712个赞
知道大有可为答主
回答量:4602
采纳率:67%
帮助的人:1072万
展开全部
很简单

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);}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式