📄 speed.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 + -