C51_LED流水灯

LED灯的工作原理

当P2.4引脚为低电平时,LED1两侧产生电压差,LED1点亮,反之,为高电平时,灯熄灭

I/O引脚部分寄存器

  • 每一组I/O引脚都有一组特殊功能的寄存器控制,这些寄存器复位后的初始值均为0xFF
  • 对于可进行位寻址的寄存器,其字节地址加上位序号即可得到位地址

I/O引脚控制的方法

由于P2寄存器支持位寻址,所以既可以进行位操作,也可以进行字节操作

  • 字节操作
    • 字节操作是指对整个寄存器进行赋值
    • 在进行字节操作前,必须使用sfr关键字定义特殊功能的寄存器,如sfr P2 = 0xA0; // 定义P2的地址为0xA0
    • 对P2进行字节操作的代码如`P2 = 0xAF; // 点亮LED1和LED3
  • 位操作
    • 位操作是指对可进行位寻址的寄存器中的某一位进行赋值
    • 在进行位操作前,必须使用sbit关键字定义特殊功能寄存器的可寻位地址sbit LED1 = 0xA4 // 位定义LED1,但在实际过程中,直接使用为地址进行位定义会稍显复杂,所以在实际过程中,通常使用"^"符号找到P2寄存器的位地址一般用sbit LED1 = P2 ^ 4 // 位定义LED1
    • 位定义后,即可使用LED1改变P2特殊功能寄存器的值,LED1 = 0; // 点亮LED1

实例与代码解析

  1. 包含头文件#include <reg52.h>
  2. 位定义LED
sbit LED1 = P2 ^ 4; // 定义LED1
sbit LED2 = P2 ^ 5;
sbit LED3 = P2 ^ 6;
sbit LED4 = P2 ^ 7;
  1. 编写延时函数
static void DelayNms(int nms); // 内部延时函数声明
static void DelayNms(int nms) // 内部函数实现
{
    unsigned int i, j;
    
    for (i = 0; i < nms; i++)
    {
        for (j = 0; j < 123; j++)
        {
            
        }
    }
}
  1. 编写主函数
void main()
{
    while (1)
    {
        LED1 = 0; // 打开LED1
        DelayNms(500); // 延时500ms
        LED1 = 1; // 关闭LED1
        
        LED2 = 0; // 打开LED2
        DelayNms(500); // 延时500ms
        LED2 = 1; // 关闭LED2
        
        LED3 = 0; // 打开LED3
        DelayNms(500); // 延时500ms
        LED3 = 1; // 关闭LED3
        
        LED4 = 0; // 打开LED4
        DelayNms(500); // 延时500ms
        LED4 = 1; // 关闭LED4
    }
}
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值