头发早晚光 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 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler