?? maindoublesignal726.c
字號:
//說明:
//曲軸脈沖信號進(jìn)入ECU之前接入延時(shí)裝置
//中斷TX1----曲軸脈沖信號 (輸入)
//P1^0-----噴油脈沖信號 (輸入)
//P1^2---- 延時(shí)輸出曲軸脈沖信號 (輸出)
//延時(shí)時(shí)間計(jì)算 曲軸周期*360*角度(inputAngle)/256
//作者:鄧天民
//時(shí)間:2005/07/26
//補(bǔ)充;程序中有很多可以刪除的地方
#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; //點(diǎn)火信號當(dāng)前標(biāo)志
UCHAR OilSignal; //噴油信號當(dāng)前標(biāo)志
UCHAR lastOilSignal; //噴油信號前1ms標(biāo)志
sbit testLed=P1^5; //模擬尖脈沖點(diǎn)火信號
sbit simLed=P1^6; //模擬噴油信號
sbit OutSignal=P1^2; //輸出斷口
sbit oilLed=P1^4; //噴油信號高
sbit fireLed=P1^3; //點(diǎn)火信號為高
sbit runLed=P1^7; //程序正常標(biāo)志
sbit keyLed=P1^0;
UINT timeFireSignal; //點(diǎn)火信號周期(0.1ms單位)
//UINT timeOilSignal; //噴油信號寬度(0.1ms單位)
UINT outTimeFire,outTimeDelay; //輸出點(diǎn)火時(shí)間
UCHAR inputAngle; //當(dāng)前延時(shí)角度(0~255)
UCHAR keydown;
UCHAR I1,I2;
static UINT time0Count,time0Count1,time0Key;//time0Count2, //計(jì)數(shù)器
static UINT downCount,upCount;
UCHAR downSign,upSign;
volatile UINT base,i; // 基本定時(shí)單元
UCHAR outSignalStart;//,outStart; //輸出信號開始標(biāo)志
void Delay(int dtime); // 延時(shí)
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; //定時(shí)器中斷允許
ET1 = 1;
PT1 = 1; //T1中斷優(yōu)先級最高
TMOD = 0x11; //T0工作方式1,計(jì)時(shí)1ms
TH0=0xFE;
TL0=0x0C;
TR0 = 1; //啟動T0;
TH1=0xFE;
TL1=0x0C;
TR1 = 1; //啟動T1;
//外部中斷1
IT1=1; //負(fù)跳變觸發(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子程序//點(diǎn)火信號檢測
//--------------------------------------------------------------------------
void intersvr1(void) interrupt 2 using 1
{
timeFireSignal = time0Count; //記錄
time0Count = 0;
//計(jì)算噴油延時(shí)時(shí)間
I1 = timeFireSignal>>2;
I2 = inputAngle>>1;
outTimeFire = ((I1*I2)>>5);
}
//--------------------------------------------------------------------------
// T1中斷子程序
//--------------------------------------------------------------------------
void time1(void) interrupt 3 using 1
{
TH1=0xFE;
TL1=0x0C;
downCount++;upCount++;
if(downSign==0xFF && downCount>=outTimeDelay)
{
OutSignal = 0;downSign = 0;
}
if(upSign==0xFF && upCount>=outTimeDelay)
{
OutSignal = 1;upSign = 0;
}
}
//--------------------------------------------------------------------------
// T0中斷子程序
//--------------------------------------------------------------------------
void time0(void) interrupt 1 using 1
{
TH0=0xFE;
TL0=0x0C;
time0Count++; //點(diǎn)火信號周期計(jì)數(shù)
time0Key++; //鍵盤延時(shí),去抖動
time0Count1++; //計(jì)數(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;
}
//產(chǎn)生模擬輸入信號
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;
}
//延時(shí)dtime 毫秒
void Delay(int dtime)
{
UCHAR i,j;
for(i=0;i<dtime;i++)
{
for(j=0;j<250;j++)
{
dlyus(); // 延時(shí)40us
}
}
}
//---------------------------------------------------------------------------
// 延時(shí)函數(shù),延時(shí)時(shí)間為28*4/12=us+調(diào)用和返回時(shí)間,大約為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); //延時(shí)去抖動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){ //延時(shí)角度+5*360/256
//fireLed = !fireLed;
inputAngle += 5;
}else if(i==2){ //延時(shí)角度+10*360/256
//oilLed = !oilLed;
inputAngle += 10;
//keyLed = !keyLed;
}else if(i==3){ //延時(shí)角度-5*360/256
//testLed = !testLed;
inputAngle -= 5;
}else if(i==4){ //延時(shí)角度-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); //延時(shí)去抖動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;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -