📄 main.c
字号:
//============================================================================
// 工程名称: bujin.spj "悬挂控制系统"
// 功能描述: 见使用说明(工程文件夹里)
// IDE环境: SUNPLUS u'nSPTM IDE 1.8.4(or later)
//
// 涉及的库: SPCE061V004.lib/sacmv25.lib/CmacroB100.lib/clib100.lib
// 硬件连接: 针对配合SPCE061A精简开发板使用 4*4键盘(接IOA0--7)
// 组成文件:
// main.c/cbit.c/dianji.c/display.c/IRQ.C/UART.C
// key.asm/system.asm
// hardware.asm/Resource.asm
// hardware.h/SPCE061V004.H/cbit.H/math.h/stdlib.h/Resource.inc
// 日期: 2005-9-10(建立)
// 2006-1-7(添加部份使用说明)
//注:编译前先设好以下链接: prkject--setting--bujing files--link--library modules--(本工程文件夹下的use-lib里的库)
//==============================================================================
#include "SPCE061V004.H"
#include "hardware.H"
#include "cbit.H"
#include "math.h"
#include "stdlib.h"
#define HaveKey 1
#define NoKey 0
double sqrt(double x);
void initlcm(void); //ST7920字符液晶显示相关子函数(见display.c)
void SendByte(char dat);
void SendCMD(unsigned char dat);
void SendDat(unsigned char dat);
void display(char *str);
void dis_12232num(long int b);
extern void UART_Init(); //串口相关子函数(见UART.C)由于时间关系,比赛时没能加入(通过红外进行无线传输)
extern void UartSendByte(); //此部份已能正确接收数据
extern void sendsixteenbit();
unsigned int UartReadByte();
void meterlift(unsigned int cycle);
void meterright(unsigned int cycle);
void meterdergeelift(unsigned int cycle);
void meterdergeeright(unsigned int cycle);
unsigned int starx[9]; //存储从键盘输入的坐标值(x,y)
unsigned int stary[9];
unsigned int nextto=0;
extern unsigned int uidata=0;
extern unsigned int round=0;
extern unsigned int alltime=0;
unsigned int KeyVal;
unsigned int KeyFlag; //按键标识
unsigned int keyadd=0,cot=0;
unsigned int xb=0,yb=0;
unsigned int degree=0; //转运的延时参数
signed int n=0,m=0;
unsigned int shuhai=0;
unsigned int keyy=0,savekey=0; //黑线参数
unsigned int severdata=0,shuzuchang=0,adxnu=0,adynu=0;
//--圆参数设置----------------------------------
float circlex=0, circley=0,w=0,X,Y;
float startx=0,starty=0;
float setx=0,sety=0,A=0,B=0;
float n0=0.0,m0=0.0;
int ii,i;
float ms=0,mz=0,mn=0;
//----------------------------------------
void PlayRespond(int Result)
{
//unsigned int Protect;
// Protect = *P_INT_Mask; //保护*P_INT_Ctrl
SACM_A2000_Initial(1); //初始化,其中*P_INT_Ctrl变为:0x0000
SACM_A2000_Play(Result, 3, 3); //其中*P_INT_Ctrl变为:0x2000
SACM_A2000_Volume(15); //音量调节0--15
while((SACM_A2000_Status()&0x0001) != 0)
{
SACM_A2000_ServiceLoop();
*P_Watchdog_Clear=0x0001; //不加入这句可能会复位
}
SACM_A2000_Stop(); //*P_INT_Ctrl变为:0x0000
//*P_INT_Mask |= Protect;
//*P_TimerA_Ctrl=0x0000;
//*P_TimerA_Data=0x0000; //恢复*P_TimerA_Data
*P_SystemClock=0x000b; //24.576 /8 强振
//*P_DAC_Ctrl=0x0000;
//*P_INT_Clear=0xffff;
asm("FIQ OFF");
}
void Playsoundnum(int soundnum) //播报数字
{
if((soundnum/100)>0)
{
PlayRespond(soundnum/100);
PlayRespond(11); //百
soundnum=(soundnum-(int)(soundnum/100)*100);
if(soundnum!=0)
{
if((soundnum/10)<1) PlayRespond(0); //零
if((soundnum/10)==1) PlayRespond(1); //一
}
}
if((soundnum/10)>1) PlayRespond(soundnum/10);
if((soundnum/10)>0) PlayRespond(10); //十
if((soundnum%10)!= 0) PlayRespond(soundnum%10);
}
void black()
{
startx=starx[nextto];
starty=stary[nextto];
for(;severdata>0;severdata--)
{
nextto=nextto+1;
setx=starx[nextto];
sety=stary[nextto];
A=sqrt((startx+14.5)*(startx+14.5)+(115-starty)*(115-starty));
*P_Watchdog_Clear=0x0001;
B=sqrt((94.5-startx)*(94.5-startx)+(115-starty)*(115-starty));
n0=sqrt((setx+14.5)*(setx+14.5)+(115-sety)*(115-sety))-A;
*P_Watchdog_Clear=0x0001;
m0=sqrt((94.5-setx)*(94.5-setx)+(115-sety)*(115-sety))-B;
*P_Watchdog_Clear=0x0001;
if(n0>0)
n0=n0+0.5;
else
n0=n0-0.5;
if(m0>0)
m0=m0+0.5;
else
m0=m0-0.5;
n=(int)(n0);
m=(int)(m0);
go();
startx=setx;
starty=sety;
*P_Watchdog_Clear=0x0001;
}
while(1)
{
*P_Watchdog_Clear=0x0001;
}
//=================================================
}
void System_ServiceLoop()
{
savekey=*P_IOB_Data;
keyy=savekey&0x0003;
switch(keyy)
{
case 0x0001: //改 向上
meterlift(1); //左电机上拉
break;
case 0x0002: //改 向下
meterdergeeright(1); //右电机下拉
meterright(1); //左电机下拉
meterright(1); //左电机下拉
meterright(1); //左电机下拉
break;
default:
break;
}
keyy=savekey&0x000c;
switch(keyy)
{
case 0x0004: //改 向左
meterright(1); //左电机下拉
meterdergeelift(1); //右电机上拉
break;
case 0x0008: //改 向右
meterlift(1); //左电机上拉
break;
default:
break;
}
}
void hunderd()
{
if(xb<=40&&yb>=50)
{
for(shuhai=0;shuhai<25;shuhai++)
{
meterright(1); //左电机下拉
meterdergeeright(1); //右电机下拉
*P_Watchdog_Clear=C_WDTCLR; //清看门狗
}
for(shuhai=0;shuhai<25;shuhai++)
{
meterright(1); //左电机下拉
meterdergeelift(1); //右电机上拉
*P_Watchdog_Clear=C_WDTCLR; //清看门狗
}
for(shuhai=0;shuhai<25;shuhai++)
{
meterlift(1); //左电机上拉
meterdergeelift(1); //右电机上拉
*P_Watchdog_Clear=C_WDTCLR; //清看门狗
}
for(shuhai=0;shuhai<25;shuhai++)
{
meterlift(1); //左电机上拉
meterdergeeright(1); //右电机下拉
*P_Watchdog_Clear=C_WDTCLR; //清看门狗
}
}
if(xb>40&&yb>50)
{
for(shuhai=0;shuhai<25;shuhai++)
{
meterright(1); //左电机下拉
meterdergeeright(1); //右电机下拉
*P_Watchdog_Clear=C_WDTCLR; //清看门狗
}
for(shuhai=0;shuhai<25;shuhai++)
{
meterlift(1); //左电机上拉
meterdergeeright(1); //右电机下拉
*P_Watchdog_Clear=C_WDTCLR;
}
for(shuhai=0;shuhai<25;shuhai++)
{
meterlift(1); //左电机上拉
meterdergeelift(1); //右电机上拉
*P_Watchdog_Clear=C_WDTCLR;
}
for(shuhai=0;shuhai<25;shuhai++)
{
meterright(1); //左电机下拉
meterdergeelift(1); //右电机上拉
*P_Watchdog_Clear=C_WDTCLR;
}
}
if(xb>=40&&yb<=50)
{
for(shuhai=0;shuhai<25;shuhai++)
{
meterlift(1); //左电机上拉
meterdergeelift(1); //右电机上拉
*P_Watchdog_Clear=C_WDTCLR;
}
for(shuhai=0;shuhai<25;shuhai++)
{
meterlift(1); //左电机上拉
meterdergeeright(1); //右电机下拉
*P_Watchdog_Clear=C_WDTCLR;
}
for(shuhai=0;shuhai<25;shuhai++)
{
meterright(1); //左电机下拉
meterdergeeright(1); //右电机下拉
*P_Watchdog_Clear=C_WDTCLR;
}
for(shuhai=0;shuhai<25;shuhai++)
{
meterright(1); //左电机下拉
meterdergeelift(1); //右电机上拉
*P_Watchdog_Clear=C_WDTCLR;
}
}
if(xb<40&&yb<50)
{
for(shuhai=0;shuhai<25;shuhai++)
{
meterlift(1); //左电机上拉
meterdergeelift(1); //右电机上拉
*P_Watchdog_Clear=C_WDTCLR;
}
for(shuhai=0;shuhai<25;shuhai++)
{
meterright(1); //左电机下拉
meterdergeelift(1); //右电机上拉
*P_Watchdog_Clear=C_WDTCLR;
}
for(shuhai=0;shuhai<25;shuhai++)
{
meterright(1); //左电机下拉
meterdergeeright(1); //右电机下拉
*P_Watchdog_Clear=C_WDTCLR;
}
for(shuhai=0;shuhai<25;shuhai++)
{
meterlift(1); //左电机上拉
meterdergeeright(1); //右电机下拉
*P_Watchdog_Clear=C_WDTCLR;
}
}
}
void roundcycle() //画园
{
//----------------------------------------------------------------------------
startx=circlex-25;//求起点位置
starty=circley;
A=sqrt((startx+14.5)*(startx+14.5)+(115-starty)*(115-starty));
*P_Watchdog_Clear=0x0001;
B=sqrt((94.5-startx)*(94.5-startx)+(115-starty)*(115-starty));
for(ii=30;ii<390;ii=ii+30)
{
w=ii*3.14159/180;
X=circlex-25*cos(w);
*P_Watchdog_Clear=0x0001;
Y=circley+25*sin(w);
*P_Watchdog_Clear=0x0001;
setx=X;
sety=Y;
n0=sqrt((setx+14.5)*(setx+14.5)+(115-sety)*(115-sety))-A;
*P_Watchdog_Clear=0x0001;
m0=sqrt((94.5-setx)*(94.5-setx)+(115-sety)*(115-sety))-B;
*P_Watchdog_Clear=0x0001;
if(circlex>40&circley>50)//误差效准
{
if(n0>0)
n0=n0+0.5;
else
n0=n0-0.5;
if(m0>0)
m0=m0+0.5;
else
m0=m0-0.5;
}
else
{
if(n0>0)
n0=n0+0.9;
else
n0=n0-0.9;
if(m0>0)
m0=m0+0.9;
else
m0=m0-0.9;
}
n=(int)(n0);
m=(int)(m0);
go();
startx=setx;
starty=sety;
SendCMD(0x0001); //清屏
SendCMD(0x82); display("圆周坐标:");
SendCMD(0x90); display("X: "); dis_12232num((unsigned int)(setx));
SendCMD(0x94); display("Y: "); dis_12232num((unsigned int)(sety));
A=sqrt((startx+14.5)*(startx+14.5)+(115-starty)*(115-starty));
*P_Watchdog_Clear=0x0001;
B=sqrt((94.5-startx)*(94.5-startx)+(115-starty)*(115-starty));
*P_Watchdog_Clear=0x0001;
}
//=================================================
}
void ooo() //从原点出发
{
n0=sqrt((setx+14.5)*(setx+14.5)+(115-sety)*(115-sety))-115.911;
*P_Watchdog_Clear=0x0001;
m0=sqrt((94.5-setx)*(94.5-setx)+(115-sety)*(115-sety))-148.846;
*P_Watchdog_Clear=0x0001;
if(n0>0)
n0=n0+0.5;
else
n0=n0-0.5;
if(m0>0)
m0=m0+0.5;
else
m0=m0-0.5;
n=(int)(n0);
m=(int)(m0);
go();
*P_Watchdog_Clear=0x0001;
}
void go()
{
//--------------------------------------------------------
if(n==0)
{
if(m>0)
{
for(;m>0;m--)
{
meterdergeeright(1); //右电机下拉
}
}
else if(m<0)
{
m=m*(-1);
for(;m>0;m--)
{
meterdergeelift(1); //右电机上拉
}
}
}
//------------------------------
else if(m==0)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -