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

📄 ledtest.c

📁 LED灯火车式队列循环,每只灯亮度64级(PWM方式调整)可单独变化,循环速度可调,亮度采用非线性方式
💻 C
字号:
/***************************************************************************************************************
** 文件名: ledtest.c 
** 版  本: 1.2                        备注:24M晶振,  64级亮度,单步约250us*64=16ms=63Hz
** 日 期: 2006-12-17                      亮度变化1/64s   64Hz
** 描 述: 30LED循环闪烁程序
** 创建人:
/***************************************************************************************************************
** 修改人:
** 版  本:
** 日 期:
** 描 述:
****************************************************************************************************************/

#include <reg51.h>
#include <led_define.h>
#define uchar unsigned char 						
#define uint unsigned int 
#define off 0                 //led的高电平或低电平点亮设置
#define on 1
#define scan_initial_value 64 //定义亮度级数(需同时定义non_linearit数组和timer0(void)的循环值)
#define pace_time 255           //led灯队列步进时间  x * 25ms   (如12*25ms等于 0.3s)
#define T0H 0xc2;//0x85;    //T0的初值  设置每个LED的闪烁周期,    
#define T0L 0xf7;//0xee;    //设置方法:假设闪烁周期为1s, 则计算出(1s/32)的定时器初值,如1s的初值为0x85,0xee;
                            //                                                         2s的初值为0x0b,0xdc;
                            //                                                         0.5s的初值为0xc2,0xf7
/*------全局变量--------*/
uchar nonce_locality0;  //led循环队列的当前首位置(0-29)
uchar scan1;            //PWM扫描
uchar timer1_counter;   //定时器1临时计数器
uchar lum[6];           //非线性亮度队列
uchar led_control[30];  //LED控制开关数组
uchar refe[6];          //时序亮度表
uchar code non_linearit[128]=        //非线性亮度表  一个周期 1s,中间部位为峰值,数值范围在0~16之间,大于16则为最高亮度16
                                    //修改该数组时千万注意数组长度为32个,值在0~16之间
    {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,
     32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,
     63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,
          31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0};
    //{0,2,3,4,5,6,7,8,9,10,11,12,13,14,16,16,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,
      //  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//调试用
   //{16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//调试用
   //{16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16};//调试用
   //{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};//调试用
   //{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//调试用
   //{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31};
   //{0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,12,12,13,13,14,14,15,15,16,16};

/*********************************************************************************************************
** 函数名称: 	clr_tail
** 功能描述: 	清零LED队列后的残留亮灯
** 输    入:   nonce_locality0            
** 输    出:   led_control[x]
** 全局变量:	nonce_locality0  led_control[x]	
** 修改人:
** 日 期:
**********************************************************************************************************/
void clr_tail()
{uchar temp,temp2,a=10;
	     temp2=nonce_locality0;        //led灯队列步进一位时,将最后一位清零
	     for(temp=5;temp!=0;temp--)
	       {  temp2--;
	          if(temp2==0xff) temp2=29;
	       }
	     while(a!=0)
        {led_control[temp2]=off;
        temp2--;
	     if(temp2==0xff) temp2=29;
        a--;
        }
}

/*********************************************************************************************************
** 函数名称: 	a
** 功能描述: 	PWM数据处理
** 输    入:   nonce_locality  led循环队列的当前首位置(0-29)
**             quantity        led循环队列数量
               lum[6]          led亮度表
** 输    出:   led_control[]   led控制表,(nonce_locality向后六位)       
** 全局变量:	lum[6]    led_control[]
** 调用模块: 	clr_tail()
** 修改人:
** 日 期:
**********************************************************************************************************/
void a(uchar nonce_locality,uchar quantity)
{ uchar temp=0;
  
  for( ;temp!=quantity;temp++)     //led队列数量,
   {
     if(nonce_locality==0xff) nonce_locality=29;   //30led首尾衔接
   
     if(lum[temp]>scan1)        //当led亮度计数器加1后值大于或等于参考值时,
          led_control[nonce_locality]=on;                           //  led亮
     else led_control[nonce_locality]=off;                          //  led灭
     nonce_locality--;
   }
  clr_tail();
}

/*********************************************************************************************************
** 函数名称: 	b
** 功能描述: 	led输出至外端口
** 输    入:   led_control[0~29]  
** 输    出:   P0,P1,P2,P3,     (注:为编写简单,P^6,P^7浪费)
** 修    改:   空出p3.4,p3.5口
** 日   期:   2006-12-17
**********************************************************************************************************/
void b()
{                          
  uchar temp1,temp2,temp3;

  if(led_control[0]) temp1=temp1|0x01; else temp1=temp1&0xFE;
  if(led_control[1]) temp1=temp1|0x02; else temp1=temp1&0xFD; 
  if(led_control[2]) temp1=temp1|0x04; else temp1=temp1&0xFB; 
  if(led_control[3]) temp1=temp1|0x08; else temp1=temp1&0xF7; 
  if(led_control[4]) temp1=temp1|0x10; else temp1=temp1&0xEF; 
  if(led_control[5]) temp1=temp1|0x20; else temp1=temp1&0xDF; 
  if(led_control[6]) temp1=temp1|0x40; else temp1=temp1&0xBF; 
  if(led_control[7]) temp1=temp1|0x80; else temp1=temp1&0x7F; 

  if(led_control[8]) temp2=temp2|0x01; else temp2=temp2&0xFE; 
  if(led_control[9]) temp2=temp2|0x02; else temp2=temp2&0xFD; 
  if(led_control[10]) temp2=temp2|0x04; else temp2=temp2&0xFB; 
  if(led_control[11]) temp2=temp2|0x08; else temp2=temp2&0xF7; 
  if(led_control[12]) temp2=temp2|0x10; else temp2=temp2&0xEF; 
  if(led_control[13]) temp2=temp2|0x20; else temp2=temp2&0xDF; 
  if(led_control[14]) temp2=temp2|0x40; else temp2=temp2&0xBF; 
  if(led_control[15]) temp2=temp2|0x80; else temp2=temp2&0x7F; 
  
  if(led_control[16]) temp3=temp3|0x01; else temp3=temp3&0xFE; 
  if(led_control[17]) temp3=temp3|0x02; else temp3=temp3&0xFD; 
  if(led_control[18]) temp3=temp3|0x04; else temp3=temp3&0xFB; 
  if(led_control[19]) temp3=temp3|0x08; else temp3=temp3&0xF7; 
  if(led_control[20]) temp3=temp3|0x10; else temp3=temp3&0xEF; 
  if(led_control[21]) temp3=temp3|0x20; else temp3=temp3&0xDF; 
  if(led_control[22]) temp3=temp3|0x40; else temp3=temp3&0xBF; 
  if(led_control[23]) temp3=temp3|0x80; else temp3=temp3&0x7F; 
  
  /*if(led_control[24]) temp4=temp4|0x01; else temp4=temp4&0xFE; 
  if(led_control[25]) temp4=temp4|0x02; else temp4=temp4&0xFD; 
  if(led_control[26]) temp4=temp4|0x04; else temp4=temp4&0xFB; 
  if(led_control[27]) temp4=temp4|0x08; else temp4=temp4&0xF7; 
  if(led_control[28]) temp4=temp4|0x10; else temp4=temp4&0xEF; 
  if(led_control[29]) temp4=temp4|0x20; else temp4=temp4&0xDF; */
  
  P0=temp1; 
  P1=temp2;
  P2=temp3;
  if(led_control[24]) led_25=1; else led_25=0;
  if(led_control[25]) led_26=1; else led_26=0;
  if(led_control[26]) led_27=1; else led_27=0;
  if(led_control[27]) led_28=1; else led_28=0;
  if(led_control[28]) led_29=1; else led_29=0;
  if(led_control[29]) led_30=1; else led_30=0;
  

  //P3=temp4;                 //若P^6,P^7口有其它用途,在此修改
  
 }
  
/*********************************************************************************************************
** 函数名称: 	RL
** 功能描述: 	数组refe左移一位
** 输    入:   refe[0~5]           
** 输    出:   refe[0~5]  
** 修改人:
** 日 期:
**********************************************************************************************************/ 
void RL()    
{
  refe[5]=refe[4];
  refe[4]=refe[3];
  refe[3]=refe[2];
  refe[2]=refe[1];
  refe[1]=refe[0];
  refe[0]=0;
}

/*********************************************************************************************************
** 函数名称: 	initTimer
** 功能描述: 	定时器中断设置,赋初值
** 输    入:   refe[0~5]           
** 输    出:   refe[0~5]  
** 修改人:
** 日 期:
**********************************************************************************************************/ 
void initTimer(void)
{
 TMOD=0x11;
 TH0=T0H;
 TL0=T0L;
 TH1=0x3c;
 TL1=0xb0;
}

/*********************************************************************************************************
** 函数名称: 	timer0      T0中断函数
** 功能描述: 	led亮度变化控制  完成refe累加,0~31循环,查表
** 输    入:   refe[0~5]
**             non_linearit[0~31]
** 输    出:   lum[0~5]
**         
** 全局变量:	lum[6]   refe[6]  non_linearit[32]
** 修改人:
** 日 期:
**********************************************************************************************************/
void timer0(void) interrupt 1     //15625us
{ 
  TH0=T0H;
  TL0=T0L;
 refe[0]++;
 refe[1]++;
 refe[2]++;
 refe[3]++;
 refe[4]++;
 refe[5]++;
 if(refe[0]==128) refe[0]=0;      //64  在此改亮度级数
 if(refe[1]==128) refe[1]=0;
 if(refe[2]==128) refe[2]=0;
 if(refe[3]==128) refe[3]=0;
 if(refe[4]==128) refe[4]=0;
 if(refe[5]==128) refe[5]=0;
 lum[0]=non_linearit[refe[0]];
 lum[1]=non_linearit[refe[1]];
 lum[2]=non_linearit[refe[2]];
 lum[3]=non_linearit[refe[3]];
 lum[4]=non_linearit[refe[4]];
 lum[5]=non_linearit[refe[5]];

}

/*********************************************************************************************************
** 函数名称: 	tomer1      T1中断函数
** 功能描述: 	LED步进控制   
** 输    入:   nonce_locality0   led循环队列的当前首位置(0-29)
**             pace_time         预定义LED步进时间
               timer1_counter    T1临时计数器
** 输    出:   nonce_locality0   
**             
** 全局变量:	nonce_locality0     timer1_counter    pace_time
** 调用模块: 	RL()
** 修改人:
** 日 期:
**********************************************************************************************************/
void timer1(void) interrupt 3    //50ms   *6=0.3s
{
 TH1=0x3c;
 TL1=0xb0;
 for(++timer1_counter;timer1_counter==pace_time;timer1_counter=0)  //pace_time 灯步进时间在此修改 该数字*50ms
   {


        nonce_locality0++;
	     if(nonce_locality0==30) nonce_locality0=0;   //30led首尾衔接(0~29)
	     RL();
     
		 refe[0]++;        //nonce_locality0改变后,调用T0的亮度变化控制 否则队列第一只灯有轻微不规则闪烁
		 refe[1]++;
		 refe[2]++;
		 refe[3]++;
		 refe[4]++;
		 refe[5]++;
		 if(refe[0]==32) refe[0]=0;
		 if(refe[1]==32) refe[1]=0;
		 if(refe[2]==32) refe[2]=0;
		 if(refe[3]==32) refe[3]=0;
		 if(refe[4]==32) refe[4]=0;
		 if(refe[5]==32) refe[5]=0;
		 lum[0]=non_linearit[refe[0]];
		 lum[1]=non_linearit[refe[1]];
		 lum[2]=non_linearit[refe[2]];
		 lum[3]=non_linearit[refe[3]];
		 lum[4]=non_linearit[refe[4]];
		 lum[5]=non_linearit[refe[5]];
   }
}



/*---主函数------------------------------------------------------------------------------*/
main()
{ uchar tep;
  bit temp=1;
  initTimer();   //中断定时器赋初值
  TR0=1;
  ET0=1;
  TR1=1;
  ET1=1;
  EA=1;
   
  P0=0Xff;      //端口清零
  P1=0xff;
  P2=0xff;
  P3=0xff;
  for(tep=29;tep!=0xff;tep--)  //led开关清零
    led_control[tep]=off;

  nonce_locality0=16;

  while(temp)
  { 
     a(nonce_locality0,6);
     b();
     scan1++;
     if(scan1==scan_initial_value) scan1=0;
  }
}


⌨️ 快捷键说明

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