timers.c

来自「太欣单片机STK6031的测试程序」· C语言 代码 · 共 195 行

C
195
字号

#include "STK6031.h"

//********************************************************************************
//定义数据类型
typedef unsigned char uint8;
typedef unsigned int  uint16;

sbit P4_0 = P4^0;  //P4.0 口产生固定频率的方波

//以下宏定义用来选择定时计数器,工作方式,以及是否使用中断方式
#define  USE_INT				       0   //  1 为查询方式,0为中断方式
#define  USE_T0M1				0   //  使用TIMER0 模式1
#define  USE_T1M2				1   //  使用TIMER1 模式2



/*
********************************************************************************  
* 	函 数 名:InitMCU
* 	功能描述:初始化MCU,其中包括初始化各I/O口,CHIPCON,
                              CKCON,选择I/O口的功能
* 	输    入: 无
* 	返    回: 无
********************************************************************************
*/	

void InitMcu(void)
{
	P0		= 0xFF;      //初始化各I/O 口
	P1		= 0xFF;
	P2 		= 0xFF;
	P3		= 0xFF;
	P4 		= 0x0F;
	
	// 当STK6031 用来替换传统12T 的MCU 使用时,这两个时序控制寄存器可以设置如下:
	CHIPCON = 0x1A;  // 设置CPUCLK=XTAL1/3,允许访问片内AUX 存储器,禁止ALE 输出,允许低电压复位
	CKCON = 0x39;  // 设置TIMER0,TIMER1,TIMER2 的计数频率为CPUCLK/4, 设置MOVX 指令访问外部AUX 存储器的时间为3 个机器周期

	// 当STK6031 用于充分发挥其4T 高处理速度时,这两个时序控制寄存器可以设置如下:
	//CHIPCON = 0x1C;  // 设置CPUCLK=2XTAL1,这时STK6031 执行相同指令的时间缩短为传统12T 8051 的1/6,
	//CKCON = 0x39;  // 设置TIMER0,TIMER1,TIMER2 的计数频率为CPUCLK/4, 这时由于CPUCLK=2XTAL1 ,所以定时计数器的频率为传统12T MCU的6 倍
	
}



#if  USE_T0M1

	#if  USE_INT  

/*
********************************************************************************  
* 	函 数 名:
* 	功能描述:定时/ 计数器程序,查询方式
* 	输    入: 无
* 	返    回: 无
********************************************************************************
*/

//Timer0 Mode1 , 设晶振为24M,需要定时时间为5 ms

void main(void)
{	
	InitMcu();
					
	TMOD = 0x01;  // Timer 0, Mode 1, 16 bit, 计数范围0--65535
	TH0 = 0xD8;  // 装入16 位计数初值,要产生5ms的定时需要计数10000次
	TL0 = 0xFE;  //  65536-10000=55536=D8F0H,但是要除去指令执行的延迟,大概14 个机器周期
	TR0 = 1;      //  开启TIMER0,开始定时
	while(1)
	{
		if(TF0)  // 查询溢出标志位有没变化
	  	{
	  	TF0 = 0;  // 清除TF0 溢出标志位
	  	P4_0 = ~P4_0;  
	  	TH0 = 0xD8;  //重新装入16 位计数初值
	  	TL0 = 0xFE;   //
	  	} 
	 }
}

	#else

/*
********************************************************************************  
* 	函 数 名:
* 	功能描述:定时/ 计数器程序,中断方式
* 	输    入: 无
* 	返    回: 无
********************************************************************************
*/

//Timer0 Mode1 , 设晶振为24M,需要定时时间为5 ms

void main(void)
{	
	InitMcu();				
	TMOD = 0x01;  // Timer 0, Mode 1, 16 bit, 计数范围0--65535
	TH0 = 0xD8;  // 装入16 位计数初值,要产生10ms的定时需要计数10000次
	TL0 = 0xFE;  //  65536-10000=55536=D8F0H,但是要除去指令执行的延迟,大概14 个机器周期
	ET0 = 1;  // 允许T0 中断
	EA = 1;  // CPU 开中断
	TR0 = 1;      //  开启TIMER0,开始定时
       while(1);   // 等待中断 
}

//中断程序1,定时中断0

void ISR_T0(void) interrupt INTERRUPT_TIMER0
{
	TF0 = 0;  // 清除TF0 溢出标志位
	P4_0 = ~P4_0;  
	TH0 = 0xD8;  //重新装入16 位计数初值
	TL0 = 0xFE;  // 
}	

	#endif

#endif




#if  USE_T1M2  

	#if  USE_INT  

/*
********************************************************************************  
* 	函 数 名:
* 	功能描述:定时/ 计数器程序,查询方式
* 	输    入: 无
* 	返    回: 无
********************************************************************************
*/

//Timer1 Mode2 , 设晶振为24M,需要定时时间为0.1 ms

void main(void)
{	
	InitMcu();
					
	TMOD = 0x20;  // Timer 1, Mode 2, 8 bit, 计数范围0--255
	TH1 = 0x38;  // 装入8 位计数初值,要产生0.1ms的定时需要计数200次,256-200=56=38H  
	TL1 = 0x38;  //  当TL1 计满时自动装载TH1 中的初值
	TR1 = 1;      //  开启TIMER1,开始定时
	while(1)
	{
		if(TF1)  // 查询溢出标志位有没变化
	  	{
	 	TF1 = 0;  // 清除TF1 溢出标志位
	  	P4_0 = ~P4_0;  
		}
	 }
}

	#else

/*
********************************************************************************  
* 	函 数 名:
* 	功能描述:定时/ 计数器程序,中断方式
* 	输    入: 无
* 	返    回: 无
********************************************************************************
*/

//Timer0 Mode1 , 设晶振为24M,需要定时时间为0.1 ms

void main(void)
{	
	InitMcu();				
	TMOD = 0x20;  // Timer 1, Mode 2, 8 bit, 计数范围0--255
	TH1 = 0x38;  // 装入8 位计数初值,要产生0.1ms的定时需要计数200次,256-200=56=38H  
	TL1 = 0x38;  //  当TL1 计满时自动装载TH1 中的初值
	ET1 = 1;  // 允许T1 中断
	EA = 1;  // CPU 开中断
	TR1 = 1;      //  开启TIMER1,开始定时
	while(1);   //等待中断
}

//中断程序1,定时中断0

void ISR_T1(void) interrupt INTERRUPT_TIMER1
{
	TF1 = 0;  // 清除TF1 溢出标志位
	P4_0 = ~P4_0;  
}	
	#endif

#endif


⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?