登录
首页 单片机论坛
回帖 发帖
正文

主题:急!!!关于89C52 T2定时器开不了的问题

点击:1570 回复:4

snn

请问一下各位高手,T2定时器一直都开不了,是怎么回事?
# include
sbit V1=P3^0;  
sbit V2=P3^1;
sbit V3=P3^2;
////////////////////////////////////////////////////////////////////////////////////
//函数名: Wait_Ms()
//功  能: 延时,单位大概是 1ms
//输  入: 延时值 i 单位为mS
//输  出: 无
///////////////////////////////////////////////////////////////////////////////////
void Wait_MS (unsigned char i)
{
  int j;
  for(i;i<0;i--)
  {
    for(j=0;j<178;j++);
}
}
/
////////////////////////////////////////////////////////////////////////////////////
//函数名: timer 0()
//功  能: 定时器中断0,X轴方向速度
//输  入: 无
//输  出: 无
////////////////////////////////////////////////////////////////////////////////////
void timer0(void) interrupt 1 //T0中断
{  TR1=0;
  TR2=0;

   V1=!V1;
}
////////////////////////////////////////////////////////////////////////////////////
//函数名: timer 1()
//功  能: 定时器中断1,y轴方向速度
//输  入: 无
//输  出: 无
////////////////////////////////////////////////////////////////////////////////////
void timer1(void) interrupt 3//T1中断
{  TR0=0;
  TR2=0;
   V2=!V2;
}
////////////////////////////////////////////////////////////////////////////////////
//函数名: timer 2()
//功  能: 定时器中断2,z轴方向速度
//输  入: 无
//输  出: 无
////////////////////////////////////////////////////////////////////////////////////
void timer2(void) interrupt 5 //T2中断
{  TR0=0;
  TR1=0;
  TF2=0;    // T2定时器发生溢出中断时,需要用户软件清除溢出标记,而51的其他定时器是自动清除的
  V3=!V3;
}
////////////////////////////////////////////////////////////////////////////////////
//函数名: Scan_key()
//功  能: 按键扫描
//输  入: 无
//输  出: 无
////////////////////////////////////////////////////////////////////////////////////
unsigned char Scan_key()
{
  unsigned char i,k;
  i = P1 & 0x1c;   //hllibs
  if(i == 0x1c)
   {
     k = 0;  //无按键按下
   }
  else
   {
     //Wait_MS(10);  //延时去抖
     switch(i)
       {
         case 0x18:k=1;break;
         case 0x14:k=2;break;
         case 0x0c:k=3;break;
       }
    }
   return k;
}
////////////////////////////////////////////////////////////////////////////////////
//函数名: main()
//功  能: 主程序的入口,一维移动速度为0-150mm/S可调
//输  入: 无
//输  出: 无
////////////////////////////////////////////////////////////////////////////////////
void main()
{
  int key_val=0;
  EA=0;
  TMOD=0x22;         //T0定时器工作方式2,T1定时器工作方式2,8位自动重载
  TH0= 0x8D;         //4kHz频率,125uS中断一次 ,256-125uS*11.0592M/12=141=0x8D
  TL0= 0x8D;
  TH1= 0x8D;
  TL1= 0x8D;
  TH2= 0xFF;
  TL2= 0xD8;
  RCAP2H=0xFF;        //4kHz频率,125uS中断一次,65536-125uS*11.0592M/12=65421=0xFF8D
  RCAP2L=0xD8;
  T2CON=0x00;         //T2定时器工作方式 为16位定时器自动重载
  EA=1;
  ET0=1;
  ET1=1;
  ET2=1;
 
  V1=0;              
  V2=0;
  V3=0;
//unsigned int hz_shu=4KHZ
//T0_cnt=0;
//T1_cnt=0;
//T2_cnt=0;
  Wait_MS(200);
//T0_over_num=get_T_over_num(hz_shu);
//T1_over_num=get_T_over_num(hz_shu);
//T2_over_num=get_T_over_num(hz_shu);
  while(1)
    {
      key_val = Scan_key();  //扫描按键
      if(key_val != 0)
      Wait_MS(10);
      if(key_val != 0)
         {
             switch(key_val)
            {
               case 1:TR0=1;break;  //开启定时器T0
               case 2:TR1=1;break;  //开启定时器T1
               case 3:TR2=1;break;  //开启定时器T2
            }
          }
       else
          {
             TR0=0;   //无产生脉冲按键按下时,关闭所有定时器
             TR1=0;
             TR2=0;
          }
     }
}
11-09-02 09:41
是不是和中断优先级有关,你在想一想!
11-09-02 12:37
调试可以中断,你的按键程序及定时中断处理编的有问题
11-09-15 12:09
我现在做plc,以前调过,我记得很好调啊就和T0、T1设置的一样就行,主要是设置T2CON,你在看看吧!
11-09-15 15:28

snn

已经搞定了,原来程序没有问题,是仿真环境的问题,内核是51内核,没有T2定时器
11-09-26 16:21

工控新闻

更多新闻资讯