我给你一个程序,单片机为STC51,晶振为12MHz。
跑马灯采用查表法,定时用查询式定时器,时间为500ms
I/O口用25只引脚,P0,P1,P2都用8个,P3用P3.0,
程序用C语言。
为了取得一个较闹蚂好指哗的观赏效果,对你的要求作了少许修改,
你可以用PROTEUS仿真观看效果。
程序已仿真调试通过。
#include<at89x51.h>
#define unchar unsigned 液逗埋char
unchar table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}
sbit P30=P3^0
void delay500ms()
main()
{
unchar i
while(1)
{
for(i=0i<8i++)
{
P0=table[i]
P1=0xff
P2=0xff
P30=1
delay500ms()
}
for(i=0i<8i++)
{
P0=0xff
P1=table[i]
P2=0xff
P30=1
delay500ms()
}
for(i=0i<8i++)
{
P0=0xff
P1=0xff
P2=table[i]
P30=1
delay500ms()
}
P0=0xff
P1=0xff
P2=0xff
P30=0
delay500ms()
P0=0xff
P1=0xff
P2=0xff
P30=1
delay500ms()
P0=0
P1=0
P2=0
P30=0
delay500ms()
delay500ms()
delay500ms()
delay500ms()
//***************************************************
P0=0xff
P1=0xff
P2=0xff
P30=1
delay500ms()
P0=0xff
P1=0xff
P2=0xff
P30=0
delay500ms()
for(i=8i>0i--)
{
P0=0xff
P1=0xff
P2=table[i-1]
P30=1
delay500ms()
}
for(i=8i>0i--)
{
P0=0xff
P1=table[i-1]
P2=0xff
P30=1
delay500ms()
}
for(i=8i>0i--)
{
P0=table[i-1]
P1=0xff
P2=0xff
P30=1
delay500ms()
}
P0=0xff
P1=0xff
P2=0xff
P30=1
delay500ms()
}
}
void delay500ms()
{
unchar i=10
TMOD=0x01
while(i--)
{
TH0=(65536-50000)/256
TL0=(-50000)%256
TR0=1
while(TF0==0)
TF0=0
}
}
用厅并带驱动IC的灯带,加上控制器就可卜孝以实现跑马流水等效果,这些只是简单的LED效果,可以做组合效果,拖尾流星,爆闪,单色流水跑马。等等。比如SK6812灯珠做的灯带。这类灯带都需要控制全彩的全彩控制器来点亮型伏稿,由控制器给信号到驱动IC这里,实现效果。
很酷的流水灯#include <reg51.h>
typedef unsigned char uchar
#define Ton 40
#define LED P0
sbit leds=P1^4
sbit LED0 = P0^0
sbit LED1 = P0^1
sbit LED2 = P0^2
sbit LED3 = P0^3
sbit LED4 = P0^4
sbit LED5 = P0^5
sbit LED6 = P0^6
sbit LED7 = P0^7
unsigned char Maikuan=0
static unsigned char ledon[8] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}
uchar Occupy_led//占空比越大,灯越亮
bit light
uchar m
void Inittime()
{
TMOD = 0x02//定时器0,工作方式2,自动重装
TH0 = 256-Ton
TL0 = 256-Ton
ET0 = 1
EA = 1
TR0 = 1
}
//定纳兄腊时器0中断
void time0() interrupt 1 using 0
{
Maikuan++
}
void main()
{
unsigned char i = 0,j = 0//初始化i,j
leds=0
Inittime()
while (1)
{
//第1,3,5,7个灯半亮,其余的全亮。
for(i=254i>0i--)
{
while ( Maikuan!=20)
{
LED = 0x00
}
while ( Maikuan!=200)
{
LED = 0x55
}
Maikuan = 0
}
//最难的:8个灯从第一个开始依次渐亮,直到最后一个。再从最后一个起渐暗,直到第一个。如此循环尘弊往复。
for(j = 0j<=7j++)
{
i = 0
while(i!=255) //洞滑 由暗变亮
{
if( Maikuan == 0) // 点亮
{
LED = ledon[j]
}
if(Maikuan == i) // 熄灭
{
LED = 0xff
}
if( Maikuan== 255)
{
i++
}
}
}
for(j=7j>=0j--)
{
i = 0
while(i!=255) // 由亮变暗
{
if(Maikuan == 0) // 熄灭
{
LED = 0xff
}
if( Maikuan == i) // 点亮
{
LED = ledon[j]
}
if( Maikuan == 255)
{
i++
}
}
}
//所有的灯逐渐从暗到全亮,再由全亮到暗。
for (m=254m>0m--)
{
while (Maikuan!=Occupy_led)
{
LED = 0x00
}
while (Maikuan!=127)
{
LED = 0xff
}
Maikuan = 0
if (light)
{
Occupy_led++
}
else
{
Occupy_led--
}
if (Occupy_led==128)
{
Occupy_led = 127
light = !light
}
if (Occupy_led>128)
{
Occupy_led = 0
light = !light
}
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)