?? 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 + -