📄 main0725.c
字号:
//说明:
//在P10和P11输入信号后,在P12上输出预定波形
#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; //输出点火时间
UINT inputAngle; //当前角度/键盘输入角度
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 = 0; //启动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(10);
keyPrev(); //键盘处理
}
}
//--------------------------------------------------------------------------
// 中断1子程序//点火信号检测
//--------------------------------------------------------------------------
void intersvr1(void) interrupt 2 using 1
{
timeFireSignal = time0Count; //记录
time0Count = 0;
//计算喷油延时时间
I1 = (timeFireSignal>>2);
I2 = (inputAngle>>3);
outTimeFire = ((I1*I2)>>4);
// FireSignal=0xFF;
}
//--------------------------------------------------------------------------
// 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++; //点火信号周期计数
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(); // 延时4us
}
}
}
//---------------------------------------------------------------------------
// 延时函数,延时时间为28*4/12=us+调用和返回时间,大约为4us
//---------------------------------------------------------------------------
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&0x01) == 0x01){ //下8
;
// runLed = 1;
}else if((keynum&0x02) == 0x02){ //上8
if(keydown==2) return; //本次按键已经生效
if(time0Key<20) //延时10ms 去抖动
return;
for(i=0;i<8;i++){ //列扫描
XBYTE[P8155IA] = ~(SI_HSEC<<i);
keynum = XBYTE[P8155IC];
if( (keynum&0x02) == 0x02){ //列扫描有键按下
if(i==0){ //归零
inputAngle = 0x00;
}else if(i==1){ //步长10增加
oilLed = !oilLed;
inputAngle += 10;
}else if(i==2){ //步长20增加
inputAngle += 20;
keyLed = !keyLed;
}else if(i==5){ //步长10减少
inputAngle-=10;
}
if(inputAngle>512) //太大归零
inputAngle=0;
keydown = 2;
break;
}
}
}else{
time0Key = 0;
keydown = 0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -