头发早晚光 2022-04-01 15:57 采纳率: 66.7%
浏览 81
已结题

求帮讲解单片机初级流水灯!

初学者请教,单片机八个流水灯,最后一个一直亮,然后从第一个等开始亮往左移,然后第一第二颗等亮往左移,以此类推。最后个灯永

img


远亮

img

  • 写回答

2条回答 默认 最新

  • single_xy 2022-04-01 17:12
    关注
    #include <REGX51.H>
    void delayms(unsigned int n);
    
    void main()
    {
            unsigned char temp = 0x7e;
            
        while(1)
        {
                    P2 = temp;
                    delayms(500);
                    temp = (temp << 1) ^ 129;
                    if(temp == 0xff)
                            temp = 0x7e;
    
        }
    }
    
    void delayms(unsigned int n)
    {
            unsigned int i,j;
            for(i=0;i<n;i++)
            {
                    for(j=110;j>0;j--);
            }
    }
    
    

    这是低电平点亮,原理图如下

    img

    1.自定义函数delayms( );是用于延时。
    2.根据题目可知,灯的初始状态为:亮、灭、灭、灭、灭、灭、灭、亮,所对应的P2口二进制表示为:01111110,十六进制表示为:0x7e。所以在while循环外先定义一个unsigned char类型的变量为0x7e。
    3.while循环中,先让P2=变量temp,再通过改变temp的值来改变灯的状态,使灯达到一个流水灯的效果。temp = (temp << 1) ^ 129;的意义是temp=01111110 左移一位后,与10000001进行异或运算——相同为0,不同为1。例如一开始的01111110左移一位后变为11111100,再与10000001进行异或运算得到0111101,也就是达到了第一个灯向第二个灯移动的效果。之后依次类推。
    4.当灯移动到第七个的位置为亮时,我们需要将其进行左移和异或运算后的值改为初始值,以长久达到流水灯的效果。也就是if(temp == 0xff) temp = 0x7e;这一步。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月17日
  • 已采纳回答 4月9日
  • 创建了问题 4月1日

悬赏问题

  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥15 想问一下树莓派接上显示屏后出现如图所示画面,是什么问题导致的
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化