❶ 单片机51,出现按一次按键,得到多次按键的情况,怎么解决
单片机51,出现按一次按键,得到多次按键的情况,是由于没有做“消抖”处理的结果,在软件上做一些延时消抖处理后,一般就可以解决这个问题。比如:
keyscan()
{
if(key==0)//当按键按下
{
delay(10);//延时消抖
if(key==0)//如果按键任然按下
{
while(key==0);//等待按键抬起
.......
}
}
}
❷ 51单片机C语言按键被重复执行
程序有些啰嗦,
voidmain()
{
while(1)key();//调用按键服宽仔陪兄务函数
}
voidkey()
{
if(S1==0)testone();
elseif(S2==0)testhold();
慎乱汪elseif(S3==0)noteup();
elseif(S4==0)notedown();
}
❸ 怎么解决单片机两个或多个键同时按下的情况
解决单片机两个或多个键同时按下的情况的程序:
key1_flag=0;
if(key==1)
{
delay(500);
if(key1==1&&key_flag==0)
{;}
}
key1_flag=key1;
解释:
1)当key1(带自锁)作为51单片机输入信号被按下时,再按key2(不带自锁)时,响应就有问题了;
2)如果是先判断key1的话,加个延时,然后再判断key2的电平,理论上没问题的;
3)或者如果你key1自锁的时候为高电平,直接
while(key1)
{;}。
❹ 51单片机中如何通过一个按键实现暂停与恢复需要一个编程的思想
有以下几种情况:
1.循环查询按键。当按键按第一次时间,进入第一层循环查询语句内部,执行恢复。不跳出该层循环,继续查询按键。当第二次按下时间,进入第二层循环查询语句内部,执行暂停。循环结束。若想反复暂停和恢复,就在外面再加一层while(1)类似的死循环,反复执行其内部的两层循环查询语句。
2.用一个标志变量,记住按键的状态。初始化为个值,如“暂停”,按键之后检查标志变量,是“暂停”就执行“恢复”,再让它变为“恢复”说明当前已经执行了恢复。反之亦然。
3.掉电暂停。这样需要按键能触发cpu工作。所以,需要按键接到外部中断上面。中断后可以恢复CPU工作。在中断中再判断是否要让cpu掉电与否。
不知道这种方法你能接受不?还是用外部中断。此按键触发中断后,关掉所有其他的中断,也即EA=0(最好先用个变量记住EA,方便恢复),然后就一直在中断中等待该按键第二次按下再恢复EA,最后退出中断。
❺ 51单片机中如何通过一个按键实现暂停与恢复需要一个编程的思想
1、创建项目文件。
❻ 51单片机IO口的分时复用应用问题
可以复用,但是按键的时候灯是亮的。
复用方法有点类似动态显示扫描,读取按键之前,把P0.1置成高电平,即关灯,延时一点时间,读按键。读完按键,恢复显示内容。
由于按键读取不需要很频繁,比如说10ms才读一次,那么显示偶尔关一小会,比如说10us,肉眼感觉不到显示闪烁。
❼ 单片机按键复位电路各元件的作用
R17
C13组成止电复位电路,刚上电时,C13是电压为0,电源通过R17对电容充电,因此,RST引脚呈现高电平,高电平时间大于2个晶振周期,单片机复位
电容充电完毕,RST引脚呈现低电平,复位结束
按钮S22和R16组成手动复位电路
,按下S22,电源接通R16和
R17,由于R17阻值比较大,因此RST是高电平,同时电容通过R16迅速放电,即使按钮触点断开,电源也可对C13充电,使RST高电平稳定一段时间
,保证可靠复位。
C13容量较小时,R16可省掉,小电容短路放电不会损坏按钮触点
❽ 关于单片机IO口输入输出复用问题
首先电阻应该接电源正极,按键一端接地,但还不行,按键检测时,IO口先输出高电平,若有按键按下则检测到低电平,所以在你检测按键之前,LED已经处于亮态了,这和你检肢好塌测到按键按历圆下再亮是矛盾的
当按键不被按下时,IO口是高是低由程序决定的,复位时IO口袜庆黙认是作为输入用的,输出是高电平
但负载能力比较弱
将LED改为低电平驱动是可行的,平时IO时输出高平可作为输入,LED不亮,按下按键后,单片机检测到低电平,可输出低电平,LED就一直亮了(也可由程序控制亮一段时间灭,以便再次进行检测)
❾ 单片机独立键盘输入数码管显示 使用独立键盘输入,实现按键复用,并在数码管上显示。
这个就两个功能,一个是键盘扫描,二是数码管显示,这样的程序网上一大把,
按键程序
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar pre_peyno=16;keyno=16;
void delayms(int x)
{
uchar i;
while(x--)
{
for(i=0;i<120;i++);
}
}
void ked_scan()
{
uchar m;
P2=0x0f;
if(P2&0x0f!=0x0f)
delayms(2);
if(P2&0x0f!=0x0f)
m=P2^0x0f;
switch(m)
{
case1:keyno=0;break;
case2:keyno=1;break;
case4:keyno=2;break;
case8:keyno=3;break;
default:keyno=16;
}
P2=0xf0;
delayms(1);
m=P2>>4^0x0f;
m=m+10;
switch(m)
{
case1:keyno=0;break;
case2:keyno=4;break;
case4:keyno=8;break;
case8:keyno=12;break;
}
}
main()
{
P2=0xff;
while(1)
{
uchar i;
switch(keyno)
{
case0:P2=0x00;break;
case1:P2=0xfe;for(i=0;i<7;i++){P2=_crol_(P2,1);delayms(150);}break;
case2:P2=0x7f;for(i=0;i<7;i++)P2=_cror_(p2,1);delayms(150);}break;
case16:P2=0xff;break;
}
}
数码管程序
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit la=P2^7;
sbit wela=P2^6;
unsigned char code num[]=
{0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
#define uint unsigned int
void delay(uint x)
{
while(x--);
}
void main()
{
while(1)
{
P0=0xfe;
wela=1;
wela=0;
P0=num[1];
la=1;
la=0;
delay(1000);
P0=0xfd;
wela=1;
wela=0;
P0=num[2];
la=1;
la=0;
delay(1000);
}
}
以上两个程序是参考程序,不过还得根据自己的实际电路改改,不能直接运用。