1 基于单片机的流水灯电路设计-德赢Vwin官网 网
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条语句。

如何用软件来vwin 延时时间呢?在设计的电路模型中,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口循环输出高电平和低电平。

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

    关注

    242

    文章

    23251

    浏览量

    660531
  • 单片机
    +关注

    关注

    6034

    文章

    44554

    浏览量

    634560
  • 嵌入式
    +关注

    关注

    5082

    文章

    19104

    浏览量

    304763
  • 电路设计
    +关注

    关注

    6673

    文章

    2451

    浏览量

    204119
  • 流水灯
    +关注

    关注

    21

    文章

    432

    浏览量

    59690
收藏 人收藏

    评论

    相关推荐

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

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

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

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

    51单片机流水灯程序

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

    单片机流水灯设计报告

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

    单片机经典流水灯程序

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

    基于单片机流水灯介绍_51单片机流水灯的五种实现方法

    本文为大家带来五种51单片机流水灯的实现方法。
    发表于 01-06 10:23 5.1w次阅读
    基于<b class='flag-5'>单片机</b>的<b class='flag-5'>流水灯</b>介绍_51<b class='flag-5'>单片机</b><b class='flag-5'>流水灯</b>的五种实现方法

    单片机控制花样流水灯原理图及程序

    本文详细介绍了AT89C51单片机流水灯的编写方法以及介绍了单片机32位LED花样流水灯程序及原理图。
    发表于 04-26 16:15 5.5w次阅读
    <b class='flag-5'>单片机</b>控制花样<b class='flag-5'>流水灯</b>原理图及程序

    基于单片机的简易流水灯实验设计方案

    基于单片机的简易流水灯实验设计方案
    发表于 03-19 10:10 0次下载
    基于<b class='flag-5'>单片机</b>的简易<b class='flag-5'>流水灯</b>实验设计方案

    基于51单片机流水灯参考案例下载

    基于51单片机流水灯参考案例下载
    发表于 09-05 17:02 42次下载

    浅析PIC单片机流水灯运用程序

    浅析PIC单片机流水灯运用程序
    发表于 10-18 09:53 1次下载

    C51单片机流水灯C代码

    C51单片机流水灯C代码
    发表于 11-05 15:20 34次下载
    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 66次下载
    51<b class='flag-5'>单片机</b><b class='flag-5'>流水灯</b>实验

    单片机51的流水灯

    实验一 单片机流水灯【实验目的】1、熟练掌握AT89C51开发板的使用方法和注意事项。2、了解简单单片机应用系统的设计方法。3、掌握应用KEIL软件编辑、编译源程序的操作方法。4、掌握
    发表于 11-23 16:20 24次下载
    <b class='flag-5'>单片机</b>51的<b class='flag-5'>流水灯</b>

    51单片机流水灯制作

    流水灯是学习51单片机的一个基本项目,是我们对单片机IO口输出认识的基本项目。当然学会了花样流水灯也很好玩。 下面就分享一种51单片机
    的头像 发表于 02-26 10:06 1607次阅读
    51<b class='flag-5'>单片机</b><b class='flag-5'>流水灯</b>制作