打印
[国产单片机]

两定时器T0可以 而T1不可,同样的设置,不知错在哪里

[复制链接]
1779|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fang355|  楼主 | 2016-5-21 13:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*程序说明*/
//按键K1 k2控制LED1输出,K1按键一次灯短亮几秒灭,K2按键一次灯长亮几秒灭,仿真的单片机是STC15W404AS  
#include"STC15W4K.H"
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit LED1=P1^0;   //LED输出口
sbit k1=P3^2;     //LED控制
sbit k2= P3^3;
void timer_inti();
void key1();
void key2();

//------------延时函数,大约延时2.----------------
void Delay20us()                //@11.0592MHz
{
        unsigned char i;

        _nop_();
        _nop_();
        _nop_();
        i = 52;
        while (--i);
}

//--------按键K1开始定时器0----------------------
void key1()
{ //timer_inti();         初始函数至此时, 灯常亮
  if(k1==0)
   {Delay20us();
   if(k1==0)   //
         {
          while(!k1);  //按键松开否?
          LED1=0;
          timer_inti();  //必须有初始化,否则仅开始一次而不能连续第2次以后按键开启
          TR0=1;  //开启T0
         }
   }
}
//----------按键K2开始定时器1----------------------
void key2()
{ //timer_inti();         初始函数至此时, 灯常亮
  if(k2==0)
   {Delay20us();
   if(k2==0)   //
         {
          while(!k2);  //按键松开否?
          LED1=0;  //点亮LED灯
      timer_inti();  //必须有初始化,否则仅开始一次而不能连续第2次以后按键开启  
          TR1=1;  //开启T1
         }
   }
}
//------- T0\ T1初始化 但是保持不开启定时器 ,仅让K1\K2按键启动定时器---------------
void timer_inti()
{
  TMOD=0x11;  //设置T0 T1工作模式1
  TH0=(65536-50000)/256;     
  TL0=(65536-50000)%256;
  TH1=(65536-50000)/256;     
  TL1=(65536-50000)%256;
     EA = 1;  //打开总中断
         ET0=1;  //开定时器0中断
         ET1=1;        //开定时器1中断       
}
  
//---------定时器T0 中断函数--------------
void Timer0() interrupt 1 using 0 //
{   
  static  num1=0,second1=0;
        num1++;
   if(num1>=16)
   {  second1++;
       num1=0;
        }
   if(second1==10)
   {
     second1=0; //必须有此清零,否则仅开始一次而不能连续第2次以后按键开启
     TR0=0;          // 关断T0
         LED1=1;   //关断LED灯
         ET0=0;         // 关断T0中断
         EA=0;         //关断总中断
        }
}
//------  ---定时器T1 中断函数--------------
void Timer1() interrupt 3 using 1 //
{   
  static  num2=0,second2=0;
        num2++;
   if(num2>=16)
   {  second2++;
       num2=0;
        }
   if(second2==20)
   {
     second2=0; //必须有此清零,否则仅开始一次而不能连续第2次以后按键开启
     TR1=0;          // 关断T1
         LED1=1;   //关断LED灯
         ET1=0;         // 关断T1中断
         EA=0;         //关断总中断
                
        }
}
//-----------主函数-----------------------   
void main()
{   
  timer_inti();         //初始函数
   while(1)
   {       
   key1();
   key2();
   }
}

相关帖子

沙发
cjg891224| | 2016-5-21 14:34 | 只看该作者
那是因为你两个定时器初始化完全一样,导致T0与T1同时进入中段,但是T0的优先级高于T1,所以导致TI无法进入中段

使用特权

评论回复
板凳
fang355|  楼主 | 2016-5-25 12:56 | 只看该作者
cjg891224 发表于 2016-5-21 14:34
那是因为你两个定时器初始化完全一样,导致T0与T1同时进入中段,但是T0的优先级高于T1,所以导致TI无法进入 ...

初始化是同样的, 但是开启的TR0 和TR1不是同时, 所以两个定时器 不干扰的。  这个程序在PROTUSE仿真  是可以通过的,  试试STC的ISP仿真器的 实物上  仿真时 出现以上问题。  感觉还是仿真器问题, 谢谢你的解答

使用特权

评论回复
地板
fang355|  楼主 | 2016-6-2 09:39 | 只看该作者
@ **NT018  :是吗 !?STC15W404AS   没有T1  我还不知道,  谢谢提示 !!  我再试试

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

48

帖子

0

粉丝