标题:
求改进一下单片机程序,使我可以只通过一个按键达到开关蜂鸣器的效果
[打印本页]
作者:
日本人孙笑川
时间:
2019-2-5 22:56
标题:
求改进一下单片机程序,使我可以只通过一个按键达到开关蜂鸣器的效果
下面的单片机代码只能按住k1时开松开就关 不能达到按一次改变一次状态的效果 求大神解释一下为什么 多谢了
#include "reg51.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit k1=P2^1;
sbit beep=P1^5;
void delay(u16 i)
{
while(i--);
}
void jiao()
{
beep=~beep;
delay(2000);
}
u8 key()
{
if(k1==0)
{
delay(1000);
if(k1==0)
{
delay(1000);
return 1;
}
while(k1==0);
}
else
return 0;
}
void main()
{
while(1)
{
if(key()==1)
jiao();
else
beep=1;
}
}
作者:
xuyaqi
时间:
2019-2-6 08:51
应该设一个标志,记录按下并弹上的次数,蜂鸣器根据按下并弹上的次数执行响与不响。你现在是按下响,放开不响。
作者:
HC6800-ES-V2.0
时间:
2019-2-6 09:18
你的程序就是这样的功能——按着响,松手停。而且不一直按着,只快速地按一下都是不会响的——全靠while(1)才响的。
你的思路,使得程序不好改了,换个新的吧
#include<reg51.h>
sbit k3=P3^2;
sbit Beep = P1^5 ;
void Delay(unsigned int i);
void Delay10ms(unsigned int c);
void main(void)
{
unsigned int i,n,f;
while(1)
{
if(k3==0)
{
Delay10ms(1);
if(k3==0)
{
if(f==0)
{n=0;
while(n<1000)
{
Beep= 1;
Delay(100);
Beep= 0;
Delay(100);
n++;
}
f=1;
}
else
{n=0;
while(n<750)
{
Beep= 1;
Delay(150);
Beep= 0;
Delay(150);
n++;
}
f=0;
}
while((i<50)&&(k3==0))
{
Delay10ms(1);
i++;
}
i=0;
}
}
}
}
void Delay10ms(unsigned int c)
{
unsigned char a,b;
for(c;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
void Delay(unsigned int i)
{
for(i; i > 0; i--);
}
程序功能:按奇数次按键一个音,按偶数次响另一个音。
作者:
日本人孙笑川
时间:
2019-2-6 12:50
HC6800-ES-V2.0 发表于 2019-2-6 09:18
你的程序就是这样的功能——按着响,松手停。而且不一直按着,只快速地按一下都是不会响的——全靠while(1) ...
感谢 不过那个f的作用是啥...看不懂诶
作者:
ahshmj
时间:
2019-2-6 18:43
设置一个标志位,按键每按一次,标志位取反一次。然后根据标志位来判断是否驱动蜂鸣器。
按键的检测和普通的按键检测相同。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1