打印

求助:大家帮我看下。。实在是改不好了。

[复制链接]
1094|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ql64|  楼主 | 2008-11-15 15:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//===================================================
//程序目的求两路同频率信号的相移,一路接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++);
}






步骤很简单。。不知道为什么出不了结果。。哎。。。强人帮忙看看啊 。。。

相关帖子

沙发
xhtxzxw| | 2008-11-16 03:32 | 只看该作者

嘿嘿

//             简单问题复杂化,哪来的那么些变量?
// =================================================================
// 程序目的求两路同频率信号的相移,一路接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 First_Fall = 1;                            //标志位,第一个下降沿
bit Period_Tested = 0;                              //测量完毕的标志
bit Delta_Tested = 0;
unsigned long count0 = 0, count1 = 0;

//==================================================================
void delay1m(int);                              //各个函数的提前声明 
void display(void);
void calcu(void);
//=====================主函数=======================================
void main(void)
{
    TMOD=0x11;                                        //选择TO计数器
    IT0=1;                                      //INTO选择下降沿触发
    IT1=1;                                      //INT1选择下降沿触发
    TH0=0;                                         //计时器0初值清零
    TL0=0;
    TH1=0;                                         //计时器1初值清零
    TL1=0;
    IE=0x8f;     //1000 1111开总中断,INTO中断,TO中断,INT1中断,T1中断
    while(1)
    {
        if((Delta_Tested) &&           //如果相移测试标志已设置,并且
           (Period_Tested))  //周期测试标志已设置,说明完成了一次测量
        {
            calcu();                                //调用计算显示程序    
            count0 = 0;                              //软件计数器置0
            count1 = 0;                              //软件计数器置0
            TH1 = 0;                              //初始化计数器初值
            TH0 = 0;                              //初始化计数器初值
            TL1 = 0;  
            TL0 = 0;
            First_Fall = 1;
        }
        display();                                        //显示程序
    }
}
//====================INTO中断=====================================
void my_int0 (void) interrupt 0 
{  
    if(First_Fall)                  //如果是第一个下降沿则启动TO,T1
    {
        First_Fall = 0;                   //第一个下降沿标志标志清0
        Period_Tested = 0;
        Delta_Tested = 0;
        TR0 = 1;                                           //启动TO
        TR1 = 1;                                           //启动T1
    }
    else //若为第二个下降沿(每次周期测量仅涉及到两个下降沿)则停止TO
    {
        TR0 = 0;                          //关闭T0,结束一次周期测试
        Period_Tested = 1;               //设置"周期已经被测量"标志
    }
}
//===========================INT1中断==============================
void my_int1 (void) interrupt 2 

    if(TR1 == 1) //如果T1已经启动(仅在INT0第一个下降沿启动)则关闭T1
    {
        TR1 = 0;
        Delta_Tested = 1;            //设置"相位偏差已经被测量"标志
    }
}
//===================================TO中断========================
void my_t0 (void) interrupt 1 

    count0++;                            //TO溢出中断,溢出一次加一
    TH0 = 0;
}
//===================================T1中断========================
void my_t1 (void) interrupt 3 

    count1++;                           //T1溢出中断,溢出一次加一
    TH1 = 0;
}
//===================计算并显示所测值==============================
void calcu(void)
{
    unsigned long Delta,Period;
    unsigned long Angle;

    Period  = TH0*256 + TL0 + count0*65536;              //计算周期
    Delta   = TH1*256 + TL1 + count1*65536;            //计算时间差
    Delta  %= Period;                       //相位有可能超前啊!!!
    Angle   = (Delta*360)/Period;  //先做乘法后做除法,不容易丢精度

    dispdata[3] = 0;                               //各个位数的显示
    dispdata[2] = (Angle/100)%10;
    dispdata[1] = (Angle/10)%10;
    dispdata[0] = Angle%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++);
}

使用特权

评论回复
板凳
hotpower| | 2008-11-16 09:43 | 只看该作者

搜索一下“volatile”~~~

使用特权

评论回复
地板
xhtxzxw| | 2008-11-16 22:22 | 只看该作者

嘿嘿


        Period_Tested = 0;
        Delta_Tested = 0;
这两行放到main()里面
        First_Fall = 1;
这一行的后面,就似乎不需要考虑"volatile"?呵呵

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

4

帖子

1

粉丝