专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

51单片机的七彩LED灯渐变调光调色程序

作者:文于鹰   来源:本站原创   点击数:  更新时间:2013年12月06日   【字体:


 //------------------------------------------------------------------------------------
// Main.c
//------------------------------------------------------------------------------------
// Copyright (C) 2013 Shenyang JYXD.
//  WEN BO RUI
// Tool chain: KEIL Full  'c'
//
//#pragma CD OE DB SB       // Compilation directives
#include<reg2051.h>
#include<intrins.h>
#define uchar unsigned char
#define uint  unsigned int
uint  Period;                 //Period刷新周期
uint  PWM;
uint  Pulse;         //脉冲个数
uchar Speed;         //速度变量
uchar count;
uint excount;
bit Gra;          //渐变/跳变总控制位
bit Gra7;          //七彩渐亮渐灭控制位
bit Gra3;          //红绿蓝渐亮渐灭控制位
bit BP;           //亮到暗,暗到亮转换位
bit LEDdelay ;                                //LED定时到标志位
sbit key1 = P3^1;           //花样组合键1 
sbit key2 = P3^0;             //花样组合键2
sbit key3 = P3^5;             //速度组合键1
sbit key4 = P3^4;        //速度组合键2
uchar led1[12]={0x10,0x030,0x20,0x60,0x40,0x50,0x70,0x50,0x40,0x60,0x20,0x30};//红、黄、绿、青、蓝、粉、白、粉、蓝、青、绿、黄
uchar led2[24]={0x10,0x00,0x30,0x00,0x20,0x00,0x60,0x00,0x40,0x00,0x50,0x00,
    0x70,0x00,0x50,0x00,0x40,0x00,0x60,0x00,0x20,0x00,0x30,0x00};
uchar led3[3]={0x10,0x20,0x40};     //红、绿、蓝
uchar ledcount,ledcount1;
//***********************************************************
//以下定义函数
// 1毫秒延时函数delayms();花样及速度扫描函数keyscan();
//***********************************************************
/*void delayms(unsigned int ms)
{
    unsigned char i ;
    while(ms--)
     {
        for(i = 0 ; i < 120 ; i++) ;
     }
}*/
void Pattern1();             //花样1函数--------->跳变无灭灯过程
void Pattern2();             //花样2函数--------->跳变有灭灯过程
void Pattern34();
void keyscan()
{
 if((key4==1)&&(key3==1))  {Speed   = 20;Period = 25;}   //预设4种速度200MS
 if((key4==0)&&(key3==1))  {Speed   = 50;Period = 50;}    //500MS
 if((key4==1)&&(key3==0))  {Speed   = 100;Period = 100;}    //1S
 if((key4==0)&&(key3==0))  {Speed   = 150;Period = 200;}    //1.5S
 if((key2==1)&&(key1==1))  {ledcount1 = 0;Pattern1();}   //预设4种花样
    if((key2==0)&&(key1==1))  {ledcount1 = 0;Pattern2();}
 if((key2==1)&&(key1==0))  {ledcount = 0;Gra3 = 1;Pattern34();}
 if((key2==0)&&(key1==0))  {ledcount = 0;Gra7 = 1;Pattern34();}
}
void value()
{
 if(Speed == 20) PWM = Pulse*8;
 if(Speed == 50) PWM = Pulse*4;         //脉冲个数
 if(Speed == 100)PWM = Pulse*2;
 if(Speed == 150)PWM = Pulse;
}
void Reset(void)
{
 unsigned char code rst[ ]={0xe4,0xc0,0xe0,0xc0,0xe0,0x32};
 (*((void (*)(void))(rst)))();
}
void main()
{
 _nop_ ();
 _nop_ ();
 _nop_ ();
 P1 = 0;
 TMOD = 0x11;             //11.0592M晶振的10ms定时初值(100分之一秒)
 TH0  = 0x0db;
 TL0  = 0x0ff;
 TH1  = 0x0ff;             //0.05ms(20000分之一秒)
 TL1  = 0x0D1;
 EA = 1;                       //开启总中断允许
 ET0 = 1;                     //允许T0定时器中断
 ET1 = 1;                     //允许T1定时器中断
 TR0 = 1;                    //开启T0定时器
 EX0=1;               //开外部中断0
  IT0=1;               //下降沿触发
 while(1)
 {
 
  keyscan();
 }
}
//*************************************************************************
//Pattern1() 花样函数1-------------跳变无灭灯过程
//*************************************************************************
void Pattern1()
{
 //keyscan();
 Gra = 0;              //跳变位=0
 if(LEDdelay)
  {
   LEDdelay = 0;
   P1 = led1[ledcount];
   ledcount++;
   if(ledcount>11)
    {
     ledcount = 0;
    }
  }
}
//***********************************************************************
//Pattern2() 花样函数2-------------跳变有灭灯过程
//***********************************************************************
void Pattern2()
{
 //keyscan();
 Gra = 0;
 if(LEDdelay)
  {
   LEDdelay = 0;
   P1 = led2[ledcount];
   ledcount++;
   if(ledcount>23)
    {
     ledcount = 0;
    }
  }  
}
//***********************************************************************
//Pattern3() 花样函数3-------------3彩渐变
//***********************************************************************
/*void Pattern3()
{
 keyscan();
 if(Speed == 20) Period = 25;
 if(Speed == 50) Period = 50;
 if(Speed == 100)Period = 100;  
 if(Speed == 150)Period = 200;
 Gra = 1;
 Gra3 = 1;
}*/
//***********************************************************************
//Pattern4() 花样函数4-------------7彩渐变
//***********************************************************************
void Pattern34()
{
 Gra = 1;             //渐变位 = 1
}
/*********************************************************/
// 定时器0中断服务程序
/*********************************************************/
void time0(void) interrupt 1
{
 TR1 =0;
 TF0 =0;
 TH0=0xdb;           //重新写入初值
 TL0=0xff; 
    if(!Gra)           //执行跳变程序
  {
   count ++;
   if(count > Speed)
    {
     LEDdelay = 1;
     count = 0;
    }
  }
 if(Gra)
  {
   TR1 = 1;         //开启TR1;
   if(!BP)             //      
    {
      if(Gra7)
      {
       P1 = led1[ledcount1];  //10ms到,亮相应的LED
      }
     if(Gra3)
      {
       P1 = led3[ledcount1];  //10ms到,亮相应的LED
      }
     Pulse++;
     value();
     if(Pulse >= Period)
      {
       Pulse = Period;
       BP = 1;      //一个周期完成转换模式
      }
    }
   if(BP)
    {
     if(Gra7)
      {
       P1 = led1[ledcount1];  //10ms到,亮相应的LED
      }
     if(Gra3)
      {
       P1 = led3[ledcount1];  //10ms到,亮相应的LED
      }
     value();    
     Pulse--;       //脉冲个数
     if(Pulse == 0)
      {
       Pulse = 0;
       BP = 0;      //一个周期完成转换模式
       ledcount1++;
       if(Gra7)
       {
        if(ledcount1 > 11)
         {
          ledcount1 = 0;
         }
         Gra7 = 0;
          }
       if(Gra3)
       {
        if(ledcount1 > 2)
         {
          ledcount1 = 0;
         }
         Gra3 = 0;
          }
      }
    }
  }
}
/*********************************************************/
// 定时器1中断服务程序
/*********************************************************/
void timer1() interrupt 3
{
 PWM --;
 TH1  = 0xff;         //0.05ms(20000分之一秒)
 TL1  = 0xD1;
 if(PWM == 0)
  {
   P1 = 0;
   TR1 = 0;
  }
}
/*********************************************************/
// 外部中断0中断服务程序 下降沿触发
/*********************************************************/
void extern0(void) interrupt 0
{
 IE0 = 0;    // 清标志位
 excount++;
 if(excount>50)      // 50大约3秒
  {
   EA = 0;
   //P1_5 = 1;
   excount = 0;
   Reset();
  }
}

 

关闭窗口

相关文章