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

📄 main.c

📁 全国电子设计大赛获奖作品 悬挂运动控制系统
💻 C
字号:
//=========================================================================================
//作    者:江苏大学 张寿龙 田兆垒 赵生禄
//题    目:悬挂运动控制系统
//备    注:
//         2005年全国大学生电子竞赛
//=========================================================================================
/***********************************
project: 凌阳SPCE61A单片机应用例程
item:系统主程序
version: V1.0

Description:
    

Author: 江苏大学电气信息工程学院


 
***********************************/

#include "spce061v004.h"
#include "math.h"

#include "main.h"


int SysStatus=SYS_ST_INITIAL;
extern int PSetStatus;

//
int PositionX,PositionY;		//当前位置
int NextPosiX,NextPosiY;
int TimeN,TimePoint,TimeL[400],TimeR[400];				//下一步移动量

int CircleX=40,CircleY=50;
int TimeCountL,TimeCountR;

extern int PSetStatus,CSetStatus;
extern int PSetPosition,CSetPosition;

int DisplayStatus=0;

//运动控制
int Running=0;		//0:未开始运动;1:开始运动,但未完成一格运动;2:完成一格运动

//=========================================================================================
//延时
//=========================================================================================

void Delay(unsigned De)
{
	while(De--);
}

//=========================================================================================
//主函数
//=========================================================================================
int main()
{
	unsigned int key=0;
 	int D;
 	int ix,j;
 	float qq;
	int *TrackX1Table,*TrackY1Table,*TrackX2Table,*TrackY2Table;
	unsigned int HZCode[10]={0xB5B1,0xC7B0,0xCEBB,0xD6C3,
							 0x2020,0x2020,0x2020,0x2020,0x2020,0x2020};		//为液晶行赋初值
	
 	*P_SystemClock=0x0000;		//0000 0000 0000 0000
//端口初始化
	*P_IOA_Dir=C_IOA_DIR;
	*P_IOA_Attrib=C_IOA_ATTRIB;
	*P_IOA_Data=C_IOA_DATA;
	
	*P_IOB_Dir=C_IOB_DIR;
	*P_IOB_Attrib=C_IOB_ATTRIB;
	*P_IOB_Data=C_IOB_DATA;

	LCDinit();						//LCD初始化

	*P_Watchdog_Clear=C_WDTCLR;
	
//启动定时器A
	*P_TimerA_Ctrl=0x0015;		//0000 0000 0000 1101
	*P_TimerA_Data=0xfffe;
	*P_INT_Ctrl=0x1000;				//C_IRQ1_TMAz;
	__asm("INT IRQ");
	
	InitialPage();					//显示启动窗口
	
	while(1)						//循环
	{
	
//检查键盘
		if(key==0)
		{							//key=0,等待按键输入
			key=*P_IOA_Data & 0x0f00;			//读键盘
			if((key&0x0e00)!=0x0e00)						//有按键?
			{
				Delay(20*DELAYINTERNAL2);			//延时
				if((key&0x0e00)==(*P_IOA_Data & 0x0e00))	//再检测键盘,按键仍在
				{
					key=key>>8;					//键值右移8位
				}
				else key=0;						//无有效按键,键值=0
			}
			else key=0;						//无有效按键,键值=0
		}
		else
		{							//key=0x0100,等待按键释放
			if((*P_IOA_Data & 0x0e00)==0x0e00)		//无按键?
			{
				*P_Watchdog_Clear=C_WDTCLR;
				Delay(40*DELAYINTERNAL2);			//延时
				if((*P_IOA_Data & 0x0e00)==0x0e00) key=0;	//确认无按键,
			}									//键盘已释放,键值=0,否则键值不变。
		}
		*P_Watchdog_Clear=C_WDTCLR;
		
//根据系统状态执行各功能模块
		switch (SysStatus)
		{
			case SYS_ST_INITIAL:			//显示菜单,响应按键操作菜单
				if((key&0x000e)!=0)
				{
					Initial(key);			//菜单响应
					key=0x0100;			//等待按键释放
				}
				*P_Watchdog_Clear=C_WDTCLR;
				break;
			case SYS_ST_MENU:			//显示菜单,响应按键操作菜单
				if((key&0x000e)!=0)
				{
					Menu(key);			//菜单响应
					key=0x0100;			//等待按键释放
				}
				*P_Watchdog_Clear=C_WDTCLR;
				break;
			case SYS_ST_POSITION:		//显示设置触发字窗口,等待任意键退回菜单页1
				if((key&0x000e)!=0)
				{
					Position(key);
					key=0x0100;			//等待按键释放
				}
				*P_Watchdog_Clear=C_WDTCLR;
				break;

			case SYS_ST_TRACK:		//显示设置门限电压窗口,等待任意键退回菜单页1
				if((key&0x000e)!=0)
				{
					Track(key);
					key=0x0100;			//等待按键释放
				}
				*P_Watchdog_Clear=C_WDTCLR;
				break;

			case SYS_ST_CIRCLE:		//显示设置门限电压窗口,等待任意键退回菜单页1
				if((key&0x000e)!=0)
				{
					SetCircle(key);
					key=0x0100;			//等待按键释放
				}
				*P_Watchdog_Clear=C_WDTCLR;
				break;

			case SYS_ST_FOLLOW:		//显示运行窗口,等待返回键退回菜单页1
				if((key&0x000e)!=0)
				{
					SetFollow(key);
					key=0x0100;			//等待按键释放
				}
				*P_Watchdog_Clear=C_WDTCLR;
				break;

		}
		*P_Watchdog_Clear=C_WDTCLR;
		
		switch (Running)			//
		{
			case 0:
				break;
			case 1:
				break;
			case 2:
				switch (SysStatus)
				{
					case SYS_ST_POSITION:			//显示菜单,响应按键操作菜单
						PositionX=NextPosiX;
						PositionY=NextPosiY;
						DisplayStatus=1;
						break;
					case SYS_ST_TRACK:			//显示菜单,响应按键操作菜单
						TrackX1Table=ReadTrackXAddr(1)+TimePoint;
						TrackY1Table=ReadTrackYAddr(1)+TimePoint;
						PositionX=(*TrackX1Table)/10;
						PositionY=(*TrackY1Table)/10;
						DisplayStatus=1;
						break;
					case SYS_ST_CIRCLE:			//显示菜单,响应按键操作菜单
						TrackX1Table=ReadTrackXAddr(2)+TimePoint;
						TrackY1Table=ReadTrackYAddr(2)+TimePoint;
						PositionX=(*TrackX1Table)/10+CircleX;
						PositionY=(*TrackY1Table)/10+CircleY;
						if(TimeN==1)
						{
							PositionX=0;PositionY=0;
						}
						DisplayStatus=1;
						break;
					case SYS_ST_FOLLOW:			//显示菜单,响应按键操作菜单
						break;
				}
				
				TimePoint++;
				TimeN--;
				if(TimeN==0)
				{
					Running=0;
					TimePoint=0;
					TimeN=0;
				}
				else
					Running=1;
				break;
		}
		
		if(DisplayStatus==1)
		{
			PositionDisp();
			DisplayStatus=0;
		}
		
		*P_Watchdog_Clear=C_WDTCLR;
	}
}

//=========================================================================================
//
//=========================================================================================
int LTime(int x1 ,int y1,int x2,int y2)
{
	float denominator;
	float numerator;
	float ls;
	float offsetx=1,offsety=1;
	int l;
	float fx1,fx2,fy1,fy2;
	
	fx1=x1;fx2=x2;fy1=y1;fy2=y2;
	switch (SysStatus)
	{
		case SYS_ST_POSITION:			//显示菜单,响应按键操作菜单
			offsetx=XOFFSET1;offsety=YOFFSET1;
			break;
		case SYS_ST_TRACK:			//显示菜单,响应按键操作菜单
			offsetx=XOFFSET2;offsety=YOFFSET2;
			break;
		case SYS_ST_CIRCLE:			//显示菜单,响应按键操作菜单
			offsetx=XOFFSET3;offsety=YOFFSET3;
			break;
	}
	fx1=fx1*offsetx;fx2=fx2*offsetx;
	fy1=fy1*offsety;fy2=fy2*offsety;
	denominator=(150.0+fx1)*(150.0+fx1)+(1150.0-fy1)*(1150.0-fy1);
	denominator=sqrtf(denominator);
	numerator=(150.0+fx2)*(150.0+fx2)+(1150.0-fy2)*(1150.0-fy2);
	numerator=sqrtf(numerator);
	ls=(denominator-numerator)*DELTAN*LOFFSET;
	l=ls;
	return(l);
}

//=========================================================================================
//
//=========================================================================================
int RTime(int x1,int y1,int x2,int y2)
{
	float denominator;
	float numerator;
	float ls;
	float offsetx,offsety;
	int l;
	float fx1,fx2,fy1,fy2;
	
	fx1=x1;fx2=x2;fy1=y1;fy2=y2;
	switch (SysStatus)
	{
		case SYS_ST_POSITION:			//显示菜单,响应按键操作菜单
			offsetx=XOFFSET1;offsety=YOFFSET1;
			break;
		case SYS_ST_TRACK:			//显示菜单,响应按键操作菜单
			offsetx=XOFFSET2;offsety=YOFFSET2;
			break;
		case SYS_ST_CIRCLE:			//显示菜单,响应按键操作菜单
			offsetx=XOFFSET3;offsety=YOFFSET3;
			break;
	}
	fx1=fx1*offsetx;fx2=fx2*offsetx;
	fy1=fy1*offsety;fy2=fy2*offsety;
	denominator=(950.0-fx1)*(950.0-fx1)+(1150.0-fy1)*(1150.0-fy1);
	denominator=sqrtf(denominator);
	numerator=(950.0-fx2)*(950.0-fx2)+(1150.0-fy2)*(1150.0-fy2);
	numerator=sqrtf(numerator);
	ls=(denominator-numerator)*DELTAN*ROFFSET;
	l=ls;
	return(l);
}

//=========================================================================================
//
//=========================================================================================
void PositionDisp()
{
	unsigned int HZCode[10]={0xB5B1,0xC7B0,0xCEBB,0xD6C3,
							 0x2020,0x2020,0x2020,0x2020,0x2020,0x2020};		//为液晶行赋初值
	unsigned int x1,x2,x3,y1,y2,y3;
	
	x1=0x3000+(PositionX/10<<8)+0x0030+PositionX%10;

	y1=0x3000+(PositionY/100<<8)+0x0030+(PositionY%100)/10;
	y3=0x3020+(PositionY%10<<8);
	HZCode[0]=0x783d;HZCode[1]=x1;HZCode[2]=0x2020;HZCode[3]=0x793d;
	HZCode[4]=y1;HZCode[5]=y3;HZCode[6]=0x2020;HZCode[7]=0x2020;
	LCDWriteLine(4,HZCode);
	
	switch (SysStatus)
	{
		case SYS_ST_POSITION:			//显示菜单,响应按键操作菜单
			PSetStatus=1;
			PSetPosition=0;
			WriteByte(0x92,0);
			WriteByte(0x0d,0);
			break;
//		case SYS_ST_CIRCLE:			//显示菜单,响应按键操作菜单
//			CSetStatus=1;
//			CSetPosition=0;
//			WriteByte(0x88,0);
//			WriteByte(0x0d,0);
//			break;
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -