51单片机学习二 led流水灯与按键控制
作者:互联网
需求
需要的知识
1.关于延时函数
void Delay100ms() //晶振频率12mhz的100s延时函数
{
unsigned char i, j;
i = 195;
j = 138;
do
{
while (--j);
} while (--i);
}
可以延时上个语句对应时间,使用辅助程序可以生成
2.关于c51语言位运算中的移位
符号 为 “>>”, “<<”
a<<m,a和m必须是整型表达式,要求m>=0,将整型数a按二进制位向左移动m位,高位移出后,将低位补0。
a>>m,a和m必须是整型表达式,要求m>=0。,将整型数a按二进制位向右移动m位,低位移出后,将高位补0
如
a=0x45=01010100B,
b=0x3b=00111011B,
则a<<2=01010000B=0x50,b>>2=00001110B=0x0e。
3.关于按键消除震动
通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械点的弹性作用,按键开关在闭合时不会马上稳定的接通,在断开时也不会一下子断开,因而在闭合和断开的瞬间均伴随着一连串的抖动。抖动时间一般为零点几秒至数秒。
按键抖动会引起按键被误读多次。为了确保 CPU 对按键的一次闭合仅作一次处理,必须进行消抖。
按键消抖有两种方式,一种是硬件消抖,另一种是软件消抖。为了使电路更加简单,通常采用软件消抖。一般来说一个简单的按键消抖就是先读取按键的状态, 如果得到按键按下之后, 延时 10ms, 再次读取按键的状态,如果按键还是按下状态,那么说明按键已经按下。
单片机常用的软件去抖动方法:
1,先设置 IO 口为高电平(由于开发板 IO 都有上拉电阻,所以默认 IO 为高电平)。
2,读取 IO 口电平确认是否有按键按下。
3,如有 IO 电平为低电平后,延时几个毫秒。
4,再读取该 IO 电平,如果任然为低电平,说明对应按键按下。
5,执行相应按键的程序
电路连接
流水灯
按键控制
软件设计
1.流水灯
循环让 D1-D8 指示灯逐个点亮。
根据流水灯实现原理,即 IO 口由低往高或者由高往低逐个输出低电平特点,那么我们可以将移位操作以及循环结合进来。
首先 led=~0x01,因为 LED 是低电平点亮,所以 0X01 取反后的结果是 0XFE,对应二进制数为 1111 1110,即最低位为 0,因此最开始的 D1指示灯会点亮,然后延时一段时间进入while循环,由于要实现8个LED从D1->D8循环点亮,因此可以使用 for 循环语句循环 8 次。
每循环一次,点亮的小灯向右移动一个即 P0 口输出的低电平要左移一位,因此可以使用 P0=~(0x01<<i);语句实现。0X01<<i 表示每次 i 增加 1 次,0x01 中的 1 就移动多少位,因为 1(高电平)不会让 LED 点亮,需要取反后变为低电平 0 才能点亮,所以最后的结果需要取反后给 P0 口,并且每次循环都要延时一段时间。
#include "reg52.h"
#include<intrins.h>
#define led P0
void Delay100ms() //@12.000MHz
{
unsigned char i, j;
i = 195;
j = 138;
do
{
while (--j);
} while (--i);
}
void main ()
{
unsigned char b;
led = ~0x01;
Delay100ms();
while (1)
{
for(b=0;b<8;b++)
{
led = ~(0x01<<b);
Delay100ms();
}
}
}
2.按键控制
定义按键 K1 和 LED1 的控制脚,让 led 设置为电平熄灭 D1 指示灯。然后进入 while 循环,在循环体内执行 keycheck()函数,即判断按键 K1是否按下,如果按下则延时 10ms (delay函数)进行消抖,再次判断按键 K1 是否按下,如果K1 确实按下,则执行 LED 状态翻转控制,最后判断按键是否松开
#include "reg52.h"
#include<intrins.h>
sbit k1=P1^0;
sbit led=P0^0;
typedef unsigned int u16;
typedef unsigned char u8;
void delay() //@12.000MHz 用延时函数消除按键抖动
{
unsigned char i, j;
i = 20;
j = 113;
do
{
while (--j);
} while (--i);
}
void keycheck()
{
if (k1==0)
{
delay(); //抖动消除
if (k1==0)
{
led=~led;
}
while (!k1);
}
}
void main ()
{
led=1;
while (1)
{
keycheck();
}
}
效果
资料参考:百度百科,晋中51单片机开发攻略
标签:led,消抖,51,按下,单片机,while,IO,按键 来源: https://blog.csdn.net/weixin_49334154/article/details/114014848