资源描述
单片机拖尾流水灯
BY-零下21度de水
效果:同时亮5个LED,中间那个最亮,旁边两个渐暗。
原理:利用占空比调节LED亮度。
思路:占空比有两种调节方法,一种是固定脉宽,调节周期,一种是固定周期,调节占空比,该例程用得是前者。
观看效果:
该程序提供给大家参考,抛砖引玉,望大家做出更漂亮的效果。
C源码:
#include <stc12c5a60s2.h>
#define uchar unsigned char
#define uint unsigned int
#define LED P1 /*硬件为P1口输出,大家相应改一下*/
uchar i=0;
uchar Position=0x01; /**/
void Delay(uchar n)
{
uchar i,j,k;
for(i=n;i>0;i--)
for(j=100;j>0;j--)
for(k=100;k>0;k--);
}
void T0_INT(void)interrupt 1
{
uchar dis_tmp;
dis_tmp=Position;
TH0=65432/256;/*定时器T0的中断时间就是固定脉宽,大家仔细看一下就会明白了*/
TL0=65432%256;
if(i<100)i++;
else i=0;
LED=~dis_tmp;/*我的硬件设计是低电平点亮LED,就是灌电流~*/
if(i%10==0) /*调整周期,旁边第一盏灯的周期为脉宽的10倍*/
{
dis_tmp|=dis_tmp<<1|dis_tmp>>1;
LED=~dis_tmp;
}
if(i==0)/*旁边第二盏灯的周期为脉宽的100倍*/
{
dis_tmp|=dis_tmp<<1|dis_tmp>>1|dis_tmp<<2|dis_tmp>>2;
LED=~dis_tmp;
}
}
void main(void)
{
uchar k,g;
ET0=1;
TMOD=0X01;
EA=1;
TH0=55532/256;
TL0=55532%256;
TR0=1;
LED0=0;
while(1)
{
for(g=20;g>0;g--)
{
for(k=7;k>0;k--)
{
Position<<=1;
Delay(g);
}
for(k=7;k>0;k--)
{
Position>>=1;
Delay(g);
}
}
for(g=0;g<20;g++)
{
for(k=7;k>0;k--)
{
Position<<=1;
Delay(g);
}
for(k=7;k>0;k--)
{
Position>>=1;
Delay(g);
}
}
}
}
展开阅读全文