pjagz 2024-07-13 02:04 采纳率: 66.7%
浏览 20
已结题

单片机STC15W定时计数器溢出中断汇编触发?

下面这段汇编代码在STC15W408AS 芯片就不灵了,定时计数器没触发中断?


;STC15W408AS 24MHz内部时钟
    AUXR EQU 0x8E             ;辅助寄存器
    ORG     000H
    AJMP     R0_INIT
    ORG        000BH
    AJMP    TIR0_ISR
    ORG     60H
R0_INIT:                    ;@24.000MHz
    MOV     SP,#60H
    ORL        AUXR,#80H        ;定时器时钟1T模式
;    ANL        AUXR,#80H
    ANL        TMOD,#0F0H        ;设置定时器模式
    MOV        TL0,#0D8H        ;设置定时初始值
    MOV        TH0,#0FFH        ;设置定时初始值
    CLR        TF0                ;清除TF0标志
    SETB    TR0                ;定时器0开始计时
    SETB    ET0                ;使能定时器0中断
    SJMP    $
;    JNB        TF0,R0_INIT

TIR0_ISR:
    CLR        TF0                ;清除TF0标志
    CLR        TR0
    CPL        P3.3
    MOV        TL0,#0D8H        ;设置定时初始值
    MOV        TH0,#0FFH        ;设置定时初始值
    SETB    ET0                ;允许T0溢出中断
    SETB    TR0                ;定时器0开始计数
    RETI

    END
//****************************************************************************
下面C代码:定时计数器设置可以触发中断

sbit DPIO3=P3^3; 
void T1ms(uint x);
void TIN0Config();

void main(void)
{
    TIN0Config();
    while(1)
    { 
       T1ms(1);
    }    
 }

void TIN0Config()
{
    AUXR |= 0x80;   //定时器时钟0x80 1T 模式
    TMOD &= 0xF0;   //设置定时计数器工作方式
    TH0 = 0xFF; 
    TL0 = 0xD8;
    
    TF0=0;      //清除TF0标志
    ET0 = 1;      //开启定时器1中断
    EA = 1;
    TR0 = 1;     //开启定时器
}

void Time0(void) interrupt 1    //定时器0中断, 
                                
{
    TF0=0;
    TH0 = 0xFF;                  //重新赋初值
    TL0 = 0xD8;
    DPIO3=1;
        T1ms(20);
       DPIO3=0;
}

 void T1ms(uint x)     //延时
{
    uint i;
    uchar j;
    for(i=x;i>0;i--)
        for(j=110;j>0;j--);
}

//汇编代码(来自STC烧录工具)定时器哪里设错了?
//
  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2024-07-13 02:05
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    在分析你的汇编代码时,我们需要确保几个关键点被正确设置,以便定时器能够正常工作并触发中断。以下是一些可能的问题点和建议的检查步骤:

    1. 辅助寄存器AUXR的设置

      • 你的代码中使用了ORL A, #80H来设置定时器时钟为1T模式。这是正确的,但请注意,这条指令实际上是将立即数80H与累加器A的内容进行逻辑或操作。如果你的目的是设置AUXR寄存器,请使用MOV A, #80H来加载立即数,然后使用ORL AUXR, A来更新AUXR。
    2. 定时器模式设置

      • 你使用了ANL TMOD, #0F0H来设置定时器模式。这将清除TMOD的低四位,确保定时器0使用模式1(16位定时器/计数器)。这是正确的,但请确保TMOD寄存器的高四位没有被意外修改。
    3. 定时器初值设置

      • 你设置了TL0TH0的初值为0D8H0FFH,这看起来是正确的,因为它们是定时器0的初始值,用于24MHz时钟下的1ms定时。
    4. 中断使能位ET0和定时器启动位TR0的设置

      • 你正确地设置了ET0TR0,以使能中断和启动定时器。但是,请注意,你的中断服务程序中重新设置了ET0TR0,这可能是不必要的,除非你需要在中断服务程序中重新配置它们。
    5. 中断服务程序TIR0_ISR中的处理流程

      • 在中断服务程序中,你清除了TF0标志,这是正确的。然后你清除了TR0,这可能不是必要的,除非你需要在每次中断后重新启动定时器。此外,你使用了CPL P3.3来切换P3.3引脚的状态,这是可以的。
    6. C语言代码对比

      • C语言代码中,AUXR |= 0x80;是正确的,它直接设置了辅助寄存器的相应位。
      • C语言代码中的定时器设置与汇编代码类似,但请注意C语言代码中没有清除TR0的指令,这可能是一个差异点。
    7. 其他注意事项

      • 确保你的中断向量地址设置正确。STC15系列单片机的中断向量地址可能与8051系列有所不同。
      • 确保你的单片机没有进入低功耗模式,这可能会影响定时器的工作。

    如果你在检查这些点后仍然遇到问题,可能需要进一步检查硬件连接,或者查看单片机的数据手册以获取更详细的配置信息。此外,如果你有STC15W408AS单片机的详细文档或数据手册,它们将是解决问题的宝贵资源。

    至于参考链接,由于我无法提供实时的网络搜索结果,我建议你访问STC官方网站或相关电子论坛,以获取更多关于STC15W408AS单片机的信息和技术支持。

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

报告相同问题?

问题事件

  • 系统已结题 7月22日
  • 已采纳回答 7月14日
  • 创建了问题 7月13日