标题:
关于STC8H1K08单片机时钟问题
[打印本页]
作者:
阿飞7812
时间:
2025-5-20 09:28
标题:
关于STC8H1K08单片机时钟问题
想用STC8H1K08单片机做一个315的解码和控制,在坛里找了一个带学习功能,用普通51测试没问题,想改用STC8H1K08单片机做,发现解不了码,查后发现时钟不一样,普通51是12个时钟周期这个STC8H1K08是1个时钟周期,坛朋们这个要怎么把STC8H1K08改有和51的一样周期,望高手们指点一下
作者:
阿飞7812
时间:
2025-5-21 09:16
没人用个STC的单片机吗
作者:
newlined
时间:
2025-5-21 09:50
这个很简单,看你用的哪个定时器,如果是T0、T1、或T2,在AUXR中设定是12个时钟周期或1个时钟周期,T3或者T4,在T4T3M中设定,具体看下这个单片机的手册。
作者:
hjx5548
时间:
2025-5-21 11:58
把你的程序发上来
作者:
man1234567
时间:
2025-5-22 17:19
你在坛内搜索的工程就那么保密么 ?
你当大家都有你说的代码和硬件么 ?
不想发工程文件可以不问,毕竟这不是算命论坛玩猜猜猜
作者:
keemee
时间:
2025-5-23 03:31
STC的烧录器可以修改周期,但我以前改了也没用
作者:
桑桑呀
时间:
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; // 全局中断使能
作者:
桑桑呀
时间:
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; // 全局中断使能
作者:
小郭郭a
时间:
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芯片的时钟节奏一样。 总结: 最简单的办法就是调整晶振频率让用户的代码能在类似的时间尺度下工作。如果硬件限制,试试在程序中加上适当的延时或调整预分频器。 你也可以提供更详细的配置和代码片段,我帮你具体看看该怎么调整!
作者:
coody_sz
时间:
2025-5-23 16:08
你解码的方法是什么?你的解码时序是什么?
没有基本信息,我们不是神仙,猜不到的。
作者:
Y_G_G
时间:
2025-5-26 09:29
你说的这两个单片机有两点不同,一个是时钟,另一个是端口的初始化,STC8H1K08默认的端口模式与STC89系列是不一样的
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1