IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 51单片机-独立按键控制LED -> 正文阅读

[嵌入式]51单片机-独立按键控制LED

1.? ?51单片机独立按键的位置:

独立按键的定义:独立按键相当于一种电子开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开;

在整个51开发板的左下角,有4个独立按键,这一篇文章主要对这4个按键进行理解;

2.使用位寄存器控制LED开关

寄存器内部存在位寄存器? ?Bit Registers? 可单独定义每一位-----P2_0? ?P2_1? 等等;

#include <REGX52.H>
#include <INTRINS.H>

void main()
{
	P2_0=0;//表示第一个灯
	P2_1=1;//表示第二个灯
	P2_2=0;//表示第三个灯
	P2_3=1;//表示第四个灯
	P2_4=0;//表示第五个灯
	P2_5=1;//表示第六个灯
	P2_6=0;//表示第七个灯
	P2_7=0;//表示第八个灯
	while(1)
	{
		
	}
}

其中:

P2_0 = 0xA0;? ? ?P2_1 = 0xA1;? ? ?P2_2 = 0xA2;? ? P2_3 = 0xA3;? ? P2_4 = 0xA4;
P2_5 = 0xA5;? ? ?P2_6 = 0xA6;? ? ?P2_7 = 0xA7;? ?再一次验证了51单片机接收十六进制位;

2.用第一个独立按键去控制LED灯的亮灭:

?原理:首先我们要懂,任何代码的表示方式都基于我们的原理图;也就是说原理图上显示LED灯的引脚接到芯片P3_1上,所以我们的循环语句用到? P3_1? ?,? ?p3_1==0的意思引脚工作状态下,也就是我们按下第一个独立按键的时候,默认不按第一个独立按键的时候,就是if语句的否则状态,也就是else,所有灯都是灭的状态;

#include <REGX52.H>
#include <INTRINS.H>

void main()
{
	
	while(1)
	{
		if(P3_1==0)
		{
			P2_0=0;//表示第一个灯
			P2_1=0;//表示第二个灯
			P2_2=0;//表示第三个灯
			P2_3=0;//表示第四个灯
			P2_4=0;//表示第五个灯
			P2_5=0;//表示第六个灯
			P2_6=0;//表示第七个灯
			P2_7=0;//表示第八个灯
		}
    else
		{
			P2_0=1;//表示第一个灯
			P2_1=1;//表示第二个灯
			P2_2=1;//表示第三个灯
			P2_3=1;//表示第四个灯
			P2_4=1;//表示第五个灯
			P2_5=1;//表示第六个灯
			P2_6=1;//表示第七个灯
			P2_7=1;//表示第八个灯
		}
	}
}

下述代表简单引进第二个独立按键:

?P3_1? 表示第一个独立按键; P3_0? 表示第二个独立按键;按位与&& 的功能是只有当同时按下 独立按键1? 和? 独立按键2 的情况下,8个LED灯才会亮;????????

#include <REGX52.H>
#include <INTRINS.H>

void main()
{
	
	while(1)
	{
		if(P3_1==0&&P3_0==0)
		{
			P2_0=0;//表示第一个灯
			P2_1=0;//表示第二个灯
			P2_2=0;//表示第三个灯
			P2_3=0;//表示第四个灯
			P2_4=0;//表示第五个灯
			P2_5=0;//表示第六个灯
			P2_6=0;//表示第七个灯
			P2_7=0;//表示第八个灯
		}
    else
		{
			P2_0=1;//表示第一个灯
			P2_1=1;//表示第二个灯
			P2_2=1;//表示第三个灯
			P2_3=1;//表示第四个灯
			P2_4=1;//表示第五个灯
			P2_5=1;//表示第六个灯
			P2_6=1;//表示第七个灯
			P2_7=1;//表示第八个灯
		}
	}
}

3.按位左移<<? 和? 按位右移>> 的意思:

0011? 1100<<1? ?->? ? 0111? 1000? ? 按位左移1个字符表示高位移出一个字符,低位补0;

0011? 1100>>1? ?->? ? 0001? 1110? ? 按位右移1个字符表示低位移出一个字符,高位补0;

4.? 按键的抖动:

对于机械开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个开关在闭合时不会马上稳点的接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动。

5. 独立按键实现按一下亮、按一下灭:? ?

?P3_1==0? 表示按下按键 执行亮灯操作;两个延迟Delay表示按下和松开时的抖动;

特别注意:取反~? ? -------? 表示1? 0 两种状态相互交替? 即按下亮 再按一下灭;

#include <REGX52.H>
#include <INTRINS.H>
void Delay(unsigned int xms)
{
	unsigned char i,j;
	while(xms)
	{
		i=2;
		j=239;
		do
		{
			while(--j);
		}
		while(--i);
		xms--;
	}
}
void main()
{
	while(1)
	{
		if(P3_1==0)
		{
			Delay(20);//按下按键以后的抖动延迟
		  while(P3_1==0);
			Delay(20);//松开按键以后的抖动延迟
			P2_0=~P2_0;//取反的意思是1号LED亮灭亮灭;
		}//1  0  进行循环;
	}
}

? ? while(P3_1==0)表示判断独立按键的状态,只要按键,我的while语句为空,所以只要判断在按键的状态-----我的灯就没有反映(灯亮就一直亮,知道松开按键;灯灭就一直灭,知道松开按键),只要判断状态为松开按键,我就进行取反操作,灯一亮一灭;

? ? while(P3_1==0)? 如果我按键后没有任何操作,判断一直在按键状态,我让他进行空循环;

延迟函数Delay 延迟的时间为 我按键以后灯的反应时间,也就是我按下按键? 假设Delay=1000,我需要等1秒,灯才会有反应;

5.独立按键控制LED显示二进制:

P2_ 表示8位;? P3_? 表示1位;

?思路:上面是延迟函数;下面定义一个新函数unsigned char LED_L=0;

8位也就是:0000 0000 每次LED_L++; 二进制加法; 逢二进一;进行运算;

0000 0001;0000 0010;0000 0011;0000? 0100;

取反:1111 1110;1111 1101;1111 1100;1111 1011;低电平亮灯???;注意定义新函数初始化0的这种思路;

#include <REGX52.H>
#include <INTRINS.H>
void Delay(unsigned int xms)
{
	unsigned char i,j;
	while(xms)
	{
		i=2;
		j=239;
		do
		{
			while(--j);
		}
		while(--i);
		xms--;
	}
}
void main()
{
	unsigned char LED_L=0;
	while(1)
	{
		if(P3_1==0)
		{
			Delay(20);//按下按键以后的抖动延迟
		  while(P3_1==0);
			Delay(20);//松开按键以后的抖动延迟
			LED_L++;
			P2=~LED_L;
		}
	}
}

6.独立按键控制LED移位:(简单来说就是按下按键流水一次,就是灯往后亮一次)

?思路:上面是延迟函数;下面一样,只要我按键,我就执行语句,定义函数初始值0;++每次加1,只要超过8,我就初始化,8个灯进行循环,在十六进制0X01也就是1的基础上进行移位操作,每次向左移位LED_L个位? , 取反,保证低电平输出;

#include <REGX52.H>
#include <INTRINS.H>
void Delay(unsigned int xms)
{
	unsigned char i,j;
	while(xms)
	{
		i=2;
		j=239;
		do
		{
			while(--j);
		}
		while(--i);
		xms--;
	}
}
void main()
{
	unsigned char LED_L=0;
	while(1)
	{
		if(P3_1==0)
		{
			Delay(20);//按下按键以后的抖动延迟
		  while(P3_1==0);
			Delay(20);//松开按键以后的抖动延迟
			LED_L++;
			if(LED_L>=8)
				LED_L=0;//保证8个灯开始循环
			P2=~(0X01<<LED_L);
		}
	}
}

实现按下独立按键1,从左向右按位亮灯;按下独立按键2,从右向左按位亮灯;

#include <REGX52.H>
#include <INTRINS.H>

void Delay(unsigned int xms)
{
	unsigned char i,j;
	while(xms)
	{
		i=2;
		j=239;
		do
		{
			while(--j);
		}
		while(--i);
	}
	
}
void main()
{
	while(1)
	{//实现从左向右按位亮灯
		if(P3_1==0)
	{
		unsigned char LED=0;
		Delay(20);
		while(P3_1==0);
		Delay(20);
		LED++;
		if(LED>=8)
			LED=0;
		P2=~(0X01<<LED);
	}
	  if(P3_0==0)
	{//实现从右向左按位亮灯
		unsigned char LED=0;
		Delay(20);
		while(P3_0==0);
		Delay(20);
		if(LED==0)
			LED=7;
		else
			LED--;
		P2=~(0X01<<LED);
	}
	}
}

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-10-31 12:14:20  更:2022-10-31 12:18:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 12:21:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码