#include "H/Function_Init.H"

#if (Test == 3)

void Timer_Init(void);
uint count = 0;
uint count1=0,count2=0;
uchar flag=0;
uint8_t tempTXINX = 0;
/*****************************************************
*函数名称：void Timer_Test(void);
*函数功能：T0/T1/T2/T3测试
*入口参数：void
*出口参数：void
*****************************************************/
void Timer_Test(void)
{
	Timer_Init();
	while(1)
	{
	}
}
/*****************************************************
*函数名称：void Timer_Init(void)
*函数功能：T0/T1/T2/T3初始化
*入口参数：void
*出口参数：void
*****************************************************/
void Timer_Init(void)
{ 
	TMCON = 0X03;    //------111 ;Timer0、Tiemr1选择时钟Fsys
	
	//T0设置，现象：P21输出周期为1ms的方波(主频：32M)
	TMOD |= 0x01;                 //0000 0001;Timer0设置工作方式1
	TL0 = (65536 - 16000)%256;    //时钟为Fsys，则溢出时间=16000*（1/Fsys）;
	TH0 = (65536 - 16000)/256;
	TR0 = 0;
	ET0 = 1;//定时器0允许
	TR0 = 1;//打开定时器0
    
	//T1设置，现象为P20输出周期为10us的方波(主频：32M)
	TMOD |= 0x20;            //0010 0000;Timer1设置工作方式2
	TL1 = 256 - 160;         //时钟为Fsys，则溢出时间=160*（1/Fsys）;
	TH1 = 256 - 160;
	TR1 = 0;
	ET1 = 1;//定时器1允许
	TR1 = 1;//打开定时器1
    
	//T2设置，设置为捕获模式，读取变量count可以知道P10第10次到第11次下降沿的定时器计数值
	tempTXINX = TXINX;
	TXINX &= 0XF8;
	TXINX |= 0X02;  //指向T2
	TXCON = 0X09;   //使能EXT2，16位捕获模式
	TXMOD = 0X80;
	THX = 0X00;
	TLX = 0X00;
	RCAPXH = 0X00;
	RCAPXL = 0X00;
  ET2 = 1;
	TRX = 1;//打开定时器2
	TXINX = tempTXINX;
	
	//T3设置，设置为捕获模式，读取变量count可以知道P10第10次到第11次下降沿的定时器计数值
	tempTXINX = TXINX;
	TXINX &= 0XF8;
	TXINX |= 0X03;  //指向T3
	TXCON = 0X09;   //使能EXT3，16位捕获模式
	TXMOD = 0X80;
	THX = 0X00;
	TLX = 0X00;
	RCAPXH = 0X00;
	RCAPXL = 0X00;
  IE1 |= 0X40;
	TRX = 1;//打开定时器3
	TXINX = tempTXINX;
    
	EA = 1;	
}

/**************************************************
*函数名称：void timer0/1/2/3() interrupt 1/3/5/13
*函数功能：定时器中断产生方波
*入口参数：void
*出口参数：void
**************************************************/
void timer0() interrupt 1
{
  TL0 = (65536 - 16000)%256;			//手动重装载值低8位
	TH0 = (65536 - 16000)/256;			//手动重装载值高8位
	P21 = ~P21;			//翻转IO口
}

void timer1() interrupt 3
{
	P20 = ~P20;			//翻转IO口
}

void Timer2Int(void) interrupt 5
{		
	tempTXINX = TXINX;
	TXINX &= 0XF8;
	TXINX |= 0X02;  //指向T2
	if((TXCON & 0x80))			//是否发生溢出中断
	{
		TXCON &= 0x7F;			//清除溢出中断
		THX = 0;
		TLX = 0;
	}
	
  if((TXCON & 0x40))		//是否发生外部捕获中断
	{
		P24 = ~P24;			//IO翻转
		TXCON &= ~0X40;      //清除标志位
		if(++flag >= 12)     //捕获到第12个电平清零
		{
			flag = 0;

		}
		if(flag == 10)      //捕获到第10个电平，记录计数值1
		{
			count1 = ((uint)(RCAPXH << 8) + RCAPXL);	
		}
		if(flag == 11)     //捕获到第11个电平，记录计数值2
		{
			count2 = ((uint)(RCAPXH << 8) + RCAPXL);
			count = count2 - count1;      //计数值2-计数值1=第10个下降沿到第11个下降沿的时间计数值
		}
	}
	TXINX = tempTXINX;
}

void Timer3Int(void) interrupt 13
{		
	tempTXINX = TXINX;
	TXINX &= 0XF8;
	TXINX |= 0X03;  //指向T3
	if((TXCON & 0x80))			//是否发生溢出中断
	{
		TXCON &= 0x7F;			//清除溢出中断
		THX = 0;
		TLX = 0;
	}
	
  if((TXCON & 0x40))		//是否发生外部捕获中断
	{
		P25 = ~P25;			//IO翻转
		TXCON &= ~0X40;      //清除标志位
		if(++flag >= 12)     //捕获到第12个电平清零
		{
			flag = 0;

		}
		if(flag == 10)      //捕获到第10个电平，记录计数值1
		{
			count1 = ((uint)(RCAPXH << 8) + RCAPXL);	
		}
		if(flag == 11)     //捕获到第11个电平，记录计数值2
		{
			count2 = ((uint)(RCAPXH << 8) + RCAPXL);
			count = count2 - count1;      //计数值2-计数值1=第10个下降沿到第11个下降沿的时间计数值
		}
	}
	TXINX = tempTXINX;
}



#endif

