//=================================================== //程序目的求两路同频率信号的相移,一路接INTO。一路接INT1 // 1.用外部中断INTO做触发,为基准波形测试。来第一个下降沿开T0.T1 // 2.当移向波形来下降沿的时候,关T1,求得tt(时间差) // 3.当基准波形来第二个下降沿,关TO,求得T(周期) //=================================================== //**************************************************** // 波形相位偏移量的测量 true@11.13 ****** //***************************************************** #include <reg51.h> //头部的引用 #include <absacc.h> //================================================= #define LS377 XBYTE[0X6000] //外部地址 //================================================ unsigned char dispbit[4]={0xe0,0xd0,0xb0,0x70}; //数码管的位选数组 unsigned char dispdata[4]={0,0,0,0}; //数码管显示的寄存数组 bit flag=1; //标志位,用于开启和关闭TO bit flag1=1; //测量完毕的标志 bit flag2=0; unsigned int TH_M0,TL_M0; //TO的初值 unsigned int TH_M1,TL_M1; unsigned int T,count,countT0,jiaodu; //测量的周期,溢出的计数器 unsigned int tt,count1,countT1; //=============================================== void delay1m(int); //各个函数的定义 void display(void); void calcu(void); //=====================主函数=========================== void main(void) {TMOD=0x11; //选择TO计数器 IE=0x8f; //1000 1111开总中断,开INTO中断,开TO中断,开INT1中断,开T1中断 IT0=1; //INTO选择下降沿触发 IT1=1; TH0=0; //计时器初值为零 TL0=0; TH1=0; //计时器初值为零 TL1=0; while(1) { if(flag2==1) //如果标志显示测量完毕 { flag2=0; //则将标志位清零 //========================================== countT0=count; //将软件计数器送给传递的中间量 count=0; //软件计数器置0 TH_M0=TH0; //用测量的数值送显示单元 TL_M0=TL0; TH0=0; //初始化计数器初值 TL0=0; //============================================== countT1=count1; //将软件计数器送给传递的中间量 count1=0; //软件计数器置0 TH_M1=TH1; //用测量的数值送显示单元 TL_M1=TL1; TH1=0; //初始化计数器初值 TL1=0; calcu(); //调用计算显示程序 } display(); //显示程序 } } //====================INTO中断============================== void my_int0 (void) interrupt 0 { if(flag==1) //如果标志为1则开TO { flag=0; //清标志 TR0=1; //开TO TR1=1; } else { TR0=0; //如果标志为0表示测量结束 flag=1; //置标志1 flag1=1; flag2=1; //标志测量完毕 } } //====================INT1中断============================== void my_int1 (void) interrupt 2 { if(flag1==1) //如果标志为1则开TO { flag1=0; //清标志 TR1=0; } } //======================TO中断======================== void my_t0 (void) interrupt 1 { count++; //TO溢出中断,溢出一次加一 } //======================T1中断======================== void my_t1 (void) interrupt 3 { count1++; //T1溢出中断,溢出一次加一 } //=============定时时间到,计算并显示所测值============= void calcu(void) { tt=TH_M1*256+TL_M1+countT1*65536; //时间差的计算 T=TH_M0*256+TL_M0+countT0*65536; //周期T的计算 jiaodu=(tt/T)*360; dispdata[3]=jiaodu/1000; //各个位数的显示 dispdata[2]=(jiaodu/100)%10; dispdata[1]=(jiaodu/10)%10; dispdata[0]=jiaodu%10; } //==================显示程序,拼字显示====================== void display(void) { int i; for(i=0;i<4;i++) { LS377=dispbit|dispdata; //在数码管上显示测量数目 delay1m(4); } } //=================延迟程序(X*1MS)==================== void delay1m(int x) {int i,j; for(i=0;i<x;i++) for(j=0;j<120;j++); }
步骤很简单。。不知道为什么出不了结果。。哎。。。强人帮忙看看啊 。。。
|