嵌入式51单片机02-独立按键系列
文章目录
独立按键
一. 独立按键基础知识
-
轻触按键:相当于一种电子开关,按下开关接通,松开开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开。
-
按键在闭合和断开时,机械触点会存在抖动现象,所以需要消抖。
-
硬件消抖:
-
软件消抖:
使用延时函数来进行消抖
//按键消抖延时函数 void Delay1ms(unsigned int xms) {unsigned char i, j;while(xms){_nop_();i = 2;j = 199;do{while (--j);} while (--i);xms--;} }//按键消抖具体判断 if(k1 == 0) {Delay1ms(20);while(k1 == 0);Delay1ms(20);//相关操作 }
-
-
开发版原理图
从原理图中可以看出,四个独立按键共地,只需要判断引脚的电平为低电平就可以判断按键是否被按下。
二. 独立按键系列代码
1. 独立按键控制LED(按下灯亮,松开灯灭)
(1)仿真电路图
(2)源代码
#include "reg52.h"
#include "intrins.h"sbit LED1=P2^0;
sbit k1 = P3^1;//延时1ms函数,参数用来改变延时的具体时间
void Delay1ms(unsigned int xms) //@11.0592MHz
{unsigned char i, j;while(xms){_nop_();i = 2;j = 199;do{while (--j);} while (--i);xms--;}
}//主函数
void main()
{while(1){//当按键按下时灯亮if(k1==0){Delay1ms(20);while(k1 == 0);Delay1ms(20);LED1 = 0;}//当按键松开是灯灭elseLED1 = 1;}
}
(3)实验结果
2. 独立按键控制LED(按键切换灯的亮灭)
(1)仿真电路图
(2)源代码
#include "reg52.h"
#include "intrins.h"sbit LED1=P2^0;
sbit k1 = P3^1;void Delay1ms(unsigned int xms) //@11.0592MHz
{unsigned char i, j;while(xms--){_nop_();i = 2;j = 199;do{while (--j);} while (--i);}
}//主函数
void main()
{while(1){//当按键按下时灯灭或亮if(k1 == 0){Delay1ms(20);while(k1 == 0);Delay1ms(20);LED1 = ~LED1;}}
}
(3)实验结果
3. 独立按键控制LED(按键按下,亮1s熄灭)
(1)仿真电路图
(2)源代码
#include<AT89X51.h>void delay(int n)
{int i,j;for (i=n;i>0;i--)for (j=110;j>0;j--);
}void change()
{P2_0=1;if (P3_1==0) //开关{delay(2);if (P3_1==0){while(1){P2_0=0;if (P3_1==0) //开关{delay(2);if (P3_1==0){delay(1000);break;}}}}}
}void main()
{while(1){change();}
}
(3)实验结果
4. 独立按键控制LED(二进制递增运算)
(1)仿真电路图
(2)源代码
#include "reg52.h"
#include "intrins.h"sbit LED1=P2^0;
sbit k1 = P3^1;void Delay1ms(unsigned int xms) //@11.0592MHz
{unsigned char i, j;while(xms){_nop_();i = 2;j = 199;do{while (--j);} while (--i);xms--;}
}//主函数
void main()
{//reverse用作中间变量unsigned char reverse=0x00;//初始化P2口P2 = 0xff;while(1){if(k1 == 0){Delay1ms(20);while(k1 == 0);Delay1ms(20);//移位操作reverse += 0x01;if(reverse >= 0x0f)reverse = 0x00; }P2 = ~reverse;}
}
(3)实验结果
5. 独立按键控制LED(两个按键控制左右移动流水)
(1)仿真电路图
(2)源代码
#include "reg52.h"
#include "intrins.h"sbit LED1 = P2^0;
sbit k1 = P3^1;
sbit k2 = P3^0;unsigned char LEDNum;void Delay1ms(unsigned int xms)
{unsigned char i, j;while(xms--){_nop_();i = 2;j = 199;do{while (--j);} while (--i);}
}void main()
{//初始化P2口P2 = 0xfe;while(1){//按键k1相关操作,控制左移if(k1 == 0){//软件消抖Delay1ms(20);while(k1 == 0);Delay1ms(20);//必须把对数的操作放在P2口之前LEDNum++;if(LEDNum == 8)LEDNum = 0;//实现左移P2 = ~(0x01 << LEDNum); }//按键k2相关操作,控制右移if(k2 == 0){//软件消抖Delay1ms(20);while(k2 == 0);Delay1ms(20); //必须把对数的操作放在P2口之前if(LEDNum == 0)LEDNum = 7;elseLEDNum--;//实现右移P2 = ~(0x01 << LEDNum); }}
}