晴天电子工作室 sunnyelestudio.taobao.com
霹雳游侠灯
v1
110827
霹雳游侠灯 v1 制作详解 sunnyelestudio.taobao.com
1
目录
硬件部分 .................................................................................................................................................................................................. 3
硬件构造 .......................................................................................................................................................................................... 3
制作思路 .......................................................................................................................................................................................... 3
软件部分 .................................................................................................................................................................................................. 7
什么是 pwm? ..................................................................................................................................................................................... 7
它是如何控制的?........................................................................................................................................................................... 7
程序原理 .......................................................................................................................................................................................... 8
中断概念的引入 ............................................................................................................................................................................ 12
实例: .................................................................................................................................................................................................... 15
预处理 ............................................................................................................................................................................................ 15
全局变量设定 ................................................................................................................................................................................ 15
延时函数 ........................................................................................................................................................................................ 16
取绝对值函数 ................................................................................................................................................................................ 16
定时器设置函数 ............................................................................................................................................................................ 17
p0 口位处理函数 ........................................................................................................................................................................... 17
p2 口位处理函数 ........................................................................................................................................................................... 18
清屏函数 ........................................................................................................................................................................................ 19
呼吸灯函数 .................................................................................................................................................................................... 19
霹雳游侠灯 v1 制作详解 sunnyelestudio.taobao.com
2
动画区域 ........................................................................................................................................................................................ 20
主函数 ............................................................................................................................................................................................ 33
中断服务函数 ................................................................................................................................................................................ 35
霹雳游侠灯 v1 制作详解 sunnyelestudio.taobao.com
3
硬件部分
硬件构造
本制作包括 stc89c52单片机、电阻、电容、led发光二极管、晶振构成。
制作思路
所有 led由单片机引脚直接控制,由单片机性质,我们采用下图所示方式来控制。
霹雳游侠灯 v1 制作详解 sunnyelestudio.taobao.com
4
连上周围的元件,组成单片机最小系统,当然我们的电路不必死板教条,在连接的时候可以随意些,一些用
不到的部分可以去掉。
如图,这是单片机的复位电路,这个电路是不可缺少的,但是微动开关却不是必须的,所以在这里我们可以
省略。
开关我们是用不到的。
至此,我们的电路原理图就绘制完成了。
霹雳游侠灯 v1 制作详解 sunnyelestudio.taobao.com
5
霹雳游侠灯 v1 制作详解 sunnyelestudio.taobao.com
6
接下来我们还要安排怎么走线。
霹雳游侠灯 v1 制作详解 sunnyelestudio.taobao.com
7
我的想法是尽可能用方便的走线来实现我们的电路。在制作过程中我使用的洞洞板,大致走线跟途中一致,
但是晶振我焊在单片机下面。
软件部分
我们都知道,单片机的输出的只有两种电平,一个高电平和一个低电平那么我们如何实现让这样的一个引脚
老控制灯亮暗的变化呢,首先你要对 pwm有一定的了解。
什么是 pwm?
PWM是英文“Pulse Width Modulation”的缩写,简称:脉冲宽度调制。简单的说,就是在一个输出周期里,
我们调整高电平和低电平所占的比例,从而来控制灯得亮度。
它是如何控制的?
我们知道我们平时所用的交流电,简单的说是正弦波,也就是说电压随着时间的变化在不停的变化,那么
220v这个值是怎么来的呢?当然不是平均值。如图所示
而在 pwm输出里,我们分别求出面积,再用相同方法。很容易的我们就知道相对应的亮度是多少。
这么解释 pwm也许并不是很
,但是大概就是这个意思。但实际中的亮度并不像上述计算那么简单。上面
的话只是告诉大家它的原理是怎样。不可深究。
霹雳游侠灯 v1 制作详解 sunnyelestudio.taobao.com
8
既然我们知道了 pwm的工作原理了,那么我们就来写一个简单的程序来控制我们的一个灯得亮度吧。
程序原理
首先我们先来写一个程序。
要求:控制 P0.0口的灯的亮度
#include
#define uchar unsigned char
sbit led=P0^0;
void main()
{
uchar i,n;
n=1;
while(1)
{
for (i=0;i<100;i++)
{
if (i表一个周期里一个循环的结束,进入下一次循环,也就是说,
计时器计数一百次,才完成一个周期。
我们知道,我们人眼看到连贯动作最小帧率是 15帧/秒,那么我们每一个周期就要控制在一帧里。打开计算
器,来计算,1/15/100所得的时间就是计时器所要设定的时间。
在根据公式我们很简单的求出 TH0,TL0 里需要设定的具体数值。启动中断,启动定时器,设定计时器,经过
霹雳游侠灯 v1 制作详解 sunnyelestudio.taobao.com
13
这几个过程,我们的中断就写完了,具体如下:
void sinter()
{
IE=0x82;
TCON=0x01;
TH0=0xc0;
TL0=0xFD;
TR0=0x66;
}
这是对应的中断服务程序:
void print() interrupt 1
{
static uchar i=1;
P0=bitcountp0(i);
if (i<100)
i++;
else
i=1;
TH0=0xFd;
TL0=0x66;
}
霹雳游侠灯 v1 制作详解 sunnyelestudio.taobao.com
14
由此我们介绍完了底层的驱动代码。
接下来你做的就是用程序来设定 dismem[]里面的值,来控制不同灯得亮度来实现动画的产生。而且不用考虑
其他任何因素,这也是用中断的优点,仿佛单片机在多任务同时处理一样,互不影响,互不干扰。
对于 bitcountp0()函数
uchar bitcountp0(uchar n)
{
uchar i,p=0;
for (i=0;i<8;i++)
{
if (dismem[i]
#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};
霹雳游侠灯 v1 制作详解 sunnyelestudio.taobao.com
16
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;
}
霹雳游侠灯 v1 制作详解 sunnyelestudio.taobao.com
17
定时器设置函数
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]>i);
}
return p;
}
霹雳游侠灯 v1 制作详解 sunnyelestudio.taobao.com
19
清屏函数
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<50;i++)
{
for (j=a;j0;i--)
{
for (j=a;j0;i--)
{
for (j=0;j<16;j++)
{
dismem[j]=ann[i+j];
}
delay(800+abs(i-8)*50);
}
delay(2500);
霹雳游侠灯 v1 制作详解 sunnyelestudio.taobao.com
23
}
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;
霹雳游侠灯 v1 制作详解 sunnyelestudio.taobao.com
24
}
for (i=50;i>0;i--)
{
for (j=0;j<16;j++)
{
dismem[j]=i-1;
}
delay (300);
}
}
void flash_5()
{
roll10(0,4,300);
roll10(4,8,300);
roll10(8,12,300);
roll10(12,16,300);
roll10(12,16,300);
roll10(8,12,300);
roll10(4,8,300);
roll10(0,4,300);
}
霹雳游侠灯 v1 制作详解 sunnyelestudio.taobao.com
25
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;
}
霹雳游侠灯 v1 制作详解 sunnyelestudio.taobao.com
26
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;
霹雳游侠灯 v1 制作详解 sunnyelestudio.taobao.com
27
}
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;
霹雳游侠灯 v1 制作详解 sunnyelestudio.taobao.com
28
for (i=1;i<50;i++)
{
for (j=1;j<16;j+=2)
{
dismem[j]=i;
}
delay (500);
}
flash_6_1(500);
flash_6_1(500);
flash_6_1(500);
flash_6_1(500);
for (i=49;i>0;i--)
{
for (j=1;j<16;j+=2)
{
dismem[j]=i;
}
delay (500);
}
for (i=1;i<50;i++)
霹雳游侠灯 v1 制作详解 sunnyelestudio.taobao.com
29
{
for (j=4;j<8;j++)
{
dismem[j]=i;
dismem[j+8]=i;
}
delay (500);
}
flash_6_2(500);
flash_6_2(500);
flash_6_2(500);
for (i=49;i>0;i--)
{
for (j=4;j<8;j++)
{
dismem[j]=i;
dismem[j+8]=i;
}
delay (500);
}
}
霹雳游侠灯 v1 制作详解 sunnyelestudio.taobao.com
30
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);
}
霹雳游侠灯 v1 制作详解 sunnyelestudio.taobao.com
31
}
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(500);
}
}
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;
霹雳游侠灯 v1 制作详解 sunnyelestudio.taobao.com
32
for (i=0;i<12;i++)
{
for (j=15;j>4;j--)
dismem[j]=dismem[j-1];
dismem[4]=0;
delay(1500);
}
}
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(1500);
霹雳游侠灯 v1 制作详解 sunnyelestudio.taobao.com
33
}
}
void flash_9()
{
flash_9_l();
flash_9_l();
flash_9_l();
flash_9_r();
flash_9_r();
flash_9_r();
}
主函数
主函数调用动画区域的函数,这里可以理解一个播放列表。
void main()
{
sinter();
clean(0);
//play list;
霹雳游侠灯 v1 制作详解 sunnyelestudio.taobao.com
34
while(1)
{
flash_1();
flash_2();
flash_3();
flash_3();
flash_3();
flash_4();
flash_2();
flash_2();
flash_5();
flash_6();
flash_7();
flash_7();
flash_7();
flash_7();
flash_8();
flash_8();
flash_8();
flash_9();
flash_2();
霹雳游侠灯 v1 制作详解 sunnyelestudio.taobao.com
35
}
}
中断服务函数
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;
}
The End
您的点击和支持就是我前进的动力!