0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于单片机的流水灯电路设计

CHANBAEK 来源:郎哥编程课堂 作者:郎宏林 2023-10-31 14:56 次阅读

前面一课掌握了嵌入式程序源代码级调试,为复杂单片机实验程序的调试做好了准备工作。本次实验完成流水灯电路模型设计和编程,在实验过程中,学习流水灯电路设计、编写延迟函数、循环移位宏定义。

流水灯电路设计

本次实验设计要求通过单片机P0口实现流水灯控制电路,P0口8个端口外接8个LED,每个LED串联一个200欧姆的限流电阻,8个限流电阻的公共端接5V直流电源。电路设计如下图所示:

图片

8个LED正极端通过串联电阻接5V直流电源,负极端接P0端口,只要给P0端口一个低电平,就可以点亮LED,若需要熄灭LED,需要给P0端口一个高电平,要实现LED流水灯功能,只要将8个LED依次点亮、熄灭即可。

编写时间延迟函数

流水灯电路要求LED依次点亮,每个LED要持续亮一段时间后熄灭。用程序来控制LED的点亮和熄灭,只需要将与LED连接的端口写入低电平或高电平即可,代码如下:

#include
void main()
{
       P0 = 0xFF;
    P0 = 0xFD;
}

上述代码第1条语句将P0第0位写入低电平,与第0位连接的lED被点亮,第2条语句将第0位写入高电平,与第0位连接的lED熄灭。两条语句连续执行,每条语句的执行时间非常短,也就十几微秒,LED点亮后很快被熄灭,人们通过眼睛感觉不到LED被点亮。因此需要在第1条语句和第2条语句之间进行时间延迟,延迟一段时间后再执行第2条语句。

如何用软件来模拟延时时间呢?在设计的电路模型中,51单片机时钟频率是12MHZ,一个时钟周期约0.08微秒,一个机器周期由12个时钟周期构成,一个机器周期约1微秒,51单片机执行一个指令的时间是机器周期的倍数,若使用for循环语句来实现时间延迟,一条基本的for循环语句执行时间大约为8微秒,若延迟500毫秒,大约需要执行500*120次循环。

// 时间延迟函数
void delay(unsigned int millisecond)
{
       unsigned int i,j;
       for(i=millisecond;i >0;i--)
              for(j=120;j >0;j--);
}

delay()函数延迟millisecond毫秒,函数使用for嵌套循环,外层for循环用于控制延迟的毫秒数,内层for循环用于控制1毫秒执行的语句次数。

循环移位

流水灯需要在每个时间间隔内只有一个LED点亮,其余LED均为熄灭状态,流水灯可以通过循环左移实现。循环左移是将操作数的二进制位按1位进行循环左移,移出的位并不会丢失,而是被后续移动的位填充。

图片

P0默认值为0xFE,P0第0位的LED被点亮,其它位熄灭;延迟一段时间后,P0循环左移1位,其值为0xFD,P0第1位LED被点亮,其它位熄灭;延迟一段时间后,P0循环左移1位,其值为0xFB,P0第2位LED被点亮,其它位熄灭;以此类推,P0不断循环左移1位,从而实现了流水灯控制。

C语言并没有提供循环左移或循环右移的运算功能,需要开发者自己编程实现。

图片

循环左移位的具体算法如上图所示:value为操作数,其值为0xFE,先将value左移1位,赋值给变量a,其值为0xFC,然后将value右移7位,赋值给变量b,其值为0X1,最后计算a|b,计算结果为value循环左移1位,并将计算结果赋值为value。

流水灯算法实现代码如下:

void main()
{
    unsigned char value=0xfe,a,b;
       unsigned char count = 0;
       while(1)
       {
             
              P0 = value;
              delay(5000);
              a = value < < 1;
              b = value > > 7;
              value = a | b;
              count += 1;
              if( count >= 8 )
              {
                     value = 0xfe;
                     count = 0;
              }
       }
      
}

算法通过while循环实现流水灯控制,在循环内部,变量value赋值给P0,点亮第0位的LED,其它位的LED为熄灭状态,然后调用delay()函数延迟5000毫秒,value循环左移1位,在下轮循环中,点亮第1位的LED,其它位的LED为熄灭状态,以此类推……。

count为计数变量,当流水灯循环点亮一次后,将value重新赋值为0xFE,并将conunt清零。

考虑到循环移位是经常使用的操作,可以将循环左移位操作定义为宏,在代码中直接调用宏就可以了。

循环左移位的宏定义:

#define ROTATE_LEFT(x) ((x) << 1) | ((x) >> 7 )

完整C程序代码如下:

#include
#define ROTATE_LEFT(x) ((x) < < 1) | ((x) > > 7 )
void delay(unsigned int millisecond)
{
       unsigned int i,j;
       for(i=millisecond;i >0;i--)
              for(j=120;j >0;j--);
}
void main()
{
    unsigned char value=0xfe,count=0;
       while(1)
       {
              P0 = value;
              delay(5000);
              value = ROTATE_LEFT(value);
              count += 1;
              if( count >= 8 )
              {
                     value = 0xfe;
                     count = 0;
              }
       }
      
}

实验小结

通过这次实验,掌握了流水灯的电路模型设计和编程,流水灯电路模型比较简单,单片机通过I/O口的8个端口来控制8个LED的点亮和熄灭。流水灯的控制通过编程实现,编程主要涉及到时间延迟函数和循环左移位宏定义,时间延迟函数用于控制间LED点亮和熄灭的隔时间,循环左移位用于控制I/O口循环输出高电平和低电平。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • led
    led
    +关注

    关注

    237

    文章

    22449

    浏览量

    645876
  • 单片机
    +关注

    关注

    6001

    文章

    43973

    浏览量

    620829
  • 嵌入式
    +关注

    关注

    4982

    文章

    18281

    浏览量

    288430
  • 电路设计
    +关注

    关注

    6565

    文章

    2317

    浏览量

    195405
  • 流水灯
    +关注

    关注

    21

    文章

    432

    浏览量

    59104
收藏 人收藏

    评论

    相关推荐

    STM32单片机流水灯#电路设计 #电子元器件 #电子工程师 #物联网

    单片机ST流水灯
    jf_21394466
    发布于 :2022年08月24日 13:37:36

    基于单片机的LED流水灯有哪些应用

    描述基于单片机的LED流水灯的应用十分广泛,由单片机作为的核心控制器,通过按键实现控制功能和数据输入是非常普遍的。通常在所需按键数量不多时,系统常采用独立式按键。这种按键的电路配置灵活
    发表于 07-15 07:33

    51单片机流水灯的设计与实现

    51单片机流水灯的设计与实现,摘要:利用AT89C51单片机进行流水灯的控制。单片机的P0^0端口到P0^7端口接8个LED灯。LED灯采用
    发表于 07-19 09:02

    51单片机流水灯原理

    51单片机流水灯原理在实验之前必须的准备工作有:1.单片机 STC90C512.编译软件keil3.烧写软件4.面包板5.发光二极管实验说明:通过单片机芯片,定时在引脚P00,P01,
    发表于 07-21 09:30

    单片机是如何去实现流水灯

    单片机实现流水灯,从入门到进阶看到这个标题,很多人会想:“流水灯?谁不会流水灯啊。单片机入门的第一节课不就是实现跑马灯嘛?” 别急,慢慢看嘛
    发表于 11-10 06:27

    基于51单片机实现流水灯

    51单片机入门教程(2)——实现流水灯一、搭建流水灯电路二、流水灯程序2.1 延时程序2.2 延时函数2.3 按字节寻址2.4 逻辑移位2.
    发表于 11-10 08:03

    如何对基于单片机流水灯进行仿真

    单片机的仿真实验——流水灯和逐一闪烁灯(输入与输出)在进行仿真实验前必须先装了软件,一个是单片机仿真软件(ISIS 7 Professional)和单片机写程序的软件(Keil uVi
    发表于 11-25 06:54

    单片机流水灯的相关资料推荐

    单片机c51流水灯实验实验一跑马灯实验一、实验目的1、熟悉HNIST-2型单片机系统相关硬件电路,程序下载方法;2、掌握采用汇编语言与C语言开发单片
    发表于 01-24 08:25

    基于51单片机的心形流水灯原理图

    51单片机控制的心形流水灯原理图,通心形流水灯的制作熟悉单片机的接口
    发表于 11-23 11:03 53次下载

    51单片机流水灯程序

    51单片机流水灯程序 51单片机流水灯程序 51单片机流水灯
    发表于 12-21 15:52 164次下载

    单片机流水灯设计报告

    单片机流水灯设计报告,感兴趣的可以看看。
    发表于 06-08 17:29 6次下载

    单片机经典流水灯程序

    单片机经典流水灯
    发表于 03-21 20:01 31次下载

    C51单片机流水灯C代码

    C51单片机流水灯C代码
    发表于 11-05 15:20 32次下载
    C51<b class='flag-5'>单片机</b><b class='flag-5'>流水灯</b>C代码

    51单片机流水灯教程。

    51单片机流水灯教程。
    发表于 11-11 20:21 22次下载
    51<b class='flag-5'>单片机</b><b class='flag-5'>流水灯</b>教程。

    51单片机流水灯实验

    基于51单片机流水灯实验 我们知道通过编写程序对51单片机进行控制,完成流水灯实验的方式有许多种。今天我们试通过51单片机的外部中断系统来
    发表于 11-20 17:51 63次下载
    51<b class='flag-5'>单片机</b><b class='flag-5'>流水灯</b>实验