标题:
STC8A单片机外部晶振这样启动
[打印本页]
作者:
happy33
时间:
2021-5-24 04:27
标题:
STC8A单片机外部晶振这样启动
来自网络大神的帖子
没事试了一下STC8A外部晶振这样启动
以前用STC15系列,使用外部晶振时在软件上选一下就可以,如果外部晶振没有焊,单片机默认是内部时钟运行的,现在STC8A单片机软件上没有选项,需要在代码中启动外部晶振,官方的例程是死等晶振稳定,如果晶振没有焊,就卡住了,试了一下将死等改成等一段保守时间,如果晶振没有稳定启动,就默认用内部时钟工作。考虑到有些情况用晶振可以更稳定,但用内部时钟也能满足的情况下,这样启动,即使晶振损坏也能像STC15一样正常工作
//这个是拷贝STC-ISP里的范例程序。
//我使用时都是与或操作。
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; //启动外部晶振
for(j=0;j<65535;j++) //官方例程是while (!(XOSCCR & 1));
{
if ((XOSCCR & 1)) //判断时钟稳定位
{
CKDIV = 0x00; //时钟不分频
CKSEL = 0x01; //选择外部晶振
break;
}
}
P_SW2 &= ~0x80;
复制代码
//========================================================================
//请参考STC-ISP里的范例程序里的STC8系列的“选择系统时钟源”,我拷贝到这里。
#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; //选择内部IRC ( 默认 )
P_SW2 = 0x00;
/*
P_SW2 = 0x80;
XOSCCR = 0xc0; //启动外部晶振 B7 ENXOSC B6 XITYPE
while (!(XOSCCR & 1)); //等待时钟稳定
CKDIV = 0x00; //时钟不分频
CKSEL = 0x01; //选择外部晶振
P_SW2 = 0x00;
*/
/*
P_SW2 = 0x80;
IRC32KCR = 0x80; //启动内部32K IRC
while (!(IRC32KCR & 1)); //等待时钟稳定
CKDIV = 0x00; //时钟不分频
CKSEL = 0x03; //选择内部32K
P_SW2 = 0x00;
*/
while (1);
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1