电子大神的日记本,供应链专家的功夫茶盘,在这里记录、分享与共鸣。

登录以开始

流水灯程序(EDN51)

 

前一段时间从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);  
 } 

博主
cat_li
好心情的博客
欢迎来到好心情的博客,在这里你将看到我学习工作的点点滴滴,有激情,有浮躁,有进步,有消沉所有的一切都与您分享,同时希望有不足的地方请指出,有更多的进步。欢迎一起交流QQ 15942526  我的博客里有部分转帖,一般都会注明,并在内容重给出原链接(不能保证给出的链接一定是原创作者的链接)如果认为侵犯的您的权益,请告知,我会马上删除 老王的个人网站  http://www.wang1jin.com  
点击跳转