单片机课程设计-频率相位表 联系客服

发布时间 : 星期二 文章单片机课程设计-频率相位表更新完毕开始阅读743de624192e45361066f524

(5) 测试12319Hz:

5.2 实物测试结果: (1)测试5Hz:

(2)测试590Hz:

6、性能分析:

由以上性能指标测试可知:

6.1仿真结果分析:利用计数法所设计的本系统的测试范围大概在1Hz~10Hz,当输入较低频率的方波信号时,精确度较高;然而随着输入的方波信号的频率逐渐增大,精确度逐渐下降。误差也随之增大。 6.2 实物结果分析:

由以上实物所测试的数据来看,实物在频率较高时,存在比较的误差;在频率较低时,误差较小,但是仍然存在,无法做到十分精确的测量,比较遗憾。 误差分析:

(1) 由于软件程序是用高级语言C写的,其延时指令精确度比不上汇编语言,所以,

在定时器定时的时候,出现误差;

(2) 由于整个设计所依靠的基本上是MCS-51单片机的定时器和中断,几乎不借助例

如计数器等扩展部件,所以其处理速度所限制;

(3) 在实物测试时候发现,实物误差较大,可能存在的原因是单片机以异或门芯片

74LS86在传输方波信号时,中间产生一定时间误差。而由于实物制作工艺问题, 电路板存在较大干扰噪声,影响测量结果。

附录一:设计源程序 #include #include\

const unsigned char table1[]={\ const unsigned char table2[]={\

unsigned char temp[]={0x30,0x30,0x30,0x30,0x30,0x2e,0x30,0x30}; unsigned char temp2[]={0x30,0x30,0x30,0x2e,0x30,0x30};

float t1,t2,fre,ph; unsigned int m,n; unsigned int n1,f,p; unsigned int m1;

unsigned int x=0,y=0;

/*******定时器T0的中断服务程序**计算方波1周期******/ void time0()interrupt 1 //记得T0的中断号是1 {

x++; //方波一计数中溢出的个数 //TH0=255; //TL0=246; }

/*******定时器T0的中断服务程序*计算方波2周期*******/ void time1()interrupt 3 {

y++; //定时器0溢出次数

// TH1=255; // TL1=246; }

/***********外部中断0-方波1 中断服务程序***********/ void wai0()interrupt 0 {

m=x; x=0;

m1=TH0*256+TL0;

//if(m1>65526)m1=m1-65526; TH0=0; TL0=0; }

/***********外部中断1-方波2 中断服务程序**************/ void wai1()interrupt 2 {

n=y; //定时器1溢出次数保存 y=0;

n1=TH1*256+TL1; TH1=0; TL1=0; }

void main(void) {

inis_lcd(); //液晶初始化 P3=0xff; //输出初始化

TMOD=0x99; // 利用门控位,gate=1时,定时器T0、T1的启动依靠TR0、TR1和外部中断的高电平

//其中T0\\T1工作于方式1,65536计数 TH0=0;

TL0=0; //加一计数器 TH1=0; //5us TL1=0;

TR0=1; //单方面启动定时器,等到外部中断高电平 TR1=1;

EX0=1; //开外部中断 EX1=1;

ET0=1; //开定时器中断 ET1=1;

EA=1; //总中断开

IT0=1; //两个外部中断的触发方式设置为由高到低的负跳变触发 IT1=1;

display(0x80,table1,4); display(0x8d,&table1[4],2); display(0xc0,table2,3); write_com(0xc9);

write_data(0x22); //度数符号\

while(1) {

t1=m*65536+m1;

fre=1000000/(2*t1); //计算频率 f=fre*100; temp[7]=f+48;

temp[6]=(f/10)+48; // temp[6]=0x2e;