⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 led.c

📁 流水灯 (1)第1
💻 C
字号:
/***********************************************************************
http://blog.ednchina.com/cat_li/91466/message.aspx
好心情出品
流水灯
(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 <AT89x51.h>
# 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);  
 }  

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -