原创 for循环闪烁LED

2009-4-8 14:04 2941 2 2 分类: MCU/ 嵌入式

/*-----------------------------------------------------
 程序功能:LED 闪烁,用 Timer0 实现
 闪烁速度变化依次为: 0.5次/秒 ,1次/秒,2次/秒
 工作状态:每个速度维持时间为3秒
 硬件引脚:P3_4
 
 问题:为什么程序进不了for循环里面去?
 现象:指示灯常量。
-------------------------------------------------------*/


#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  T0MODE1 0x01  // 0000 0001,Timer0工作在模式1 ,16位定时;


#define  SET_T0X12_C 0x80  // or AUXR
#define  CLR_T0X12_C 0x7F  // 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;     //工作状态计数


   // 初始化硬件
 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 中断
  
  
  //初始化起始状态--亮 
  bWork_Disp=LIGHT;    //点亮
  bCur_DispStat=LIGHT;      //记忆当前状态
  uiDisp_Time_Val = LIGNT_HALF_C; //显示时间
  uiDisp_Time_Cnt = uiDisp_Time_Val;
  uiWorkStat_TimeCnt = 3000;
  ucWorkStat_Cnt = 3;
 
 
  g_1ms_flag=FALSE;
  EA="TRUE";          //启动中断
 
  while(1)
  {
     if(g_1ms_flag==TRUE)
     {
        g_1ms_flag=FALSE;


    for(;ucWorkStat_Cnt>=0;ucWorkStat_Cnt--)
    { 
                 
         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 if(ucWorkStat_Cnt>1)         
        { 
         
          uiDisp_Time_Val = LIGHT_ONE_C;
           uiWorkStat_TimeCnt = 3000;
          
        } 
        else if(ucWorkStat_Cnt>0)
        
        {
           uiDisp_Time_Val = LIGHT_TWO_C;
           uiWorkStat_TimeCnt = 3000;
          }
        }
   }    
  }  
}
/********************************************/
/*          定时器 0 中断服务               */
/* 说明:  1ms 中断一次,           */
/********************************************/


void  Timer0_Int(void) interrupt 1 using 1
{
 
 TH0 = 0xF8;
 TL0 = 0xCC;
   
 g_1ms_flag = TRUE; 
} <PIXTEL_MMI_EBOOK_2005>4                                                           </PIXTEL_MMI_EBOOK_2005>

PARTNER CONTENT

文章评论0条评论)

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