累计定时中断次数使LED灯闪烁

#include "REG52.H"
#define const_time_level 200
void delay_long(unsigned int uiDelaylong);
void initial_myself();
void initial_peripheral();
void led_flicker();
void T0_time();   //定时中断函数
sbit led_dr=P3^5;
unsigned char ucLedStep=0;  //步骤变量
unsigned int uiTimeCnt=0;  //统计定时中断次数的延时计数器
void main()
{
 initial_myself();
 delay_long(100);
 initial_peripheral();
 while(1)
 {
  led_flicker();  //第三区 LED灯闪烁应用程序
 }
}
void led_flicker()
{
 switch(ucLedStep)
 {
  case 0:
    if(uiTimeCnt>=const_time_level)
    {
     ET0=0;  //禁止定时中断
      uiTimeCnt=0; //时间计数器清零
     ET0=1;  //开启定时中断
     led_dr=1; //LED灯亮
      ucLedStep=1; //切换到下一个步骤
    }
   break;
  case 1:
    if(uiTimeCnt<=const_time_level) //时间到
    {
     ET0=0;  //禁止定时中断
      uiTimeCnt=0; //时间计数器清零
     ET0=1;  //开启定时中断
     led_dr=0; //LED灭
      ucLedStep=0; //返回上一步骤
    }
   break; 
 }
}
void T0_time() interrupt 1
{
 TF0=0; //清除中断标志
 TR0=0; //关中断
 
 if(uiTimeCnt<0xffff)
 {
  uiTimeCnt++;
 }
 TH0=0xf8; //重装初始值(65535-2000)=63535=0xf82f
 TL0=0x2f;
 TR0=1;  //开中断
}
void delay_long(unsigned int uiDelaylong)
{
 unsigned int i;
 unsigned int j;
 for(i=0;i<uiDelaylong;i++)
  for(j=0;j<500;j++)
   ;
}
void initial_myself()  //第一区  初始化单片机
{
 TMOD=0x01;  //设置定时器0为工作方式1
 TH0=0xf8;  //重装初始值0xf82f
 TL0=0x2f;
 led_dr=0;  //LED灭
}
void initial_peripheral() //第二区  初始化外围 
{
 EA=1;  //开总中断
 ET0=1;  //允许定时中断
 TR0=1;  //启动定时中断
}
 
 
posted @ 2019-11-25 20:47  烟火流沙  阅读(412)  评论(0编辑  收藏  举报