📄 main.c
字号:
//========================================================
// 工程名称: 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 + -