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

📄 main.c

📁 这是一整套USB2.0试验程序
💻 C
📖 第 1 页 / 共 5 页
字号:
/**********************************************
文件名: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 + -