前一段时间从51c51转过来的一个题目,一直没时间做,今天抽空做了一下,还剩下最后一个没有实现,呵呵,有兴趣的朋友可以试一下,改天把完整的贴上来包括详细的实现方法
实现的时候为了让对比更明显,所以半亮实际上是微亮, 觉得还行的话顶一下,^_^
/***********************************************************************
作者: 好心情
EDN 51 实验板验证通过
流水灯
(1)第1,3,5,7个灯半亮,其余的全亮。
(2)第1个亮1/8,第2个亮2/8,第3个亮3/8,第4个亮4/8,第5个亮5/8,第6个亮6/8,
第7个亮7/8,第8个全亮。
(3)来点小难的,所有的灯逐渐从暗到全亮,再由全亮到暗。
(4)最难的:8个灯从第一个开始依次渐亮,直到最后一个。再从最后一个起渐暗,
直到第一个。如此循环往复。这才是真正的流水灯。
************************************************************************/
# include
# define uchar unsigned char
# define uint unsigned int
# define true 1
# define false 0
# define led P0
code unsigned char stop[3] _at_ 0x3B; //Mon51仿真用!
uint Ton = 100; //最小定时时间
uchar time_count = 1; //
uchar time_count1 = 1;
bit j = 0;
void timer_init(); //定时器初始化
void timer_init() //定时器初始化
{
TMOD = 0x20; //T1定时,工作模式2--8位自动载入;T0定时,工作模式1--16位
//TH0 = (65536-T)/256; //TO初值,控制pwm的周期
//TL0 = (65536-T)%256;
TH1 = (256-Ton); //T1 重载值装入TH1
TL1 = (256-Ton); //T1 初值装入TL1
//TR0 = true; //启动T0
TR1 = true;
ET0 = true; //允许T0中断
ET1 = true; //允许T1中断
EA = true; //开放所有中断
}
void timer1_int() interrupt 3 using 3 //T1中断,占用工作组2
{
time_count++;
if(time_count>201)
{
time_count = 1;
time_count1++;
}
if(time_count1>201)
{
time_count1 = 1;
j = !j;
}
}
void ledshow1(uint count) //第一种花样 1 3 5 7半亮,其他全亮
{
while(count--)
{
if(time_count == 10) //如果条件满足,就关闭1 3 5 7 使其半亮
{
led = 0x55;
}
if(time_count == 1) // 否则,全开
{
led = 0x00;
}
}
}
void ledshow2(uint count) //第二种花样
{
while(count--)
{
switch(time_count)
{
case 1: // 全亮 第8个led
{
led = 0x00;
break;
}
case 20: // 7/8亮 第7个led
{
led = 0x80;
break;
} // 6/8亮 第6个led
case 40:
{
led = 0xc0;
break;
}
case 60: // 5/8亮 第5个led
{
led = 0xe0;
break;
}
case 80: // 4/8亮 第4个led
{
led = 0xf0;
break;
}
case 100: // 3/8亮 第3个led
{
led = 0xf8;
break;
}
case 130: // 2/8亮 第2个led
{
led = 0xfc;
break;
}
case 170: // 1/8亮 第1个led
{
led = 0xfe;
break;
}
}
}
}
void ledshow3 (uint count) //所有的灯逐渐从暗到全亮,再由全亮到暗
{
while(count--)
{
if(j==1) //如果J == 1 从暗到亮
{
if(time_count == time_count1)
{
led = 0xff;
}
if(time_count == 1)
{
led = 0x00;
}
}
if(j==0) //如果j==0 从亮到暗
{
if(time_count == time_count1)
{
led = 0x00;
}
if(time_count ==1)
{
led = 0xff;
}
}
}
}
void delay (uchar time) // 延时
{
uint i;
while(time--)
{
for(i = 0;i<255;i++);
}
}
void main()
{
timer_init();
while(1)
{
ledshow1(55000);
led = 0xff;
delay(5);
ledshow2(55000);
led = 0xff;
delay(5);
ledshow3(65535);
led = 0xff;
delay(5);
}
}
用户1467105 2008-12-4 12:17
用户1644949 2008-4-12 09:50
用户42640 2008-3-17 09:44
用户393306 2008-3-14 15:14
用户42640 2008-3-12 14:49
用户1364249 2008-3-12 14:33