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; // 全局中断使能 |