原创 流水灯程序(EDN51)

2008-3-11 17:22 2787 11 17 分类: MCU/ 嵌入式

 


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


文章评论6条评论)

登录后参与讨论

用户1467105 2008-12-4 12:17

呵呵。我也来看看!!1

用户1644949 2008-4-12 09:50

很好,谢谢cat_li了!

用户42640 2008-3-17 09:44

呵呵,是89s51

用户393306 2008-3-14 15:14

是89S51还是其他啊

用户42640 2008-3-12 14:49

o(∩_∩)o...

用户1364249 2008-3-12 14:33

来试试
相关推荐阅读
用户42640 2012-03-28 09:28
评论:@小野兽的小草窝 博客中提到的“【博客 大赛】虚焊,你伤不起~~”
这个确实很重要,不起眼的问题会折腾人很久 ...
用户42640 2010-11-05 14:14
怎样用Realview MDK生成bin文件?
怎样用Realview MDK生成bin文件?       使用RVCT的fromelf.exe工具进行转换。也就是说首先将源文件编译链接成*.axf的文件,然后使用fromelf.exe工具将*....
用户42640 2010-10-28 21:35
新塘M051中文技术参考手册
  今天无意中在网上看到的,这个要比研讨会上光盘上提供的那个中文版详细很多,看了一下,就是英文手册的完整翻译版 需要的朋友可以到这里下载:http://www.wang1jin.com/bbs/vie...
用户42640 2010-10-26 16:50
保护三极管基础
这次出现的问题是使用了ULN2003,由于直接用它的输入级接入模块的输入端,因此出现了问题。 由于电缆上存在分布电感和分布电容,因此很容易出现耦合,在ISO7637的实验中,存在高频脉冲250V,20...
用户42640 2010-08-10 09:04
广岛无冤魂
1945年8月6日,美国的B-29“空中堡垒”轰炸机向日本广岛投下代号为”男孩”(Boy)的原子弹,实施了人类首次核轰炸。 总听到有些人(尤其是中国人)说,战争是日本军国主义者全面发动的,日本人民是受...
用户42640 2010-07-15 16:59
RT-Thread学习笔记--- 初步认识RT-Thread
最近对RT-Thread很感兴趣,准备学习一下,硬件使用安富莱开发板2.0。软件使用keil MDK   RT-Thread的目录结构 其中Bsp是针对各个具体的平台,可以认为是用户代码。为了方...
我要评论
6
11
关闭 站长推荐上一条 /2 下一条