原创 指示灯点亮

2009-4-2 13:58 1921 5 5 分类: MCU/ 嵌入式

/*-----------------------------------------------------
 程序功能:LED 闪烁,用 Timer0 实现:
 闪烁速度从 0.5次/秒 到 5次/秒,
 再回到 0.5次/秒,变化的间隔数为10,每个速度维持时间为3秒,
 硬件引脚:P3_4


存在问题:没想到怎么实现第二次及以后的定时器赋值


                   不会每个速度维持时间为3秒,所以只搭个框架


                 希望大家给予帮助,谢谢!
-------------------------------------------------------*/


#include  <STC12C5410AD.h>    /* STC12C5410AD 的头文件,为MCU中各个硬件寄存器定个名称,以便C语言中使用*/


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


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


#define  TRUE    1
#define  FALSE    0
#define  LIGHT_TWOs_C  2000   // 亮时间,
#define  DARK_TWOs_C   2000   // 暗时间


#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  T0MODE2 0x02  // 0000 0010,Timer0工作在模式2 ,8 位自动重加载定时;
#define  T0MODE3 0x03  // 0000 0011,Timer0工作在模式3


#define  T0_TIMER 0x00  // Timer0 工作在定时器模式
#define  T0_COUNTER 0x04 // Timer0 工作在计数器模式
#define  T0_DISGATE 0x00 // Timer0 禁止INT0引脚控制
#define  T0_ENGATE 0x08 // Timer0 允许INT0引脚控制


#define  T1MODE0 0x00  // 0000 0000,Timer0工作在模式0 ,13位定时;
#define  T1MODE1 0x10  // 0000 0001,Timer0工作在模式1 ,16位定时;
#define  T1MODE2 0x20  // 0000 0010,Timer0工作在模式2 ,8 位自动重加载定时;
#define  T1MODE3 0x30  // 0000 0011,Timer0工作在模式3


#define  T1_TIMER 0x00  // Timer1 工作在定时器模式
#define  T1_COUNTER 0x40 // Timer1 工作在计数器模式
#define  T1_DISGATE 0x00 // Timer1 禁止INT1引脚控制
#define  T1_ENGATE 0x80 // Timer1 允许INT1引脚控制


#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  EnINT0_C  0x01
#define  EnT0_C   0x02
#define  EnINT1_C 0x04
#define  EnT1_C   0x08
#define  EnUART_C 0x10
#define  EnADCSPI_C  0x20
#define  EnPCALVD_C  0x40


#define  INT0_DOWN 0x01  // TCON 中对INT0中断信号的控制,下降沿触发;
#define  INT0_LOW 0x00  // TCON 中对INT0中断信号的控制,低电平触发;


#define  INT1_DOWN 0x04  // TCON 中对INT1中断信号的控制,下降沿触发;
#define  INT1_LOW 0x00  // TCON 中对INT1中断信号的控制,低电平触发;


#define  NOIP_C  0x00  /* 无优先级 */


#define  INT0_HIGH  0x01 // IP 寄存器中的优先级设置,IPH暂不处理。
#define  T0_HIGH   0x02
#define  INT1_HIGH  0x04
#define  T1_HIGH   0x08
#define  UART_HIGH  0x10
#define  ADCSPI_HIGH 0x20
#define  PCALVD_HIGH 0x40 



/*********** 主程序 *****************/
bit  g_1ms_flag;   // 1ms中断标志
void main(void)
{
   unsigned int   disp_time;   //显示时间计数器
   bit    cur_disp;  //记忆当前显示状态
   // 初始化硬件
 P3M0 = P3MODE0;         // P3 口初始化
 P3M1 = P3MODE1;


 /* 初始化定时器 */
 
 TMOD = T0MODE1;      // Timer0 工作在模式1 ,16位定时
 AUXR = AUXR&CLR_T0X12_C; // Timer0 工作在12分频
  
   TCON="0";                //未使用外部中断,所以不用定义中断的触发方式
  
   TH0 = TIME1msH_C;
  TL0 = TIME1msH_C;
  TR0 = TRUE;
 
  //初始化中断
  IE = EnT0_C;       // 此处只允许 Timer0 中断
 
  IPH = NOIP_C;       // 此处不设优先级
     IP = NOIP_C; 
  
  //初始化起始状态--亮
  work_disp=LIGHT;    //点亮
  cur_disp=LIGHT;      //记忆当前状态
  disp_time=LIGHT_TWOs_C; //显示时间
 
  g_1ms_flag=FALSE;
  EA="TRUE";          //启动中断
 
  while(1)
  {
     if(g_1ms_flag==TRUE)
     {
       g_1ms_flag=FALSE;
      
       //0.5秒/次闪烁
       disp_time--;  
       if(disp_time==0) 
       {
          if(cur_disp==LIGHT)
          {
             work_disp = DARK;  // 熄灭
         cur_disp= DARK;
         disp_time= DARK_TWOs_C;
          }
          else
          {
             work_disp = LIGHT;  // 点亮
         cur_disp= LIGHT;
         disp_time= LIGHT_TWOs_C;
          }
       }
         
        //1秒/次闪烁
        disp_time--;   //计时
        if(disp_time==0) 
        {
           if(cur_disp==LIGHT)
           {
             work_disp = DARK;  // 熄灭
         cur_disp= DARK;
         disp_time= DARK_TWOs_C;
           }
           else
           {
             work_disp = LIGHT;  // 点亮
         cur_disp= LIGHT;
         disp_time= LIGHT_TWOs_C;
           }
         }
      
       //1.5秒/次闪烁
       disp_time--;  
       if(disp_time==0) 
       {
          if(cur_disp==LIGHT)
          {
             work_disp = DARK;  // 熄灭
         cur_disp= DARK;
         disp_time= DARK_TWOs_C;
          }
          else
          {
             work_disp = LIGHT;  // 点亮
         cur_disp= LIGHT;
         disp_time= LIGHT_TWOs_C;
          }
       }
      
       //2秒/次闪烁
       disp_time--;  
       if(disp_time==0) 
       {
          if(cur_disp==LIGHT)
          {
             work_disp = DARK;  // 熄灭
         cur_disp= DARK;
         disp_time= DARK_TWOs_C;
          }
          else
          {
             work_disp = LIGHT;  // 点亮
         cur_disp= LIGHT;
         disp_time= LIGHT_TWOs_C;
          }
       }
       //2.5秒/次闪烁
       disp_time--;  
       if(disp_time==0) 
       {
          if(cur_disp==LIGHT)
          {
             work_disp = DARK;  // 熄灭
         cur_disp= DARK;
         disp_time= DARK_TWOs_C;
          }
          else
          {
             work_disp = LIGHT;  // 点亮
         cur_disp= LIGHT;
         disp_time= LIGHT_TWOs_C;
          }
       }
       //3秒/次闪烁
       disp_time--;  
       if(disp_time==0) 
       {
          if(cur_disp==LIGHT)
          {
             work_disp = DARK;  // 熄灭
         cur_disp= DARK;
         disp_time= DARK_TWOs_C;
          }
          else
          {
             work_disp = LIGHT;  // 点亮
         cur_disp= LIGHT;
         disp_time= LIGHT_TWOs_C;
          }
       }
      
       //3.5秒/次闪烁
       disp_time--;  
       if(disp_time==0) 
       {
          if(cur_disp==LIGHT)
          {
             work_disp = DARK;  // 熄灭
         cur_disp= DARK;
         disp_time= DARK_TWOs_C;
          }
          else
          {
             work_disp = LIGHT;  // 点亮
         cur_disp= LIGHT;
         disp_time= LIGHT_TWOs_C;
          }
       }
      
       //4秒/次闪烁
       disp_time--;  
       if(disp_time==0) 
       {
          if(cur_disp==LIGHT)
          {
             work_disp = DARK;  // 熄灭
         cur_disp= DARK;
         disp_time= DARK_TWOs_C;
          }
          else
          {
             work_disp = LIGHT;  // 点亮
         cur_disp= LIGHT;
         disp_time= LIGHT_TWOs_C;
          }
       }
      
       //4.5秒/次闪烁
       disp_time--;  
       if(disp_time==0) 
       {
          if(cur_disp==LIGHT)
          {
             work_disp = DARK;  // 熄灭
         cur_disp= DARK;
         disp_time= DARK_TWOs_C;
          }
          else
          {
             work_disp = LIGHT;  // 点亮
         cur_disp= LIGHT;
         disp_time= LIGHT_TWOs_C;
          }
       }
      
       //5秒/次闪烁
       disp_time--;  
       if(disp_time==0) 
       {
          if(cur_disp==LIGHT)
          {
             work_disp = DARK;  // 熄灭
         cur_disp= DARK;
         disp_time= DARK_TWOs_C;
          }
          else
          {
             work_disp = LIGHT;  // 点亮
         cur_disp= LIGHT;
         disp_time= LIGHT_TWOs_C;
          }
       }
      
     }
    
  }
 
  
}
/********************************************/
/*          定时器 0 中断服务               */
/* 说明:  1ms 中断一次,           */
/********************************************/


void  Timer0_Int(void) interrupt 1 using 1
{
 
 TH0 = TIME1msH_C;
 TL0 = TIME1msL_C;
   
 g_1ms_flag = TRUE; 
} <PIXTEL_MMI_EBOOK_2005>2                                                           </PIXTEL_MMI_EBOOK_2005>

PARTNER CONTENT

文章评论0条评论)

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