基于STC51单片机的霓虹灯
设计要求:
- 使用PWM驱动8个LED灯
- 人眼不能观察到灯光全灭
- 灯光要有动画效果
设计概述:
???按照设计要求,为了更直观的说明脉冲宽度调制技术(PWM),所以霓虹灯的动画效果为流水灯形式。所需要的单片机芯片为STC89C52,所用的硬件工具是由华清远见开发的基于STC89C52的智能小车。该小车配备所需要的LED灯模块,8个LED灯由P1口来控制。STC89C52是一种低功耗,高性能的8位微控制器,是加强版的80C51单片机,但是与80C51单片机一样不具备PWM硬件模块,所以我们需要自己写一个程序来软件模拟PWM方波。
??PWM是一种方波,可以实现数字信号控制模拟电路,它有两个重要参数周期或频率,占空比。占空比 = 高电平时间/周期,最小为0%,最大为100%,通过调整占空比来控制高电平,低电平所占比例,进而调控LED灯的亮灭与明暗变化。STC89C52中P1口为低电平有效,将P1口置0,LED灯亮,置1灯灭。若将P1口的电平输出信号调整成高低电平各占50%,即在一个周期内高电平,低电平所占比例都是50%,P1口控制的LED灯将会明暗闪烁。
???市面上的许多51单片机开发板大同小异,都是用P1口控制LED灯,所以在此就不提供智能小车的原理图和实物图。
源代码:
软件模拟PWM方波通常利用定时器来实现。
参考代码1:
#include <reg52.h>
unsigned int pwm = 0;
void Timer0() interrupt 1
{
pwm++;
if(pwm == 500)
{
P1 = 0xfe;
}
else if(pwm == 1000)
{
P1 = 0xff;
}
else if(pwm == 1500)
{
P1 = 0xfd;
}
else if(pwm == 2000)
{
P1 = 0xff;
}
else if(pwm == 2500)
{
P1 = 0xfb;
}
else if(pwm == 3000)
{
P1 = 0xff;
}
else if(pwm == 3500)
{
P1 = 0xf7;
}
else if(pwm == 4000)
{
P1 = 0xff;
}
else if(pwm == 4500)
{
P1 = 0xef;
}
else if(pwm == 5000)
{
P1 = 0xff;
}
else if(pwm == 5500)
{
P1 = 0xdf;
}
else if(pwm == 6000)
{
P1 = 0xff;
}
else if(pwm == 6500)
{
P1 = 0xbf;
}
else if(pwm == 7000)
{
P1 = 0xff;
}
else if(pwm == 7500)
{
P1 = 0x7f;
}
else if(pwm == 8000)
{
P1 = 0xff;
pwm = 0;
}
}
void main()
{
TMOD |= 1<<1;
TMOD &= ~(1<<0);
TMOD &= ~(1<<2);
TMOD &= ~(1<<3);
TL0 = 156;
TH0 = 156;
ET0 = 1;
EA = 1;
TR0 = 1;
while(1)
;
}
参考代码2:
#ifndef _LED_H
#define _LED_H
char pwm_led_ctl(unsigned int led_num);
#endif
#include <reg52.h>
#include "led.h"
char pwm_led_ctl(unsigned int led_num)
{
unsigned int pwm;
for(pwm = 0;pwm <= 2000;pwm++)
{
if(pwm == 1000)
{
P1 &= ~(1<<led_num);
}
else if(pwm == 2000)
{
P1 |= 1<<led_num;
}
}
return 0;
}
#include <reg52.h>
#include "led.h"
void Timer0() interrupt 1
{
unsigned int i;
for(i=0;i<8;i++)
{
pwm_led_ctl(i);
}
}
void main()
{
TMOD |= 1<<1;
TMOD &= ~(1<<0);
TMOD &= ~(1<<2);
TMOD &= ~(1<<3);
TL0 = 156;
TH0 = 156;
ET0 = 1;
EA = 1;
TR0 = 1;
while(1)
;
}
|