其他分享
首页 > 其他分享> > 51单片机学习二 led流水灯与按键控制

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