×

51单片机笔记 51单片机学习纪实

51单片机纪实:5.3-使用独立按键控制8个LED依次点亮与熄灭_【增强实验2】

一哥 一哥 发表于2022-01-02 20:33:59 浏览1251 评论0

抢沙发发表评论

实验要求:

使用独立按键控制8个LED从LED1-LED8依次全部点亮,然后从LED8-LED1依次全部熄灭。


实验思路:

1、LED灯D1-D8控制管脚接P2.0-P2.7管脚,并宏定义P2端口为为:LED_PORT。

2、独立按键K1控制管脚接P0.7管脚,并定义为KEY1;重定义系统数据类型。

3、定义一个数组变量led_code,用于存放LED点亮的控制码表。

4、定义一个延时函数delay_10us。

5、主程序内定义一个静态变量x,用于独立按键控制LED点亮。


完整代码:

/**************************** 程序信息 ********************************
* 实验名称:使用独立按键控制8个LED依次点亮与熄灭
* 文件名称:main.c
* 版    本:V1.00
* 日    期:2022-01-02
* 编    著:gefon
* 说    明:使用普中A7开发版,使用K1按键控制D1-D8编号LED灯依次全部点亮,
            然后从D8-D1依次全部熄灭。

****************************** 声明区 ********************************/
#include <reg52.h>

#define LED_PORT    P2  //宏定义LED控制端口

sbit KEY1=P0^7;  //定义独立按键K1控制管脚

//重定义系统数据类型
typedef unsigned char U8;
typedef unsigned int U16;

//LED控制码表
U8 led_code[16]={0x7F,  //点亮D1灯
                 0x3F,  //点亮D1-D2灯
                 0x1F,  //点亮D1-D3灯
                 0x0F,  //点亮D1-D4灯
                 0x07,  //点亮D1-D5灯
                 0x03,  //点亮D1-D6灯
                 0x01,  //点亮D1-D7灯
                 0x00,  //点亮D1-D8灯
                 0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF,
                };

/****************************** 子程序 ********************************
* 函 数 名   :delay_10us
* 函数功能   :延时函数,当传入变量ten_us=1时,约延时10us
* 输    入   :ten_us
* 输    出   :无
***********************************************************************/
void delay_10us(U16 ten_us)
{
    while(ten_us--);
}

/****************************** 主程序 ********************************
* 函 数 名   :main
* 函数功能   :主函数       
* 输    入   :无
* 输    出   :无
***********************************************************************/
void main()
{
    static U8 x=0;
    while(1)
    {
        if(KEY1==0)
        {
            delay_10us(1000);  //按键消抖
/***************************** 实现方案1 *****************************/
            if(KEY1==0)
            {
                LED_PORT=led_code[x];
                delay_10us(20000); //延时约200ms,以防止按下过程中再次进行判断
                x++;
            }
/***************************** 实现方案1 *****************************/


/***************************** 实现方案2 *****************************/
//            while(KEY1==0);
//            delay_10us(1000);
//            LED_PORT=led_code[x];
//            x++;
/***************************** 实现方案2 *****************************/

        }
        if(x==16)
            x=0;  //当静态变量x==16时,初始化x赋值。
    }
}


实验分析:

如何让LED的显示调用LED控制码表led_code?这里我们定义了一个静态变量,并给它赋初值x=0,用于调用LED控制码表。按键每次按下判定完,执行LED点亮后,对x的值+1。这样按键每次按下后,X值会增加一位。当x=16时,再次对x赋值初始化为x=0,即可不断的循环点亮和熄灭LED。因为按键按下到松开有一个时间,如果在按键未松开时,程序执行完成。会进行再一次的判断,点亮其它的灯。为了使每次按键按下到松开,只点亮一颗LED灯,在LED点亮执行后,增加了一个200ms的延时,以防止点亮多颗LED。

上面完整代码可以看到,实现LED点亮有两种方案:

方案1:使用if语句进行判断,这种方案当按键按下不放开时,会不断的执行。就像按下电视遥控的音量键一样,不断的增加。在这个实验内就会是按键不断的按顺序点亮后熄灭。

方案2:使用while循环,while循环的判定条件是KEY1==0,即只要K1按键是按下的,都会不断在while循环内执行,只有当按键松开时,才会执行点亮LED。因为按键松开时,会有波形抖动,在执行点亮LED前,增加一个10ms的延时进行按键消抖。方案2相对方案1的区另在于,方案2需要松开按键才会执行点亮LED,因此按键不松开状态下,LED点亮的语句是不会执行。所以做不到按键不松开的不断按顺序点亮后熄灭。但此方法不用担心按键按下到松开的时间内,造成多颗LED点亮的问题。

少长咸集

群贤毕至

访客