⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 speed.c

📁 转速测定
💻 C
字号:
/
*******************************************************************************/
#include   <reg52.h>
#include   <stdio.h>
#include   <intrins.h>

#define    Uchar   unsigned char
#define    Uint    unsigned int
#define    Ulong   unsigned long

#define    MaxFull      200
#define    MaxSpeed     182
#define    MaxSave      8
#define    FiftyMsTimes 10
#define    MaxTimes     10
/******************/
#define    MaxRack      126
#define    ContrPort    P2

Uint       code SelectChan[4]={0x0000,0x0200,0x0400,0x0600};
/**********5620控制端口**/
sbit       LdacPort=P2^4;
sbit       LoadPort=P2^5;
sbit       DataPort=P2^6;
sbit       ClkPort =P2^7;
/**********转速方向********/
sbit       CheckPul=P3^4;
/**********超速报警********/
sbit       OverSpeed=P3^6;
/**********看门狗*********/
sbit       WDI=P1^7;
union      IntUnion
           {
            Uint Word;
            struct{
                   Uchar  HighByte;
                   Uchar  LowByte;
                  }Byte;
           };
union      IntUnion SpeedVal;
bit        CountFlag;
Uchar      Seconds,PusleNum,BeginFlag,DirectFlag;
Uint       idata Speed1[MaxSave];
Uchar      idata CurrentNo;
Uchar      idata CurrentNum;
Uint       idata SpeedSave;
Uchar      idata Direct[MaxTimes];
/*函数列表*/
void       SystemInit(void);
void       DA5620(Uchar);
void       CountSpeed(void);

/*初始化系统相关端口和寄存器**/
void SystemInit(void)
{
     Uchar i; 
     
     TMOD   =0x15;
     TH0    =0x00;
     TL0    =0x00;
     TH1    =0x3C;
     TL1    =0xB0;
     T2CON  =0x34;
     TH2    =0xFF;
     TL2    =0x64;
     RCAP2H =0xFF;
     RCAP2L =0x64;
     PCON   =0X80;
     SCON   =0XD0;
     SM2    =0;
     ES     =0;
     /**/
     IT0    =1;
     EX0    =1;
     PX0    =1;
     /**/
     CurrentNo=0;/*开始个数为零*/
     CurrentNum=0;
     Seconds=0;
     /**/
     PusleNum=0x00;
     for(i=0;i<MaxTimes/2;i++)         Direct[i]=0X55;
     for(i=MaxTimes/2;i<MaxTimes;i++)  Direct[i]=0XAA;
     BeginFlag=0x55;
     DirectFlag=0x77;
     /**/
     TR0=1;
     TR1=1;
     ET1=1;
     ES =1;
     CountFlag=0;
}

/****DA转换***/
void DA5620(Uchar ChanData)
{
     Uchar idata i;
     Uchar idata m;
     Uint  idata TChan;

     for(m=0;m<4;m++)
     {
      TChan=(Uint)ChanData|SelectChan[m];
      LoadPort=1;   
      _nop_();
      LdacPort=1;;  
      _nop_();
      for(i=0;i<11;i++)
      {
       if(TChan&0x0400)  DataPort=1;  
       else              DataPort=0;  
       ClkPort=1;
       TChan=(TChan<<1);
       _nop_();_nop_();_nop_();
       ClkPort=0;
      }
      LoadPort=0;   //LOAD
      _nop_();
      LdacPort=0;;  //LDAC
      _nop_();_nop_();
     }
}
/**/
void EXINT0(void) interrupt 0 using 1
{
     Uchar idata i,Totall;

     if(BeginFlag==0x55)
     {
      PusleNum =0x00;
      BeginFlag=0xAA;
      return;
     }
     /**/
     if(CheckPul)                      Direct[PusleNum++]=0XAA;/*正*/
     else                              Direct[PusleNum++]=0X55;/*反*/
     if(PusleNum>=MaxTimes)            PusleNum=0;
     /**/
     if(SpeedSave<50)
     {
      Totall=0;
      for(i=0;i<MaxTimes;i++)
      {
       if(Direct[i]==0XAA)             Totall++;
      }
      if(Totall>=MaxTimes/2)           DirectFlag=0x77;      /*正*/
      else                             DirectFlag=0x88;      /*反*/
     }
}

/*定时1定时0.05S=50ms*/
void Timer1() interrupt 3 using 0
{
     Uint   idata Tint1;
     Uchar  idata Tchar1;

     EA=0;
     TR0=0;
     TR1=0;
     ET1=0;
     WDI=~WDI;
     Seconds++;
     if(Seconds==FiftyMsTimes)
     {
      Tchar1=TL0;
      Tint1=TH0;
      Tint1=Tint1*256+Tchar1;
      Speed1[CurrentNo++]=Tint1;
      if(CurrentNo>=MaxSave)    CurrentNo=0;
      if(CurrentNum<MaxSave)    CurrentNum++;
      CountFlag=1;
      Seconds=0;
      return;
     }
     /*定时50Ms*/
     TH1=0x3C;
     TL1=0xB0;
     TR0=1;
     TR1=1;
     ET1=1;
     EA=1;
}

/*********计算速度********/
void CountSpeed(void)
{
     Uchar  idata Tchar1,i;
     Ulong  idata TLong1;
     Ulong  idata TLong2;

     TLong1=0;
     for(Tchar1=0;Tchar1<CurrentNum;Tchar1++) TLong1+=Speed1[Tchar1];
     /*计算转速值*/
     if(CurrentNum==0)     CurrentNum=1;
     TLong1=TLong1*(1200/FiftyMsTimes);
     TLong1=TLong1/CurrentNum;
     TLong1=TLong1/MaxRack;
     TLong2=TLong1;
     SpeedSave=(Uint)TLong1;
     if(SpeedSave==0)
     {
      for(i=0;i<MaxTimes/2;i++)         Direct[i]=0X55;
      for(i=MaxTimes/2;i<MaxTimes;i++)  Direct[i]=0XAA;
      DirectFlag=0x77;                  /*正*/
      BeginFlag=0x55;
     }
     if(SpeedSave>MaxFull)              SpeedSave=MaxFull;
     TLong1=TLong1*255;
     TLong1=TLong1/MaxFull;
     if(TLong1>0xff)                    TLong1=0xff;
     Tchar1=(Uchar)TLong1;
     if(DirectFlag==0x77)               ContrPort=ContrPort|0x0F; /***正传***/
     else                               ContrPort=ContrPort&0xF0; /***反转***/
     DA5620(Tchar1);
     /*超速值采集*/
     if(TLong2<MaxSpeed)                OverSpeed=1;
     else                               OverSpeed=0;
     TH0=0x00;
     TL0=0x00;
     /*定时50Ms-->12M晶振*/
     TH1=0x3C;
     TL1=0xB0;
     TR0=1;
     TR1=1;
     ET1=1;
     EA=1;
}

/*发送到远程*/
void SendDataToFar(void)
{
     Uchar CheckSum,i;

     EA=0;
     TB8=1;
     SBUF=0xAA;
     while(TI==0);TI=0;
     SpeedVal.Word=SpeedSave;
     TB8=0;
     SBUF=SpeedVal.Byte.HighByte;
     CheckSum=SpeedVal.Byte.HighByte;
     while(TI==0);TI=0;
     TB8=0;
     SBUF=SpeedVal.Byte.LowByte;
     CheckSum^=SpeedVal.Byte.LowByte;
     while(TI==0);TI=0;
     TB8=0;
     SBUF=DirectFlag;
     CheckSum^=DirectFlag;
     while(TI==0);TI=0;
     TB8=0;
     SBUF=CheckSum;
     while(TI==0);TI=0;
     TB8=1;
     SBUF=0xCC;
     while(TI==0);TI=0;
     EA=1;
}

/****主函数****/
void main(void)
{
     EA=0;
     SP=0xE0;
     PSW=0x00;
     SystemInit();
     //DA5620(0x80);
     //DA5620(0xFF);
     EA=1;
     ContrPort=ContrPort|0x0F;
     while(1)
     {
      WDI=~WDI;
      if(CountFlag)
      {
       CountSpeed();
       CountFlag=0;
       SendDataToFar();
      }
     }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -