这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 物联网技术 » 51单片机流水灯疑问

共7条 1/1 1 跳转至

51单片机流水灯疑问

菜鸟
2012-02-15 15:23:35     打赏
请问第二个流水等实验为什么是MTB先亮?
我认为应该是和第一个流水等试验一样是第一个灯(MTA)先亮,但是利用第二个程序(位操作)都发现是MTB先亮。为什么?谢谢

第一个:对每一个口操作
#include <STC89.h>

sbit mta=P2^4;
sbit mtb=P2^5;
sbit mtc=P2^6;
sbit mtd=P2^7;

void delay(unsigned char n)        //延时程序 (n=10--200ms)
{
    unsigned char i,j,k;
    for(i=n;i>0;i--)
        for(j=100;j>0;j--)
            for(k=125;k>0;k--);
}

void main()
{
   while(1)
   {
    mta=1;
    delay(10);
    mta=0;
    delay(20);
   
    mtb=1;
    delay(30);
    mtb=0;
    delay(40);

    mtc=1;
    delay(40);
    mtc=0;
    delay(30);

    mtd=1;
    delay(20);
    mtd=0;
    delay(10);
    }
}
第二个:(利用了位操作)
#include<stc89.h>
   
void delay(unsigned char n)       
{
    unsigned char i,j,k;
    for(i=n;i>0;i--)
        for(j=100;j>0;j--)
            for(k=125;k>0;k--);
}
void main()
{
    unsigned char i;
    while(1)
    {
      for(i=0;i<4;i++)
      {
          P2=(1<<i+4);
        delay(10);
        P2&=0x0F;
        delay(10);
        }
    }
}
           



关键词: 单片机     流水     疑问     delay    

菜鸟
2012-02-15 15:39:30     打赏
2楼
其实就是P2.4,P2.5,P2.6,P2.7分别控制MTA,MTB,MTC,MTD,只是P2.4高点平时MTA亮而已,对于MTB等也是一样,分别有P2.5,P2,6,P2.7控制。  有一个直观的截图我没弄下来

菜鸟
2012-02-15 19:04:02     打赏
3楼
可是我想表达的是让1(也就是00000001)左移(i+4)位。因为P2.4,P2.5,P2.6,P2.7分别控制MTA,MTB,MTC,MTD,所以P2.0--P2.3需要跳过去。我使用P2=(1<<(i+4));可是结果还是一样。

菜鸟
2012-02-15 22:11:03     打赏
4楼
这个是让流水灯MTA先亮200ms,然后灭200ms,然后MTB亮200ms,然后灭200ms,然后MTC。。。 当然要是不写就是中间没有全灭的情况。二者都可以,但是我是试过了,改成P2&=0xF0 MTA照样第一次不亮,先是MTB亮,然后MTC,MTD,MTA,MTB,MTC,MTD,MTA,MTB,MTC,MTD,MTA... 为什么MTA第一次不亮啊,第一次循环i=0啊。

谢谢大家,我的截图如下,我用daumplayer无法截图,只能用wmp截图,无法截清楚,P2.4经过ULN2003A接到了MTA上,P2.5经过 ULN2003A接到了MTB上,P2.6经过ULN2003A接到了MTC上,P2.7经过ULN2003A接到了MTD上,ULN2003A起到了一 个反向的作用,也就是P2.4若是高电平,则ULN2003A输出低电平。谢谢

菜鸟
2012-02-16 13:44:54     打赏
5楼
谢谢您的回复,我还是不太明白,您说“在for循环的判断中,i先赋值为0,再判断是否小于4,加为1,1右移五位,当然第二灯亮”,请问为什么判断小于四后要加为1,第一个循环i=0啊。这是i左移4位,由00000001变成了00010000,而恰好是P2.4为高电平,带动MTA亮。

另外我认为这个程序没有消除残影,delay(10)延时是200ms,这个时间是肉眼能分辨的。流水灯也没有必要消除残影吧。
0x0f取与的思路是:将00010000(MTA亮)200ms后变成00000000(全部灯灭200ms),然后在00100000(MTB亮)200ms,后变成00000000(全部灯灭200ms),然后在01000000(MTC亮)200ms,后变成00000000(全部灯灭200ms),然后在10000000(MTD亮)200ms,后变成00000000(全部灯灭200ms),一次循环,请问为什么要与0xf0相与呢?

本人菜鸟,望指点

菜鸟
2012-02-16 13:46:26     打赏
6楼
我用keil的debug调试过,i也是从0开始啊,是不是硬件问题

菜鸟
2012-02-16 18:40:05     打赏
7楼
谢谢,目前找不到问题,我在看看。

共7条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]