应广单片机 PMC/PMS153 定时器中断

采用PMC/PMS153芯片,选用哪一种芯片只需在文件中选定对应芯片即可。

定时器中断,1ms进一次中断,用示波器看过频率是正常的,误差小于1us。

////////////////////////////////////////////////////////////////////////////////////////////
//主控:PMC153  (根据具体IC以及封装修改)
//		           ________________________
//		          -|PB5   		PB2 	|-            
//		      LED4-|PB6   		PB1 	|-        
//		      LED3-|PB7   		PB0/INT1|-        
//		          -|VDD   		GND 	|-            
//		      LED2-|PA7   		PA0/INT0|-       
//		      LED1-|PA6   		PA4 	|- LED6        
//	              -|PA5/PRSTB   PA3 	|- LED5                
//		           ------------------------                                                   
////////////////////////////////////////////////////////////////////////////////////////////
#include	"extern.h"

// .outfile %S_%TyymmddHHMMSS_%x.PDK  //输出的烧录文件带校验码、芯片型号、时间日期

typedef byte u8; 
typedef word u16;
typedef EWORD u24;
typedef DWORD u32;

#define     SetPortA()      PAPH = 0XD9; PAC = 0XD8; PA = 0XD9
#define     SetPortB()      PBPH = 0XC0; PBC = 0XC0; PB = 0XC0
//==================单个io口的初始化==================//
//    paph.0 = 1; //上拉   0/1->无/有
//    pac.0 = 1;  //pac 0:IN  1:OUT  模式:0/1->输入/输出
//    pa.0 = 0;   //输出0/1
//=================一个io端口的初始化=================//
//    paph = 0x01;
//    pac = 0X01;   //pac 0:IN  1:OUT
//    pa = 0x00;
//上面两个都是对PA.0进行初始化为0,不建议对单个IO口操作,推荐使用下面那种,对整组io进行设置

/************************************************************************************/
/*							  LED灯接口配置		 								    */
/************************************************************************************/
#define     LED1_ON()                PA.6 = 0
#define     LED1_OFF()               PA.6 = 1
#define     LED2_ON()                PA.7 = 0
#define     LED2_OFF()               PA.7 = 1
#define     LED3_ON()                PB.7 = 0
#define     LED3_OFF()               PB.7 = 1
#define     LED4_ON()                PB.6 = 0
#define     LED4_OFF()               PB.6 = 1
#define     LED5_ON()                PA.3 = 0
#define     LED5_OFF()               PA.3 = 1
#define     LED6_ON()                PA.4 = 0
#define     LED6_OFF()               PA.4 = 1


u16 T16val;
u8 gCnt;
u16	Tcount;
void sys_init(void)
{
    T16val = 0;
    gCnt = 0;
	Tcount = 0;  
}
/************************************************************************************/
/*							  16位计数定时器T16 								    */
/************************************************************************************/
#define USER_TIMER_CONFIG()		$ T16M IHRC, /16, BIT10 //对t16寄存器进行配置   时钟:IHRC 分频:/16  中断源:BIT10   
#define ENABLE_TIMER()			SET1 INTEN.2 //$ INTEN T16 //开定时器中断
#define DISENABLE_TIMER()		SET0 INTEN.2 //关定时器中断
#define INIT_TIMER_VALUE(n)		STT16 n//装载定时器计数值
#define EA_INT()				ENGINT//开总中断
#define DIS_INT()				DISGINT//关总中断
#define CONST_TIME_VALUE        24//0x10E//224//  (BIT - CONST_TIME_VALUE) / (IHRC / 分频) = us

/************************************************************************************/
//一次中断的时间计算公式   (BIT - CONST_TIME_VALUE) / (IHRC / 分频) = us
//                         (2^10 - 24) / (16 / 16) = 1000us    
void Set_User_T16(void)
{	
	USER_TIMER_CONFIG();
	T16val = CONST_TIME_VALUE;
	INIT_TIMER_VALUE(T16val);
	ENABLE_TIMER();
	INTRQ = 0;//清除INTRQ
	EA_INT();
}



/************************************************************************************/
/*							 主函数 								    */
/************************************************************************************/
void	FPPA0 (void)
{
//	.ADJUST_IC	SYSCLK=IHRC/4		//	SYSCLK=IHRC/4
	.ADJUST_IC	SYSCLK=IHRC/4, IHRC=16MHz,VDD=3.3V		//	SYSCLK=IHRC/2	//系统时钟4M
//	clkmd.En_WatchDog	=	1;		//	WatchDog Enable
//	clkmd.En_Reset	=	1;			//	PA.5 as Reset pin

	//	Insert Initial Code
	SetPortA();
    SetPortB();
    sys_init();
    Set_User_T16();




	while (1)
	{
//		...
//		wdreset;
		if (gCnt) {  // 利用IO口翻转看中断时间
			LED1_ON();
        } else {
            LED1_OFF();
        }
	}

}



/************************************************************************************/
/*							  中断 								    */
/************************************************************************************/
void	Interrupt (void)
{
	pushaf;

	if (Intrq.T16)
	{	//	T16 Trig
		//	User can add code
		Intrq.T16	=	0;
		T16val = CONST_TIME_VALUE;
        INIT_TIMER_VALUE(T16val);
        //中断执行区
		Tcount++;
		if(Tcount >= 2000)
		{
	        if (gCnt) {  // 利用IO口翻转看中断时间
	            gCnt = 0;
	        } else {
	            gCnt = 1;
	        }
			Tcount = 0;
		}

	}

	popaf;
}

 

你可能感兴趣的:(应广单片机)