stc15系列單片機 timer組件



/**
 *  文件名:timer.h
 */

#ifndef _TIMER_H
#define _TIMER_H

#define SYS_MCLK 11059200	//系統主時鐘
#define FOSC	 11059200	//晶振頻率



#define USING_T0
#define USING_STC15_T2



#ifdef USING_T0
	extern uint8_t tmr0LowByte, tmr0HighByte;
	void tmr0_init(uint8_t ms);
#endif



#ifdef USING_T1
	extern uint8_t tmr1LowByte, tmr1HighByte;
	void tmr1_init(uint8_t ms);
#endif



#ifdef USING_T2
	void tmr2_init(uint8_t ms);
#endif



#ifdef USING_STC15_T2
	void stc15_tmr2_init(uint8_t ms);
#endif



#endif



/**
 *  文件名:timer.c
 */

#include <stc15f2k60s2.h>
#include "stdint.h"
#include "timer.h"


/**
 * 定時器0
 */
#ifdef USING_T0
uint8_t tmr0LowByte, tmr0HighByte;

void tmr0_init(uint8_t ms) {	//!!8bits
	uint32_t tmp;	//小心溢出

	tmp = ms * SYS_MCLK / 12 / 1000;
	tmp = 65536 - tmp;
	tmr0LowByte = (uint8_t)tmp;
	tmr0HighByte = (uint8_t)(tmp >> 8);

	AUXR &= 0x7F;		//定時器時鐘12T模式
	TMOD &= 0xF0;
	TMOD |= 0x01;
	TL0 = tmr0LowByte;
	TH0 = tmr0HighByte;
	EA = 1;
	ET0 = 1;
	TR0 = 1;
}
#endif



#ifdef USING_T1
uint8_t tmr1LowByte, tmr1HighByte;

void tmr1_init(uint8_t ms) {	//!!8bits
	uint32_t tmp;

	tmp = ms * SYS_MCLK / 12 / 1000;
	tmp = 65536 - tmp;
	tmr1LowByte = (uint8_t)tmp;
	tmr1HighByte = (uint8_t)(tmp >> 8);

	AUXR &= 0xBF;
	TMOD &= 0x0F;
	TMOD |= 0x10;
	TL1 = tmr1LowByte;
	TH1 = tmr1HighByte;
	EA = 1;
	ET1 = 1;
	TR1 = 1;
}
#endif



#ifdef USING_T2
/**
 * 89系列單片機定時器2初始化
 * 定時器模式:16位自動重載
 * 定時器時鐘:12T(FOSC/12)
 */
void tmr2_init(uint8_t ms) {
	uint32_t tmp;	//小心溢出

	tmp = ms * SYS_MCLK / 12 / 1000;
	tmp = 65536 - tmp;
	
	T2MOD = 0x00;	//初始化模式寄存器
	T2CON = 0x00;	//初始化控制寄存器
	TL2 = (uint8_t)tmp;			//設置定時器初值
	TH2 = (uint8_t)(tmp >> 8);
	RCAP2L = TL2;				//設置定時器重載值
	RCAP2H = TH2;
	EA = 1;		//!!!
	ET2 = 1;	//!!!
	TR2 = 1;
}
#endif



#ifdef USING_STC15_T2
/**
 * stc15系列單片機定時器2初始化
 * 定時器模式:16位自動重載
 * 定時器時鐘:12T(FOSC/12)
 */
void stc15_tmr2_init(uint8_t ms) {
	uint32_t tmp;	//小心溢出

	tmp = ms * SYS_MCLK / 12 / 1000;
	tmp = 65536 - tmp;
	
	AUXR &= 0xFB;		//定時器時鐘12T模式
	T2L = (uint8_t)tmp;			//設置定時器初值
	T2H = (uint8_t)(tmp >> 8);
	EA = 1;		//!!!
	IE2 |= 0x04;				//!!!開定時器2中斷
	AUXR |= 0x10;				//定時器2開始計時
}
#endif


發佈了108 篇原創文章 · 獲贊 28 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章