永发信息网

51单片机 单按钮启停

答案:3  悬赏:0  手机版
解决时间 2021-04-01 08:51
  • 提问者网友:温柔港
  • 2021-03-31 13:13
51单片机 单按钮启停
最佳答案
  • 五星知识达人网友:廢物販賣機
  • 2021-03-31 13:19
先试着在start_keyscan() 函数里面最后加一个while(!K1),在没松开按键的时候不跳出函数。然后在主循环里面加一个while(1)把所有的代码包进去。
这样先试一下,虽然貌似和你停不下来没啥关系,但是程序会更稳定一点。。。追问谢谢,没有解决。追答刚才看错了,应该是你第一次aciton=1进入循环后退不出来了,改成if(aciton),或者在while(action)里面再加一个keyscan应该就可以,还有unsigned char的范围貌似最大是512,i=2000给不了吧。。。

#include
void delay(unsigned char t);
void start_keyscan();

sbit K1=P3^7;
sbit led=P1^0;
bit action=0;

void delay(int t)
{
int i;
for(t;t>0;t--)
for(i=2000;i>0;i--) ;
}

void start_keyscan()
{
if(K1==0)
{
delay(10);
if(K1==0)
action=~action;
while(!K1);
}
}

void main()
{
while(1)
{
start_keyscan();
if(action)
{
led=~led;
delay(500);
led=~led;
delay(500);
}
}
}追问改成if 是暂停了,我要的是全部停止,达到关闭电源的效果,不知道怎么做。追答软件是不可能直接关闭电源的,芯片只要上电之后就会不断运行你烧写的程序,即使没有while(1),也会从main重新开始执行,一般都是在硬件侧加开关器件通过软件控制开关开断的。追问问题已经解决,是可以通过软件解决的。追答真的不知道用软件怎么做,求指教。。。
全部回答
  • 1楼网友:渡鹤影
  • 2021-03-31 14:41
将 while(action) 改成 if(action) 按键结尾最好再加一个 while(!K1);追问是可以暂停了,但不是彻底停止,其实程序挺复杂的,不只是让灯闪烁,是个倒计时,这样点了暂停后是停在我点的那一时刻了,帮我看看怎么全部停止,就是关电的效果。追答在吗? 加 854091421
  • 2楼网友:鱼芗
  • 2021-03-31 13:42
第一:
这个地方修改一下:
void start_keyscan()
{
if(K1==0)
{
delay(10);
if(K1==0)
action=~action;
//---加一句这个:
while(K1 == 0);
}
}

第二:
这个地方修改一下:
void delay(unsigned char t)
{
unsigned char i;
for(t;t>0;t--)
for(i=2000;i>0;i--) ;
}

把上面的unsigned char i修改成unsigned int i
因为unsigned char 最大只能到 255,你的程序里用了 2000,你调用的时候用了 500,其实都没有达到,所以要改.

第三:
这个地方修改一下:

while(action)
{
led=~led;
delay(500);
led=~led;
delay(500);
}
修改成:

while(1)
{
if(action)
{
led=~led;
delay(500);

}
else
{
led = 1; //---如果你的二极管的负极接P1^0,led = 1就是关闭二极管
//---如果你的二极管负极接的是地,那么led = 0是关闭二极管
//---根据电路来选择.
}
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯