OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » 综合技术 » 物联网技术 » 51单片机流水灯疑问

共19条 1/2 1 2 跳转至

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 15:46:41    评分
3楼
 P2=(1<<i+4);
里面的 1<<i+4 是有优先级的!!如果你想要左移i位再加4的话应该是:P2=((1<<i)+4);

菜鸟
2012-02-15 18:08:54    评分
4楼

我同意楼上的观点


菜鸟
2012-02-15 19:04:02    评分
5楼
可是我想表达的是让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 19:04:37    评分
6楼

看不懂~  我来顶一顶~~~


助工
2012-02-15 20:08:45    评分
7楼

可能初始条件没设置好,

高电平亮还是低电平亮?


专家
2012-02-15 20:23:19    评分
8楼
那既然是你那样的话,那为什么P2&=0x0F;??而不是P2&=0xF0????
我觉得是P2&=0xF0!!


菜鸟
2012-02-15 22:11:03    评分
9楼
这个是让流水灯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 01:54:40    评分
10楼
楼主还是多看书,多读别人的程序吧。问题出在i上面。执行过程是这样的,在for循环的判断中,i先赋值为0,再判断是否小于4,加为1,1右移五位,当然第二灯亮

共19条 1/2 1 2 跳转至

回复

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