大哲老师 发表于 2024-5-30 14:34:48

STC8H的主频问题

同志们这咋搞,我这35mhz,40mhz定时器延时好像不准呀,定时器的延时直接用的工具,P20口接的led灯,这都不是1s闪烁,慢了好多,哭了,我用24mhz跑就是对的

#include <STC8H.H>


void Timer0_Isr(void) interrupt 1
{
        static unsigned int T0Count1;
        T0Count1++;
        if(T0Count1 >= 1000)
        {
                P20 = !P20;
                T0Count1 = 0;
        }       
}
//定时器0(16位自动重载)
void Timer0_Init(void)                //1毫秒@35MHz
{
        AUXR |= 0x80;                        //定时器时钟1T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0x48;                                //设置定时初始值
        TH0 = 0x77;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
}

void main(void)
{
        //测试引脚 P20:系统版载LED01P21:系统板载按键SW01
P2M0 &= ~0x03;
        P2M1 &= ~0x03;
        P_SW2 |= 0x80;
        Timer0_Init();
        EA=1;
        while(1)
        {

        }
}       


小飞侠 发表于 2024-5-30 14:57:58

使用的什么型号

小飞侠 发表于 2024-5-30 15:01:26

使用这个选项试试

大哲老师 发表于 2024-5-30 15:03:16

小飞侠 发表于 2024-5-30 15:01
使用这个选项试试

用的就是STC8H8K64U,我这里是这样设置的

大哲老师 发表于 2024-5-30 15:05:29

小飞侠 发表于 2024-5-30 15:01
使用这个选项试试

我单独写了个程序去看那个定时器延时准不准,24mhz,35mhz,40mhz,好像就24mhz是1S的延时{:cry:},这啥情况嘞

#include <STC8H.H>

//P20 是LED灯


//void Timer0_Isr(void) interrupt 1
//{
//        static unsigned int T0Count1;
//        T0Count1++;
//        if(T0Count1 >= 1000)
//        {
//                P20 = !P20;
//                T0Count1 = 0;
//        }       
//}
////定时器0(16位自动重载)
//void Timer0_Init(void)                //1毫秒@35MHz
//{
//        AUXR |= 0x80;                        //定时器时钟1T模式
//        TMOD &= 0xF0;                        //设置定时器模式
//        TL0 = 0x48;                                //设置定时初始值
//        TH0 = 0x77;                                //设置定时初始值
//        TF0 = 0;                                //清除TF0标志
//        TR0 = 1;                                //定时器0开始计时
//        ET0 = 1;                                //使能定时器0中断
//}
void Timer0_Isr(void) interrupt 1
{
        static unsigned int T0Count1;
        T0Count1++;
        if(T0Count1 >= 1000)
        {
                P20 = !P20;
                T0Count1 = 0;
        }       
}

void Timer0_Init(void)                //1毫秒@24.000MHz
{
        AUXR |= 0x80;                        //定时器时钟1T模式
        TMOD &= 0xF0;                        //设置定时器模式
        TL0 = 0x40;                                //设置定时初始值
        TH0 = 0xA2;                                //设置定时初始值
        TF0 = 0;                                //清除TF0标志
        TR0 = 1;                                //定时器0开始计时
        ET0 = 1;                                //使能定时器0中断
}

//void Timer0_Isr(void) interrupt 1
//{
//        static unsigned int T0Count1;
//        T0Count1++;
//        if(T0Count1 >= 1000)
//        {
//                P20 = !P20;
//                T0Count1 = 0;
//        }       
//}

//void Timer0_Init(void)                //1毫秒@30.000MHz
//{
//        AUXR |= 0x80;                        //定时器时钟1T模式
//        TMOD &= 0xF0;                        //设置定时器模式
//        TL0 = 0xD0;                                //设置定时初始值
//        TH0 = 0x8A;                                //设置定时初始值
//        TF0 = 0;                                //清除TF0标志
//        TR0 = 1;                                //定时器0开始计时
//        ET0 = 1;                                //使能定时器0中断
//}


void main(void)
{
        //测试引脚 P20:系统版载LED01P21:系统板载按键SW01
P2M0 &= ~0x03;
        P2M1 &= ~0x03;
        P_SW2 |= 0x80;
        Timer0_Init();
        EA=1;
        while(1)
        {

        }
}       


小飞侠 发表于 2024-5-30 15:08:10

你看看我之前的帖子,我也遇到过这种问题
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=7181

小飞侠 发表于 2024-5-30 15:10:09

我当时的判断就是"动态调节IRC"有问题,我是只有18.432M不正常,其他都正常,我最高试到24M,35M和44M我没有试

大哲老师 发表于 2024-5-30 15:30:20

小飞侠 发表于 2024-5-30 15:10
我当时的判断就是"动态调节IRC"有问题,我是只有18.432M不正常,其他都正常,我最高试到24M,35M和44M我没 ...

{:cry:}害,我等官方回复吧,看看他们怎么说,我看你那个帖子官方都没有回复你呀

晓飛飛 发表于 2024-5-30 16:44:22

本帖最后由 晓飛飛 于 2024-5-30 16:46 编辑

实测35MHz和40MHz IRC工作频率下都很正常,没有上述问题,下面是代码和测试视频:

144
#include "stc8h.h"
#include "intrins.h"
void Timer0_Isr(void) interrupt 1
{
      static unsigned int count;
      switch(count++)
      {
                case 200:
                        P26 = 0;
                break;
                case 400:
                        P27 = 0;
                break;
                case 600:
                        P26 = 1;
                break;
                case 800:
                        P27 = 1;
                break;
                case 1000:
                        count = 0;
                break;
                default:
                        break;
      }
}

void Timer0_Init(void)                //1毫秒@40MHz
{
      AUXR |= 0x80;                        //定时器时钟1T模式
      TMOD &= 0xF0;                        //设置定时器模式
      TL0 = 0xC0;                              //设置定时初始值
      TH0 = 0x63;                              //设置定时初始值
      TF0 = 0;                              //清除TF0标志
      TR0 = 1;                              //定时器0开始计时
      ET0 = 1;                              //使能定时器0中断
}

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;                                          
    Timer0_Init();                        //初始化Timer0并启动中断
    EA = 1;
    while (1);
}





大哲老师 发表于 2024-5-30 19:10:17

晓飛飛 发表于 2024-5-30 16:44
实测35MHz和40MHz IRC工作频率下都很正常,没有上述问题,下面是代码和测试视频:

144 ...

你可以试试我的代码不,把输出脚改了就行,反正我单独跑就24mhz是稳的😔,35,40都不对
页: [1] 2
查看完整版本: STC8H的主频问题