📄 main.c
字号:
/**********************************************
文件名:main.c
日期:2006-4-25
作者:李升义
说明:主程序文件
**********************************************/
//xiugaibiaozhi5
#include <C8051F020.H>
//#include <global.h>
//#include <IRQ_Vector.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define SYSCLOCK 11059200 //系统时钟
//#define DRVCLOCK 16000000 //驱动时钟
//#define CYLINDERNUMBER 4 //发动机缸数
#define PROCESSWRITHE 1200 //加速转速
#define TOPWRITHE 2400 //最高转速*/
#define SCRATCH_ADDR 0x0000 // address of Scratchpad
//------------------定义4*4键盘编码--------------------
#define KeyNum0 0x28 //11101110数字键0
#define KeyNum1 0x11 //11011110
#define KeyNum2 0x21 //10111110
#define KeyNum3 0x41 //01111110
#define KeyNum4 0x12 //11101101
#define KeyNum5 0x22 //11011101
#define KeyNum6 0x42 //10111101
#define KeyNum7 0x14 //01111101数字键7
#define KeyNum8 0x24 //11101011
#define KeyNum9 0x44 //11011011数字键9
#define KeyUp 0x82 //10111011上箭头键
#define KeyDown 0x84 //01111011下箭头键
#define KeyEsc 0x81 //11110111返回键
#define KeyLeft 0x18 //11010111左箭头开始/停止键
#define KeyRight 0x48 //10110111右箭头Back Space 键
#define KeyEnter 0x88 //01110111回车(确认)输入键
//--------------定义屏幕功能划分标记------------------------
#define ScreenLeft 0 //左
#define ScreenRight 319 //右
#define ScreenTop 0 //上
#define ScreenBottom 239 //下
#define MainZoneTop 26 //主输出区顶
#define CylinderOutLine 221 //缸数输出行
#define CylinderOut1ColWord 10 //左输出列
#define CylinderOut2ColWord 30 //右输出列
#define LeftItem 6 //左边项目起始列
#define RightItem 26 //右边项目起始列
//---------------继电器控制位-------------------------------
//sbit K3 = P3^2; //继电器3
/*sbit K4 = P3^3; //继电器4
sbit K5 = P3^4; //继电器5
sbit K6 = P3^5; //继电器6
sbit Cex1Flag = P0^7; //P0.7,cex1输出标志
///sbit Int7 = P3^7; //中断7引脚
//------------------Fuction dedlare--------------------
//sbit StandardCylinder = P0 ^ 6;
void SetWrithe();
void SetFreq(float freq);
void ResetStepCounter();
uchar ReadKeyBoard(void);
void AnswerKeyBoard(uchar key);
void DelayM(ulong n);
void DisplayOneNumber(uchar x,uchar y,uchar number,uchar counter);
void DeleteOneNumber(uchar x,uchar y,uchar counter);
//void StartOutput();
//void StopOutput();
//void ClearLineZone(uchar x,uchar y,uchar col,uchar att); //清屏1行字符(8行点)
//void ClearZone(uchar beginY,uchar endY,uchar att);
void PutLogo(uchar x,uchar y, uchar flag); /
void DisplayStart();
void DisplayMainMenu(uchar func,uchar oldfunc);
void DisplayItem(uchar func);
void DisableInput(uchar x,uchar y,uchar len);
//uchar GetStrLength(uchar *pstr);
void RenewSubMenu(uchar old,uchar new); //刷新子菜单
void LockFlash(void); //琐定flash,禁止从jtag读取代码
void ReadFlash(void); //从FLASH的附加扇区读取标定系数
void WriteFlash(void); //写入标定参数
void FillParaArray(void);
void Quit(void); //退出项目返回主菜单
void OnEsc(void); //Esc键
void OnEnter(void); //确认键
void OnUp(void); //上行键
void OnDown(void); //下行键
void OnLeft(void); //左行键
void OnRight(void); //右行键
void OnNumber(uchar number); //数字键
void BeginItem(void); //进入子项目
void StopNumberInput(void); //结束数字输入
void FunctionSwitch(void); //各项目中功能转换
void StartupCurrentOutput(void); //起动电流开始输出
void ChargeCurrentOutput(void); //充电电流开始输出
void StartupCurrentZero(void); //线圈中电流置0
void SetFireAngle(void); //设定提前角
void ReSetAheadFlag(void); //复位提前角标志变量
//-------------------------------------------------------------------------
extern Init_Device();
//------------------LCM控制函数--------------------------------------------
extern void EnableCursor(uchar flag);
extern void LcmInitialize( void );
extern void LcmClear( void );
extern void Put_uint(uchar x,uchar y,uchar wei,uint shu,uchar attribte,bit inverse);
extern void Putf(uchar x,uchar y,uchar *p,float fbuf,uchar attribte);
extern void Locatexy(uchar x,uchar y, uchar attribs);
extern void Linexy(uint x0,uchar y0,uint xt,uchar yt,uchar att);
extern void Putstr(uchar x,uchar y, uchar *pstr,uchar flag,bit inverse);
extern void PutHz_32(uchar x,uchar y, uchar *pstr,uchar flag);
extern void PutHz_24(uchar x,uchar y, uchar *pstr,uchar flag);
//extern void PutHz_12(uchar x,uchar y, uchar *pstr,uchar flag);
//-----------------------------全局控制变量------------------------------------------------
ulong PCADRVCLOCK; //PCA驱动时钟
ulong TIMER4DRVCLOCK; //TIMER4驱动时钟
uchar Timer4Overflow = 0; //timer4溢出计数
bit bUp = 1; //加速时间上升阶段
//ulong Timer4PointTotal = 0; //timer4加速时间计数
uchar CYLINDERNUMBER = 4; //发动机缸数
ulong COUNTER = 0; //计数器
uint DisplayCounter = 0; //转速显示计数器
uint FlashDisplayCounter = 0; //闪光显示计数器
uint Timer4Counter = 0; //Timer4计数器
uint outCounter; //PCA输出计数,半周期
uint WRITHE = 800; //转速设定值(转/分)
float fSpeedTime = 0.0f; //加速时间实测值
uint SPEEDTIME = 200; //加速时间设定(毫秒)
uchar CLOSEANGLE = 20; //闭合角(度)
float fCloseAngle = 0.0f; //实测闭合角
uchar FIREANGLE = 20; //提前角(度)
float fFireAngle = 0; //提前角实测值
float fSpeed = 0.0f; //实际测得转速值
//bit CEX1=1; //PCA输出电平标志
//uint DelayCounter=0; //Timer3控制的的毫秒计数器
uchar StepCode = 0; //程序进行标志
uchar FunctionCode = 1; //项目标志
uchar OldFCode = 1; //旧项目
uchar SubMenuCode = 1; //各项目子菜单标志
uchar OldSubMenuCode = 1; //旧的各项目子菜单标志
uchar MaxSubMenuCode = 14; //子菜单数目
uchar LeftSubMenuCode = 8; //左边子菜单数目
uchar StateCode=0; //程序状态:进行、停止、输入
//----------------------------键盘输入控制所用变量-----------------------------------------
uchar InputCounter = 0; //输入计数值
uchar InputCounterMax = 0; //最大输入位数
uchar InputCounterInt = 0; //最大输入整数位数
uint InputValTemp = 0; //输入值的整数部分
uint InputValTempF = 0; //输入值的小数部分
float InputValTempMax = 0; //输入值上限
float InputValTempMin = 0; //输入值下限
float InputValTempInit = 0; //输入值默认
uchar InputPosX = 0; //当前输入位置
uchar InputPosY = 0;
//-----------------------------加速时间所用变量---------------------------------------------
uint StepCounter[8]; //加速时间步骤计数
uchar PCACPAL[300]; //加速过程中的PCA比较器值低字节数组
uchar PCACPAH[300]; //加速过程中的PCA比较器值高字节数组
bit SwitchUp=0; //加速开关
//-----------------------------闭合角所用变量-----------------------------------------------
uchar pcacpLH; //高电平输出时的PCA比较器低字节
uchar pcacpHH; //高电平输出时的PCA比较器高字节
uchar pcacpLL; //低电平输出时的PCA比较器低字节
uchar pcacpHL; //低电平输出时的PCA比较器高字节
//-----------------------------提前角所用变量-----------------------------------------------
bit bAhead0=0; //进行提前角输出标志
bit bAhead1=0; //进行提前角输出标志
bit bAhead2=0; //进行提前角输出标志
bit bAhead3=0; //进行提前角输出标志
//bit bAhead4=0; //进行提前角输出标志
bit bTimer = 0; //是否需要定时器3
uint PressValue = 0; //缸压波形零点
uint PressValueMax=4000;
uint PressValueMaxRec=3000;
uint PressValueZero=0;
uint PressValueStart=0;
ulong TermCounters =0; //主循环在一缸期间的计数值
long mainfunccounter = 0;
//uint AheadCounterLimitBegin,AheadCounterLimitEnd; //缸压波形起点
//uint AheadPoints;
long AheadCounters;
uchar CylinderCounter=0; //脉冲循环计数,作为缸号标志
uchar CylinderNumberEnd; //缸号循环尾标志
//uint WaveLength=200; //缸压波形的长度
//-------------------------------------------------------------------------------------------
//-----------------------------标定参数--------------------------------------------------
//参数表fPara备忘:0~7电流,8~11电压,12~18转速,19~23加速时间,24~35闭合角,36~44提前角
//参数表Para_Array备忘:0~7电流*100,8~11电压*100,12~18七个转速值的整数第一部分,
//19~23五个加速时间的整数第一部分,24~35十二个闭合角的整数部分,
//36~44九个提前角的整数部分,45~51七个转速值的整数第二部分,
//52~56五个加速时间的整数第二部分,57~68十二个闭合角的小数部分,
//69~77九个提前角的小数部分,78~84七个转速值的的小数部分,
//85~89五个加速时间的小数部分,
//90~101电压电流的3、4位小数
float fPara[47]; //电流8个系数,,电压4个系数,两位小数
uchar Para_Array[108];
uchar ParaFlag=0; //参数表标志变量
float fSpeedParaMul = 1.0f; //当前乘系数
float fSpeedParaAdd = 0.0f; //当前加系数
float fTimeParaMul = 1.0f; //当前乘系数
float fTimeParaAdd = 0.0f; //当前加系数
float fCloseAngleParaMul = 1.0f; //当前乘系数
float fCloseAngleParaAdd = 0.0f; //当前加系数
float fAheadAngleParaMul = 1.0f; //当前乘系数
float fAheadAngleParaAdd = 0.0f; //当前加系数
float fCurrentPara;
float fVoltagePara;
uchar VoltageFlag = 0;
//-----------------------------屏幕位置变量----------------------------------------------------------
uchar PromptX1;
uchar PromptY1;
uchar PromptX2;
uchar PromptY2;
uchar PromptX3;
uchar PromptY3;
uchar PromptX4;
uchar PromptY4;
//-----------------------------DA/AD控制变量---------------------------------
bit AD0ProcessEnd=0;
bit AD1ProcessEnd=0;
bit StartFlag = 0;
//bit EndFlag = 0;
bit bVoltageAdjusting = 1;
bit bVoltageOk = 0;
bit bCurrentAdjusting = 1;
bit CurrentAdjusted = 0;
bit bCurrentWaitForAdj = 0;
uchar CurrentOkCounter = 0;
uchar VOLTAGEDATA = 0; //电压设定值
uchar VOLTAGEDATAADJUSTED = 0; //电压设定值
uchar VOLTAGEDATAADJUSTEDUP = 0; //电压设定值
uchar VOLTAGEDATAADJUSTEDDOWN = 0; //电压设定值
uint VoltageCounter = 0;
uint VoltageOkCounter = 0;
//uchar VOLTAGEDATAUP = 0;
//float VoltageAdjusted = 12.0f; //标定后的电压设定值
uint CURRENT = 100; //电流设定值
uint CURRENTDATA = 100;
uchar CURRENTDISP = 5; //电流偏移值
uint CURRENTDOWN = 100; //电流设定值下限
uint CURRENTUP = 200; //电流设定值上限
float fVoltage = 0.0f; //实际测得电压值
float fCurrent = 0.0f; //采样阻值
float fRSample = 2.0f; //实际测得电流值
float fGain0 = 2.0f; //AD0的增益
//uchar fGain1 = 1; //AD1的增益
uchar CurrentFlag = 0; //电流档位标志
uint AD0TraceCounterMax = 0; //AD跟踪器在调整后的等待上限值(电容充放电时间)
uint ValueOut_DA1 = 0xfff; //DA1输出变量
uint ValueOut_DA0 = 0xfff; //DA0输出变量
ulong ADC0_SUM; //ADC1数值和
ulong ADC1_SUM; //ADC1数值和
uint COUNTER_ADC1 = 0; //ADC1计数器
//-------------------------------------------------------------------
uchar KeyCounter = 0; //键盘中断计数
//-------------------------------------------------------------------
uchar BDBegin = 0;
uchar BDEnd = 0;
//-------------------------------------------------------------------
//----------------闪光中断--------------------
//EIE2 |= 0x10;//允许INT7外部中断
//EIP2 |= 0x10;//INT7外部中断置为高优先级
bit bFlash = 0;
*/
//--------------USB---------------------------
//sbit SLRD=P7^0;//OUT
//sbit SLWR=P7^1;//OUT
//sbit SLCS=P7^2;//OUT
//sbit SLOE=P7^3;//OUT
//sbit FIFOADR1=P7^4;//OUT
//sbit FIFOADR0=P7^5;//OUT
//sbit Start=P6^0;//IN
//P5应配置为输出
//SLRD(RDY0/SLRD)、1
//SLWR(RDY1/SLWR)、 1
//SLCS(PA7/FLAGD/SLCS)、0
//SLOE(PA2/ SLOE) 1
//FIFOADR1(PA5/ FIFOADR1)1
//FIFOADR0(PA4/ FIFOADR0)0
int inData[256];
//-------------------------------------------=
void main(void)
{
int FD;
int i;
// FIFOADR0=1; //选择EP6
// FIFOADR1=0;
// SLWR=1; //初始化各个控制引脚
// SLRD=1;
// SLCS=0;
// SLOE=1;
WDTCN = 0xde; // disable watchdog timer
WDTCN = 0xad;
Init_Device();
P7 = 0x0B;
while(1) //主循环
{
P7 |= 0x30;//选择端点8,看是否有输出包
// P5 = 0x00;//设置P5为输入
if(!(P6&0x01))//若已满,读取命令包,或者利用可编程标志PF,读取设定字节的数据
{
P7 &= 0xF3; //SLOE
for (i=0;i<256;i++)
{
P7 &= 0xFE;
inData[i] = P5<<8;//仅读取高8位;
P7 |= 0x01;
// SLRD=0;
// SLRD=1;
}
for (i=0;i<256;i++)//两重缓冲,读两次
{
P7 &= 0xFE;
inData[i] += P5;//第二个缓冲区的高8位放在输入缓冲区的低字节
P7 |= 0x01;
}
P7 |= 0x08;
}
else
{
P7 &= 0xcf;//选择端点2
if(P6&0x01) //如果未满,满标志高电平
{
P74OUT |= 0x0c;
for (i=0;i<512;i++)
{
P5 = i; //循环写入512个数据0x05
P7 &= 0xFD;
P7 |= 0x02;
// SLWR=0;
// SLWR=1;
}
P74OUT &= 0xF3;
P5 = 0xff;//设置P5为输入
}
else //已满
{
FD = 0;
}
}
}
/* uchar key;
uint i;
bit ParaError0=0;
bit ParaError1=0;
bit ParaError2=0;
bit ParaError3=0;
WDTCN = 0xde; // disable watchdog timer
WDTCN = 0xad;
// LockFlash();
// P3 = 0x00;
//
K4 = 0;
K5 = 0;
K6 = 0;
// K3 = 0;
Init_Device();
K4 = 0;
K5 = 0;
K6 = 0;
// K3 = 0;
//lcd 显示
// DelayM(10); // 足够的延时确保lcm已经准备好
LcmInitialize(); //LCM初始化
LcmClear(); //LCM清屏
DisplayStart(); //显示欢迎界面
// DelayM(5000); //延时5秒
//===================================
//==========================================
do
key = ReadKeyBoard();
while(key == 0);
LcmClear();
//-------------从FLASH调取标定系数--------------------
// Putstr(14,120,"读取标定系数",0,1);
ReadFlash();
// LcmClear();
//----------------系数纠错---------------------------
//发现一个系数错误,所有系数重写
for(i=0;i<12;i++)//提前角可以要求系数大一些或小一些
{
if(fPara[i]>1.5 || fPara[i]<0.5)
{
// fPara[i] = 1.0f;
ParaError0=1;
break;
}
}
for(i=12;i<45;i++)//
{
if(fPara[i]<1)
{
// fPara[i] = 1.0f;
ParaError1=1;
break;
}
}
for(i=12;i<102;i++)
{
if(Para_Array[i]>99)
{
ParaError1=1;
break;
}
}
if(PressValueMax>4000 || PressValueMax<1000)
{
ParaError2=1;
}
if(fPara[45]>1.5)
ParaError3 = 1;
if(ParaError0 || ParaError1 || ParaError2 || ParaError3)
{
if(ParaError0)
{
for(i=0;i<12;i++)
{
fPara[i]=1.0f;
}
}
if(ParaError1)
{
fPara[12] = 100;
fPara[13] = 300;
fPara[14] = 400;
fPara[15] = 1200;
fPara[16] = 2400;
fPara[17] = 5000;
fPara[18] = 7200;
fPara[19] = 200;
fPara[20] = 400;
fPara[21] = 800;
fPara[22] = 1200;
fPara[23] = 2000;
fPara[24] = 60;
fPara[25] = 65;
fPara[26] = 70;
fPara[27] = 40;
fPara[28] = 45;
fPara[29] = 50;
fPara[30] = 30;
fPara[31] = 40;
fPara[32] = 50;
fPara[33] = 20;
fPara[34] = 30;
fPara[35] = 40;
fPara[36] = 4;
fPara[37] = 10;
fPara[38] = 14;
fPara[39] = 12;
fPara[40] = 16;
fPara[41] = 24;
fPara[42] = 24;
fPara[43] = 36;
fPara[44] = 48;
}
if(ParaError2)
PressValueMax = 4000;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -