標(biāo)題: 流星雨程序不懂請大家?guī)蛶臀野?[打印本頁]

作者: fujian2014    時間: 2014-11-1 00:38
標(biāo)題: 流星雨程序不懂請大家?guī)蛶臀野?br />程序在下面

作者: fujian2014    時間: 2014-11-1 00:38
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char

uchar abit=16; //流到哪位
uchar atimer0_n;
uchar code abit8[9]={1,2,4,8,16,32,64,128,0};
uchar nn;
char a,b,c,d;

main()
{        TMOD = 0x11;       
        TL0 = 0x00;                //2.5ms
        TH0 = 0xF7;       
        TF0 = 0;               
        TR0 = 1;       
        EA=1;ET0=1;
        while(1)
        {
         a=abit;
         if(a>7||a<0)
                a=8;
         b=abit-1;
         if(b>7||b<0)
                 b=8;
         c=abit-2;
         if(c>7||c<0)
                 c=8;
                 d=abit-3;
         if(d>7||d<0)
                 d=8;
       
               
        atimer0_n++;
        if(atimer0_n==255)
        atimer0_n=0;
        if(atimer0_n<5)
                P1=0xff-abit8[a];
        if(atimer0_n<40)
                P1=0xff-abit8[b];
        if(atimer0_n<150)
                P1=0xff-abit8[c];       
        if(atimer0_n<255)
                P1=0xff-abit8[d];       
        }
}

atimer0 () interrupt 1
{       
        TL0 = 0x00;                //50ms
        TH0 = 0x4C;
        nn++;
        if(nn==2)
        {
                nn=0;abit--;
                 if(abit==0)
                 abit=16;
        }

               
}
作者: fujian2014    時間: 2014-11-1 00:41
while(1)后面就徹底看不懂了,我腦子有點(diǎn)笨呵呵,請大神耐心詳細(xì)解答在此先謝謝啦
作者: admin    時間: 2014-11-1 02:21
最好有電路圖
作者: T29    時間: 2014-11-1 17:15
前面一段是排序,來排列最亮到最暗,總共4位,后面是給四個LED賦值進(jìn)行占空比調(diào)整,其中a>7||a<0是16進(jìn)制轉(zhuǎn)化為2進(jìn)制,然后八位2進(jìn)制按位進(jìn)行或運(yùn)算,主要是定位哪一位
作者: fujian2014    時間: 2014-11-1 22:05
T29 發(fā)表于 2014-11-1 17:15
前面一段是排序,來排列最亮到最暗,總共4位,后面是給四個LED賦值進(jìn)行占空比調(diào)整,其中a>7||a

不懂你說的16進(jìn)制轉(zhuǎn)換成2進(jìn)制的意識,A不是被賦值為16嗎   IF(A>7||A<0)  還有A=8 B=8 C=8 D=8又是什么意識求老師耐心講解
作者: T29    時間: 2014-11-2 03:05
本帖最后由 T29 于 2014-11-2 03:06 編輯

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char

uchar abit=16; //流到哪位
uchar atimer0_n; //主程序循環(huán)次數(shù)
uchar code abit8[9]={1,2,4,8,16,32,64,128,0};
uchar nn;
char a,b,c,d;

main()
{        TMOD = 0x11;        
        TL0 = 0x00;                //2.5ms
        TH0 = 0xF7;        
        TF0 = 0;               
        TR0 = 1;        
        EA=1;ET0=1;
        while(1)
        {
         a=abit;//初次賦值,中間賦值在定時,再次賦值在定時里
    //8次循環(huán)顯示,四位LED          abcd 00000000
          //                                         abc d0000000
          //                                           ab cd000000
          //                                             a bcd00000
          //                                                abcd0000
          //以上是a的值是16-8之間的變化,7-0是低四位加上退出四位,同時進(jìn)行賦值給abcd進(jìn)行占空比
         if(a>7||a<0)a=8;//在單片機(jī)里面,無符號數(shù)據(jù)小于0會變成最大值,也就是小于0會變成255
         b=abit-1;
         if(b>7||b<0)b=8;
         c=abit-2;
         if(c>7||c<0)c=8;
         d=abit-3;
         if(d>7||d<0)d=8;
        
               
        atimer0_n++;
        if(atimer0_n==255)
        atimer0_n=0;
        if(atimer0_n<5)P1=0xff-abit8[a];//256-128轉(zhuǎn)成2進(jìn)制,0為亮,01111111時間最短循環(huán)5次,所以最暗
        if(atimer0_n<40)P1=0xff-abit8;//256-64轉(zhuǎn)成2進(jìn)制,0為亮,10111111
        if(atimer0_n<150)P1=0xff-abit8[c]; //256-32轉(zhuǎn)成2進(jìn)制,0為亮,11011111      
        if(atimer0_n<255) P1=0xff-abit8[d]; //256-16轉(zhuǎn)成2進(jìn)制,0為亮,11101111  時間最長,最亮     
        }
}

atimer0 () interrupt 1
{        
        TL0 = 0x00;                //50ms
        TH0 = 0x4C;
        nn++;
        if(nn==2)
        {
                nn=0;abit--;
                 if(abit==0)abit=16;
        }

               
}


只能靠易會理解了,說不清楚呀

作者: fujian2014    時間: 2014-11-2 10:34
T29 發(fā)表于 2014-11-2 03:05
#include
#define uint unsigned int
#define uchar unsigned char

雖然現(xiàn)在還不能理解,但是過一段時間就會好的

因此對于您的解答我非常感謝!
作者: dgahz    時間: 2014-11-3 10:31
[img][/img]
在if條件判斷中可以轉(zhuǎn)換進(jìn)制嗎?可不可以賦值?比如if(i=8)?
作者: dgahz    時間: 2014-11-3 10:36
求a>7||a<0是16進(jìn)制轉(zhuǎn)化為2進(jìn)制,設(shè)a=0和a=8時表達(dá)式的值為多少?
作者: dgahz    時間: 2014-11-3 15:44
本帖最后由 dgahz 于 2014-11-4 10:09 編輯

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char

uchar abit=16;
uchar atimer0_n;
uchar code abit8[9]={254,253,251,247,239,223,191,127,255}; /*對應(yīng){11111110,11111101,11111011,11110111,11101111,
uchar nn;                                                                                       11011111,10111111,01111111,11111111} 0為燈亮,
char a,b,c,d;                                                                                 1為燈滅*/

main()
{        TMOD = 0x11;        
        TL0 = 0x00;          /*每進(jìn)一次中斷abit變動一次。則 a,b,c,d 變動一次。
        TH0 = 0xF7;          取a,b,c,d 的值,值代表數(shù)組abit8[]元素的序號。相當(dāng)P1口賦值相應(yīng)元素。
        TF0 = 0;                while執(zhí)行掃描50ms進(jìn)一次中斷*/
        TR0 = 1;        
        EA=1;ET0=1;                        
        while(1)              /*   if(a>7||a<0)中“||”是或者的意思,即如果a>7或者a<0只要其中一個成立則條件成立,執(zhí)行下面語句,否則跳過。
                                        當(dāng)abit在16-11時:a=b=c=d=8. 燈全滅。
        {                              當(dāng)abit=10:a=8,b=8,c=8,d=7.進(jìn)一次中斷11111111,11111111,11111111,01111111
         a=abit;                    當(dāng)abit=9: a=8,b=8,c=7,d=6.進(jìn)一次中斷11111111,11111111,01111111,10111111
         if(a>7||a<0)            當(dāng)abit=8: a=8,b=7,c=6,d=5.進(jìn)一次中斷11111111,01111111,10111111,11011111
                a=8;                當(dāng)abit=7: a=7,b=6,c=5,d=4.進(jìn)一次中斷01111111,10111111,11011111,11101111
         b=abit-1;                 當(dāng)abit=6: a=6,b=5,c=4,d=3.進(jìn)一次中斷
                                        當(dāng)abit=5: a=5,b=4,c=3,d=2.進(jìn)一次中斷
                                        當(dāng)abit=4: a=4,b=3,c=2,d=1.進(jìn)一次中斷
         if(b>7||b<0)            當(dāng)abit=3: a=3,b=2,c=1,d=0.進(jìn)一次中斷
                 b=8;               當(dāng)abit=2: a=2,b=1,c=0,d=8.進(jìn)一次中斷
         c=abit-2;                 當(dāng)abit=1: a=1,b=0,c=8,d=8.進(jìn)一次中斷
         if(c>7||c<0)            當(dāng)abit=0: a=0,b=8,c=8,d=8.進(jìn)一次中斷
                                                        
                 c=8;                當(dāng)abit在16-11時:滿足4個if條件,a=b=c=d=8;P1=abit8[8]=11111111,燈全滅。也就是說有
         d=abit-3;                  一段時間燈是不亮的。
         if(d>7||d<0)             當(dāng)abit=0時:第1個條件不滿足,不執(zhí)行a=8,則a=abit=0;后面3個條件b<0,c<0,d<0都滿足,
                 d=8;                 所以執(zhí)行b=c=d=8.*/
        
               
        atimer0_n++;
        if(atimer0_n==255)        //假設(shè)某一次進(jìn)中斷取得abit=7:則 a=7,b=6,c=5,d=4.則有如下:
        atimer0_n=0;
        if(atimer0_n<5)
                P1=abit8[a];      //P2=01111111    //255次循環(huán)中這句只執(zhí)行了5次
        if(atimer0_n<40)
                P1=abit8;       //P2=10111111   //255次循環(huán)中這句只執(zhí)行了40次
        if(atimer0_n<150)
                P1=abit8[c];   //P2=11011111   //255次循環(huán)中這句只執(zhí)行了150次
        if(atimer0_n<255)
                P1=abit8[d];    //P2=11101111   //255次循環(huán)中這句只執(zhí)行了255次
        }                                                           //執(zhí)行的次數(shù)越多等效于燈亮的時間越長,每次循環(huán)視覺上4燈亮。

}                                           /*while一直重復(fù)執(zhí)行到50ms結(jié)束再進(jìn)中斷取得新的a,b,c,d值為止,abit變則相當(dāng)于a,b,c,d值變。
                                              while執(zhí)行255次則n同步等于255,50ms中能執(zhí)行多少個255次不知道。*/
atimer0 () interrupt 1
{        
        TL0 = 0x00;                //50ms
        TH0 = 0x4C;
        nn++;
        if(nn==2)
        {
                nn=0;abit--;          //abit變化范圍16-0;
                 if(abit==0)
                 abit=16;
        }

               
}                                          //程序效果右移

作者: fujian2014    時間: 2014-11-3 22:55
好人啊謝謝




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1