本帖最后由 ANSI_gao 于 2010-8-3 10:26 编辑
这几天我做了一个外部中断信号INT0中断触发Timer0计时,Timer1计数 的仿真。误差很大。不知各位大侠有何减少误差的方法。
关于LCD显示的函数和初始化函数、延时函数太繁琐就不一一列出了
现在我把主函数和三个中断函数列出来:
/*********************************************************
程序功能:计数两个负边缘触发信号时间间隔T内的外部脉冲个数P
并在LCD上显示出时间间隔T和脉冲数P
**********************************************************/
.................
/*******************************************************
函数功能:主函数
********************************************************/
void main(void)
{
LcdInitiate(); //调用LCD初始化函数
display_sym(); //在LCD上显示时间和脉冲提示符“T=”和“P=”
display_val1(000); //初始时在LCD上显示器工作正常标志“0.000”和“00000”
display_val2(00000);
display_unit(); //LCD显示时间单位“S”
TMOD=0x51; //定时器T1工作于计数模式1,定时器T0工作于计时模式1;
EA=1; EX0=1; //开总中断,
ET0=1;
IT0=1;
while(1) //无限循环
{
while(flag==0); //第一个下降沿启动T0,T1
TH1=0; //定时器T1高8位赋初值0
TL1=0; //定时器T1低8位赋初值0
TR1=1; //定时器T1启动 INT0下降沿触发
count=0; //再赋初值
TH0=-0x03;
TL0=-0xe8;
TR0=1; //启动定时器T0
while(flag==1); //第二个下降沿关闭T0,T1
TR0=0; //终止Timer0
TR1=0;
flag=0;
pulse=(unsigned int)(TH1*256+TL1);
pulse=65536*T1count+pulse; //脉冲数
display_val2(pulse); //显示脉冲数
display_val1(count); //显示时间
T1count=0;
}
}
/*******************************************************
函数功能:定时器T0的中断服务函数
********************************************************/
void Time0(void ) interrupt 1 //定时器T0的中断编号为1,使用第1组工作寄存器
{
count++; //T0每中断1次,count加1
TH0=-0x03; /1ms中断一次;
TL0=-0xe8;
}
void Int0(void) interrupt 0
{
flag++;
}
void Time1(void) interrupt 3
{
T1count++;
}
------------------------------------------------------------------------------------------------------
用脉冲数pulse除以(countX0.001)S得到脉冲的频率
但是仿真结果误差很大,而且我发现把TH0=-0x03;TL0=-0xe8;改为TH0=TH_M1;TL0=TL_M1;
(#define TH_M1 (65536-1000)/256
#define TL_M1 (65536-1000)%256 结果又不一样)
请各位大侠给点建议怎样才能减小误差。 |