?? mainsinglesignal726.c.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 //節(jié)拍信號
#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, //計數(shù)器
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;
}
//--------------------------------------------------------------------------
// 系統(tǒng)初始化,初始化寄存器
//--------------------------------------------------------------------------
void initsys()
{
EA = 1; //全局中斷允許
ET0 = 1; //定時器中斷允許
ET1 = 1;
PT1 = 1; //T1中斷優(yōu)先級最高
TMOD = 0x11; //T0工作方式1,計時1ms
TH0=0xFE;
TL0=0x0C;
TR0 = 1; //啟動T0;
TH1=0xFE;
TL1=0x0C;
TR1 = 1; //啟動T1;
//外部中斷1
IT1=1; //負跳變觸發(fā)
EX1=1; //外中斷1允許
fireLed = 0;
oilLed = 0;
OutSignal = 1; //輸出信號斷口初值
//8155 INIT
XBYTE[P8155CW] = 0x43; //定義8155控制字
}
//--------------------------------------------------------------------------
// 主程序
//--------------------------------------------------------------------------
void main(void)
{
init(); //變量初始化
initsys(); //系統(tǒng)初始化
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++; //點火信號周期計數(shù)
time0Key++; //鍵盤延時,去抖動
time0Count1++; //計數(shù)
//噴油信號檢測
// 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
}
}
}
//---------------------------------------------------------------------------
// 延時函數(shù),延時時間為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; //本次按鍵已經(jīng)生效
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; //本次按鍵已經(jīng)生效
// 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 + -