一、前言:
STC8H系列属于增强型C51单片机,标准版的51单片机的系统时钟通常使用外部晶振为其提供稳定的时钟源,而8H系列系统时钟类似于STM32的时钟树概念,不仅可以使用外部时钟而且(IRC)内部时钟源同样的稳定精确,至于系统时钟控制的意义,不在本教程的探讨范围,仅供单片机爱好者之间的交流学习。
二、知识简介:
STC8H时钟树
依据8H系列芯片手册,它提供了四种时钟输入供选择,分别是内部高速时钟(HIRC)、外部高速时钟(XOSC)、外部32K时钟(X32K)、内部32K时钟(IRC32K),另外还有一路特殊的内部48M(IRC48M)专供USB时钟,这5类时钟操作相关的特殊寄存器都可以成为系钟时钟的时钟源,下面介绍操作相关的寄存器实现系统时钟的控制与输出。
三、实验平台搭建:
1、MCU:STC-打狗棒系列核心实验板 V2.3
2、实验板平台:德飞莱LY-51s
3、硬件连接表:
四、测试源代码:
#include "STC8H.h"
void Delay1ms(unsigned char x);//当主时钟频率为12M,1ms延时为基准
void Blink_Led();//利用延时闪灯,主频不同延时有差异
void init_IO();//初始化IO
sbit Led=P0^0;
void main()
{
P_SW2 |= 0x80; //扩展寄存器XFR访问使能
CKSEL=0x0C;
init_IO();
HIRCCR=0x80;//内部IRC使能位
IRCBAND&=0xFC;//SEL[1:0] 值为00 syscls=6M
CLKDIV=0x00;//时钟源无分频至系统时钟
while(1)
{
if(P20==0)
{
CKSEL=0x00;//选择内部高整IRC
IRCBAND&=0xFC;//清空值
IRCBAND|=0x01;//SEL[1:0] 值为01 syscls=10M
}
if(P21==0)
{
IRCBAND&=0xFC;//清空值
IRCBAND|=0x02;//SEL[1:0] 值为10 syscls=27M
}
if(P22==0)
{
IRCBAND&=0xFC;//清空值
IRCBAND|=0x03;//SEL[1:0] 值为11 syscls=44M
}
if(P23==0)//时钟源降频16倍得到系统时钟
{
CLKDIV=0x0F;
}
if(P24==0)//选择内部IRC32K晶振
{
IRC32KCR=0x80;
while(!(IRC32KCR&1));
CLKDIV=0x00;
CKSEL=0x03;
}
if(P25==0)//系统时钟直接从P1_6输出
{
MCLKOCR=0x81;
}
Blink_Led();
}
}
void init_IO()
{
P0M1 = 0x00; P0M0 = 0x00; //设置P0口为准双向口
P1M1 = 0x00; P1M0 = 0x00; //设置P0口为准双向口
}
void Blink_Led()
{
Led=0; //点亮Led
Delay1ms(10);
Led=1; //点亮Led
Delay1ms(10);
}
void Delay1ms(unsigned char x) //@12.000MHz
{
unsigned char i, j;
i = 16;
j = 147;
while(x--)
{
do
{
while (--j);
} while (--i);
}
}
五、运行结果视频:
STC8H单片机时钟控制视频