本文為大家?guī)鞸TC12C5A60S2可編程時鐘模塊及系統(tǒng)省電模塊代碼介紹。
STC12C5A60S2寄存器介紹
STC12C5A60S2可編程時鐘模塊代碼
//****************************************************************************//
// STC12C5A60S2可編程時鐘模塊
//
//
// 說明:STC12C5A60S2單片機有三路可編程時鐘輸出CLKOUT0/T0/P3.4
// CLKOUT1/T1/P3.5、CLKOUT2/P1.0
//
// 涉及寄存器:AUXR(輔助寄存器)、WAKE_CLKO(時鐘與系統(tǒng)掉電喚醒控制寄存
器)
// BRT(獨立波特率發(fā)生器定時器寄存器)
//
// 程序說明:
// 本程序可選實現P3.4輸出CLKOUT0時鐘、P3.5輸出CLKOUT1時
鐘
// P1.0輸出CLKOUT2時鐘
//
////****************************************************************************/
/
#include 《STC12C5A60S2.H》
#include 《intrins.h》
//#define Port_BRT //如果想測試獨立波特率發(fā)生器時鐘輸出請打開此句
//若想測試CLKOUT1和CLKOUT0請注釋此句
#ifdef Port_BRT /*條件編譯獨立波特率發(fā)生器時鐘輸出*/
//*********************************//
// CLKOUT2時鐘初始化 //
//*********************************//
void CLKOUT_init(void)
{
WAKE_CLKO = 0x04; //Bit2-BRTCLKO 允許P1.0配置為獨立波特率發(fā)生器的時
鐘輸出
//BRT工作在1T模式下時的輸出頻率 = Sysclk/(256-BRT)/2
//BRT工作在12T模式下時輸出頻率 = Sysclk/12/(256-BRT)/2
AUXR = 0x14; //Bit4-BRTR 允許獨立波特率發(fā)生器運行
//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系統(tǒng)時鐘模塊
//
//
// 說明: 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 //若要修改系統(tǒng)時鐘直接在此處修改
//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
//*********************************************//
// 系統(tǒng)時鐘初始化 //
//*********************************************//
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系統(tǒng)省電模塊 //
//
// 說明: STC12C5A60S2單片機有三種省電模式以降低功耗??臻e模式,低速模式
// 掉電模式
//
//
// 涉及寄存器:PCON(電源控制寄存器)
// Bit0 - IDL 控制單片機進入IDLE空閑模式
// Bit1 - PD 控制單片機進入掉電模式
// //
// 程序說明: 程序實現讓單片機先工作一陣子(通過P0^3指示燈顯示)
// 然后進入掉電狀態(tài),利用外部中斷0口來喚醒單片機工作
// 喚醒后單片機將通過P0^0-3口的燈閃爍顯示開始工作
////****************************************************************************/
/
#include 《STC12C5A60S2.h》
#include 《intrins.h》
#define uchar unsigned char
#define uint unsigned int
uchar Power_Down_Flag = 0; //進入掉電狀態(tài)標志
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為低電平觸發(fā)
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(); //系統(tǒng)正常工作指示
}
Power_Down_Flag = 1; //系統(tǒng)開始進入掉電狀態(tài)
PCON = 0x02;
_nop_();
_nop_();
_nop_();
_nop_();
After_Power_Down(); //掉電喚醒后
}
}
//**********************************//
// 中斷服務
//**********************************//
void INT0_Service(void) interrupt 0
{
if( Power_Down_Flag ) //掉電喚醒狀態(tài)指示
{
Power_Down_Flag = 0;
Power_Down_LED_INT0 = 1;
while( Power_Down_Wakeup_INT0 == 0 )
{
_nop_(); //等待高電平
}
Power_Down_LED_INT0 = 0;
}
else //未掉電狀態(tài)
{
N_Power_Down_LED_INT0 = 1; //不是掉電喚醒指示
while( Power_Down_Wakeup_INT0 == 0 )
{
_nop_();
}
N_Power_Down_LED_INT0 = 0;
}
}
-
單片機
+關注
關注
6037文章
44558瀏覽量
635216 -
STC12C5A60S2
+關注
關注
36文章
219瀏覽量
70040
發(fā)布評論請先 登錄
相關推薦
評論