tian981018078 2022-05-21 23:59 采纳率: 50%
浏览 63
已结题

为什么我的51单片机左右往复流水灯,为什么从左到右或者从右到左会愣一下

#include<reg52.h>
sbit ADDR0=P1^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
sbit ENLED=P1^4;
void main()
{
unsigned int i=0;
unsigned char cnt=0;
unsigned char dire=0;
ENLED=0;
ADDR3=1;
ADDR2=1;
ADDR1=1;
ADDR0=0;

                       while(1)
                       {
                         if (dire==0)
                             {
                         P0=~(0x01<<cnt);
                           for(i=0;i<20000;i++);
                           cnt++;
                                  if(cnt>=8)
                                    { 
                                        cnt=0;
                                        dire=1;
                                    }
                                }
              else
              {
                 P0=~(0x80>>cnt);
                            for(i=0;i<20000;i++);
                            cnt++;
                                    if(cnt>=8)
                                    {
                                        cnt=0;
                                        dire=0;
                                    }
                                }
                                    
                         
                        }
                    }
  • 写回答

1条回答 默认 最新

  • qllaoda 2022-05-22 08:27
    关注

    所谓楞一下,就是多等了一会儿,你分析一下两种状态交替时候执行的操作就明白了。
    很明显,从右边往左边滚动的,滚到最左边,按这个滚动循环,LED会在最左边停留一个周期,然后进入下一轮从左往右滚的的循环,这个循环的第一个周期,LED的动作就是停在最左边一个周期的时间,所以从外部看,LED在最左边停留了两个周期的时间,最右边也是同理,给人的感觉就是楞了一下。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 6月1日
  • 已采纳回答 5月24日
  • 创建了问题 5月21日

悬赏问题

  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容