LED灯跑马问题

LED灯跑马问题,第1张

我给你一个程序,单片机为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

}

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12392082.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存