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

📄 main.c

📁 基于S3c44b0的自主式小车导航及寻迹程序
💻 C
字号:
#include "ctrl_set.h"
#include "console.h"
#include "utils.h"
#include "39vf160.h"
#include "DataType.h"
#include "inc/44b0x.h"  //本来需要的


#define	DFT_DOWNLOAD_ADDR	0xc008000 //缺省的下载地址
#define	MAX_CMD_LEN	128 //定义最大的命令字符数是128个
#define	MAX_ARGS	MAX_CMD_LEN/4  //定义最多的参数个数,比如“route 1" "route 2"...

extern U32 MCLK;  //从外部的文件引用该变量(常数),在外部文件已经定义好了
//const char d[8]={0x0e,0x0c,0x0d,0x09,0x0b,0x03,0x07,0x06}; //MAC地址,自己随意设置,但不能与网络上其他网络芯片的物理地址重复
//unsigned char left=1,right=1;  //left=1,right=1时左、右轮转动,=0是不转
unsigned char i=0,j=0,l=0;  
//unsigned char sec_h=0,sec_l=0;  //数码管上显示的数值与这两位相同,sec_h=0高位,sec_l=0低位
//unsigned char Roadold,Roadnew;  //定义中间变量


U32 program_begin;
extern U32 size;
U8 i,usbinited;
U32 * Ep2OutBuf;



/*********************************************************/
static void delay(U32 cnt)  //软件延时子程序
{
	while(cnt--);
}

/*********************************************************/
int SysClock(int argc, char *argv[])  //调整44B0X的运行时钟
{
	int i, mdiv,pdiv=6,sdiv=1,freq;
	
	if(argc < 2)
	{
		return 0;
	}
	else
	{
		freq = strtoul2(argv[1]);
		if((freq==-1)||(freq<10)||(freq>90))		
		{
			return 0;
		}			
		mdiv=16*freq/10-8;
		ChangePllValue(mdiv, pdiv, sdiv);
	
		i = 8000;
		while(i--);	
	
	return 0;
	}
}



//==================================================================================寻迹程序

unsigned char Road;
//            右				中					左
//-->CCPR2L-->RB0				RB1					RB2
//================================================================================
const char d[8]={0x0e,0x0c,0x0d,0x09,0x0b,0x03,0x07,0x06};
const char e[8]={0x06,0x07,0x03,0x0b,0x09,0x0d,0x0c,0x0e};
unsigned char left=1,right=1;
unsigned char ii=0,jj=0;
unsigned char sec_h=0,sec_l=0;
volatile int tracker_variable=0;
//================================================================================
void tracker_Timer0Done(void)
{
	unsigned char temp1,temp2,temp3;
	rI_ISPC=BIT_TIMER0;
	Road=rPDATE;
	Road=Road&0xC0;
	switch(Road)
	{			//右 左
		case 0x40: //10
	//		left=1;
	//		right=0;
			left=0;
			right=1;
			break;
		case 0x80:	//01
	//		left=0;
	//		right=1;
			left=1;
			right=0;
			break;
		case 0xC0: //00
	//		left=0;
	//		right=0;
			left=1;
			right=1;
			break;
		case 0:	//11
	//		left=1;
	//		right=1;
			left=0;
			right=0;
			break;
	}
	if(left)
		{
			temp1=d[ii];
			ii=ii+1;
			ii=ii%8;
		}
	else rPDATG=0xFF;
	if(right)
		{
			temp2=e[jj];
			jj=jj+1;
			jj=jj%8;
		}
	else rPDATG=0xFF;
	temp2=temp2<<4;
	temp2=temp2&0xF0;
	temp1=temp1&0x0F;
	temp1=temp1|temp2;
	rPDATG=temp1;
	temp3=rPDATD;
	if(temp3==0xFE)		tracker_variable=1;
}
int Tracker(int argc, char *argv[])  //循迹子程序
{
	volatile int aaa;
	rPCONG=0x5555;
	rPUPG=0x00;
	rPCONE=rPCONE&0xf0fff;
	rPUPE=0x00;
	rPCOND=0x0000; //设置PCOND的PD0~PD7每一个都为输入 (P227页)
	rPUPD=0xFF;
	rINTCON=0x1;
	rINTMOD=0x0000000;

	rINTMSK=~(BIT_GLOBAL|BIT_TIMER0);
	
	
	/*7 6 5 4 3 2 1:0 */
	/*Internal clock,LSB mode,Transmit/Receive mode,rising edge clock,No action,Non hand-shaking mode,SIO interrupt mode*/
	/*0 1 1 1 0 0 01*/
	rSIOCON=0x71;
	rSBRDR=15;//band rate = 60MHz/2/(15+1)=1.875MHz
	rIVTCNT=7;//Intervals=60MHz/4/(7+1)=1.875MHz
	rTCFG0=0xF9;
	rTCFG1=0x1;
	rTCON=0x08;
	rTCNTB0=60;
	
	rTCON=0x02;
	rTCON=0x09;
	
	while(tracker_variable==0)
	{
		rI_ISPC=0x1000000;
		aaa=rI_ISPR;
		if(aaa==0x2000)		tracker_Timer0Done();
	}
	
	return 0;
}

/*********************************************************/
#include "44b0x.h"

int main()
{
	int i, key,seconds;
	char command[MAX_CMD_LEN];		
	void (*fp)(void) = (void (*)(void))(0x10000);
	
	ChangePllValue(56, 6, 1);	//修改系统主频为4 倍频
	PortInit();
	
	Tracker(0,0);
}

/********************************************************/
int pIrqStart = 0;
int pIrqHandler = 0;
int pIrqFinish = 0;

⌨️ 快捷键说明

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