8051单片机-成为点灯大师

第三章 成为点灯大师

1. 硬件设计

复制代码
上一章说到,怎么点亮LED灯,很简单啊,就是把P2口设置成低电平就行了。接下来让我们更进一步,完成LED闪烁、流水灯实验

2. 软件设计

2.1 LED闪烁实验

复制代码
为了使LED闪烁,我们自然而然的想到要使用延时函数,那么就来写一个吧
c 复制代码
void delay_us(unsigned int set_us) // 定义函数,函数名:delay_us.参数:set_us
{
    while(set_us) // 直到参数0循环停止 
}
复制代码
下面看整体代码:
c 复制代码
#include <REGX52.H>

sbit LED1 = P2^0;    //将P2.0管脚定义为LED1

void delay_us(unsigned int set_us)
{
    while(set_us--);    
}

void main()
{    
    while(1)
    {
        LED1 = 0; // 低电平点亮
        delay_us(50000); //大约延时450ms

        LED1 = 1; // 熄灭
        delay_us(50000);     
    }        
}

2.2 流水灯实验

复制代码
所谓流水灯,就是让几个灯逐个点亮、熄灭,这个时候就需要用到for循环和移位操作符,即IO口按顺序输出低电平,如何实现,先看主程序:
c 复制代码
void main()
{
    unsigned char i;

    while(1)
    {
        for(i = 0; i < 8 ;i++)
        {
            P2 = ~(0x01 << i); // 0000 0001
            delay_us(50000);
        }
    }
}
复制代码
那么主函数是怎么完成流水现象的呢?for循环不必解释,循环八次代表八个灯。主要在于P2 = ~(0x01 << i);怎么理解:
  1. 0x01 是一个8位的二进制数,其形式是 00000001。左移操作 << 将这个数按位向左移动,移动的位数由循环变量 i 决定。

  2. 在循环中,i 的值从 0 递增到 7。因此,左移操作 0x01 << i 将会得到不同位被置位的结果。例如,当 i 为 0 时,结果是 00000001,当 i 为 1 时,结果是 00000010,以此类推。

  3. ~ 运算符是按位取反操作符,它将每个位上的值取反。因此,~(0x01 << i) 将会生成一个具有与左移操作相反的位值的二进制数。

  4. 最后,P2 = ~(0x01 << i); 将取反后的值写入到 P2 寄存器中,控制对应的 LED 灯的亮灭状态。

    除了我们自己写函数外,其实KEIL有可以使用的库函数,下面我们用库函数再写一遍:

c 复制代码
#include "reg52.h"
#include "intrins.h" // 移位操作需要包含的头文件

void main()
{
    unsigned char i;
    P2 = 0xFE; // 1111 1110 代表先点亮第一个灯,其他全灭
    delay_10us(50000);
    while(1)
    {
        for(i = 0; i < 8 ;i++) //将 led 左移一位
        {
            P2 = _crol_(P2, 1); // _crol_移位函数,参数(串口,要移动的位数)
            delay_us(50000);
        }

        /*for(i = 0; i < 7 ;i++) //将 led 右移一位
        {
            P2 = _cror_(P2, 1);
            delay_us(50000);
        }
        */
    }
}
复制代码
那么,我们就完成成了两个代码的基本编写。注意:以上代码均为片段,还需自己补充延时函数及其他省略的

3.小结

复制代码
在这一章,我们主要是学会了通过延时函数来使LED闪烁,再通过for循环或者库函数实现流水灯

这里再具体讲解一下流水灯到底是怎么实现的

c 复制代码
//初始状态: 
LED_PORT=1111 1110
    i=0: LED_PORT=1111 1101
    i=1: LED_PORT=1111 1011
    i=2: LED_PORT=1111 0111
    i=3: LED_PORT=1110 1111
    i=4: LED_PORT=1101 1111
    i=5: LED_PORT=1011 1111
    i=6: LED_PORT=0111 1111
    i=7: LED_PORT=1111 1110
复制代码
我们初始就给了P2一个值P2=0xFE(十六进制)转换成二进制-1111 1110(即最低为0,即第一个灯为低电位-也就点亮)

后面我们再不断移位,D2->D3->....如此便完成的流水灯,还是很好理解的

文中工程代码下载:https://github.com/hazy1k/STC51-Quick-Start-Guide/tree/master/STC89C51系列/2.code

相关推荐
准测仪器2 小时前
6项提高电机制造质量的电气测试方案
单片机·嵌入式硬件·制造·电机·电气·放电测试·局部放电测试
ACP广源盛139246256733 小时前
(ACP广源盛)GSV6172---MIPI/LVDS 信号转换为 Type-C/DisplayPort 1.4/HDMI 2.0 并集成嵌入式 MCU
c语言·开发语言·单片机·嵌入式硬件·音视频
hazy1k3 小时前
51单片机基础-IO扩展(并转串 74HC165)
stm32·单片机·嵌入式硬件·fpga开发·51单片机·1024程序员节
Tony小周3 小时前
使用QKeyEvent keyPress(QEvent::KeyPress, key模拟键盘发送事件,会导致主程序卡死
嵌入式硬件·qt
workflower4 小时前
FDD(Feature Driven Development)特征驱动开发
大数据·数据库·驱动开发·需求分析·个人开发
普中科技6 小时前
【普中STM32F1xx开发攻略--标准库版】-- 第 13 章 STM32 位带操作
stm32·单片机·嵌入式硬件·arm·gpio·普中科技·位带操作
迅为电子7 小时前
嵌入式Linux新手入门:北京迅为3568开发板驱动开发第二章helloworld 驱动实验
linux·运维·驱动开发
河南博为智能科技有限公司7 小时前
RS485转以太网串口服务器-串口设备联网的理想选择
大数据·服务器·人工智能·单片机·嵌入式硬件·物联网
国科安芯8 小时前
抗辐照MCU芯片在无人叉车领域的性能评估与选型建议
网络·人工智能·单片机·嵌入式硬件·安全
国科安芯9 小时前
抗辐照MCU芯片在激光雷达领域的适配性分析
网络·人工智能·单片机·嵌入式硬件·fpga开发