玩转51单片机(STC89C52RC):第三章 独立按键控制LED的四大魔法“

目录

独立按键       

        相关概念

        独立按键的连接方式

预备知识

        sfr和sbit

        C51数据运算

        C51基本语句

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

        代码

思路:

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

        按键的抖动:

代码

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

代码

3-4 独立按键控制LED移位

代码


独立按键       

         看到这一章的时候,我们不经思考,什么是独立按键呢?

        相关概念

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

它的样子是这样的

        独立按键的连接方式

        内部是这样连接的

         在STC89C51的单片机中,和主要芯片的连接是这样的

        (其中GND为负极,所有的IO口都默认为高电平

         对应到芯片位置就是左侧的P3.0到P3.3

         所以单片机上独立按键的连接方式就如下图所示

        其中TXD寄存器,它会检测io口的电平

        按键如果按下,寄存器的值为0反之寄存器的值为1


预备知识

        sfr和sbit

         将头文件打开,会看到

 

         sfr是定义八位寄存器的,在这里面操作的P2是八位一体的(同时控制八位的电平)

         sbit位寄存器(如P2_0就只是控制P2的一号口)

        重要:在操作位的时候,就是非0即1、

        C51数据运算

        数据运算的时候需要用到下列的运算符(用法和之前学到的c语言相同):

举例:

        按位右移(>>): 0011 1100>>1(表示“按位右移”1位)  ->0001 1110

        按位左移(<<):0011 1100<<1(表示“按位左移”1位)  ->0111 1000

        按位与(&):0001 1000 & 0010 1010  (同一位上只有都为1时,输出的才是1,其余都是0(有且的意思))-> 0000 1000

        按位或(|):0001 1000 | 0010 1010(同一位上只要有1,输出的就是1,其余都是0(有或者的意思))  -> 0011 1010

        按位异或(^):0001 1000 ^ 0010 1010(异或:同一位上两个相同为0,不同为1)  -> 0011 0010

        按位取反(~):~0001 1000(这个符号只用在一串数字上)(每一位上都取相反的)  -> 1110 0111

        C51基本语句


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

        代码

#include <REGX52.H>

void main(){
	while(1){
	if(P3_1==0){//因为K1按键连接的是P31的口,所以需要写P3_1的位,按键按下为0松开为1
		//k1对应P3_1,k2对应P3_0,k3对应P3_2,k4对应P3_3
		P2_0=0;//点亮第一个LED灯,位计算器的时候
		}
	else{
		P2_0=1;
	}

	}

}

思路:

        1、k1口是由P31控制的,k1按下为0

        2、利用if语句对其进行判断

        3、在if语句下控制灯的亮灭即可

        4、然后输入到单片机上实现即可


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

        按键的抖动:

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

解决的办法有两种:

        1、是利用物理的方法,在上面接上一根线(这个比较复杂,先讲一下2怎么写的)

        2、利用软件的方法,当发生抖动的时候,就延时10毫秒

实现方法2的话:

        首先要建立工程,如果不会的话可以参考下面这篇文章

51单片机(STC89C52RC)软件使用方法(Keil4):详解全面,让你事半功倍!_LYPHARD MELODY。的博客-CSDN博客先建立一个新项目点击Project,之后点击蓝色的区域在电脑中找个地方,建立(建议建立文件夹放在一起)在里面找到(这样你就建立出了新的项目)找到这个魔法棒,并点击进去在这个里面,点击Include Paths后面的三个点点开之后双击空白处在Keil4中的软件包中,找到所需要的(为了以防万一我选择都添加进来),之后点击选择第一个Keil Monitor-51 Driver之后点击OK点击左上角的空白纸,或者File进行新建文件之后点击保存将其保存为。https://blog.csdn.net/m0_75096759/article/details/131862245

        然后在STC-ISP(软件延时计算器)里生成一个相关的代码(注意:系统频率要和单片机的规定频率相同,8051指令集也同理)

        在延时代码中加入一个参数unsigned int类型的函数(范围为0~65535)方便控制任意时刻的时间。

        然后需要测试一下这个调用函数以防出错

        之后就可以书写代码了

代码

#include <REGX52.H>

void Delay(unsigned int xms)		//利用STC-ISP生成的1毫秒的延时代码,添加一个函数,就可以实现,随意定义时间
{
	while(xms){	//利用while函数和xms--;语句实现对时间的控制
	unsigned char data i, j;

	i = 2;
	j = 239;
	do
	{
		while (--j);
	} while (--i);
	xms--;
	}
}

void main(){
	while(1){ //利用while函数实现循环
	if(P3_1==0){ //利用if语句,判断按键k1是否被按下
		Delay(20); //延时20毫秒
		while(P3_1==0);//如果按键一直被按着,就用while语句一直循环
		Delay(20); //延时20毫秒
		P2_0=~P2_0;	  //利用取反,使得执行相反的操作(对于P2整体不能操作,试过了,需要对位进行操作)
	}
	}
}

        然后输入到单片机上实现即可;


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

        代码

#include <REGX52.H>			   
 void Delay(unsigned int xms)//用于控制秒数,括号中输入多少秒就是U多少秒
{	while(xms--){
	unsigned char data i, j;

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

void main(){
	int n=0; //定义一个新函数,并将其赋值为0
	//这里的赋值,是n充当一个瓶子,防止P2在加的时候使得自身发生变化,而陷入死循环
	   while(1){
	   		if(P3_1==0){   //利用if语句判断k1按键是否被按下
				Delay(20);	//延时20毫秒
				while(P3_1==0);	 //为了防止K1按下20毫秒还在按着,就保持循环
				Delay(20);
				n++;   //利用++操作实现二进制
				P2=~n;	//因为0为亮,1为灭,所以需要对其取反
			}
	   	
	   }

}

        然后输入到单片机上实现即可;


3-4 独立按键控制LED移位

        代码

#include <REGX52.H>			   
void Delay(unsigned int xms);//函数的声明
void main(){
	int n; //定义一个新函数,并将其赋值为0
	//这里的赋值,是n充当一个瓶子,防止P2在加的时候使得自身发生变化,而陷入死循环
	  P2=0xfe;
	   while(1){
	   		if(P3_1==0){   //利用if语句判断k1按键是否被按下
				Delay(20);	//延时20毫秒
				while(P3_1==0);	 //为了防止K1按下20毫秒还在按着,就保持循环
				Delay(20);

				n++;   //利用++操作实现对位平移个数的控制
				if(n>=8){ //如果平移个数大于8,就要回到灯
					n=0;
				}
				P2=~(0x01<<n);//因为0为亮,所以需要取反
			}
	   		if(P3_0==0){ //下面的操作与上面相同  
				Delay(20);	
				while(P3_0==0);	 
				Delay(20);

							   
				if(n==0){
					n=7;
				}
				else{
					n--;
				}
				P2=~(0x01<<n);
			}
	   }

}

void Delay(unsigned int xms)//用于控制秒数,括号中输入多少秒就是U多少秒
{	while(xms--){
	unsigned char data i, j;

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

        然后输入到单片机上实现即可;

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LYPHARD MELODY。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值