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

📄 main11

📁 发动机控制
💻
字号:
//说明:
//在P10和P11输入信号后,在P12上输出预定波形

#include <reg51.h>
#include <stdio.h> 
#include <intrins.h>

#define UINT unsigned int 
#define UCHAR unsigned char

#define  SI_HSEC   0x01           //节拍信号
#define  SI_WIDTH   0x08
UCHAR    TSignal;        //半秒信号

UCHAR FireSignal;       //点火信号当前标志
UCHAR lastFireSignal;   //点火信号前1ms标志

UCHAR OilSignal;       //喷油信号当前标志
UCHAR lastOilSignal;   //喷油信号前1ms标志

sbit testLed=P1^5;       //模拟尖脉冲点火信号
sbit simLed=P1^6;        //模拟喷油信号

sbit OutSignal=P1^2;     //输出断口
sbit oilLed=P1^4;        //喷油信号高
sbit fireLed=P1^3;       //点火信号为高
sbit runLed=P1^7;        //程序正常标志

UINT timeFireSignal;     //点火信号周期(0.1ms单位)
UINT timeOilSignal;      //喷油信号宽度(0.1ms单位)

UINT outTimeFire,outTimeDelay;       //输出点火时间
UINT inputAngle;                //输入角度
static UINT time0Count,time0Count1,time0Count2;        //计数器
volatile UINT base;                                  // 基本定时单元

UCHAR outSignalStart;   //输出信号开始标志

void  firePrev();       //点火信号处理
void  oilPrev();        //喷油信号处理
void  outPrev();        //输出信号处理
//--------------------------------------------------------------------------
// 变量初始化子程序
//--------------------------------------------------------------------------
void init()
{
	inputAngle = 60;	
	timeOilSignal = 0;
	outTimeFire = 0;
	time0Count = 0;
	time0Count1 = 0;
	time0Count2 = 0;
	
	OilSignal = 0;
	lastOilSignal = 0;
	FireSignal = 0;
	lastFireSignal = 0;
	
	outSignalStart =0x00;
	outTimeDelay = 0xFFFF;
}
//--------------------------------------------------------------------------
// 系统初始化,初始化寄存器
//--------------------------------------------------------------------------
void initsys()
{	
        EA = 1;
        ET0 = 1;
        ET1 = 1;
        PT1 = 1;
	TMOD = 0x11;                  //T0工作方式1,计时1ms
	TH0=0xFE;
	TL0=0x0C;
	TR0 = 1;                     //启动T0;
	TH1=0xFF;
	TL1=0xFE;
	TR1 = 0;                     //启动T1;
	//中断1
	IT1=1;                       //负跳变触发
	EX1=1;                       //外中断1允许
	
	//P1 = 0;
	fireLed = 0;
	oilLed = 0;
	OutSignal = 1;
}
//--------------------------------------------------------------------------
// 主程序
//--------------------------------------------------------------------------
void main(void)
{   
   
   init();
   initsys();
   while(1){            
   	firePrev(); //处理点火信号
   	oilPrev();  //处理喷油信号
   	outPrev();  //输出信号处理
        if(TSignal&SI_HSEC)          // 半秒消息信号
    	{                      
           TSignal&=~SI_HSEC;	     // 清除半秒消息信号标志
           runLed = !runLed;
    	}
   }
}
//--------------------------------------------------------------------------
// 中断1子程序
//--------------------------------------------------------------------------
void intersvr1(void) interrupt 2 using 1
{
       FireSignal=0xFF;
}
//--------------------------------------------------------------------------
// T1中断子程序
//--------------------------------------------------------------------------
void time1(void) interrupt 3 using 1
{	
	OutSignal = 1;
	TR1 = 0;
}
//--------------------------------------------------------------------------
// T0中断子程序
//--------------------------------------------------------------------------
void time0(void) interrupt 1 using 1
{          
     TH0=0xFE;
     TL0=0x0C;
     time0Count++;          //点火信号周期计数
     
     time0Count1++;         //喷油脉冲宽度计数
     time0Count2++;         //输出信号延时计数
//     if(time0Count2>)
     //喷油信号检测
     if( (P1&0x02) == 0x02){     	
        OilSignal=0x00;
        if(lastOilSignal==0xFF){ //喷油信号上升沿
	    timeOilSignal = time0Count1;
	    outTimeDelay = outTimeFire;
	    time0Count2 = 0;
	    outSignalStart = 0xFF;
	}
     }else{
        OilSignal = 0xFF;
        if(lastOilSignal!=0xFF){ //喷油信号下降沿
	    time0Count1=0;
	}
     }
     lastOilSignal = OilSignal;  
     if(++base==800){      //0.4秒信号
     	base = 0;
     	TSignal|=SI_HSEC;
     	}
    
     //产生模拟输入信号
     if(base%200==0) 
        testLed = 0;
     else
        testLed = 1;
     
     if(base>402&&base<402+SI_WIDTH){
     	simLed = 0;
     }else if(base>2&&base<2+SI_WIDTH){
     	simLed = 0;
     }else
        simLed = 1;   
}
//--------------------------------------------------------------------------
//点火信号处理
//--------------------------------------------------------------------------
void  firePrev()
{
//	UINT i;
	if(FireSignal==0xFF)      //点火信号到
    	{
//    	   EX1 = 0;               //关闭中断
//   	   if(lastFireSignal!=0xFF){ //第一次来高电平
   	   	fireLed = 1;
   	   	timeFireSignal = time0Count;  //记录
      	        time0Count = 0;               //清零     
      	        outTimeFire = timeFireSignal*25;
      	        timeFireSignal = outTimeFire/3;
      	        outTimeFire = timeFireSignal*inputAngle;
      	        timeFireSignal = outTimeFire/6;
      	        outTimeFire = timeFireSignal/500;
      /*        outTimeFire =  720-inputAngle+20;
      	        outTimeFire = outTimeFire/6;
      	        timeFireSignal = timeFireSignal/3;
      	        outTimeFire = outTimeFire*timeFireSignal/20;*/
//   	   }
//   	   for(i=80;i>0;i--);  //延时1ms
//   	   EX1 = 1;             //启动关闭中断
      	}
//      	lastFireSignal = FireSignal;
      	FireSignal = 0x00;
      	fireLed = 0;
}
//--------------------------------------------------------------------------
//喷油信号处理
//--------------------------------------------------------------------------
void  oilPrev()
{
	if(OilSignal==0xFF){         //喷油信号为高电平
	    if(lastOilSignal!=0xFF){ //喷油信号下降沿
	    time0Count1=0;
	    }
	    oilLed = 0;
	}else{
	    if(lastOilSignal==0xFF){ //喷油信号上升沿
	    if(time0Count1<30)
	    	timeOilSignal = time0Count1;
	    outTimeDelay = outTimeFire;
	    time0Count2 = 0;
	    outSignalStart = 0xFF;
	    }
	    oilLed = 1;
	}
	lastOilSignal = OilSignal;
}
//--------------------------------------------------------------------------
//输出信号处理
//--------------------------------------------------------------------------
void  outPrev()
{
	if(outSignalStart==0xFF){
           if(time0Count2>outTimeDelay)
           {
         //  	EA = 0;
           	TH1 = (0xFFFF-timeOilSignal*500)/256;
           	TL1 = (0xFFFF-timeOilSignal*500)%256;
           	TR1 = 1;
           	OutSignal = 0;                        //置输出为低电平
        //   	time0Count2 = 0;                      //计数器清零
           	outSignalStart = 0x00;
           }
/*	   if(time0Count2>outTimeDelay && time0Count2<outTimeDelay+timeOilSignal)
	   {
	   	OutSignal = 0;                        //置输出为低电平
	   }else if(time0Count2>outTimeDelay+timeOilSignal)
	   {
	   	OutSignal = 1;                        //置输出为高电平
	   	time0Count2 = 0;                      //计数器清零
	   }else{
	        OutSignal = 1;                        //置输出为高电平
	   }
	   
	   if(time0Count2>=outTimeDelay+timeOilSignal){//延时到计算+喷油宽度
	        OutSignal = 1;                        //置输出为高电平
	        outSignalStart = 0x00;
	        time0Count2 = 0;
	   }else if(time0Count2>=outTimeDelay){        //延时到计算时间
	        OutSignal = 0;                        //置输出为低电平	  
	   }else{
	        OutSignal = 1;
	   }*/
	}
}

⌨️ 快捷键说明

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