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);
}
} 展开
#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);
}
} 展开
5个回答
展开全部
你这段程序,如果按下按键,则程序会进入 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;
}
}
}
如果要求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” 就可以了
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的程序有问题,当按下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);
}
}
}
}
你需要把判断条件放入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);
}
}
}
}
更多追问追答
追问
这样程序只运行一遍,不循环的。谢谢!
追答
恩,是的,按一下运行一边。然后停止。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
楼上方法有误,假如程序段含有较长延时的 程序
比如延时 一小时 那岂不是 按住一小时测能检测得到?
应该利用 外部中断 按下开关 进入中断给予 停止条件状态
使其复位 然后判断状态 是否运行 这样才能保证实时性。。,,
比如延时 一小时 那岂不是 按住一小时测能检测得到?
应该利用 外部中断 按下开关 进入中断给予 停止条件状态
使其复位 然后判断状态 是否运行 这样才能保证实时性。。,,
更多追问追答
追问
请问应该如何实现?谢谢!
追答
你说的是 暂停后继续接着运行的话 那我的方法不行
我的只能是 重新运行 你说的还没想到
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
很简单
if(key==1)
{
//程序段1
}
else
{
//程序段2
}
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);}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询