原创 一维数组实现LED闪烁

2009-4-8 14:04 2831 3 3 分类: MCU/ 嵌入式

/*-----------------------------------------------------
 程序功能:LED 闪烁,用 Timer0 实现
 闪烁速度从 0.5次/秒 到4次/秒
 工作状态:均分为8个状态,每个速度维持时间为3秒,
 硬件引脚:P3_4
-------------------------------------------------------*/
#include  <STC12C5410AD.h>   /* STC12C5410AD 的头文件,为MCU中各个硬件寄存器定个名称,以便C语言中使用*/


sbit  bWork_Disp = P3^4;   // 用主控显示的名称代替硬件


#define  LIGHT     0  // 亮逻辑值
#define  DARK   1  // 暗逻辑值


#define  TRUE   1
#define  FALSE   0 
#define  LIGNT_HALF_C  1000   // 亮时间,
#define  DARK_HALF_C  1000   // 暗时间


#define   LIGHT_ONE_C   500      // 亮时间,
#define   LIGHT_ONE_C   500   // 亮时间,


#define  LIGHT_TWO_C  250   // 亮时间,
#define  DARK_TWO_C  250   // 暗时间


#define  P3MODE0   0x10   // 00010000,P3.4 设置为开漏输出,其余均为标准 51 口;
#define  P3MODE1   0x10   // 00010000,


/* 定时器参数定义 */


#define  T0MODE0 0x00  // 0000 0000,Timer0工作在模式0 ,13位定时;
#define  T0MODE1 0x01  // 0000 0001,Timer0工作在模式1 ,16位定时;


#define  SET_T0X12_C 0x80  // or AUXR
#define  CLR_T0X12_C 0x7F  // and AUXR


#define  SET_T1X12_C 0x40  // or AUXR
#define  CLR_T1X12_C 0xBF  // and AUXR


#define  TIME1ms_C 0xF8D0  /* 1ms 定时的加载值字节,对应 22.1184MHz 定时器12分频 */  
#define  TIME1msH_C 0xF8  /* 1ms 定时的加载值高字节 */
#define  TIME1msL_C 0xD0  /* 1ms 定时的加载值低字节 */


/* 中断处理参数定义 */
#define  EnT0_C   0x02
 


/*********** 主程序 *****************/


bit  g_1ms_flag;   // 1ms中断标志


void main(void)
{
   unsigned int    uiDisp_Time_Cnt; //  显示时间计数器
   unsigned int  uiDisp_Time_Val; //  每次闪烁时间值
  
   bit      bCur_DispStat;   //记忆当前显示状态
  
   unsigned int         uiWorkStat_TimeCnt;  // 每个显示状态计时
   unsigned char        ucWorkStat_Cnt;     //工作状态计数
   unsigned int       a_uiDisp_Time_Val[16]={LIGNT_HALF_C,
    LIGHT_ONE_C,LIGHT_ONEHALF_C,LIGHT_TWO_C,LIGHT_TWOHALF_C,
                                             LIGHT_THR_C,
                                             LIGHT_THRHALF_C,
                                             LIGHT_FOUR_C,
                                             LIGHT_FOUR_C,
                                             LIGHT_THRHALF_C,
                                             LIGHT_THR_C,
                                             LIGHT_TWOHALF_C,
                                             LIGHT_TWO_C,
                                             LIGHT_ONEHALF_C,
                                             LIGHT_ONE_C,
                                             LIGNT_HALF_C};


   // 初始化硬件
 P3M0 = P3MODE0;    // P3 口初始化
 P3M1 = P3MODE1;


 /* 初始化定时器 */
 
 TMOD = T0MODE1;    // Timer0 工作在模式1 ,16位定时
 AUXR = AUXR&CLR_T0X12_C;  // Timer0 工作在12分频
  
    TCON=0;                   //未使用外部中断,所以不用定义中断的触发方式
  
    TH0 = 0xF8;   //
  TL0 = 0xCC;
  TR0 = TRUE;
 
  //初始化中断
  IE = EnT0_C;    // 此处只允许 Timer0 中断
 
  IPH = NOIP_C;    // 此处不设优先级
      IP = NOIP_C; 
  
  //初始化起始状态--亮
  uiWorkStat_TimeCnt = 3000;
  ucWorkStat_Cnt = 0;
 
  bWork_Disp=LIGHT;    //点亮
  bCur_DispStat=LIGHT;      //记忆当前状态
  uiDisp_Time_Val = a_uiDisp_Time_Val[ucWorkStat_Cnt]; //显示时间
  uiDisp_Time_Cnt = uiDisp_Time_Val;
 
 
 
  g_1ms_flag=FALSE;
  EA="TRUE";          //启动中断
 
  while(1)
  {
     if(g_1ms_flag==TRUE)
     {
        g_1ms_flag=FALSE;



         if(uiWorkStat_TimeCnt!=0)
         {
      uiWorkStat_TimeCnt--;
           
      //0.5秒/次闪
         uiDisp_Time_Cnt--;
         
          if(uiDisp_Time_Cnt==0) 
          {
          if(bCur_DispStat==LIGHT)
           {
               bWork_Disp = DARK;  // 熄灭
         bCur_DispStat= DARK;
         uiDisp_Time_Cnt = uiDisp_Time_Val;
           }
           else
           {
               bWork_Disp = LIGHT;  // 点亮
         bCur_DispStat= LIGHT;
         uiDisp_Time_Cnt = uiDisp_Time_Val;
         }
          }
         }               
                 
        else          
        { 
          ucWorkStat_Cnt++;
          if(ucWorkStat_Cnt>=16)
           {
            ucWorkStat_Cnt=0;
           }
          uiDisp_Time_Val = a_uiDisp_Time_Val[ucWorkStat_Cnt];
           uiWorkStat_TimeCnt = 3000;
          
        } 


   }    
  }  
}
/********************************************/
/*          定时器 0 中断服务               */
/* 说明:  1ms 中断一次,           */
/********************************************/


void  Timer0_Int(void) interrupt 1 using 1
{
 
 TH0 = 0xF8;
 TL0 = 0xCC;
   
 g_1ms_flag = TRUE; 
}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
3
关闭 站长推荐上一条 /3 下一条