📄 main.c
字号:
#include "hardware.h"
#include "SPCE061V004.H"
#include "s480.h"
#include "SPCE061.H"
unsigned int uiOutput=0x0000;
unsigned int Stat=0x0000;
unsigned int uiIutput=0x0f00;
unsigned int TimeCount=0x000;
unsigned int Blance=208;
unsigned int Signal=0;
main()
{
*P_IOB_Dir|=0xF000; //IOB12-15 OutPut
*P_IOB_Dir&=0xF0FF; //IOB8-11 InPut
*P_IOB_Attrib|=0xF000; //IOB12-15高电平输出
*P_IOB_Attrib&=0xF0FF; //IOB8-11 低电平输入
*P_IOB_Data&=0x0FFF; //IOB12-15 初始化0
*P_IOB_Data|=0x0F00; //IOB 8-11初始化1
if(!((*P_IOB_Data&0x0f00)==0x0F00))
Play(0);
IrqInit();
while(1)
{
*P_IOB_Data&=0x0FFF; //IOB12-15 作为电机控制端口初始化0
Up();
PingHeng();
Down();
Back();
}
}//主函数结束
Up() //IOB12-15口控制小车前进 小车开始前进
{
TimeCount=0x000;
*P_IOB_Data&=0x0FFF; //IOB12-15 作为电机控制端口初始化0
*P_IOB_Data|=0x0F00; //初始化传感器的输入信号口为全高电平
while(1)
{
Time();
*P_Watchdog_Clear =C_WDTCLR;
uiIutput=*P_IOB_Data;
if((uiIutput&0x0f00)==0x0f00)
Stat=0x0000;//1111后退
else if((uiIutput&0x0f00)==0x0d00)
Stat=0x0020;//1101前进直走
else if((uiIutput&0x0f00)==0x0b00)
Stat=0x0010;//1011前进左转
else if((uiIutput&0x0f00)==0x0e00)
Stat=0x0002;//1110前进右转
else if((uiIutput&0x0f00)==0x0900)
Stat=0x0010;//1001左边两个检测到前进左转
else if((uiIutput&0x0f00)==0x0c00)
Stat=0x0002;//1100右边两个检测到前进右转
else if((uiIutput&0x0f00)==0x0800)
Stat=0x0001;//全检测到黑线停止计时开始进入平衡调节模块
else
Stat=0x0004;//后退
*P_IOB_Data&=0x0FFF;
Time();
if(Stat==0x0000)
{
//*P_IOB_Data&=0x0FFF; //IOB12-15 作为电机控制端口初始化0
*P_IOB_Data|=0x2000;
}
else if(Stat==0x0020) //前进直走
{
//*P_IOB_Data&=0x0FFF; //IOB12-15 作为电机控制端口初始化0
*P_IOB_Data|=0x1000;
}
else if(Stat==0x0010) //输出0101前进左转
{
//*P_IOB_Data&=0x0FFF; //IOB12-15 作为电机控制端口初始化0
*P_IOB_Data|=0x5000;
}
else if(Stat==0x0002) //输出1001前进右转
{
//*P_IOB_Data&=0x0FFF; //IOB12-15 作为电机控制端口初始化0
*P_IOB_Data|=0x9000;
}
else if(Stat==0x0001)
{
Time();
break;
}
} //跳出前进程序转去执行后退程序
}
PingHeng()
{
TimeCount=0;
Time();
while(1){
Time();
if(TimeCount>=40){
LedShow(0040);
break;}
*P_Watchdog_Clear =C_WDTCLR;
*P_IOB_Data&=0x0fff;
if(ADmain()>=(Blance+4)){
*P_IOB_Data|=0x1000; //超过平衡点后退;
}
else if((Blance-4)>=ADmain()) {
*P_IOB_Data|=0x2000; //未超过平衡点前进;
}
else if(ADmain()==Blance+3){
*P_IOB_Data|=0x1000;
Delay(1);
*P_IOB_Data&=0x0fff;
Delay(2);
}
else if(ADmain()==Blance-3){
*P_IOB_Data|=0x2000;
Delay(1);
*P_IOB_Data&=0x0fff;
Delay(2);
}
else if(ADmain()==Blance+2)
{
*P_IOB_Data|=0x1000;
Delay(1);
*P_IOB_Data&=0x0fff;
Delay(4);
}
else if(ADmain()==Blance-2)
{
*P_IOB_Data|=0x2000;
Delay(1);
*P_IOB_Data&=0x0fff;
Delay(4);
}
else if(ADmain()==(Blance+1)){
*P_IOB_Data|=0x1000;
Delay(1);
*P_IOB_Data&=0x0fff;
Delay(8);
}
else if(ADmain()==(Blance-1)){
*P_IOB_Data|=0x2000;
Delay(1);
*P_IOB_Data&=0x0fff;
Delay(8);
}
else if (ADmain()==Blance){
*P_IOB_Data&=0x0fff;
Delay(16);
}
} //循环进入平衡调节模块
} //平衡调节函数结束
//平衡调节结束开始下坡
//循环结束
Down()
{
TimeCount=0;//下坡时间记录
while(1)
{
Time();
*P_Watchdog_Clear =C_WDTCLR;
uiIutput=*P_IOB_Data;
if((uiIutput&0x0f00)==0x0f00)
Stat=0x0000;//1111停止
else if((uiIutput&0x0f00)==0x0d00)
Stat=0x0020;//1101前进直走
else if((uiIutput&0x0f00)==0x0b00)
Stat=0x0010;//1011前进左转
else if((uiIutput&0x0f00)==0x0e00)
Stat=0x0002;//1110前进右转
else if((uiIutput&0x0f00)==0x0900)
Stat=0x0010;//1001左边两个检测到前进左转
else if((uiIutput&0x0f00)==0x0c00)
Stat=0x0002;//1100右边两个检测到前进右转
else
Stat=0x0004;//后退
*P_IOB_Data&=0x0FFF;
Time();
if(Stat==0x0000) //后退
{
//*P_IOB_Data&=0x0FFF; //IOB12-15 作为电机控制端口初始化0
*P_IOB_Data|=0x2000;
}
else if(Stat==0x0020) //前进直走
{
//*P_IOB_Data&=0x0FFF; //IOB12-15 作为电机控制端口初始化0
*P_IOB_Data|=0x1000;
}
else if(Stat==0x0010) //输出0101前进左转
{
//*P_IOB_Data&=0x0FFF; //IOB12-15 作为电机控制端口初始化0
*P_IOB_Data|=0x5000;
}
else if(Stat==0x0002) //输出1001前进右转
{
//*P_IOB_Data&=0x0FFF; //IOB12-15 作为电机控制端口初始化0
*P_IOB_Data|=0x9000;
}
else //if(Stat==0x0004)停5秒
{
*P_IOB_Data&=0x0fff;
Play(1); //播放5秒的录音提示返回
IrqInit();
break; //跳出前进程序转去执行后退程序
}
}
} //小车前进函数结束
//IrqInit();//开计时中断
//TimeCount=0;;
Back() //开始返回 IOB8-11控制后退
{
// IrqInit();
TimeCount=0;
*P_IOB_Data&=0x0FFF;//IOB12-15 作为电机控制端口初始化0
*P_IOB_Data|=0x00F0;//初始化传感器的输入信号口为全高电平
while(1)
{
Time();
*P_Watchdog_Clear =C_WDTCLR;
uiIutput=*P_IOB_Data;
if((uiIutput&0x00F0)==0x00D0)
Stat=0x0000; //后传感器1101 后退
else if((uiIutput&0x00F0)==0x00f0)
Stat=0x0000; //后传感器1111 后退
//else if((uiIutput&0x0F00)==0x0D00) 倒退时碰到全为高电平的情况下出轨全未检测到 未写入代码
// Stat=0x0000;
else if((uiIutput&0x00F0)==0x00B0)
Stat=0x0010; //1011后退左转
else if((uiIutput&0x00F0)==0x00E0)
Stat=0x0002; //1110后退右转
else if((uiIutput&0x00F0)==0x0090)
Stat=0x0010; //1001左边两个检测到后退左转
else if((uiIutput&0x00F0)==0x00C0)
Stat=0x0002; //1100右边两个检测到后退右转
else if((uiIutput&0x00F0)==0x0080)
Stat=0x0004; //1000三个全检测到 回到A点停止
else
Stat=0x0000;
*P_IOB_Data&=0x0FFF;
Time();
if(Stat==0x0000)
{
*P_IOB_Data|=0x2000;//后退
}
//else if(Stat==0x0020) //前进直走
//{ *P_IOB_Data|=0x1000;
// Delay(1); }
else if(Stat==0x0010) //输出0110后退左转
{
*P_IOB_Data|=0x6000;
}
else if (Stat==0x0002) //输出1010后退右转
{
*P_IOB_Data|=0xA000;
}
else //回到A点停止
{
*P_IOB_Data&=0x0fff;
// __asm ("FIQ ON");
Play(2); //小车返回播放提示音
while(1){*P_IOB_Data&=0x0fff;
*P_Watchdog_Clear =C_WDTCLR;} //程序终点
}
}
}
void Delay(unsigned int Time)
{
unsigned int Count;
unsigned int uiCount;
for(Count = 0;Count<Time; Count++)
{
for(uiCount = 0;uiCount <2200; uiCount++)
{
*P_Watchdog_Clear = 0x0001;//清看门狗操作
}
}
}
void IrqInit()//计时程序控制设置
{
TimeCount=0;
*P_INT_Ctrl=C_IRQ1_TMA; //Open Interrupt
__asm("INT OFF");
*P_TimerA_Ctrl=C_SourceA_1+C_SourceB_1024Hz; //TimerA:1024Hz
*P_TimerA_Data=0xFBFF; //1Second
//计时设置完
}
void Time()
{
//计时
if(*P_INT_Ctrl&C_IRQ1_TMA)
{
*P_INT_Clear=C_IRQ1_TMA; //clear INT flag
TimeCount++; //计时
}
LedShow(TimeCount); //显示时间
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -