|
來自網(wǎng)絡(luò)大神的帖子
沒事試了一下STC8A外部晶振這樣啟動(dòng)
以前用STC15系列,使用外部晶振時(shí)在軟件上選一下就可以,如果外部晶振沒有焊,單片機(jī)默認(rèn)是內(nèi)部時(shí)鐘運(yùn)行的,現(xiàn)在STC8A單片機(jī)軟件上沒有選項(xiàng),需要在代碼中啟動(dòng)外部晶振,官方的例程是死等晶振穩(wěn)定,如果晶振沒有焊,就卡住了,試了一下將死等改成等一段保守時(shí)間,如果晶振沒有穩(wěn)定啟動(dòng),就默認(rèn)用內(nèi)部時(shí)鐘工作。考慮到有些情況用晶振可以更穩(wěn)定,但用內(nèi)部時(shí)鐘也能滿足的情況下,這樣啟動(dòng),即使晶振損壞也能像STC15一樣正常工作
- //這個(gè)是拷貝STC-ISP里的范例程序。
- //我使用時(shí)都是與或操作。
- P_SW2 |= 0x80; //bit7=1
- //操作代碼略
- P_SW2 &= ~0x80; //bit7=0
- //而在中斷中,則是:
- u8 i;
- i = P_SW2;
- P_SW2 |= 0x80; //bit7=1
- //操作代碼略
- P_SW2 &= ~0x80; //bit7=0
- P_SW2 = i;
- P_SW2 |= 0x80;
- XOSCCR = 0xc0; //啟動(dòng)外部晶振
- for(j=0;j<65535;j++) //官方例程是while (!(XOSCCR & 1));
- {
- if ((XOSCCR & 1)) //判斷時(shí)鐘穩(wěn)定位
- {
- CKDIV = 0x00; //時(shí)鐘不分頻
- CKSEL = 0x01; //選擇外部晶振
- break;
- }
- }
- P_SW2 &= ~0x80;
復(fù)制代碼- //========================================================================
- //請參考STC-ISP里的范例程序里的STC8系列的“選擇系統(tǒng)時(shí)鐘源”,我拷貝到這里。
- #include "reg51.h"
- #include "intrins.h"
- #define CKSEL (*(unsigned char volatile xdata *)0xfe00)
- #define CKDIV (*(unsigned char volatile xdata *)0xfe01)
- #define IRC24MCR (*(unsigned char volatile xdata *)0xfe02)
- #define XOSCCR (*(unsigned char volatile xdata *)0xfe03)
- #define IRC32KCR (*(unsigned char volatile xdata *)0xfe04)
- sfr P_SW2 = 0xba;
- void main()
- {
- P_SW2 = 0x80;
- CKSEL = 0x00; //選擇內(nèi)部IRC ( 默認(rèn) )
- P_SW2 = 0x00;
- /*
- P_SW2 = 0x80;
- XOSCCR = 0xc0; //啟動(dòng)外部晶振 B7 ENXOSC B6 XITYPE
- while (!(XOSCCR & 1)); //等待時(shí)鐘穩(wěn)定
- CKDIV = 0x00; //時(shí)鐘不分頻
- CKSEL = 0x01; //選擇外部晶振
- P_SW2 = 0x00;
- */
- /*
- P_SW2 = 0x80;
- IRC32KCR = 0x80; //啟動(dòng)內(nèi)部32K IRC
- while (!(IRC32KCR & 1)); //等待時(shí)鐘穩(wěn)定
- CKDIV = 0x00; //時(shí)鐘不分頻
- CKSEL = 0x03; //選擇內(nèi)部32K
- P_SW2 = 0x00;
- */
- while (1);
- }
復(fù)制代碼
|
|