大哲老师 发表于 2024-5-24 19:40:49

stc8h的定时器2延时1s的问题 | 已解决

为啥做不到延时1s呀,我的led灯一直闪很快,代码如下:




#include <STC8H.H>

void Timer2_Isr(void) interrupt 12
{
      P20 = !P20;
}

void Timer2_Init(void)                //1秒@24.000MHz
{
      TM2PS = 0x1E;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
      AUXR &= 0xFB;                        //定时器时钟12T模式
      T2L = 0xFC;                              //设置定时初始值
      T2H = 0x03;                              //设置定时初始值
      AUXR |= 0x10;                        //定时器2开始计时
      IE2 |= 0x04;                        //使能定时器2中断
}

void main(void)
{
      P2M0 &= ~0x01;
      P2M1 &= ~0x01;
      Timer2_Init();
      EA=1;
      while(1);
}      


晓飛飛 发表于 2024-5-24 23:04:07

并非所有系列都有此寄存器,详情请查看数据手册
使用STC8H8K64U测试没有问题,代码如下:
#include "stc8h.h"
#include "intrins.h"

void Timer2_Isr(void) interrupt 12
{
        P34 = !P34;
        P35 = !P34;
}

void Timer2_Init(void)                //500毫秒@11.0592MHz       11.0592MHz 最长定时周期1517ms约1.5s
{
        TM2PS = 0x54;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
        AUXR |= 0x04;                        //定时器时钟1T模式
        T2L = 0xE2;                                //设置定时初始值
        T2H = 0x01;                                //设置定时初始值
        AUXR |= 0x10;                        //定时器2开始计时
        IE2 |= 0x04;                        //使能定时器2中断
}

void main()
{
    EAXSFR();   //
        P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;                                           
        Timer2_Init();                        //初始化Timer2并启动中断
    EA = 1;

    while (1);
}



Lkck8210 发表于 2024-5-24 23:49:57






qike009 发表于 2024-5-25 05:54:31

#include "reg51.h"
#include "intrins.h"

sfr   T2L   =   0xd7;
sfr   T2H   =   0xd6;
sfr   AUXR    =   0x8e;
sfr   IE2   =   0xaf;
#define ET2         0x04
sfr   AUXINTIF =0xef;
#define T2IF      0x01

sfr   P0M1    =   0x93;
sfr   P0M0    =   0x94;
sfr   P1M1    =   0x91;
sfr   P1M0    =   0x92;
sfr   P2M1    =   0x95;
sfr   P2M0    =   0x96;
sfr   P3M1    =   0xb1;
sfr   P3M0    =   0xb2;
sfr   P4M1    =   0xb3;
sfr   P4M0    =   0xb4;
sfr   P5M1    =   0xc9;
sfr   P5M0    =   0xca;

sbit    P10   =   P1^0;

void TM2_Isr() interrupt 12
{
    P10 = !P10;                                 //测试端口
}

void main()
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;

    T2L = 0x66;                                 //65536-11.0592M/12/1000
    T2H = 0xfc;
    AUXR = 0x10;                              //启动定时器
    IE2 = ET2;                                  //使能定时器中断
    EA = 1;

    while (1);
}

测测这个   官方程序

jwd 发表于 2024-5-25 06:43:02

可能是所选芯片没有那个寄存器吧

大哲老师 发表于 2024-5-25 11:25:07

Lkck8210 发表于 2024-5-24 23:49


昨天找到原因了,就是没有使用psw2🤣

小飞侠 发表于 2024-5-25 13:46:02

找到原因就好,官方有例程的,参考一下例程,再对比自己写的代码进行排查

大哲老师 发表于 2024-5-25 14:00:03

小飞侠 发表于 2024-5-25 13:46
找到原因就好,官方有例程的,参考一下例程,再对比自己写的代码进行排查 ...

还不太能理解为啥我用定时器也要使能访问xfr

大哲老师 发表于 2024-5-25 14:01:01

Lkck8210 发表于 2024-5-24 23:49


你这个图 上的内容是在手册哪个部分呀,我用的stc8h8k64u,手册里一直没找这个地方

小飞侠 发表于 2024-5-25 14:26:02

因为使用了扩展的XFR寄存器
页: [1] 2
查看完整版本: stc8h的定时器2延时1s的问题 | 已解决