找回密码
 立即注册
查看: 815|回复: 20

STC8H的主频问题

[复制链接]
  • 打卡等级:常住居民I
  • 打卡总天数:61
  • 最近打卡:2025-02-18 18:39:08

13

主题

91

回帖

279

积分

中级会员

积分
279
发表于 2024-5-30 14:34:48 | 显示全部楼层 |阅读模式
同志们这咋搞,我这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:系统版载LED01  P21:系统板载按键SW01
  P2M0 &= ~0x03;
        P2M1 &= ~0x03;
        P_SW2 |= 0x80;
        Timer0_Init();
        EA=1;
        while(1)
        {

        }
}       


回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:394
  • 最近打卡:2025-05-01 03:26:07

16

主题

702

回帖

2470

积分

金牌会员

积分
2470
发表于 2024-5-30 14:57:58 | 显示全部楼层
使用的什么型号
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:394
  • 最近打卡:2025-05-01 03:26:07

16

主题

702

回帖

2470

积分

金牌会员

积分
2470
发表于 2024-5-30 15:01:26 | 显示全部楼层
使用这个选项试试
截图202405301501112788.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:61
  • 最近打卡:2025-02-18 18:39:08

13

主题

91

回帖

279

积分

中级会员

积分
279
发表于 2024-5-30 15:03:16 | 显示全部楼层
小*** 发表于 2024-5-30 15:01
使用这个选项试试

用的就是STC8H8K64U,我这里是这样设置的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:61
  • 最近打卡:2025-02-18 18:39:08

13

主题

91

回帖

279

积分

中级会员

积分
279
发表于 2024-5-30 15:05:29 | 显示全部楼层
小*** 发表于 2024-5-30 15:01
使用这个选项试试

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

#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:系统版载LED01  P21:系统板载按键SW01
  P2M0 &= ~0x03;
        P2M1 &= ~0x03;
        P_SW2 |= 0x80;
        Timer0_Init();
        EA=1;
        while(1)
        {

        }
}       


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:394
  • 最近打卡:2025-05-01 03:26:07

16

主题

702

回帖

2470

积分

金牌会员

积分
2470
发表于 2024-5-30 15:08:10 | 显示全部楼层
你看看我之前的帖子,我也遇到过这种问题
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=7181
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:394
  • 最近打卡:2025-05-01 03:26:07

16

主题

702

回帖

2470

积分

金牌会员

积分
2470
发表于 2024-5-30 15:10:09 | 显示全部楼层
我当时的判断就是"动态调节IRC"有问题,我是只有18.432M不正常,其他都正常,我最高试到24M,35M和44M我没有试
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:61
  • 最近打卡:2025-02-18 18:39:08

13

主题

91

回帖

279

积分

中级会员

积分
279
发表于 2024-5-30 15:30:20 | 显示全部楼层
小*** 发表于 2024-5-30 15:10
我当时的判断就是"动态调节IRC"有问题,我是只有18.432M不正常,其他都正常,我最高试到24M,35M和44M我没 ...

害,我等官方回复吧,看看他们怎么说,我看你那个帖子官方都没有回复你呀
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-04-30 21:39:09
已绑定手机

34

主题

2096

回帖

2206

积分

荣誉版主

积分
2206
发表于 2024-5-30 16:44:22 | 显示全部楼层
本帖最后由 晓飛飛 于 2024-5-30 16:46 编辑

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


  1. #include "stc8h.h"
  2. #include "intrins.h"
  3. void Timer0_Isr(void) interrupt 1
  4. {
  5.         static unsigned int count;
  6.         switch(count++)
  7.         {
  8.                 case 200:
  9.                         P26 = 0;
  10.                 break;
  11.                 case 400:
  12.                         P27 = 0;
  13.                 break;
  14.                 case 600:
  15.                         P26 = 1;
  16.                 break;
  17.                 case 800:
  18.                         P27 = 1;
  19.                 break;
  20.                 case 1000:
  21.                         count = 0;
  22.                 break;
  23.                 default:
  24.                         break;
  25.         }
  26. }
  27. void Timer0_Init(void)                //1毫秒@40MHz
  28. {
  29.         AUXR |= 0x80;                        //定时器时钟1T模式
  30.         TMOD &= 0xF0;                        //设置定时器模式
  31.         TL0 = 0xC0;                                //设置定时初始值
  32.         TH0 = 0x63;                                //设置定时初始值
  33.         TF0 = 0;                                //清除TF0标志
  34.         TR0 = 1;                                //定时器0开始计时
  35.         ET0 = 1;                                //使能定时器0中断
  36. }
  37. void main()
  38. {
  39.     EAXSFR();   //
  40.     P0M0 = 0x00;    P0M1 = 0x00;
  41.     P1M0 = 0x00;    P1M1 = 0x00;
  42.     P2M0 = 0x00;    P2M1 = 0x00;
  43.     P3M0 = 0x00;    P3M1 = 0x00;
  44.     P4M0 = 0x00;    P4M1 = 0x00;
  45.     P5M0 = 0x00;    P5M1 = 0x00;                                            
  46.     Timer0_Init();                        //初始化Timer0并启动中断
  47.     EA = 1;
  48.     while (1);
  49. }
复制代码




1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:61
  • 最近打卡:2025-02-18 18:39:08

13

主题

91

回帖

279

积分

中级会员

积分
279
发表于 2024-5-30 19:10:17 来自手机 | 显示全部楼层
晓飛飛 发表于 2024-5-30 16:44
实测35MHz和40MHz IRC工作频率下都很正常,没有上述问题,下面是代码和测试视频:

[apoyl_aliyunvideo]144 ...

你可以试试我的代码不,把输出脚改了就行,反正我单独跑就24mhz是稳的😔,35,40都不对

点评

用你的代码跑35MHz测试了,完全没有任何问题: [apoyl_aliyunvideo]145[/apoyl_aliyunvideo]  详情 回复 发表于 2024-5-30 20:09
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:28 , Processed in 0.655202 second(s), 110 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表