ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

51单片机 第三节 独立按键

2020-11-29 12:34:09  阅读:434  来源: 互联网

标签:Delayms P1 20 第三节 按键 51 单片机 while 寄存器


本笔记默认学习者已拥有:
1.Keil5和stc烧写工具 等各种软件、驱动、环境;
2.有一个属于自己的 51单片机开发板及相关零件 ;
3.认识C语言的语法;
本人使用的51开发板为 郭天祥C51 TX-1C增强版开发板
本笔记根据B站up主:江科大自化协的教学视频 整理得到ヾ(•ω•)


3-1 独立按键控制LED亮灭

原理分析

1

2

上图为TX-1C的 独立按键及矩阵按键 原理图 ,注意到寄存器位置与视频所有不同

3

4

1.GND为接地线,可以视为电源的负极;

2.独立按键一头 接地 ,另一头接到了 IO口上,单片机通电时,所有IO口默认都是高电平

3.所以当没有按下 独立按键时,IO口为高电平,按下 独立按键时,IO口为低电平;

上一节,我们介绍了寄存器,介绍了寄存器可以赋值给IO口

4.寄存器可以检测IO口的电平,读回到寄存器中
如果 按键 松开,直接读取寄存器,它应该为 1(高电平的状态);如果按下 按键,那它的值应该为 0(低电平状态);
通过此现象,可以检测按键是否被按下;

\[\begin{cases} 未按按键 \to 电路断开 \to 寄存器值为1(高电平状态) \\ 按下按键 \to 电路连接\to 寄存器值为0(低电平状态)\end{cases} \]


实践代码

上一节 学习了 直接给整个P2寄存器赋值,来达到让LED亮灭的效果,但如果只控制独立的单个位,而不影响其他位呢?

sfr

1.打开头文件 #include<reg51.h> ,其中sfr是用来定义 整个8位寄存器

2.其中 sbit 是用来定义 位寄存器 的,操作这些变量,就可以单独操作每一位

独立按键控制LED亮灭.c

#include<reg51.h>
sbit led1=P1^0;
//sfr P1=0x90; 但#include<reg51.h>中并未定义其 位寄存器
//这里选择 自主定义
void main(){
	while(1){
		//根据#include<reg51.h>的定义,s2按键对应的端口为P3^4,即为 T0
		if(T0==0) led1=0;
		else led1=1;
	}
}

运行结果如下:

IMG_4229


3-2 独立按键控制LED状态

5

消抖的两种方法
(1)硬件消抖:增加电路,通过电路中的触发器等 电路操作,将抖动进行过滤,此方法比较麻烦,且需要硬件支持;
(2)软件消抖:检测按键是否按下时,前后各延时20ms,抖动时间就过去了;

如下是完整的 检测按键是否按下 的代码

if(T0==0){
	Delayms(20);
	while(T0==0);//检测松手,只要不松手,就一直保持循环 
	Delayms(20);
	//do sth.
}

独立开关控制LED状态.c

#include<reg51.h>
#define uint unsigned int
sbit led1=P1^0;
void Delayms(uint x)		//@11.0592MHz
{
	unsigned char i, j;

		while(x--){
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
}

void main(){
	while(1){
		Delayms(20);
		if(T0==0){
			Delayms(20);
			while(T0==0);
			Delayms(20);
			led1=~led1;
		}
		Delayms(20);
	}
}

运行结果如下:

IMG_4231


3-3 独立按键控制LED显示二进制.c

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int 
void Delayms(uint x)		//@11.0592MHz
{
	unsigned char i, j;

		while(x--){
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
}

void main(){
	uchar LEDnum=0; 
	//uchar 刚好表示 0~255,符合 8位寄存器的大小 
	while(1)
		if(T0==0){
			Delayms(20);
			while(T0==0);
			Delayms(20);
			//P1口上电默认给高电平,即P1= 1111 1111
			//直接让P1 +1 ,则P1=0000 0000 
			//不符合预期,故使用 变量 LEDnum 来表示 寄存器
			++LEDnum;
			P1=LEDnum; 
		}
}

运行结果如下:

IMG_4232


相关知识

reset

此为 复位按键,按下 复位按键,相当于 电源重新打开,单片机程序会从头开始

标签:Delayms,P1,20,第三节,按键,51,单片机,while,寄存器
来源: https://www.cnblogs.com/Potrem/p/51_3.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有