qq_45379364 2023-03-04 09:26 采纳率: 82.9%
浏览 49
已结题

51单片机的问题,定时器不工作

请教各位,使用的普中89C52RC单片机,A2版本,但是定时器怎么配置都不工作,直接点LED灯是可以的 用是定时器0或1控制就没反应,我都怀疑是不是开发板有问题,请各位帮看一下代码。

#include <REGX52.H>
#include <INTRINS.H>


void Timer0Init(void)        //1??@11.0592MHz
{
//    
//    TMOD |= 0X01;        
//    TL0 = 0x66;        
//    TH0 = 0xFC;        
//    TF0 = 1;        
//    TR0 = 1;        
    
    TMOD |= 0x01;        //设置定时器模?
    TH0 = 0xFC;        //设置定时初值
    TL0 = 0x66;        //设置定时初值
//TF0 = 0;        //清楚TF0标 志
    TR0 = 1;        //定时器0开始计
  ET0=1;
    EA=1;
//   PT0=0;
//     IPH=0x00;

}    

void main() 
{
        void Timer0Init(void);
    
//    P2_1=0;

      while(1) {
  
//            P2_1=0;
    }
  
    }    

void Timer0_Rrountine() interrupt 1
 
{   unsigned int t=0;
    TH0= 0xFC;        //??????
    TL0 = 0x66;        //??????
    t++;
    if(t==1000)
       t=0;
     P2_2=0;
        P2_4 = !P2_4;
}


  • 写回答

3条回答 默认 最新

  • 「已注销」 2023-03-04 09:42
    关注

    “Devil组”引证GPT后的撰写:
    这段代码使用了定时器0中断来控制P2_4口的电平状态,但是在描述中提到无论使用定时器0还是定时器1都无法工作。因此,我建议按照以下步骤进行排查:

    确认开发板是否有问题。可以使用一个已知工作正常的程序进行测试,例如点亮LED灯等。
    确认使用的定时器是否可用。查看单片机的数据手册,确定定时器0和定时器1的相关寄存器及其设置方法。
    确认定时器是否已经正确初始化。在这段代码中,可以先注释掉定时器中断服务函数(Timer0_Routine()函数),只测试定时器是否能够正常计时,并使用P2_4口的电平状态来确认定时器是否在工作。
    确认定时器中断服务函数是否正确。在定时器中断服务函数中,需要清除定时器0的中断标志(TF0)以允许下一次中断发生,并且在定时器中断服务函数中执行的代码需要尽量简短,以避免中断时间过长导致系统稳定性问题。
    

    修改后的代码示例:

    #include <REGX52.H>
    #include <INTRINS.H>
    
    void Timer0Init(void)
    {
    TMOD |= 0x01; //设置定时器0为模式1,16位计数器
    TH0 = 0xFC; //设置定时初值,定时1ms
    TL0 = 0x66; //设置定时初值
    TR0 = 1; //定时器0开始计数
    ET0 = 1; //使能定时器0中断
    EA = 1; //允许中断
    }
    
    void main()
    {
    Timer0Init(); //初始化定时器0
    while (1)
    {
    //主程序循环,这里可以添加其他代码
    }
    }
    
    void Timer0_Routine() interrupt 1
    {
    static unsigned int t = 0;
    TH0 = 0xFC; //重置计时器初值,定时1ms
    TL0 = 0x66;
    TF0 = 0; //清除定时器0中断标志
    t++; //计数器加1
    if (t == 1000)
    {
    t = 0;
    P2_4 = !P2_4; //每1秒钟改变P2_4口的电平状态
    }
    }
    
    

    定时器0设置为16位定时器,使用模式1,定时1ms。在定时器中断服务函数中,首先重置定时器初值,然后清除定时器中断标志,并使用计数器t记录定时器中断的次数,以达到每秒改变P2_4口电平状态的目的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月12日
  • 已采纳回答 3月4日
  • 创建了问题 3月4日

悬赏问题

  • ¥15 请问1553 RT怎么测试,没有BC有方法吗
  • ¥100 业务编程如何选择学习方向和内容?
  • ¥15 wamp3.3.5安装完成后图标正常显示绿色,鼠标左右键点击图标均无反应。求解决方法。
  • ¥15 鼠标点击的这条记录了什么?
  • ¥15 在写pid调速的程序时,电机始终维持最大速度
  • ¥15 【有偿】调用DXGI截图初始化失败,提示0xf 887a0004
  • ¥15 请问如何查看手机root记录?
  • ¥15 商城小程序订单号重复
  • ¥15 学校优化算法sbo和蚁群算法怎么结合
  • ¥21 matlab怎么求时域信号的二阶导数