二、玩51单片机之独立按键篇

1、独立按键控制LED灯的亮灭(效果:按下按键灯亮,松开按键灯熄灭)

在正式编写程序前,我们先来了解独立按键。下图右3为独立按键的引脚连接方式,左边引脚连在一起,并且有两个触点,右边引脚连在一起有一个在中心的触点。当按键按下的时候,金属弹片与触点形成通路,松开按键就与触点分开。

在了解了独立按键的外在物理结构后让我们来看一下他的电路结构。

独立按键的一条引脚都接了GND。

可以看到每个独立按键与单片机的io 口都连接了,独立按键的按键io 口有点特殊,按键K4接的是P33口,K3接的是P32口,K2接的是P30口,K1接的是P31口。这点是需要我们注意的。

单片机上电时,所以io 口都默认为高电频,如果按键没有按下,这个io 口就保证是高电频,如果按下了,这个io 口就为低电频了,单片机上有寄存器,我们写一个值他就会送到io口上。同时寄存器还有另一个作用,他会检测io 口的高低电频,再读取回寄存器中。

在了解完其电路结构后,我们便可编写程序了。

之前我们是对P2寄存器上整个值来进行操作,现在我们只想对寄存器中的一位进行操作,这时就可以引入我们的头文件,即可对其中一位进行操作

前面我们说到寄存器会对io 口进行检测,检测的值会返回到寄存器中,所以,我们对寄存器进行判断是否为0(即知道我们是否按下了)。这样我们第一个独立按键控制LED的亮灭即完成了。

在编写第二个程序前我们先了解编写C51的数据运算以及基本语句

上面的加减乘除与判断部分不多赘述,我们来看除法与取余

其中除法就是取他的商,取余就是取他的余数。

接着我们来看逻辑操作符与位运算,逻辑操作符可看我的初识c语言,接下来我来简单说下位运算。

<<(按位左移)即从最高位左移,最高位移出,最低位补0;

>>(按位右移)即从最高位右移,最低位移出,最高位补0;

&(按位与)二进制位与位相与,都为真才为真(在C语言中,我们以非0为真,0为假);

|(按位或)二进制位与位相或,有真即为真;

^(按位异或)相同为0;不相同为1;

~(按位取反)0变1,1变0;

下面便是一些选择结构和循环结构的语句,想要了解的可以去看我的初识C语言

2、独立按键控制LED灯的状态

在正式编写程序前先补充一些知识,在我们按下按键和松开按键后里面的振片都会抖动,从而导致对硬件的误操作,所以我们在实际操作中需要消除按键抖动。(我们可以通过硬件消抖,也可以用Delay函数进行消抖)

一种好的习惯,边写边测试。比如下面的Delay函数,我们可以写完简单的测试一下程序是否正确。

接下来就编写我们的主程序了,其中用if 语句来判断我们的按键是否按下,因为我们想要达到的效果是松开手后,LED灯才会电亮。所以我们需要用一个循环判断是否松手了,当松手以后,我们进行按位取反就能得到我们想要的效果了。其中的Delay函数是为了消除振片的抖动对我们的影响。

3、独立按键控制LED显示二进制

因为我们是要显示二进制,所以直接对P2寄存器进行操作,这其中也要用到Delay函数,可以直接将上节的粘贴复制。

我来解释下下面的代码,刚开始启动单片机我们的P2口都是高电频,即为1。然后对P2进行++,导致数值溢出,即P2全变为0。接着我们对P2进行按位取反,又全变为高电位。即我们按动按键LED灯也不会有什么反应。

上面已经知道对寄存器直接++,会导致其中的值发生改变,所以我们可以用一个char字符来存储数据,这里面char字符里面的位数与单片机里寄存器的位数相同。且对变量进行取法又不会改变变量本身。这样我们就得到了LED灯显示二进制。

4、独立按键控制LED移位

在独立按键控制LED移位中我们也需要用到Delay函数,如果我们在主函数的下面定义Delay函数,那么在主函数的上面就一定要声明,否则编译器会报错。

我们所想实现的代码是每按一下就加一,然后移动我们想要位数,这里左移操作符,只要我们按一下按键,我们的数值就像左移一位。

这样就能实现我们按k1 就实现LED灯移位,下面的if  判断是必要的,因为最多移动7位,当LEDNum为8时,我们便让他归零。

接下来我们想实现按K2LED灯向另一边移动,在底下加上这样代码就能控制LED灯的另一边移动。这里的if 判断条件也是必要的,当LEDNum为0时,我们如果再对他减减,他就会变为unsigned char 类型 能存放的最大数据。所以当LEDNnum为0时,我们直接将他们的值修改为7。

  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
根据提供的引用内容,可以得知独立按键是一种常见的电子元器件,它通常由四个引脚组成,其中两组间距较短,而另两组间距较长。间距长的两组引脚之间是连在一起的,而短间距引脚之间初始状态是断开的,当按键被按下时,四个引脚被通,可视作一根导线。在51单片机中,我们可以通过定时器来实现对独立按键的检测。 以下是51单片机定时器独立按键的实现步骤: 1. 配置定时器:选择一个合适的定时器,并设置其工作模式和计数器初值,使其能够按照一定的时间间隔产生中断。 2. 配置IO:将独立按键的一个引脚连单片机的一个IO上,并将该IO设置为输入模式。 3. 编写中断服务程序:在定时器中断服务程序中,读取独立按键的状态,如果检测到按键被按下,则执行相应的操作。 4. 启动定时器:启动定时器,使其开始按照设定的时间间隔产生中断。 5. 等待按键事件:在主程序中,等待独立按键的事件发生,如果检测到按键被按下,则执行相应的操作。 以下是51单片机定时器独立按键的代码示例: ```c #include <reg52.h> sbit KEY = P1^0; // 独立按键到P1.0 void Timer0_Init() // 定时器0初始化函数 { TMOD &= 0xF0; // 设置定时器0为模式0 TH0 = 0x3C; // 设置定时器0的计数初值为0x3C TL0 = 0xB0; // 设置定时器0的计数初值为0xB0 ET0 = 1; // 使能定时器0中断 TR0 = 1; // 启动定时器0 } void main() { Timer0_Init(); // 初始化定时器0 while(1) { if(KEY == 0) // 检测独立按键是否被按下 { // 执行相应的操作 } } } void Timer0_ISR() interrupt 1 // 定时器0中断服务程序 { if(KEY == 0) // 检测独立按键是否被按下 { // 执行相应的操作 } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值