C51单片机流水灯的实现

目录

一、引言

二、电路原理

原理图​

三、程序设计与实现

1.代码编写

2.实验效果

总结

一、引言

         在电子技术的学习过程中,我们经常会接触到各种有趣的实验项目。其中,C51单片机流水灯设计是一个非常经典且易于实现的项目。本文将介绍如何使用C语言编写程序,控制C51单片机的I/O口来实现流水灯效果。

二、电路原理

LED的阳极串联一个电阻,然后连接电源VCC,而LED的阴极连接到单片机的P2口,当引脚(P2口)输出高电平即正极(5V)时,LED不亮;当引脚输出低电平即负极(0V)时,LED亮。通过高低变换把电压输出到引脚,从而将LED以流水灯的形式表现出来。51单片机使用的是TTL电平,规定高电平为5V,低电平为0V。在写代码时一般用1表示高电平,用0表示低电平。

原理图
LED电路原理图

三、程序设计与实现

C51单片机它拥有多个I/O口,可以通过编程控制这些I/O口的电平状态,从而控制外部设备的开关状态。在流水灯设计中,我们需要控制LED灯按照一定的顺序依次点亮和熄灭,以达到流水灯的效果。循环控制LED灯:在程序的主函数中,我们可以使用一个while循环来控制LED灯的亮灭。通过改变每个LED灯的I/O口的电平状态,我们可以实现流水灯的效果。

1.代码编写

头文件和数据类型的定义

#include <reg52.h> // 包含头文件,定义C51单片机的寄存器
#include <intrins.h> // 包含头文件,定义_nop_()函数

#define uchar unsigned char // 定义数据类型别名
#define uint unsigned int // 定义数据类型别名

 定义led连接到P端口(主要看手上的led端口是连接芯片的P1或者P2端口)

sbit LED1 = P1^0; // 定义LED1连接到 P1.0口
sbit LED2 = P1^1; // 定义LED2连接到 P1.1口
sbit LED3 = P1^2; // 定义LED3连接到 P1.2口
// ... 以此类推,定义其他LED灯

 定义延时函数

void delay(uint z) // 延时函数,z为延时时间
{
    uint x, y;
    for (x = z; x > 0; x--)
        for (y = 110; y > 0; y--);
}

 编写主函数设置led灯的亮灭和延时时间

void main() // 主函数
{
    while (1) // 无限循环
    {
        LED1 = 0; // LED1亮
        delay(1000); // 延时1秒
        LED1 = 1; // LED1灭
        LED2 = 0; // LED2亮
        delay(1000); // 延时1秒
        LED2 = 1; // LED2灭
        LED3 = 0; // LED3亮
        delay(1000); // 延时1秒
        LED3 = 1; // LED3灭
        // ... 以此类推,控制其他LED灯的亮灭
    }
}

 整体代码如下


#include <reg52.h> // 包含头文件,定义C51单片机的寄存器
#include <intrins.h> // 包含头文件,定义_nop_()函数

#define uchar unsigned char // 定义数据类型别名
#define uint unsigned int // 定义数据类型别名

sbit LED1 = P1^0; // 定义LED1连接到P1.0口
sbit LED2 = P1^1; // 定义LED2连接到P1.1口
sbit LED3 = P1^2; // 定义LED3连接到P1.2口
// ... 以此类推,定义其他LED灯

void delay(uint z) // 延时函数,z为延时时间
{
    uint x, y;
    for (x = z; x > 0; x--)
        for (y = 110; y > 0; y--);
}

void main() // 主函数
{
    while (1) // 无限循环
    {
        LED1 = 0; // LED1亮
        delay(1000); // 延时1秒
        LED1 = 1; // LED1灭
        LED2 = 0; // LED2亮
        delay(1000); // 延时1秒
        LED2 = 1; // LED2灭
        LED3 = 0; // LED3亮
        delay(1000); // 延时1秒
        LED3 = 1; // LED3灭
        // ... 以此类推,控制其他LED灯的亮灭
    }
}

2.实验效果

C51单片机流水灯效果

总结

通过以上步骤,我们已经实现了最简单的C51单片机流水灯效果。在实际使用中,我们可以根据需要调整LED灯的数量、延时时间和亮灭顺序,从而创造出更多样的流水灯效果。

  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
下面是基于C51单片机的按键控制流水灯亮灭的代码: ``` #include <reg52.h> sbit LED1 = P1^0; sbit LED2 = P1^1; sbit LED3 = P1^2; sbit LED4 = P1^3; sbit KEY1 = P3^1; sbit KEY2 = P3^0; void delay(unsigned int i) { while(i--); } void main() { unsigned char cnt = 0; while(1) { if(!KEY1) // 检测 KEY1 是否按下 { delay(1000); // 延时消抖 if(!KEY1) // 再次检测 KEY1 是否按下 { cnt++; if(cnt == 5) // 如果计数器超过 4,则清零 { cnt = 0; } } while(!KEY1); // 等待 KEY1 松开 } if(!KEY2) // 检测 KEY2 是否按下 { delay(1000); // 延时消抖 if(!KEY2) // 再次检测 KEY2 是否按下 { cnt--; if(cnt == 255) // 如果计数器小于 0,则设置为最大值 { cnt = 4; } } while(!KEY2); // 等待 KEY2 松开 } switch(cnt) // 根据计数器的值控制流水灯的亮灭 { case 0: LED1 = 1; LED2 = 0; LED3 = 0; LED4 = 0; break; case 1: LED1 = 0; LED2 = 1; LED3 = 0; LED4 = 0; break; case 2: LED1 = 0; LED2 = 0; LED3 = 1; LED4 = 0; break; case 3: LED1 = 0; LED2 = 0; LED3 = 0; LED4 = 1; break; case 4: LED1 = 1; LED2 = 1; LED3 = 1; LED4 = 1; break; default: LED1 = 1; LED2 = 1; LED3 = 1; LED4 = 1; break; } } } ``` 上面的代码中,使用了 P1.0 ~ P1.3 控制四个 LED 的亮灭,使用 P3.0 和 P3.1 作为按键输入。在主循环中,不断检测 KEY1 和 KEY2 是否按下,如果按下了则根据计数器的值进行加减,并控制流水灯的亮灭。需要注意的是,为了避免按键的抖动造成计数器值不准确,需要在检测到按键按下后加入一段延时消抖的代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

22级物联网1班彭世义

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

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

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

打赏作者

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

抵扣说明:

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

余额充值