51单片机独立按键识别控制LED,经常无响应

网站已改版,请使用新地址访问:
The-8-keys-to-control-8-LED-lights 通过单片机上的独立按键来控制8个LED灯,同时也可以 哪个灯亮反映是第几个 按下 SCM 开发 238万源代码下载- www.pudn.com
&文件名称: The-8-keys-to-control-8-LED-lights
& & & & &&]
&&所属分类:
&&开发工具: C-C++
&&文件大小: 84 KB
&&上传时间:
&&下载次数: 1
&&提 供 者:
&详细说明:通过单片机上的独立按键来控制8个LED灯,同时也可以通过哪个灯亮反映是第几个按键按下-Through the single independent key to control 8 LED lights,At the same time, can also through which light reflected is the first of several key press
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&8个按键控制8个LED灯&&...................\main.c&&...................\pro&&...................\pro.hex&&...................\pro.M51&&...................\pro.uvopt&&...................\pro.uvproj&&...................\STARTUP.A51&&LED显示键值&&...........\main.c&&...........\pro&&...........\pro.hex&&...........\pro.M51&&...........\pro.uvopt&&...........\pro.uvproj&&...........\STARTUP.A51&&...........\__Previews&&...........\..........\main.cPreview
&输入关键字,在本站238万海量源码库中尽情搜索:
&[] - 按键控制PWM实现LED亮度渐变实验按键控制PWM实现LED亮度渐变实验
&[] - 按键控制ADC采集,当按键常开ADC开始工作并控制LED随电压的上升点亮单片机之路—独立按键操作
我的图书馆
单片机之路—独立按键操作
1、概述我们在使用家用电器时经常需要通过按键给电器输入指令,让电器执行动作。比如电磁炉的开关、电饭煲定时时间设定等等。今天我们来讲一下单片机怎么识别按键操作指令的。我们知道单片机只能识别高低电平,对于51单片机来说,0V为低电平,5V为高电平。按键就相当于一个开关,按下时导通,按键弹开时断开。2、硬件电路分析我们来看一下按键和单片机的接口电路图:独立按键与单片机接口我们直接把单片机P3.2引脚和P3.3引脚接到按键的一端,按键的另外一端接地。因为单片机的P3引脚是接有上拉电阻的,所以可以这样接。如果是P0口不能这样接。3、程序编写在开始写程序之前,我们需要了解一个实际应用的中知识点,按键在按下和释放的时候并不是我们想象的是一个理想的方波脉冲,实际是在电平跳变的时候是有产生抖动的,这些抖动会导致单片机采集按键状态时出现误判的情况。从实际波形我们可以看到在按键实际波形的中间有一段稳定的波形,我们可以采集这段波形进行判断。也就是说在程序处理中,我们检测到按键按下后延时3~5ms再次检测按键是否处于按下状态。按键实际波形和理想波形我们在上次流水灯的程序基础上进行编写,实现触碰P3.2引脚的KEY1流水灯间隔亮灭,触碰P3.3引脚的KEY2流水灯从低位往高位依次点亮。我们先把两个按键引脚定义一下sbit KEY1 P3^2sbit KEY2 P3^3接下来我们写一个按键扫描函数unsigned char KeyScan(void){static unsigned char keynum = 0;if(KEY1 == 0){delay_ms(3);if(KEY1 == 0){keynum = 1;}}else if(KEY2 == 0){delay_ms(3);if(KEY2 == 0){keynum = 2;}}}在这函数的处理中我们判断当KEY1按下时,我们返回1,当KEY2按下时,我们返回2,其他的情况返回0。需要注意的是,因为我们使用的是触碰按键,也就是按下放开之后按键的状态就自动恢复了,但是我们需要单片机保持住按键按下的状态,因此我们需要通过变量去记录按键的状态,所以在按键扫描函数中定义了一个静态局部变量,静态局部变量就是函数退出后,变量的数值还保持,但是变量的作用范围仅在定义的函数内。我们还需要修改一下主函数,需要在主函数中判断按键的状态并且让流水灯做出相应的动作。void main(){for(;;){if(KeyScan() == 1){//闪烁花式LedDisplay(0xAA);delay_ms(500);LedDisplay(0x55);delay_ms(500);}else if(KeyScan() == 2){//移位花式dat = 0x01;for(i=0;i{LedDisplay(~dat);delay_ms(500);dat = dat}}else{LedDisplay(0x00);delay_ms(500);}}}在主函数中判断按键执行的状态,如果KEY1被触碰,则单片机执行流水花式,如果KEY2被触碰,则单片机执行移位花式。把程序下载进去,我们会发现,按键触碰一下有可能出现流水灯花式不会切换的情况,需要长按才行。原因为主程序是循环在执行的,如果当前程序正在执行流水程序,需要等到程序执行完流水程序后才能判断按键状态。目前按键的功能是可以实现了,下一次文章中给大家讲解怎么解决按键检测不灵的问题。
喜欢该文的人也喜欢51单片机简单的按键(按下LED亮,松开LED灭)
#include"reg52.h"typedef unsigned char u8;typedef unsigned int u16;sbit l1=P2^3;sbit k1=P3^2;sbit l2=P2^2;sbit k2=P3^3;void delay(u16 i){ while(i--);}void anjian1(){ if(k1==0)//判断按键是否被按下 {
delay(1000);//消抖
if(k1==0)//消抖之后再次判断是否被按下
l1=~l1;//点亮led灯,led灯默认高电'平
while(!k1);//判断是否断开 }
}void anjian2(){ if(k2==0)//判断按键是否被按下 {
delay(1000);//消抖
if(k2==0)//消抖之后再次判断是否被按下
l2=~l2;//点亮led灯,led灯默认高电'平
while(!k2);//判断是否断开 }
}void main(){
while(1) {
anjian1();
anjian2(); }}
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!单片机8051按键控制LED灯的亮度,软件设计问题
[问题点数:100分,结帖人longdeng001]
单片机8051按键控制LED灯的亮度,软件设计问题
[问题点数:100分,结帖人longdeng001]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|跪求各位大佬。我的程序能用一个独立按键控制一个LED的亮 灭状态吗?【51单片机吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:59,437贴子:
跪求各位大佬。我的程序能用一个收藏
跪求各位大佬。我的程序能用一个独立按键控制一个LED的亮 灭状态吗?
开发宝为广大单片机编程电子工程师提供一个自由的网上交易平台,保障交易双方权益.单片机编程选择什么平台?开发宝-靠谱的电子产品研发众包平台.认准开发宝.
不能,开关有按下弹起,你没有写延迟函数。也就是k1==0时那个看不到效果。
按照你这个思路,我写了一个程序到我的板子上,发现一个问题。当按键按下后灯会亮但是再按一次这个按键灯却不会灭。也就是说按照你这个思路的话一个按键只能控制灯的一种状态。
这个思路不行就换个思路呗,我有一个想法,你可以试一试。定义一个数据记录按键次数,然后当这个数据为奇数时灯为一种状态,当数据为偶数时灯是另一种状态。这样你在按按键的时候灯就会一亮一灭。
死循环跳的出来?。。。。
第一while(1)应该在if语句外面第二应该是K1==0
while语句和if语句反了
LED=~LED就行了啊
作死,你这是眼力题吗?快将while(1)放if的前面。
登录百度帐号

我要回帖

更多关于 单片机的独立按键 的文章

 

随机推荐