标题:
51单片机呼吸灯 霹雳游侠摩托车尾灯 仿真+程序代码
[打印本页]
作者:
蓝灵魔君
时间:
2014-7-1 10:14
标题:
51单片机呼吸灯 霹雳游侠摩托车尾灯 仿真+程序代码
摩托车尾灯
/*实例:
实例中部分与上述讲解有所不同
因为实际中我们控制的是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;
}
复制代码
霹雳游侠灯.rar
2014-7-1 10:13 上传
点击文件名下载附件
下载积分: 黑币 -5
620.85 KB, 下载次数: 164, 下载积分: 黑币 -5
作者:
a110
时间:
2014-7-17 16:55
很牛的作品
作者:
新手110
时间:
2014-11-10 20:25
真的是么
作者:
新手110
时间:
2014-11-10 20:25
弄下来看看就知道咋样了
作者:
tsqddq
时间:
2016-1-24 14:34
很强。。。。。。。。。。。。
作者:
yangfu1982
时间:
2017-3-7 20:49
电路不一样,程序也不一样对吗
作者:
泡泡无敌
时间:
2017-3-8 11:20
学习借鉴了,谢谢楼主
作者:
ufo110796003
时间:
2019-12-1 20:28
楼主怎么不对, 能给我对的吗,谢谢
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1