二、主要程序部分
主要是根据不同频率段分不同的最小计数时长
/*******************************************************************************
* FunctionName : Function_1_Serve
* Description : 模式1服务函数 定时器0单位定时周期配置
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void Function_1_Serve(void)
{
float temp = 0.0;
temp = Calculate_Data();//计算方波频率
/*对应不同频率段 设置不同的单位定时器周期*/
if(temp<=1)
TIMEO = 10000;
else if(temp<=10)
TIMEO = 1000;
else if(temp<=100)
TIMEO = 100;
else if(temp<=1000)
TIMEO = 50;
else if(temp<=10000)
TIMEO = 20;
switch(TIMEO)// 设置不同的单位定时器周期
{
/*0.1hz-1hz*/
case 10000:
TIMEO_H = 0xdc;TIMEO_L = 0x00;
time0_all_num=100/temp;time0_high_num=time0_low_num=time0_all_num/2;break;
/*1hz-10hz*/
case 1000:
TIMEO_H = 0xfc;TIMEO_L = 0x75;
time0_all_num=1000/temp;time0_high_num=time0_low_num=time0_all_num/2;break;
/*10hz-100hz*/
case 100:
TIMEO_H = 0xff;TIMEO_L = 0xb2;
time0_all_num=10000/temp;time0_high_num=time0_low_num=time0_all_num/2;break;
/*100hz-1000hz*/
case 50:
TIMEO_H = 0xff;TIMEO_L = 0xdf;
time0_all_num=20000/temp;time0_high_num=time0_low_num=time0_all_num/2;break;
/*1000hz-10khz*/
case 20:
TIMEO_H = 0xff;TIMEO_L = 0xff;
time0_all_num=23000/temp;time0_high_num=time0_low_num=time0_all_num/2;break;
default:break;
}
}
/*******************************************************************************
* FunctionName : Function_3_Serve
* Description : 模式3服务函数 定时器1单位定时周期配置
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void Function_3_Serve(void)
{
float temp = 0.0;
temp = Calculate_Data();
time1_all_num = (uint)temp;
TIME1_H = ((65536-80)/256);
TIME1_L = ((65536-80)%256);
}
/*******************************************************************************
* FunctionName : Time_Init
* Description :系统定时器初始化
* Input : None
* Output : None
* Return : None
*******************************************************************************/
voidTime_Init(void)
{
TMOD = 0X11;
TR0 = 0;
TR1 = 0;
ET0 = 1;
ET1 = 1;
EA = 1;
}
/*******************************************************************************
* FunctionName : Time0(void) interrupt 1
* Description :定时器0中断服务函数
* Input : None
* Output : None
*******************************************************************************/
void Time0(void)interrupt 1
{
TH0 = TIMEO_H;
TL0 = TIMEO_L;
time0_num++; //记录一个周期进入定时器中断的次数
if(time0_num > time0_high_num) //输出口由高电平跳变为低电平
OUTPUT=0;
if(time0_num > time0_all_num) //输出口由低电平跳变为高电平
{
OUTPUT=1;
time0_num = 0;
}
}
/*******************************************************************************
* FunctionName : Time1(void) interrupt 3
* Description : 定时器1中断服务函数
* Input : None
* Output : None
*******************************************************************************/
void Time1(void)interrupt 3
{
TH1 = TIME1_H;
TL1 = TIME1_L;
time1_num++; //记录进入定时器中断的次数
if(time1_all_num>time1_num) //输出口由高电平跳变为低电平
OUTPUT = 1;
if(time1_all_num<time1_num) //输出口由低电平跳变为高电平
{
OUTPUT = 0;
time1_num = 0;
TR1 = 0;//高电平输出结束 关闭定时器
}
}