|
STC8H1K08是1T單片機(jī)(1個(gè)時(shí)鐘周期執(zhí)行1條指令),而傳統(tǒng)51是12T(12個(gè)時(shí)鐘周期執(zhí)行1條指令)。這導(dǎo)致原有代碼中的時(shí)序邏輯(延時(shí)、定時(shí)器)在STC8H上運(yùn)行速度快了12倍,無(wú)法正確解碼315MHz信號(hào)。 解決方案: 1. 修改定時(shí)器分頻系數(shù)(推薦) STC8H的定時(shí)器支持獨(dú)立分頻,無(wú)需降低主頻即可解決時(shí)序問(wèn)題。假設(shè)原51使用12MHz晶振,定時(shí)器配置為12分頻,移植到STC8H時(shí)需調(diào)整如下: c // 定時(shí)器初始化示例(Timer0) void Timer0_Init(void) { AUXR |= 0x80; // 定時(shí)器0設(shè)置為1T模式 TMOD &= 0xF0; // 清除定時(shí)器0模式位 TMOD |= 0x01; // 定時(shí)器0設(shè)為模式1(16位自動(dòng)重載) TL0 = 0x00; // 初始化計(jì)時(shí)值 TH0 = 0x00; ET0 = 1; // 使能定時(shí)器0中斷 TR0 = 1; // 啟動(dòng)定時(shí)器0 // 關(guān)鍵設(shè)置:定時(shí)器時(shí)鐘分頻(假設(shè)原51為12分頻) T0H = (65536 - (FOSC / 12 / 1000)) >> 8; // 舉例:1ms中斷 T0L = (65536 - (FOSC / 12 / 1000)) & 0xFF; } 2. 調(diào)整系統(tǒng)時(shí)鐘分頻 若解碼邏輯依賴全局延時(shí)(如nop循環(huán)),可降低系統(tǒng)時(shí)鐘至原51的1/12: c // 在程序初始化時(shí)設(shè)置時(shí)鐘分頻 CLKDIV = 0x0B; // 系統(tǒng)時(shí)鐘12分頻(主頻=外部晶振/12) 3. 修改軟件延時(shí)函數(shù) 若代碼中有基于循環(huán)的軟件延時(shí),需將延時(shí)倍數(shù)調(diào)整為12倍: c void Delay1ms() { unsigned int i, j; for (i=0; i<12; i++) { // 原循環(huán)次數(shù)乘以12 for (j=0; j<1000; j++); } } 4. 檢查外部中斷配置 315MHz解碼通常依賴外部中斷檢測(cè)信號(hào)邊沿。確保STC8H的IO口模式配置正確(建議設(shè)置為高阻輸入): c P1M1 |= 0x01; // P1.0設(shè)為高阻輸入 P1M0 &= ~0x01; IT0 = 1; // 設(shè)置INT0為下降沿觸發(fā) EX0 = 1; // 使能INT0中斷 EA = 1; // 全局中斷使能 |
|