找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 177|回复: 8
打印 上一主题 下一主题
收起左侧

关于STC8H1K08单片机时钟问题

[复制链接]
跳转到指定楼层
楼主
ID:65237 发表于 2025-5-20 09:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
想用STC8H1K08单片机做一个315的解码和控制,在坛里找了一个带学习功能,用普通51测试没问题,想改用STC8H1K08单片机做,发现解不了码,查后发现时钟不一样,普通51是12个时钟周期这个STC8H1K08是1个时钟周期,坛朋们这个要怎么把STC8H1K08改有和51的一样周期,望高手们指点一下
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:65237 发表于 2025-5-21 09:16 | 只看该作者
没人用个STC的单片机吗
回复

使用道具 举报

板凳
ID:227818 发表于 2025-5-21 09:50 | 只看该作者
这个很简单,看你用的哪个定时器,如果是T0、T1、或T2,在AUXR中设定是12个时钟周期或1个时钟周期,T3或者T4,在T4T3M中设定,具体看下这个单片机的手册。
回复

使用道具 举报

地板
ID:72649 发表于 2025-5-21 11:58 来自触屏版 | 只看该作者
把你的程序发上来
回复

使用道具 举报

5#
ID:584814 发表于 2025-5-22 17:19 | 只看该作者
你在坛内搜索的工程就那么保密么 ?
你当大家都有你说的代码和硬件么 ?
不想发工程文件可以不问,毕竟这不是算命论坛玩猜猜猜
回复

使用道具 举报

6#
ID:1110477 发表于 2025-5-23 03:31 | 只看该作者
STC的烧录器可以修改周期,但我以前改了也没用
回复

使用道具 举报

7#
ID:1151360 发表于 2025-5-23 09:15 | 只看该作者
STC8H1K08是1T单片机(1个时钟周期执行1条指令),而传统51是12T(12个时钟周期执行1条指令)。这导致原有代码中的时序逻辑(延时、定时器)在STC8H上运行速度快了12倍,无法正确解码315MHz信号。  解决方案: 1. 修改定时器分频系数(推荐) STC8H的定时器支持独立分频,无需降低主频即可解决时序问题。假设原51使用12MHz晶振,定时器配置为12分频,移植到STC8H时需调整如下:  c // 定时器初始化示例(Timer0) void Timer0_Init(void) {     AUXR |= 0x80;       // 定时器0设置为1T模式     TMOD &= 0xF0;       // 清除定时器0模式位     TMOD |= 0x01;       // 定时器0设为模式1(16位自动重载)     TL0 = 0x00;         // 初始化计时值     TH0 = 0x00;     ET0 = 1;            // 使能定时器0中断     TR0 = 1;            // 启动定时器0     // 关键设置:定时器时钟分频(假设原51为12分频)     T0H = (65536 - (FOSC / 12 / 1000)) >> 8;  // 举例:1ms中断     T0L = (65536 - (FOSC / 12 / 1000)) & 0xFF; } 2. 调整系统时钟分频 若解码逻辑依赖全局延时(如nop循环),可降低系统时钟至原51的1/12:  c // 在程序初始化时设置时钟分频 CLKDIV = 0x0B;          // 系统时钟12分频(主频=外部晶振/12) 3. 修改软件延时函数 若代码中有基于循环的软件延时,需将延时倍数调整为12倍:  c void Delay1ms() {     unsigned int i, j;     for (i=0; i<12; i++) {  // 原循环次数乘以12         for (j=0; j<1000; j++);     } } 4. 检查外部中断配置 315MHz解码通常依赖外部中断检测信号边沿。确保STC8H的IO口模式配置正确(建议设置为高阻输入):  c P1M1 |= 0x01;   // P1.0设为高阻输入 P1M0 &= ~0x01; IT0 = 1;        // 设置INT0为下降沿触发 EX0 = 1;        // 使能INT0中断 EA = 1;         // 全局中断使能
回复

使用道具 举报

8#
ID:1151360 发表于 2025-5-23 09:16 | 只看该作者
STC8H1K08是1T单片机(1个时钟周期执行1条指令),而传统51是12T(12个时钟周期执行1条指令)。这导致原有代码中的时序逻辑(延时、定时器)在STC8H上运行速度快了12倍,无法正确解码315MHz信号。

解决方案:
1. 修改定时器分频系数(推荐)
STC8H的定时器支持独立分频,无需降低主频即可解决时序问题。假设原51使用12MHz晶振,定时器配置为12分频,移植到STC8H时需调整如下:
// 定时器初始化示例(Timer0)
void Timer0_Init(void) {
    AUXR |= 0x80;       // 定时器0设置为1T模式
    TMOD &= 0xF0;       // 清除定时器0模式位
    TMOD |= 0x01;       // 定时器0设为模式1(16位自动重载)
    TL0 = 0x00;         // 初始化计时值
    TH0 = 0x00;
    ET0 = 1;            // 使能定时器0中断
    TR0 = 1;            // 启动定时器0
    // 关键设置:定时器时钟分频(假设原51为12分频)
    T0H = (65536 - (FOSC / 12 / 1000)) >> 8;  // 举例:1ms中断
    T0L = (65536 - (FOSC / 12 / 1000)) & 0xFF;
}
2. 调整系统时钟分频
若解码逻辑依赖全局延时(如nop循环),可降低系统时钟至原51的1/12:
// 在程序初始化时设置时钟分频
CLKDIV = 0x0B;          // 系统时钟12分频(主频=外部晶振/12)
3. 修改软件延时函数
若代码中有基于循环的软件延时,需将延时倍数调整为12倍:
void Delay1ms() {
    unsigned int i, j;
    for (i=0; i<12; i++) {  // 原循环次数乘以12
        for (j=0; j<1000; j++);
    }
}
4. 检查外部中断配置
315MHz解码通常依赖外部中断检测信号边沿。确保STC8H的IO口模式配置正确(建议设置为高阻输入):
P1M1 |= 0x01;   // P1.0设为高阻输入
P1M0 &= ~0x01;
IT0 = 1;        // 设置INT0为下降沿触发
EX0 = 1;        // 使能INT0中断
EA = 1;         // 全局中断使能
回复

使用道具 举报

9#
ID:1121978 发表于 2025-5-23 10:52 | 只看该作者
你这个问题挺关键的——主要是时钟周期不同导致的解码不兼容。STC8H1K08的内部时钟周期通常是按照1个系统时钟的,而普通51(如8051)可能用的是12个时钟周期一个指令周期。  关键点:  8051/51芯片: 一个指令周期一般是12个机器时钟(晶振),即每个指令执行时间为12个晶振周期。 STC8H1K08: 通常一个指令周期就是一个晶振频率(1个晶振周期)。 解决方案:  调整你的晶振频率: 让STC8H1K08的晶振频率与旧的51芯片相匹配(如果原本定义的时钟周期是基于12个晶振周期的逻辑),这样你在程序中计时时可以复用之前的算法。  软件模拟延时:  如果你不能修改晶振,可以在程序里加入延时,用软件延时等效于原先12个时钟周期的时间。这在解码等时序性很强的应用中常用。 使用FOSC指令或配置:  在STC芯片的配置(如FOSC)里调节时钟源,让其以接近12个晶振周期的方式运行(比如调节晶振频率),符合之前的逻辑。 程序适配:  如果解码算法依赖于时间,你需要在代码中调整计时器的预分频,使它计得与旧51芯片的时钟节奏一样。 总结: 最简单的办法就是调整晶振频率让用户的代码能在类似的时间尺度下工作。如果硬件限制,试试在程序中加上适当的延时或调整预分频器。  你也可以提供更详细的配置和代码片段,我帮你具体看看该怎么调整!
回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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