1 STC12C5A60S2可编程时钟模块及系统省电模块代码-德赢Vwin官网 网

STC12C5A60S2可编程时钟模块及系统省电模块代码

电子说

1.3w人已加入

描述

本文为大家带来STC12C5A60S2可编程时钟模块及系统省电模块代码介绍。

STC12C5A60S2寄存器介绍

STC12C5A60S2

STC12C5A60S2

STC12C5A60S2

STC12C5A60S2可编程时钟模块代码

//****************************************************************************//

// STC12C5A60S2可编程时钟模块

//

//

// 说明:STC12C5A60S2单片机有三路可编程时钟输出CLKOUT0/T0/P3.4

// CLKOUT1/T1/P3.5、CLKOUT2/P1.0

//

// 涉及寄存器:AUXR(辅助寄存器)、WAKE_CLKO(时钟与系统掉电唤醒控制寄存

器)

// BRT(独立波特率发生器定时器寄存器)

//

// 程序说明:

// 本程序可选实现P3.4输出CLKOUT0时钟、P3.5输出CLKOUT1时

// P1.0输出CLKOUT2时钟

//

////****************************************************************************/

/

#include 《STC12C5A60S2.H》

#include 《intrins.h》

//#define Port_BRT //如果想测试独立波特率发生器时钟输出请打开此句

//若想测试CLKOUT1和CLKOUT0请注释此句

#ifdef Port_BRT /*条件编译独立波特率发生器时钟输出*/

//*********************************//

// CLKOUT2时钟初始化 //

//*********************************//

void CLKOUT_init(void)

{

WAKE_CLKO = 0x04; //Bit2-BRTCLKO 允许P1.0配置为独立波特率发生器的时

钟输出

//BRT工作在1T模式下时的输出频率 = Sysclk/(256-BRT)/2

//BRT工作在12T模式下时输出频率 = Sysclk/12/(256-BRT)/2

AUXR = 0x14; //Bit4-BRTR 允许独立波特率发生器运行

//Bit2-BRTx12 BRT工作在1T模式下

BRT = 0xff; //更改该寄存器的值可实现对输出的时钟频率进行分频

}

#else /*条件编译CLKOUT0时钟输出*/

//*********************************//

// CLKOUT0时钟和CLKOUT1初始化 //

//*********************************//

void CLKOUT_init(void)

{

WAKE_CLKO = 0x03; //允许将P3.4/T0脚配置为定时器0的时钟输出CLKOUT0

//T0工作在1T模式时的输出频率 = SYSclk/(256-TH0)/2

//T0工作在12T模式时的输出频率 = SYSclk/12/(256-TH0)/2

//1T指的是每1个时钟加1,是普通C51的12倍

//12T指的是每12个时钟加1与普通C51一样

//允许将P3.5/T1脚配置为定时器1的时钟输出CLKOUT1,只

能工作在定时器模式2下

//T1工作在1T模式时的输出频率 = SYSclk/(256-TH0)/2

//T1工作在12T模式时的输出频率 = SYSclk/12/(256-TH0)/2

//1T指的是每1个时钟加1,是普通C51的12倍

//12T指的是每12个时钟加1与普通C51一样

AUXR = 0xc0; //T0定时器速度是普通8051的12倍,即工作在1T模式下

//T1定时器速度是普通8051的12倍,即工作在1T模式下

TMOD = 0x22; //定时器0工作模式为方式2,自动装载时间常数

//定时器1工作模式为方式2,自动装载时间常数

TH0 = 0xff; //更改该寄存器的值可实现对输出的时钟频率进行分频

TL0 = 0xff;

TH1 = 0xff; //更改该寄存器的值可实现对输出的时钟频率进行分频

TL1 = 0xff;

TR1 = 1;

TR0 = 1;

}

#endif

//**********************************//

// 主程序 //

//**********************************

//

void main()

{

CLKOUT_init();

while(1);

}

//****************************************************************************//

// STC12C5A60S2系统时钟模块

//

//

// 说明: STC12C5A60S2单片机有两个时钟源,内部R/C振荡时钟和外部晶体时

// 出厂标准配置是使用外部晶体或时钟

//

//

// 涉及寄存器:CLK_DIV(时钟分频寄存器)

// 由该寄存器的Bit0-2组合可实现对时钟源进行0、2、4、8、16

// 32、64、128分频

// //

// 程序说明:

// 对外部时钟进行分频得到Sysclk,然后经过P1.0的独立波特率

// 时钟输出功能Sysclk/2输出时钟频率

//****************************************************************************//

#include 《STC12C5A60S2.h》

#include 《intrins.h》

#define Bus_clk 12 //若要修改系统时钟直接在此处修改

//12 为 12M 的sysclk

//6 为 6M 的sysclk

//3 为 3M 的sysclk

//1500 为 1.5M 的sysclk

//750 为 750kHz 的sysclk

//375 为 375kHz 的sysclk

//187500 为 187.5kHz 的sysclk

//93750 为 93.75kHz 的sysclk

//*********************************************//

// 系统时钟初始化 //

//*********************************************//

void Sysclk_init(void)

{

WAKE_CLKO = 0x04; //配置P1.0口为频率输出

AUXR = 0x14; //允许波特率时钟工作

//工作模式为1T

BRT = 0xff;

#if( Bus_clk == 12 )

CLK_DIV = 0x00;

#elif( Bus_clk == 6 )

CLK_DIV = 0x01;

#elif( Bus_clk == 3 )

CLK_DIV = 0x02;

#elif( Bus_clk == 1500 )

CLK_DIV = 0x03;

#elif( Bus_clk == 750 )

CLK_DIV = 0x04;

#elif( Bus_clk == 375 )

CLK_DIV = 0x05;

#elif( Bus_clk == 187500 )

CLK_DIV = 0x06;

#elif( Bus_clk == 93750 )

CLK_DIV = 0x07;

#endif

}

//**********************************************//

// 主程序 //

//**********************************************//

void main()

{

Sysclk_init();

while(1);

}

STC12C5A60S2省电模块代码

//****************************************************************************//

// STC12C5A60S2系统省电模块 //

//

// 说明: STC12C5A60S2单片机有三种省电模式以降低功耗。空闲模式,低速模式

// 掉电模式

//

//

// 涉及寄存器:PCON(电源控制寄存器)

// Bit0 - IDL 控制单片机进入IDLE空闲模式

// Bit1 - PD 控制单片机进入掉电模式

// //

// 程序说明: 程序实现让单片机先工作一阵子(通过P0^3指示灯显示)

// 然后进入掉电状态,利用外部中断0口来唤醒单片机工作

// 唤醒后单片机将通过P0^0-3口的灯闪烁显示开始工作

////****************************************************************************/

/

#include 《STC12C5A60S2.h》

#include 《intrins.h》

#define uchar unsigned char

#define uint unsigned int

uchar Power_Down_Flag = 0; //进入掉电状态标志

sbit Chip_Start_LED = P0^0; //单片机开始工作指示灯

sbi

t Power_Down_LED_INT0 = P0^1; //INT0口掉电唤醒指示灯

sbit N_Power_Down_LED_INT0 = P0^2; //INT0口没有唤醒指示灯

sbit Normal_Work_LED = P0^3; //正常工作指示灯

sbit Power_Down_Wakeup_INT0= P3^2; //外中断唤醒输入口

void Delay_ms( uint time );

void Normal_work(void);

void Intp_init(void);

void After_Powr_Down(void);

//***********************************//

// 软件延时 //

//***********************************//

void Delay_ms( uint time )

{

uint t; //延时时间 = (time*1003+16)us while(time--)

{

for( t = 0; t 《 82; t++ );

}

}

//***********************************//

// 正常工作指示

//***********************************//

void Normal_work(void)

{

Normal_Work_LED = 1;

Delay_ms(500);

Normal_Work_LED = 0;

Delay_ms(500);

}

void After_Power_Down(void)

{

uchar i ;

for( i = 0; i 《 100; i++ )

{

P0 = 0x0f;

Delay_ms(500);

P0 = 0x00;

Delay_ms(500);

}

}

//***********************************//

// 中断初始化 //

//***********************************//

void Intp_init(void)

{

IT0 = 0; //外部中断源0为低电平触发

EX0 = 1; //允许外部中断

EA = 1; //开总中断

}

//***********************************//

STC12C5A60S2单片机各个模块程序代码13_stc12c5a60s2

// 主程序 //

//***********************************//

void main()

{

uchar j = 0;

uchar wakeup_counter = 0; //记录掉电次数

P0 = 0x00;

Chip_Start_LED = 1; //单片机开始工作

Intp_init(); //外中断0初始化

while(1)

{

P2 = wakeup_counter;

wakeup_counter++;

for( j = 0; j 《 250; j++ )

{

Normal_work(); //系统正常工作指示

}

Power_Down_Flag = 1; //系统开始进入掉电状态

PCON = 0x02;

_nop_();

_nop_();

_nop_();

_nop_();

After_Power_Down(); //掉电唤醒后

}

}

//**********************************//

// 中断服务

//**********************************//

void INT0_Service(void) interrupt 0

{

if( Power_Down_Flag ) //掉电唤醒状态指示

{

Power_Down_Flag = 0;

Power_Down_LED_INT0 = 1;

while( Power_Down_Wakeup_INT0 == 0 )

{

_nop_(); //等待高电平

}

Power_Down_LED_INT0 = 0;

}

else //未掉电状态

{

N_Power_Down_LED_INT0 = 1; //不是掉电唤醒指示

while( Power_Down_Wakeup_INT0 == 0 )

{

_nop_();

}

N_Power_Down_LED_INT0 = 0;

}

}

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分