本帖最后由 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}; /*對應{11111110,11111101,11111011,11110111,11101111,
uchar nn; 11011111,10111111,01111111,11111111} 0為燈亮,
char a,b,c,d; 1為燈滅*/
main()
{ TMOD = 0x11;
TL0 = 0x00; /*每進一次中斷abit變動一次。則 a,b,c,d 變動一次。
TH0 = 0xF7; 取a,b,c,d 的值,值代表數組abit8[]元素的序號。相當P1口賦值相應元素。
TF0 = 0; while執行掃描50ms進一次中斷*/
TR0 = 1;
EA=1;ET0=1;
while(1) /* if(a>7||a<0)中“||”是或者的意思,即如果a>7或者a<0只要其中一個成立則條件成立,執行下面語句,否則跳過。
當abit在16-11時:a=b=c=d=8. 燈全滅。
{ 當abit=10:a=8,b=8,c=8,d=7.進一次中斷11111111,11111111,11111111,01111111
a=abit; 當abit=9: a=8,b=8,c=7,d=6.進一次中斷11111111,11111111,01111111,10111111
if(a>7||a<0) 當abit=8: a=8,b=7,c=6,d=5.進一次中斷11111111,01111111,10111111,11011111
a=8; 當abit=7: a=7,b=6,c=5,d=4.進一次中斷01111111,10111111,11011111,11101111
b=abit-1; 當abit=6: a=6,b=5,c=4,d=3.進一次中斷
當abit=5: a=5,b=4,c=3,d=2.進一次中斷
當abit=4: a=4,b=3,c=2,d=1.進一次中斷
if(b>7||b<0) 當abit=3: a=3,b=2,c=1,d=0.進一次中斷
b=8; 當abit=2: a=2,b=1,c=0,d=8.進一次中斷
c=abit-2; 當abit=1: a=1,b=0,c=8,d=8.進一次中斷
if(c>7||c<0) 當abit=0: a=0,b=8,c=8,d=8.進一次中斷
c=8; 當abit在16-11時:滿足4個if條件,a=b=c=d=8;P1=abit8[8]=11111111,燈全滅。也就是說有
d=abit-3; 一段時間燈是不亮的。
if(d>7||d<0) 當abit=0時:第1個條件不滿足,不執行a=8,則a=abit=0;后面3個條件b<0,c<0,d<0都滿足,
d=8; 所以執行b=c=d=8.*/
atimer0_n++;
if(atimer0_n==255) //假設某一次進中斷取得abit=7:則 a=7,b=6,c=5,d=4.則有如下:
atimer0_n=0;
if(atimer0_n<5)
P1=abit8[a]; //P2=01111111 //255次循環中這句只執行了5次
if(atimer0_n<40)
P1=abit8; //P2=10111111 //255次循環中這句只執行了40次
if(atimer0_n<150)
P1=abit8[c]; //P2=11011111 //255次循環中這句只執行了150次
if(atimer0_n<255)
P1=abit8[d]; //P2=11101111 //255次循環中這句只執行了255次
} //執行的次數越多等效于燈亮的時間越長,每次循環視覺上4燈亮。
} /*while一直重復執行到50ms結束再進中斷取得新的a,b,c,d值為止,abit變則相當于a,b,c,d值變。
while執行255次則n同步等于255,50ms中能執行多少個255次不知道。*/
atimer0 () interrupt 1
{
TL0 = 0x00; //50ms
TH0 = 0x4C;
nn++;
if(nn==2)
{
nn=0;abit--; //abit變化范圍16-0;
if(abit==0)
abit=16;
}
} //程序效果右移 |