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

📄 mainsinglesignal726.c.bak

📁 发动机控制
💻 BAK
字号:
//说明:
//曲轴脉冲信号进入ECU之前接入延时装置
//中断TX1----曲轴脉冲信号    (输入)
//P1^2----延时输出曲轴脉冲信号 (输出)
//延时时间计算    360 X 角度(inputAngle)/256
//作者:邓天民
//时间:2005/07/26
//补充;程序中有很多可以删除的地方

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

#define UINT unsigned int 
#define UCHAR unsigned char
                               //8155地址 宏定义
#define P8155CW 0x0200         //控制字地址
#define P8155IA 0x0201         //A口
#define P8155IB 0x0202         //B口
#define P8155IC 0x0203         //C口

UCHAR   keynum;

#define  SI_HSEC    0x01           //节拍信号
#define  SI_WIDTH   0x08          //模拟喷油脉冲宽度
UCHAR    TSignal;                 //半秒信号

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

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;        //程序正常标志
sbit keyLed=P1^0;

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

UINT outTimeFire,outTimeDelay;        //输出点火时间
UCHAR inputAngle;                     //当前延时角度(0~255)
UCHAR keydown;
UCHAR I1,I2;

static UINT time0Count,time0Count1,time0Key;//time0Count2, //计数器
static UINT downCount,upCount;
UCHAR  downSign,upSign;
volatile UINT base,i;                                      // 基本定时单元

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

void Delay(int dtime);  // 延时
void dlyus();     
void  keyPrev();        //键盘处理
//--------------------------------------------------------------------------
// 变量初始化子程序
//--------------------------------------------------------------------------
void init()
{
	runLed = 1;
	inputAngle = 0;
//	timeOilSignal = 0;
	outTimeFire = 0;
	time0Count = 0;
	time0Count1 = 0;
//	time0Count2 = 0;
	time0Key = 0;
	keydown = 0;
	
	OilSignal = 0;
	lastOilSignal = 0;
	FireSignal = 0;
//	lastFireSignal = 0;
	
	outSignalStart =0;
//	outStart = 0x00;
	outTimeDelay = 0;
	timeFireSignal = 0;
	keyLed = 0;
	downCount = 0;
	upCount = 0;
	downSign = 0;
	upSign = 0;
}
//--------------------------------------------------------------------------
// 系统初始化,初始化寄存器
//--------------------------------------------------------------------------
void initsys()
{	
        EA = 1;                      //全局中断允许
        ET0 = 1;                     //定时器中断允许
        ET1 = 1;
        PT1 = 1;                     //T1中断优先级最高
	TMOD = 0x11;                 //T0工作方式1,计时1ms
	TH0=0xFE;
	TL0=0x0C;
	TR0 = 1;                     //启动T0;
	
	TH1=0xFE;
        TL1=0x0C;
	TR1 = 1;                     //启动T1;
	//外部中断1
	IT1=1;                       //负跳变触发
	EX1=1;                       //外中断1允许
		
	fireLed = 0;
	oilLed = 0;
	OutSignal = 1;               //输出信号断口初值
	//8155 INIT
	XBYTE[P8155CW] = 0x43;       //定义8155控制字 
}
//--------------------------------------------------------------------------
// 主程序
//--------------------------------------------------------------------------
void main(void)
{  
   init();          //变量初始化
   initsys();       //系统初始化
   while(1){   
        Delay(5);
        keyPrev();  //键盘处理
   }
}
//--------------------------------------------------------------------------
// 中断1子程序//点火信号检测
//--------------------------------------------------------------------------
void intersvr1(void) interrupt 2 using 1
{
       timeFireSignal = time0Count;  //记录
       time0Count = 0;       
       //计算喷油延时时间
       I1 = timeFireSignal>>2;
       I2 = inputAngle>>1;
       outTimeFire = ((I1*I2)>>5);
       downSign = 0xFF;
       downCount = 0;
}
//--------------------------------------------------------------------------
// T1中断子程序
//--------------------------------------------------------------------------
void time1(void) interrupt 3 using 1
{	
	TH1=0xFE;
        TL1=0x0C;
        
        downCount++;upCount++;        
        if(downSign==0xFF && downCount>=outTimeFire)
        {
            OutSignal = 0;downSign = 0;
            for(i=0;i<50;i++)dlyus();
            OutSignal = 1;
        }
                
//        if(upSign==0xFF && upCount>=outTimeDelay)
//        {
//            OutSignal = 1;upSign = 0;
//        }
}
//--------------------------------------------------------------------------
// T0中断子程序
//--------------------------------------------------------------------------
void time0(void) interrupt 1 using 1
{
     TH0=0xFE;
     TL0=0x0C;
     time0Count++;          //点火信号周期计数
     time0Key++;            //键盘延时,去抖动
          
     time0Count1++;         //计数 
     //喷油信号检测
//     if( (P1&0x02) == 0x02){
//     	OilSignal = 0xFF;
//        if(lastOilSignal!=0xFF){ //喷油信号上升沿
//	    outTimeDelay = outTimeFire;
//	    downSign = 0xFF;
//	    downCount = 0;
//	}
//     }else{
//        OilSignal=0x00;
//        if(lastOilSignal==0xFF){ //喷油信号下降沿
//        	upSign = 0xFF;
//        	upCount = 0;
//	}
//     }
//     lastOilSignal = OilSignal;
                 
     if(++base==800){      //0.4秒信号
     	base = 0;
     	runLed = !runLed;
     //	TSignal|=SI_HSEC;
     }
     //产生模拟输入信号
     if(base%200==0) 
        testLed = 0;
     else
        testLed = 1;
     
     if(base>402&&base<402+SI_WIDTH){
     	simLed = 1;
     }else if(base>2&&base<2+SI_WIDTH){
     	simLed = 1;
     }else
        simLed = 0;
}
//延时dtime 毫秒
void Delay(int dtime)
{
        UCHAR i,j;
        for(i=0;i<dtime;i++)
	{
		for(j=0;j<250;j++)
		{
			dlyus();					// 延时40us
		}
	}
}
//---------------------------------------------------------------------------
// 延时函数,延时时间为28*4/12=us+调用和返回时间,大约为40us
//---------------------------------------------------------------------------
void dlyus()
{
	_nop_();_nop_();_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();_nop_();_nop_();
	_nop_();_nop_();_nop_();
}
//--------------------------------------------------------------------------
//键盘处理
//--------------------------------------------------------------------------
void  keyPrev()
{	
	XBYTE[P8155IA] = 0xFF;
    	keynum = ~XBYTE[P8155IC];    	
    	
    	if((keynum&0x02) == 0x02){ //上8
    	   //keyLed = !keyLed;
    	   if(keydown==2) return;        //本次按键已经生效    	   
    	   Delay(1);                     //延时去抖动10MS
    	   for(i=0;i<8;i++){             //列扫描
    	       XBYTE[P8155IA] = ~(SI_HSEC<<i);
    	       keynum = XBYTE[P8155IC];
    	       if( (keynum&0x02) == 0x02){   //列扫描有键按下
    	       	   if(i==0){                 //归零
    	       	      //OutSignal = !OutSignal;
    	       	      inputAngle = 0x00;
    	       	   }else if(i==1){           //延时角度+5*360/256
    	       	      //fireLed = !fireLed;
    	       	      inputAngle += 5;
    	       	   }else if(i==2){           //延时角度+10*360/256
    	       	      //oilLed = !oilLed;
    	       	      inputAngle += 10;
    	       	      //keyLed = !keyLed;
    	       	   }else if(i==3){           //延时角度-5*360/256
    	       	      //testLed = !testLed;
    	       	      inputAngle -= 5;
    	       	   }else if(i==4){           //延时角度-10*360/256
    	       	      //testLed = !testLed;
    	       	      inputAngle -= 10;
    	       	   }
    	       	   inputAngle &= 0x00FF;
    	       	   
    	   	   keydown = 2;
    	   	   break;
    	       }
    	   }    	       	   
    	}else if((keynum&0x01) == 0x01){ //xia8
//    	   OutSignal = !OutSignal;
//    	   if(keydown==1) return;        //本次按键已经生效    	   
//    	   Delay(1);                     //延时去抖动10MS
//    	   for(i=0;i<8;i++){             //列扫描
//    	       XBYTE[P8155IA] = ~(SI_HSEC<<i);
//  	       keynum = XBYTE[P8155IC];
//  	       if( (keynum&0x01) == 0x01){   //列扫描有键按下
//  	       	   if(i==0){                 //归零
//   	       	      OutSignal = !OutSignal;
//    	       	   	//inputAngle = 0x00;
//    	       	   }else if(i==1){           //步长10增加
//    	       	      fireLed = !fireLed;
    	       	      //inputAngle += 10;
//    	       	   }else if(i==2){           //步长20增加
//    	       	      oilLed = !oilLed;
    	       	      //inputAngle += 20;
    	       	      //keyLed = !keyLed;
//    	       	   }else if(i==7){           //步长10减少
//    	       	      testLed = !testLed;
    	       	      //inputAngle-=10;
//    	       	   }
//    	   	   keydown = 1;
//    	   	   break;
//    	       }
//    	   }
    	}else{
    	   keydown = 0;
    	}
}

⌨️ 快捷键说明

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