新闻中心

EEPW首页>嵌入式系统>设计应用> 玩转单片机,你我都是菜鸟(续3)

玩转单片机,你我都是菜鸟(续3)

作者: 时间:2016-11-25 来源:网络 收藏

voidinit()//定时器初始化
{
TMOD=0x02;//T0方式2,8位自动载入
TH0=256-Ton;//T0初始值
TL0=256-Ton;//重载值
TR0=1;//启动T0
ET0=1;//开T0,T1中断
EA=1;//全局中断允许
}

voidtime0_int()interrupt1using3//T0中断函数,中断1,使用工作组3
{
LEDflag++;//修改LEDflag
}

voidled_on_off()
{
uchari;//i初始化
i=0;//i初始化
while(i!=255)//由暗变亮
{
if(LEDflag==0)//点亮
{
led=0x00;
}
if(LEDflag==i)//熄灭
{
led=0xff;
}
if(LEDflag==255)//修改变量
{
i++;
}


}
i=0;//i初始化
while(i!=255)//由暗变亮
{
if(LEDflag==0)//点亮
{
led=0xff;
}
if(LEDflag==i)//熄灭
{
led=0x00;
}
if(LEDflag==255)//修改变量
{
i++;
}


}
}
题目要求:8个灯从第一个开始依次渐亮,直到最后一个。再从最后一个起渐暗,直到第一个。如此循环往复。这才是真正的流水灯。
(4)程序:
#include
#define uchar unsigned char
# define led P1 //led接在P1口
# define Ton 40 //基准脉宽0.04ms
uchar LEDflag = 0; //全局变量,最大255,保存T0中断次数
uchar code led_off[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void init();
void led_on_off();
void main()
{
init();
while(1)
{

led_on_off();

}
}
void init() //定时器初始化
{
TMOD = 0x02; //T0 方式2,8位自动载入
TH0 = 256 - Ton; //T0初始值
TL0 = 256 - Ton; //重载值
TR0 = 1; //启动T0
ET0 = 1; //开T0,T1中断
EA = 1; //全局中断允许
}

void time0_int() interrupt 1 using 3 //T0中断函数,中断1,使用工作组3
{
LEDflag++; //修改LEDflag
}

void led_on_off()
{
uchar i = 0,j = 0; // i初始化
for(j = 0;j<8;j++)
{
i = 0; // i初始化
while(i!=255) // 由暗变亮
{
if(LEDflag == 0) // 点亮
{
led = led_off[j];
}
if(LEDflag == i) // 熄灭
{
led = 0xff;
}
if(LEDflag == 255) //修改变量
{
i++;
}


}
}
for(j = 8;j>0;j--)
{
i = 0; // i初始化
while(i!=255) // 由暗变亮
{
if(LEDflag == 0) // 点亮
{
led = 0xff;
}
if(LEDflag == i) // 熄灭
{
led = led_off[j-1];
}
if(LEDflag == 255) //修改变量
{
i++;
}


}
}


}

上面是这几个题目的程序,全部是我自己写的或是参考别人程序写的,全部通过调试都能完成题目要求,只是第二个题目不是很完美,效果不是很明显。我这个人很追求完美,但是第二个题目想了很久也没想到更好的思路,也许是思维受到别人程序的限制了,希望能得到你们的指导,也许你会有不一样的思路。其实流水灯的控制很多,但是只要能掌握其原理,变来变去也就那么几种,控制总在你的掌握之中。无论控制什么,个人看法还是掌握原理,只要原理明白,就完全在你的控制之中,俗话说“万变不离其中”吗!就是这个道理。

上一页 1 2 下一页

关键词:单片机流水

评论


技术专区

关闭