本帖最后由 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;
}
} //程序效果右移 |