首页 > 其他分享 >【二】【单片机】有关独立按键的实验

【二】【单片机】有关独立按键的实验

时间:2024-03-16 20:04:58浏览次数:26  
标签:P3 LED LEDNum Delay 单片机 实验 按键 20

自定义延时函数Delay

分别用Delay.c文件存储Delay函数。用Delay.h声明Delay函数。每次将这两个文件复制到工程中,直接使用。


//Delay.c
void Delay(unsigned int xms)                //@11.0592MHz
{
        
        while(xms--){
        unsigned char i, j;

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

}

//Delay.h
void Delay(unsigned int xms);                //@11.0592MHz

独立按键控制LED灯亮灭

GND表示是低电平,P31对应K1按键,P30对应K2按键,P32对应K3按键,P33对应K4按键。

K1按键按下去,表示P31为低电平,也就是P31=0。K1按键被弹起,P31为高电平,也就是P31=1。其他的按键以此类推。


#include <REGX52.H>
void main(){
    while(1){
        if(P3_1==0){
                P2_0=0;
        }else{
                P2_0=1;
        }
    } 
}
<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="5aDvbamt-1710556370953" src="https://live.csdn.net/v/embed/371269"></iframe>

独立按键控制LED亮灭

独立按键控制LED灯状态

独立按键控制LED灯亮灭实验中,每当我们按下K1按键,灯亮起,如果K1被弹起,灯不亮。我们是否可以控制每当按键按下、抬起一整个阶段结束,灯才完成一次变化,亮到灭或者灭到亮?

独立按键控制LED灯的状态,每当我们按下抬起整个阶段完成,灯发生一次变化,亮到灭或者灭到亮。


#include <REGX52.H>
#include "Delay.h"
void main(){
    while(1){
        if(P3_1==0){
            Delay(20);
            while(P3_1==0);
            Delay(20);
            
            P2_0=~P2_0;
        }
    }

}

代码中添加Delay(20)是为了对应按键抖动。

所以我们延时20毫秒,此时按键一定处于稳定的状态。因为前后抖动加起来的时间不超过20毫秒。

所以延时20毫秒后,按键的状态可以是按下或者抬起。此时都是处于稳定的状态。

如果此时按键一直处于按下的状态,也就是P3_1=0,一直让程序空跑,直到按键被抬起,才使灯发生改变。

因为我们要使某个LED灯状态改变,所以只需要对对应二进制数进行取反即可。

<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="5zOrFlN5-1710556395972" src="https://live.csdn.net/v/embed/371268"></iframe>

独立按键控制LED灯状态

独立按键控制LED灯显示二进制

独立按键控制LED灯呈现二进制数显示。我们模拟二进制数的计算过程即可,每次进行++操作。比如说十进制的5,对应的二进制数是101,我需要让显示1的亮,显示0的不亮,所以我们还需要对二进制数进行取反。

检测范围,八个灯,全部亮是1111 1111对应的十进制数是2^8-1=255。而unsigned char的范围就是0~255。因此我们可以用unsigned char 作为二进制数的模拟数据类型。

模拟按键是完成一整个操作,状态发生一次改变。


#include <REGX52.H>
#include "Delay.h"

void main(){
    unsigned char LEDNum=0;
    while(1){

        if(P3_1==0){
            Delay(20);
            while(P3_1==0);
            Delay(20);
            
            LEDNum++;
            P2=~LEDNum;
                
        }
            
    }
        
}
<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="SC0toNat-1710556416657" src="https://live.csdn.net/v/embed/371264"></iframe>

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

独立按键控制LED灯移位

独立按键控制LED灯移位,K1按键控制LED灯左移,K2按键控制LED灯右移。


#include <REGX52.H>
#include "Delay.h"

void main(){
        unsigned char LEDNum=0;
        P2=~0x01;
        while(1){
                if(P3_1==0){
                        Delay(20);
                        while(P3_1==0);
                        Delay(20);
                        
                        if(LEDNum==0){
                                LEDNum=7;
                        }else{
                                LEDNum--;
                        }
                        
                        P2=~(0x01<<LEDNum);
                        
                }
                if(P3_0==0){
                        Delay(20);
                        while(P3_0==0);
                        Delay(20);
                        
                        LEDNum++;
                        if(LEDNum>=8){
                                LEDNum=0;
                        }
                        
                        P2=~(0x01<<LEDNum);
                        
        
                        
                }        
        }
        
        
        
}

这段代码是用来控制一个8位LED灯的亮灭和切换的程序,编写在51单片机上,利用了外部的两个按钮来控制LED灯的左右移动。

#include <REGX52.H>这一行代码是包含一个特定的头文件REGX52.H,这个文件中定义了使用51单片机系列中某个型号(如REGX52)时需要的一些特定功能和寄存器的地址。这是为了方便编程而直接使用单片机中的资源。

#include "Delay.h"这里包含了一个叫Delay.h的头文件,这个文件应该定义了一些延时函数,用于在程序中创建延迟。延迟在这种硬件控制程序中非常常见,用来等待硬件响应或者创建定时任务。

unsigned char LEDNum=0;定义了一个无符号字符变量LEDNum,并初始化为0。这个变量用来记录当前点亮的LED灯的编号(0-7)。

P2=~0x01;这行代码是将P2端口的值设置为~0x01(即11111110),使得第一个LED灯亮起。这里用到了位操作,~是位取反操作符,0x01是二进制的00000001,取反后变为11111110。

while(1){这是一个无限循环,意味着下面的代码会不断重复执行。

if(P3_1==0){这行代码检查P3端口的第二个引脚(P3_1)的状态是否为0(即是否被按下)。

Delay(20);调用Delay函数进行20ms的延时,用于消抖。消抖是因为当按键按下时,会有一个短暂的不稳定期,这时按键的电平可能会不断跳变。

while(P3_1==0);这是一个空的循环体,如果P3_1仍然为0,则一直在这里等待,直到按钮被释放。

Delay(20);再次调用Delay函数进行20ms的延时,进一步确保消抖完成,避免误操作。

if(LEDNum==0){ LEDNum=7; }else{ LEDNum--; }这部分逻辑是用于当P3_1被按下时,如果当前点亮的是第一个LED(LEDNum为0),则将LEDNum设置为7,即跳转到最后一个LED。否则,LEDNum减1,即向左移动一个LED。

P2=~(0x01<<LEDNum);这行代码是将P2端口的值设置为~(0x01<<LEDNum),通过左移操作和取反操作,来控制对应编号的LED灯亮起。

剩余的部分代码是处理另一个按钮(P3_0)的按下事件,逻辑与处理P3_1的按下类似,只是它是用于控制LED灯向右移动。

<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="DyWEhduE-1710556432727" src="https://live.csdn.net/v/embed/371266"></iframe>

独立按键控制LED灯移位

结尾

最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。

同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。

谢谢您的支持,期待与您在下一篇文章中再次相遇!

标签:P3,LED,LEDNum,Delay,单片机,实验,按键,20
From: https://blog.csdn.net/m0_74163972/article/details/136758062

相关文章

  • 实验1 C语言开发环境使用和数据类型,运算符,表达式
    #include<stdio.h>intmain(){printf("O\n");printf("<H>\n");printf("II\n");return0;}#include<stdio.h>intmain(){printf("O\n");printf("<H>\n");print......
  • 瑞熙贝通实验室物联网管理平台新升级|支持远程开门视频监控与电源控制以及环境监测
    瑞熙贝通实验室智能物联网管控平台:利用“互联网+与物联网技术”有机融合,对实验室的用电安全监测、实验室环境异常监测(颗粒物监测、明火监测、可燃气体、烟雾监测、温湿度传感器、红外人体感应)、实验室人员安全准入、万物互联等进行有效感知识别,运用人脸识别、门禁系统、传感器......
  • c语言实验一
    #include<stdio.h>#include<stdlib.h>intmain(){printf("o\to\n");printf("<H>\t<H>\n");printf("II\tII\n");system("pause");return0;}#include&......
  • 基于Java+SpringBoot的开放实验室管理系统子系统毕业设计(源码+论文)
    作者主页:Java程序员老张主要内容:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。收藏点赞不迷路 关注作者有好处文末获取源码技术选型【后端】:Java【框架】:SpringBoot【前端】:vue【JDK版本】:JDK1.8【服......
  • c语言程序设计——实验报告一
    c语言程序设计——实验报告一实验项目名称:实验一熟悉C语言运行环境实验项目类型:验证性实验日期:2023年3月14日一、实验目的下载安装Devc6.0程序。了解在该系统上如何进行编辑、编译、连接和运行一个C程序。通过运行简单的C程序了解C程序的特点。二、实验硬、软件环境W......
  • 南京邮电大学C++实验(一)类和对象的定义及使用(仅参考)
    实验名称:类和对象的定义及使用一、实验目的和要求(1)掌握类与对象的定义与使用方法,理解面向对象方法中通过对象间传递消息的工作机制。(2)正确掌握类的不同属性成员的使用方法。(3)掌握构造函数与析构函数的概念,理解构造函数与析构函数的执行过程。(4)掌握友元函数和友元类的定义......
  • 51单片机学习
    单片机介绍是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而......
  • 实验1
    task1include<stdio.h>intmain(){printf("OO\n");printf("\n");printf("IIII\n");return0;}task2include<stdio.h>intmain(){floata,b,c;scanf("%f%f%f",&a,&b......
  • 实验一 邵铭修 202383310026
    task1}点击查看代码#include<stdio.h>intmain(){ printf("o\n"); printf("<H>\n"); printf("II\n"); printf("o\n"); printf("<H>\n"); printf("II\n"); return0;![](ht......
  • 实验 1 C语言开发实验环境和数据类型、运算符、表达式
     ......