lkl0305

STC15引脚输出系统时钟

0
阅读(3968)

STC单片机的内部RC时钟配置非常方便,虽然精度不是很高,但是在要求不高的场合下却能省去一个外部晶振,而且可以对之中进行预设系统时钟,并分频通过引脚输出。

主要使用了CLK_DIV寄存器:

61930-6362504167574090388934809.png-g115

(1)其中CLKS2、CLKS1、CLKS0用来控制将主时钟分频后作为系统时钟,共CPU和片内外设。

61930-6362504167628777316834631.png-g115

(2)其中,B6和B7比特位用于控制在STC单片机引脚输出时钟的频率。

61930-6362504167647527164076435.png-g115

(3)CLK_2控制在那个引脚输出时钟。

61930-6362504167655339551819005.png-g115

这里要注意的是当想要将系统时钟通过P1.6引脚输出时,需要注意之前P1.6的状态,可能复位后P1.6为高阻输入,因此需要在初始化时先将引脚配置成输出(准双向也可)。不然可能没有输出。

61930-6362504167820963213045888.png-g115

接下来写个程序测试一下结果,下载程序时,将内部RC时钟配置成24MHz作为主时钟,然后4分频后作为系统时钟,在4分频后通过P1.6引脚输出,可用示波器查看波形。

程序如下:

#include <STC15F2K60S2.H>
#include "stdio.h"

void GPIO_Init(void);
void Uart_Init(void);
char putchar(char c);

void main(void)
{
    GPIO_Init();
    CLK_DIV = (CLK_DIV & 0x30) | (0x02 | 0x08 | 0xc0);

    Uart_Init();
    
    printf("This is a test of SYSclk output...\r\n");
    printf("The Mclk is 24MHz, the Sysclk is 6MHz, and divided by 4 output on Pin1.6...\r\n");
    printf("You can test it on the pin 1.6\r\n");
    
    for(;;)
    {
        ;
    }
}

void GPIO_Init(void)
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    
    P1M0 = 0x00;
    P1M1 = 0x00;
    
    P2M0 = 0x00;
    P2M1 = 0x00;
    
    P3M0 = 0x00;
    P3M1 = 0x00;
    
    P4M0 = 0x00;
    P4M1 = 0x00;
    
    P5M0 = 0x00;
    P5M1 = 0x00;
}

void Uart_Init(void)        //9600bps@6.000MHz
{
    SCON = 0x50;        //8位数据,可变波特率
    AUXR |= 0x01;        //串口1选择定时器2为波特率发生器
    AUXR |= 0x04;        //定时器2时钟为Fosc,即1T
    T2L = 0x64;        //设定定时初值
    T2H = 0xFF;        //设定定时初值
    AUXR |= 0x10;        //启动定时器2
}

char putchar(char c)
{
    SBUF = c;
    while(TI == 0)
    {
        ;
    }
    TI = 0;
    return c;
}

将程序下载到单片机中,运行,可以看到串口输出提示信息。

61930-6362504167570965232476319.png-g115

手头没有示波器,还好有个逻辑分析仪,将就着看一下,发现P1.6引脚输出正确的系统时钟波形!

61930-6362504167744401376147600.png-g115


QQ截图20170313220316.png