晴天电子工作室 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办法,就
是让他们同时受控制。
软件是为硬件服务的。所以我们编写软件的同时要考虑硬件的组成。
首先,我们来控制 P0口得八个灯,我们现在需要考虑的是,八个灯互相不影响,在某一时刻,我们可以让
八个灯的以不同的亮度亮起来。那么我们需要八个变量来
我们设置给它的亮度。由于单片机资源有限,亮度
值小于 100(因为我们的周期是 100,当你给它的值是 100的时候,已经是最亮了)所以我们定义的类型是 uchar
(unsigned char)。为了方便调用,我们定义成数组形式。
uchar dismem[8];
在我们的程序里,一个周期循环 100次,这 100次里,有的时候灯被点亮了,有的时候灯灭了,因为速度很
快所以我们看到的是一个“稳定”的状态,但是由于我们设置它在一个周期里点亮了多少次得不同,我们看到的
这个“稳定”的状态也就不同。
sbit led0=P0^0;
sbit led1=P0^1;
sbit led2=P0^2;
sbit led3=P0^3;
sbit led4=P0^4;
霹雳游侠灯 v1 制作详解 sunnyelestudio.taobao.com
10
sbit led5=P0^5;
sbit led6=P0^6;
sbit led7=P0^7;
void main()
{
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]