wumei 发表于 2024-7-1 16:52:47

STC8H8K64U, T2/T3/T4做24位定时器不正常 | 已解决

今天在一个项目中打算用24位定时器做个长定时,但忙了一天没结果。
不知是什么原因?
修改分频寄存器TM2PS,TM3PS,TM4PS定时时长没改变!





#include <STC8H.H>

#define ET2         0x04
#define ET3         0x20
#define ET4         0x40

#define T2IF      0x01
#define T3IF      0x02
#define T4IF      0x04

#define PIN_LED1    P46
#define PIN_LED2    P00
#define PIN_LED3    P01


void Reset(void){
//      IAP_CONTR = 0x20;         //软件复位,系统重新从用户代码区开始运行程序
      IAP_CONTR = 0x60;         //软件复位,系统重新从ISP代码区开始运行程序
}
void TM2_Isr() interrupt 12
{
    PIN_LED1 = !PIN_LED1;                                 //测试端口
}

void TM3_Isr() interrupt 19
{
    PIN_LED2 = !PIN_LED2;                                 //测试端口
}

void TM4_Isr() interrupt 20
{
    PIN_LED3 = !PIN_LED3;                                 //测试端口
}

void UART1_Isr() interrupt 4
{
    if (TI)
    {
      TI = 0;                                 //清中断标志
    }
    if (RI)
    {
      RI = 0;                                 //清中断标志
      Reset();
    }
}
void Timer2_Init(void)                //200毫秒@6.000MHz
{
      TM2PS = 0x01;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
      AUXR &= 0xFB;                        //定时器时钟12T模式
      T2L = 0xB0;                              //设置定时初始值
      T2H = 0x3C;                              //设置定时初始值
      AUXR |= 0x10;                        //定时器2开始计时
    IE2 |= ET2;             //使能定时器中断
}

void Timer3_Init(void)                //300毫秒@6.000MHz
{
      TM3PS = 0x02;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
      T4T3M &= 0xFD;                        //定时器时钟12T模式
      T3L = 0xB0;                              //设置定时初始值
      T3H = 0x3C;                              //设置定时初始值
      T4T3M |= 0x08;                        //定时器3开始计时
    IE2 |= ET3;             //使能定时器中断
}

void Timer4_Init(void)                //400毫秒@6.000MHz
{
      TM4PS = 0x03;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
      T4T3M &= 0xDF;                        //定时器时钟12T模式
      T4L = 0xB0;                              //设置定时初始值
      T4H = 0x3C;                              //设置定时初始值
      T4T3M |= 0x80;                        //定时器4开始计时
    IE2 |= ET4;             //使能定时器中断
}
void Uart1_Init(void)      //4800bps@6.000MHz
{
      SCON = 0x50;                //8位数据,可变波特率
      AUXR &= 0xBF;                //定时器时钟12T模式
      AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
      TMOD &= 0x0F;                //设置定时器模式
      TL1 = 0xE6;                        //设置定时初始值
      TH1 = 0xFF;                        //设置定时初始值
      ET1 = 0;                        //禁止定时器中断
      TR1 = 1;                        //定时器1开始计时
    ES = 1;             //使能串口1中断
}

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

    Uart1_Init();

    Timer2_Init();
    Timer3_Init();
    Timer4_Init();
   
    P0 = 0;
    P1 = 0xC0;
    P2 = 0;
    P3 = 3;
    P4 = 0x80;
    P5 = 0;

    EA = 1;

    while (1);
}




_奶咖君_ 发表于 2024-7-1 17:12:12

#define EAXSFR() P_SW2 |= 0x80 ;
/* MOVX A,@DPTR/MOVX @DPTR,A指令的操作对象为扩展SFR(XSFR) */

加上这个,,主函数里面
void main(void){
EAXSFR();
...
}

_奶咖君_ 发表于 2024-7-1 17:12:54

不加这个 你调一个月也调不出来{:4_200:}

wumei 发表于 2024-7-1 17:50:29

谢谢指点。
页: [1]
查看完整版本: STC8H8K64U, T2/T3/T4做24位定时器不正常 | 已解决