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

📄 main.c

📁 常用经典小车程序常用经典小车程序常用经典小车程序
💻 C
📖 第 1 页 / 共 2 页
字号:
//========================================================
//	工程名称:	search route.spj
//	功能描述:	2003年循迹小车 完成了循迹,避障,寻光源,准确停车
//				在行程中正确显示铁片数目,记录路程,时间,并在终点报时间,路程。
//	涉及的库:	CMacro1016.lib,sacmv26e.lib
//	组成文件:	main.c/irq.asm/FIQ.ASM/Singleled.asm
//              hardware.inc/hardware.h/s480.h/s480.inc/
//	硬件连接:  IOA0~IOA2           为光源检测输入口(3个)
//              IOA3~IOA6           为测黑线输入口(4个)
//              IOA7~IOA10          为电机信号输出口(4个)
//              IOA12~IOA13         红外避障输入信号口(3个)
//              IOB2                检测铁片输入口(中断方式)(1个)
//              IOB3                距离检测输入口(中断方式)(1个)
//              IOB4                二极管闪烁输出信号口(1个)
//              IOB5~IOB7           数码管位选输出口(3个)
//              IOB8~IOB15          数码管段码输出口(8个)
//========================================================
//	文件名称:	main.c
//	功能描述:	工程的主文件
//	维护记录:	2007-8-20	v1.0
//========================================================
//
//========================================================
#include"SPCE061A.h"
#include "s480.h"

#define	P_IOA_Data 			(volatile unsigned int *)0x7000
#define	P_IOA_Buffer 		(volatile unsigned int *)0x7001   
#define P_IOA_Dir 			(volatile unsigned int *)0x7002
#define P_IOA_Attrib 		(volatile unsigned int *)0x7003
#define P_IOB_Data			(volatile unsigned int *)0x7005
#define	P_IOB_Buffer 		(volatile unsigned int *)0x7006  
#define P_IOB_Dir			(volatile unsigned int *)0x7007   
#define P_IOB_Attrib		(volatile unsigned int *)0x7008   
#define P_TimerA_Data		(volatile unsigned int *)0x700A   
#define P_TimerA_Ctrl		(volatile unsigned int *)0x700B   
#define P_TimerB_Data		(volatile unsigned int *)0x700C   
#define P_TimerB_Ctrl		(volatile unsigned int *)0x700D   
#define P_Watchdog_Clear	(volatile unsigned int *)0x7012   
#define P_INT_Mask			(volatile unsigned int *)0x702D   
#define P_INT_Clear			(volatile unsigned int *)0x7011   
#define P_SystemClok	    (volatile unsigned int *)0x7013
#define C_IRQ4_4KHz       0x0040 



extern void SP_Init_IOA(unsigned int, unsigned int, unsigned int);
extern void SP_Init_IOB(unsigned int, unsigned int, unsigned int);
extern unsigned int speedcar(void);
extern void F_SingleLed(unsigned int,unsigned int);
extern void L_delay(void);
void SystemInit(void);
void PlaySnd_Auto(unsigned int uiSndIndex,unsigned int uiDAC_Channel);
void stopcar5s();
void ShowAndVoic();
void searchline(void);
void hedge(void); 
void searchlight(void);
void searchlinett(void);
unsigned int n=0;                                          //记录车轮扫描个数(四次为旋转一周)
unsigned int longth=0;                                     //记录总路程
unsigned int one=0;                          //记录铁片距起点的距离
unsigned int two=0;
unsigned int three=0;
unsigned int  m=0;         //记录铁片的个数
unsigned int uiTimeset = 90;								//运行时间定时,调整该参数控制运行时间此处定义90s
unsigned int uiTimecont=0; 								//运行时间计时
unsigned int  aheaddata;                                //电机信号控制
unsigned int  duty;                                      // 占空比调整
unsigned int  j=0;
unsigned int  aheaddata1=0;                                //电机信号控制
unsigned int  duty1=0;
unsigned int  j1=0;                                      // 占空比调整
unsigned int flaglight=0;                                  //开始检测光源标志 0 没有开启,1 开启
unsigned int flagstop=0;                                  //终点标志    
 unsigned int uiIOA;  
 unsigned int uiDelay=0x0003;
 unsigned int hedgeflag=0;   
 unsigned int lineflag=0;    
 unsigned int fengming=0;
//==============================================================
void soft_10ms()/***********12MHZ 提供10MS 软件延时************/
{ 	int i;
	for(i=0;i<711;i++) *P_Watchdog_Clear = 0x01;
}


//=============================================================
// 语法格式:	void GoAhead();
// 实现功能:	前进子函数
// 参数:		无
// 返回值:		无
//=============================================================
void pwm(unsigned aheaddata,unsigned duty)
{
	unsigned int j;
	if(j<duty)
	{
		if(j==0)
		{
			*P_IOA_Buffer=*P_IOA_Buffer&0xf9ff;
			*P_IOA_Buffer=*P_IOA_Buffer|aheaddata;
			j++;
		}
		else
		{
			*P_Watchdog_Clear=0x0001;
			j++;
		}
	}
	else 
	{
		if(j>50)
		{
			j=0;
			*P_Watchdog_Clear=0x0001;
		}
		else
		{
			
				j++;
				*P_IOA_Buffer=*P_IOA_Buffer&0xf9ff;
		
		
		}
	}
}

void pwm1(unsigned aheaddata1,unsigned duty1)
{
	unsigned int j1;
	if(j1<duty1)
	{
		if(j1==0)
		{
			*P_IOA_Buffer=*P_IOA_Buffer&0xfe7f;
			*P_IOA_Buffer=*P_IOA_Buffer|aheaddata1;
			j1++;
		}
		else
		{
			*P_Watchdog_Clear=0x0001;
			j1++;
		}
	}
	else 
	{
		if(j1>50)
		{
			j1=0;
			*P_Watchdog_Clear=0x0001;
		}
		else
		{
			
				j1++;
				*P_IOA_Buffer=*P_IOA_Buffer&0xfe7f;
		
		
		}
	}
}
//========================================================
//	语法格式:	void PlaySnd_Auto(unsigned int uiSndIndex,
//								unsigned int uiDAC_Channel)
//	实现功能:	通过自动方式播放语音资源
//	参数:		1.uiSndIndex:语音资源序号 
//				2.uiDAC_Channel:语音播放通道
//	返回值:	无
//========================================================

void PlaySnd_Auto(unsigned int uiSndIndex,unsigned int uiDAC_Channel)
{
	SACM_S480_Initial(1);						//初始化为自动播放方式
	SACM_S480_Play(uiSndIndex,uiDAC_Channel,3);	//播放
	while((SACM_S480_Status() & 0x0001) != 0)
	{											//判断播放状态,如还在播放则继续循环
		SACM_S480_ServiceLoop();				//播放系统服务程序
		*P_Watchdog_Clear = 0x0001;			
	}	
	SACM_S480_Stop();							//停止播放
}         
//=================================================================
void GoAhead(void)                     				//前进

{   
	aheaddata=0x0200;        
	 duty=10;
	 *P_INT_Mask |=0x4040;
	 __asm("irq on");
	*P_Watchdog_Clear=0x0001;

	 *P_INT_Mask |= 0x0004;						//以下为中断定时操作2hz
	__asm("int fiq,irq");
	uiTimecont = 0;
	n=0; 
	one=0;                          //记录铁片距起点的距离
    two=0;
    three=0;
    m=0; 
}

//=============================================================
//停车5s钟声光显示初始化寻光源
//=============================================================
void stopcar5s()
{
 unsigned int i;
  __asm("irq off");
 // *P_INT_Mask&=0xfbff;
 //aheaddata=0x0400;        
//	 duty=14;
// aheaddata1=0x0000; 
 	
 //*P_INT_Mask |=0x0040;
	// __asm("irq on");
//for(i=0;i<1000;i++)
 //  {
 //  soft_10ms();	
  // }
 __asm("irq off");	
  //*P_INT_Mask&=0xbfbf;    //屏蔽pwm输出
  //*P_INT_=0x0000;
  *P_IOA_Buffer=*P_IOA_Buffer&0xf87f;
 				//调用播放程序,播放第0段语音,采用DAC1播放
    *P_IOB_Buffer=*P_IOB_Buffer&0xffef;
    for(i=0;i<1000;i++)
    {soft_10ms();
 
    *P_Watchdog_Clear = 0x0001;
    }
   *P_IOB_Buffer=*P_IOB_Buffer|0x0010;
    PlaySnd_Auto(1,1);
 
 
    *P_IOB_Buffer=*P_IOB_Buffer&0xffef;
    for(i=0;i<1000;i++)
    {soft_10ms();
 
    *P_Watchdog_Clear = 0x0001;
    }	
    
*P_IOB_Buffer=*P_IOB_Buffer|0x0010;
    PlaySnd_Auto(2,1);
 
    *P_IOB_Buffer=*P_IOB_Buffer&0xffef;
    for(i=0;i<1000;i++)
    {soft_10ms();
 
    *P_Watchdog_Clear = 0x0001;
    }	
  
  *P_IOB_Buffer=*P_IOB_Buffer|0x0010;
 PlaySnd_Auto(3,1);
 
    *P_IOB_Buffer=*P_IOB_Buffer&0xffef;
    for(i=0;i<1000;i++)
    {soft_10ms();
 
    *P_Watchdog_Clear = 0x0001;
    }	
 *P_IOB_Buffer=*P_IOB_Buffer|0x0010;  
  PlaySnd_Auto(4,1);
   

    *P_IOB_Buffer=*P_IOB_Buffer&0xffef;	
    for(i=0;i<1000;i++)
    {soft_10ms();
 
    *P_Watchdog_Clear = 0x0001;
    }
   *P_IOB_Buffer=*P_IOB_Buffer|0x0010;   
   PlaySnd_Auto(5,1);
  
   *P_IOB_Buffer=*P_IOB_Buffer&0xffef;
   aheaddata=0x0200;        
	 duty=8;
    __asm("irq on");
 flaglight=1;
 //flagstop=1;
}

//=============================================================
// 语法格式:	void Stop();
// 实现功能:	停车子函数
// 参数:		无
// 返回值:		无
//=============================================================
void Stop()                           			//停车
{    *P_INT_Ctrl &=0xBFBB;
	*P_IOA_Data=0x0000;
		
}

//=============================================================
// 语法格式:	void IRQ5(void);
// 实现功能:	中断服务子函数
// 参数:		无
// 返回值:		无
//=============================================================

void IRQ5(void)__attribute__((ISR));			//运动定时控制
void IRQ5(void)
{ 
	if(uiTimecont++ == uiTimeset)
	{    *P_INT_Mask &=0xbfbb;
		*P_IOA_Data = 0x0000;
	//	Stop();
	}
	*P_INT_Clear = 0x0004;
}


void IRQ4(void)__attribute__((ISR));
void IRQ4(void) 

{    
		pwm(aheaddata,duty);                                  //占空比
       *P_INT_Clear=C_IRQ4_4KHz;	

}


void IRQ0(void)__attribute__((ISR));
void IRQ0(void)
{
	pwm1(aheaddata1,duty1);                                  //占空比
       *P_INT_Clear=0x4000;	
}
//=============================================================
// 语法格式:	int main(void);
//实现功能:	主函数
// 参数:		无
// 返回值:		无
//=============================================================
int main(void)
{ 	
	int i;
	*P_SystemClok=0x0040;                      //32MHZ 
    SP_Init_IOA(0x0f80,0x0000,0x0f80);   
	SP_Init_IOB(0xfff3,0xff0c,0xfffb);
//==============================================================	
//===========初始化端口	 
//===========IOA0~IOA2下拉输入
//===========IOA3~IOA6下拉输入
//===========IOA7~IOA10同相低电平输出
//===========IOA12~IOA13下拉输入
//===========IOB2上拉输入
//===========IOB3上拉悬浮输入
//===========IOB4同相高电平输出
//===========IOB5~IOB7同相低电平输出
//===========IOB8~IOB15同相高电平输出                                                            
//=============================================================== 
	*P_Watchdog_Clear = 0x0001;
	SystemInit();
	*P_INT_Mask|=0x0300;   //开ext1 ext2中断
	 __asm("irq on"); 
	 for(i=0;i<5000;i++)
	 {
	 	soft_10ms();
	 }
  GoAhead();
	while(1)
	   {  
	    *P_Watchdog_Clear = 0x0001; 
	      if(flaglight==0)
	       {
	       searchline();
	        }
	    else 
	      {  for(i=0;i<1150;i++)
	                 {
	      	aheaddata1=0x0080;        
	             duty1=23; 
	             duty=18; 
	          aheaddata=0x0200;                        //zuo
	             *P_INT_Mask |=0x4040; 
	            *P_Watchdog_Clear = 0x0001;       
	            soft_10ms();
	                  }
	                    for(i=0;i<700;i++)
	                 {
	                   aheaddata1=0x0100;        
	           duty1=25;
	           duty=15;
	           *P_INT_Mask |=0x4040;
	             *P_Watchdog_Clear = 0x0001; 
	            	soft_10ms();
	                  }
	                  for(i=0;i<100;i++)
	                 {
	                 aheaddata=0x0200;        
	               duty=14;
	               aheaddata1=0;
  	               *P_INT_Mask |=0x4040;
	                   soft_10ms();                                 //直走
                   *P_Watchdog_Clear = 0x0001;
	                 }	
	       while(1)
	       {
	       	
	       	searchlinett();
	       	    if(lineflag==0)
	            	{
	                   hedge();
	           	         if(hedgeflag==0)
	                      	   {
	                              searchlight();
	                         	}

⌨️ 快捷键说明

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