|
摩托车尾灯
- /*实例:
- 实例中部分与上述讲解有所不同
- 因为实际中我们控制的是16个灯,而在上述讲解中只是控制8个灯,所以实例中有所不同
- 由于单片机速度限制,我最后将一个周期设定为循环50次。
- 所以当数组中存50既代表全亮。*/
- //预处理
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- //全局变量设定
- uchar dismem[16];
- uchar code tab[16]={0,1,2,3,4,5,6,7,8,9,11,13,16,22,35,50};
- uchar code ann[]={1,1,1,1,1,1,1,1,2,3,6,10,14,20,35,50,35,20,14,10,6,3,2,1,1,1,1,1,1,1,1,1};
- uchar code ann2[]={0,0,0,0,0,0,0,0,1,2,6,14,35,50,35,14,6,2,1,1,1,0,0,0,0,0,0,0,0};
- //延时函数
- void delay(uint i)
- {
- while(i--);
- }
- //取绝对值函数
- char abs(char i)
- {
- if (i<0)
- i=-i;
- return i;
- }
- //定时器设置函数
- void sinter()
- {
- IE=0x82;
- TCON=0x01;
- TH0=0xc0;
- TL0=0xFD;
- TR0=0x66;
- }
- //p0口位处理函数
- uchar bitcountp0(uchar n)
- {
- uchar i,p=0;
- for (i=0;i<8;i++)
- {
- if (dismem[i]<n)
- p=p|(1<<i);
- }
- return p;
- }
- //p2口位处理函数
- //在这里需要注意的是,p2口得顺序和我们led连接顺序是反的。详情可以观察电路图可了解到。
- uchar bitcountp2(uchar n)
- {
- uchar i,p=0;
- for (i=0;i<8;i++)
- {
- if (dismem[i+8]<n)
- p=p|(0x80>>i);
- }
- return p;
- }
- //清屏函数
- void clean(uchar n)
- {
- uchar i;
- for (i=0;i<16;i++)
- {
- dismem[i]=n;
- }
- }
- //呼吸灯函数
- //其中被控制灯在第a个和第b个之间。speed是呼吸速度。
- void roll10(uchar a,uchar b,uint speed)
- {
- uchar i,j;
- for (i=1;i<30;i++)
- {
- for (j=a;j<b;j++)
-
- {
- dismem[j]=i;
- }
- delay (speed);
- }
- for(i=30;i>0;i--)
- {
- for (j=a;j<b;j++)
- {
- dismem[j]=i-1;
- }
- delay (speed);
- }
- }
- //动画区域
-
- void flash_1() ///////////////////////////////////////////
- {
- uchar i,j,mem[32]={0,0,0,0,0,0,0,0x00,0,0,0,0,0,0,0,0x01,15,13,11,9,7,5,3,0x02,1,1,1,1,1,1,1,1};
- for (i=0;i<36;i++)
- {
- for (j=0;j<16;j++)
- {
- dismem[j]=tab[mem[j]];
- }
- for (j=0;j<31;j++)
- {
- mem[j]=mem[j+1];
- }
- mem[31]=1;
- delay(750);
- }
- }
- void flash_2() /////////////////////////////////////////
- {
- roll10(0,16,300);
- roll10(0,16,300);
- }
- void flash_3() ////////////////////////////////////////////
- {
- uchar i,j;
- for (i=0;i<16;i++)
- {
- for (j=0;j<16;j++)
- {
- dismem[j]=ann[i+j];
- }
- delay(800+abs(i-8)*50);
- }
- delay(2500);
- for (i=16;i>0;i--)
- {
- for (j=0;j<16;j++)
- {
- dismem[j]=ann[i+j];
- }
- delay(800+abs(i-8)*50);
- }
- delay(2500);
- }
- void flash_4() /////////////////////////////////////////////
- {
- uchar i,j,k;
- for (i=0;i<16;i++)
- {
- k=(i%2)*50;
- for(j=0;j<8;j++)
- {
- dismem[j]=k;
- }
- k=((i+1)%2)*50;
- for (j=8;j<16;j++)
- {
- dismem[j]=k;
- }
- delay(3000);
- }
- for (j=0;j<8;j++)
- {
- dismem[j]=50;
- }
- for (i=50;i>0;i--)
- {
- for (j=0;j<16;j++)
- {
- dismem[j]=i-1;
- }
- delay (300);
- }
- }
- void flash_5() ////////////////////////////////////////////////
- {
- roll10(0,4,50);
- roll10(4,8,50);
- roll10(8,12,50);
- roll10(12,16,50);
- roll10(12,16,50);
- roll10(8,12,50);
- roll10(4,8,50);
- roll10(0,4,50);
- roll10(0,1,10);
- roll10(1,2,10);
- roll10(2,3,10);
- roll10(3,4,10);
- roll10(4,5,10);
- roll10(5,6,10);
- roll10(6,7,10);
- roll10(7,8,10);
- roll10(8,9,10);
- roll10(9,10,10);
- roll10(10,11,10);
- roll10(11,12,10);
- roll10(12,13,10);
- roll10(13,14,10);
- roll10(14,15,10);
- roll10(15,16,10);
- roll10(15,16,10);
- roll10(14,16,10);
- roll10(13,16,10);
- roll10(12,16,10);
- roll10(11,16,10);
- roll10(10,16,10);
- roll10(9,16,10);
- roll10(8,16,10);
- roll10(7,16,10);
- roll10(6,16,10);
- roll10(5,16,10);
- roll10(4,16,10);
- roll10(3,16,10);
- roll10(2,16,10);
- roll10(1,16,10);
- roll10(0,16,10);
- roll10(0,16,10);
- roll10(15,16,10);
- roll10(14,15,10);
- roll10(13,14,10);
- roll10(12,13,10);
- roll10(11,12,10);
- roll10(10,11,10);
- roll10(9,10,10);
- roll10(8,9,10);
- roll10(7,8,10);
- roll10(6,7,10);
- roll10(5,6,10);
- roll10(4,5,10);
- roll10(3,4,10);
- roll10(2,3,10);
- roll10(1,2,10);
- roll10(0,1,10);
- roll10(0,16,10);
- roll10(1,16,10);
- roll10(2,16,10);
- roll10(3,16,10);
- roll10(4,16,10);
- roll10(5,16,10);
- roll10(6,16,10);
- roll10(7,16,10);
- roll10(8,16,10);
- roll10(9,16,10);
- roll10(10,16,10);
- roll10(11,16,10);
- roll10(12,16,10);
- roll10(13,16,10);
- roll10(14,16,10);
- roll10(15,16,10);
- }
- void flash_6_1(uint speed) /////////////////////////////////////////
- {
- uchar i,j;
- for (i=1;i<50;i++)
- {
- for (j=0;j<16;j+=2)
- {
- dismem[j]=i;
- }
- for (j=1;j<16;j+=2)
- {
- dismem[j]=49-i;
- }
- delay (speed);
- }
- for (i=49;i>0;i--)
- {
- for (j=0;j<16;j+=2)
- {
- dismem[j]=i;
- }
- for (j=1;j<16;j+=2)
- {
- dismem[j]=49-i;
- }
- delay (speed);
- }
- }
- void flash_6_2(uint speed) /////////////////////////////////////////
- {
- uchar i,j;
- for (i=1;i<50;i++)
- {
- for (j=0;j<4;j++)
- {
- dismem[j]=i;
- dismem[j+8]=i;
- }
- for (j=4;j<8;j++)
- {
- dismem[j]=49-i;
- dismem[j+8]=49-i;
- }
- delay (speed);
- }
- for (i=49;i>0;i--)
- {
- for (j=0;j<4;j++)
- {
- dismem[j]=i;
- dismem[j+8]=i;
- }
- for (j=4;j<8;j++)
- {
- dismem[j]=49-i;
- dismem[j+8]=49-i;
- }
- delay (speed);
- }
- }
- void flash_6() //////////////////////////////////////////////
- {
- uchar i,j;
- for (i=1;i<50;i++)
- {
- for (j=1;j<16;j+=2)
- {
- dismem[j]=i;
- }
- delay (100);
- }
- flash_6_1(100);
- flash_6_1(100);
- flash_6_1(100);
- flash_6_1(100);
- for (i=49;i>0;i--)
- {
- for (j=1;j<16;j+=2)
- {
- dismem[j]=i;
- }
- delay (100);
- }
- for (i=1;i<50;i++)
- {
- for (j=4;j<8;j++)
- {
- dismem[j]=i;
- dismem[j+8]=i;
- }
- delay (100);
- }
- flash_6_2(100);
- flash_6_2(100);
- flash_6_2(100);
- for (i=49;i>0;i--)
- {
- for (j=4;j<8;j++)
- {
- dismem[j]=i;
- dismem[j+8]=i;
- }
- delay (100);
- }
- }
- void flash_7() //////////////////////////////////////////////
- {
- uchar i,j,k;
- for (i=0;i<15;i++)
- {
- k=(i%2)*50;
- for (j=0;j<8;j++)
- {
- dismem[j]=k;
- }
- delay(1500);
- }
- for (i=0;i<15;i++)
- {
- k=(i%2)*50;
- for (j=8;j<16;j++)
- {
- dismem[j]=k;
- }
- delay(1500);
- }
- }
- void flash_8() ////////////////////////////////////////////////
- {
- uchar i,j;
- for (i=0;i<22;i++)
- {
- for (j=0;j<8;j++)
- {
- dismem[j]=ann2[i+j];
- dismem[15-j]=ann2[i+j];
- }
- delay(1500);
- }
- }
- void flash_9_l() /////////////////////////////////////////////////////////
- {
- uchar i,j;
- for (i=0;i<4;i++)
- dismem[i]=50;
- for (i=4;i<8;i++)
- dismem[i]=1;
- for (i=0;i<12;i++)
- {
- for (j=15;j>4;j--)
- dismem[j]=dismem[j-1];
- dismem[4]=0;
- delay(1000);
- }
- }
- void flash_9_r() //////////////////////////////////////////////////
- {
- uchar i,j;
- for (i=12;i<16;i++)
- dismem[i]=50;
- for (i=8;i<12;i++)
- dismem[i]=1;
- for (i=0;i<12;i++)
- {
- for (j=0;j<11;j++)
- dismem[j]=dismem[j+1];
- dismem[11]=0;
- delay(1000);
- }
- }
- void flash_9() //////////////////////////////////////////////////////
- {
- flash_9_l();
- flash_9_r();
- flash_9_l();
- flash_9_r();
- flash_9_l();
- flash_9_r();
-
- }
- //主函数
- //主函数调用动画区域的函数,这里可以理解一个播放列表。
- void main()
- {
- sinter();
- clean(0);
- //play list;
- while(1)
- {
- flash_1();
- flash_2();
- flash_3();
- flash_4();
- flash_2();
- flash_5();
- flash_6();
- flash_7();
- flash_7();
- flash_9();
- flash_8();
- flash_8();
- flash_2();
- flash_6();
- flash_9();
- flash_3();
- flash_1();
- flash_8();
- flash_8();
- flash_6();
- flash_5();
- flash_4();
- }
- }
- //中断服务函数
- void print() interrupt 1
- {
- static uchar i=1;
- P0=bitcountp0(i);
- P2=bitcountp2(i);
- if (i<50)
- i++;
- else
- i=1;
- TH0=0xFd;
- TL0=0x66;
- }
复制代码
|
|