在住程序里面改成小车能按照黑色轨迹来走就可以了。a0是左边的传感器,a1是右边的传感器。a<100是在黑色轨迹上。a>100是在白色纸张上。要遥控启动车子。是智能小车来的。
#include <hidef.h> /* for EnableInterrupts macro */ #include "MC68HC908JL3.h" /* include peripheral declarations */ #define MiddleLight PTD_PTD5 /* 前进方向指示灯控制变量 */ #define LeftLight PTD_PTD4 /* 左转方向指示灯控制变量 */ #define RightLight PTD_PTD2 /* 右转方向指示灯控制变量 */ #define On 0 /* 指示灯为共阳接法 */ #define Off 1 /* 指示灯为共阳接法 */ #define True 1 /* */ #define False 0 /* */
#define SoundControl PTD_PTD0 /* 蜂鸣器的控制变量 */
#define LA PTA_PTA3 /* 左电机LA */ #define LB PTA_PTA2 /* 左电机LB */ #define RA PTD_PTD7 /* 右电机LA */ #define RB PTD_PTD6 /* 右电机LB */
#define FrontSensor PTA_PTA5//PTA_PTA5 /* 前端传感器,0:有障碍物 */ #define BackSensor PTB_PTB0 /* 后端传感器,0:有障碍物 */ #define FrontLeftInfrared PTB_PTB1 /* 左前红外传感器,0:有障碍物 */ #define FrontRightInfrared PTB_PTB2 /* 右前红外传感器,0:有障碍物 */ #define FrontMiddleInfrared PTB_PTB3 /* 右后红外传感器,0:有障碍物 */ #define BackLeftInfrared PTB_PTB4 /* 左后红外传感器,0:有障碍物 */
//定义变量=================================================================
uchar cont_10ms; //为得到10ms时间平台计数器 uchar AD_buf;//保存AD转换值
//蜂鸣器相关变量========================================================== uchar beef_daley;//响蜂鸣持续时间 uchar beef_figer;//响蜂鸣器标记 uchar beef_time; //设置响蜂鸣器次数的变量 //======================================================================= uchar ch; uchar a[7];
uchar run_mode;
//遥控相关的变量=========================================================== uchar rest_time;//遥控接收时间计数器计数时间平台0.125ms uchar rxtime_buf;//暂存遥控接收时间计数器数据的变量 uchar rx_figer; //头码接收标记 uchar RCV_STEP; //接收阶段 uchar RCV_CONT; //接收数据位数计数变量 uchar rx_data;//遥控返回的得到内码 uchar RCV_BUF[4]={0};//接收数据缓冲数组 uchar RCV_CODE[9]={0x1a,0x13,0x0a,0x0b,0x0f,0x02,0xfc,0x0e,0x12 };//查遥控内码表
//以下为用户程序编写区 ============================================================
//初始化AD================================================================== void initAd(void) { ADICLK = 0x30; //设置AD转换器的时钟源及分频系数 ADSCR=ch; //设置AD转换器的启动,中断允许及转换通道 }
//AD管理===================================================================== void AD_porm(void) //每次调用该函数则启动一次AD转换,该AD通道为1 { initAd(); for(;;) { if(0x80==(ADSCR&0x80)) //等待转换结束 { a[ch-1]=ADR; //将AD转换得到值保存在AD_buf里 ch++; if(ch>7) ch=1; break; } } }
//蜂鸣器管理================================================================ void beef_conr(void) { if(beef_daley==0) //若蜂鸣器工作时间结束, { if(beef_figer==1)//若已响过蜂鸣则要关掉蜂器 { beef_daley=20;//送蜂鸣器间隔时间 beef_figer=0;//清响蜂鸣器标记 } else {if(beef_time>0)//若前面没有响蜂鸣且还没有达到要响次数则继续响 {beef_figer=1; //允许响蜂鸣器 beef_time--; //响的次数减1 beef_daley=20;//响蜂鸣器的时间 } } } }
//溢出中断================================================================== interrupt 6 void Timer_Interrupt(void) { TSC=TSC&0x7f; //清溢出中断标记 TMODH = 0; TMODL = 250; rest_time++; if(rest_time>159) { rx_figer=0; RCV_STEP=0; RCV_CONT=0; rest_time=0; } //蜂鸣器驱动=========================================== if(beef_figer==1) PTD=PTD^1;//对PTD的第0位引脚取反产生振荡信号 else PTD=PTD&0xfe; //===================================================== cont_10ms++; //为得到10ms计数器,每隔0.125ms计数一次 if(cont_10ms>79) { //10ms时间平台==================================== cont_10ms=0; if(beef_daley>0) beef_daley--; //对自减响蜂鸣的时间 } } //外中断===================================================================== //外中断主要负责遥控接收每按一次遥控器键盘时返回一个遥控内码保存在rx_data变量里 interrupt 2 void IRQ_Interrupt(void) { char i; rxtime_buf=rest_time; rest_time=0; if(rx_figer&1) { if((rxtime_buf>4)&&(rxtime_buf<23)) { if(rxtime_buf<=13) { RCV_CONT++; RCV_BUF[RCV_STEP]=RCV_BUF[RCV_STEP]>>1; RCV_BUF[RCV_STEP]=RCV_BUF[RCV_STEP]|0x80; } else if(rxtime_buf>=14) { RCV_BUF[RCV_STEP]=RCV_BUF[RCV_STEP]>>1; RCV_BUF[RCV_STEP]=RCV_BUF[RCV_STEP]&0x7f; RCV_CONT++; } if(RCV_CONT==8) { RCV_STEP++; RCV_CONT=0; } if(RCV_STEP>3) { rx_figer=0; RCV_STEP=0; RCV_CONT=0; for(i=0;i<10;i++) { if(RCV_BUF[3]==RCV_CODE) { rx_data=i; beef_time=rx_data; break; } } ; } } } else { if((rxtime_buf>104)&&(rxtime_buf<112)) { rx_figer=1; RCV_STEP=0; RCV_CONT=0; } }
} //外中断初始化============================================================= void init_IRQ(void) { INTSCR=0x00;//设置外中断信号为下降沿触发 } //定时器初始化============================================================== void InitTimer(void) { TMODH = 0; //设置定时器预置寄存器的高8位值为0 TMODL = 250; //设置定时器预置寄存器的低8位值为250 TSC=0x40; // } //软件延时================================================================== void daley(int x) { int c; for(c=0;c<x;c++) ; }
//MCU初始化================================================================ void MCU_init(void) { CONFIG1=1; PTD=0x00; PTB=0xff; PTA=0; DDRA=0xff; DDRD=0xff; //PTD口作为输出 DDRB=0x00; //PTB口作为输入 InitTimer(); //定时器初始化 init_IRQ(); EnableInterrupts//开总断 } //========================================================================= /********* 停止模块 ***********/ void RunStop(void) { //设置电机控制变量 LA = 0; LB = 0; RA = 0; RB = 0; //设置指示灯 MiddleLight = Off; LeftLight = Off; RightLight = Off; }
/********* 前进模块 ***********/ void RunForward(void) { LA = 1; LB = 0; RA = 1; RB = 0; //设置指示灯 MiddleLight = On; LeftLight = Off; RightLight = Off; }
/********* 后退模块 ***********/ void RunBackward(void) { //设置电机控制变量 LA = 0; LB = 1; RA = 0; RB = 1; //设置指示灯 MiddleLight = On; LeftLight = On; RightLight = On; }
/********* 左转模块 ***********/ void RunLeft(void) { //设置电机控制变量 LA = 0; LB = 1; RA = 1; RB = 0; //设置指示灯 MiddleLight = Off; LeftLight = On; RightLight = Off; }
/********* 原地左转模块 *******/ void RunLeftRoundLeft(void) { //设置电机控制变量 LA = 0; LB = 0; RA = 1; RB = 0; //设置指示灯 MiddleLight = Off; LeftLight = On; RightLight = Off; }
/********* 右转模块 ***********/ void RunRight(void) { //设置电机控制变量 LA = 1; LB = 0; RA = 0; RB = 1; //设置指示灯 MiddleLight = Off; LeftLight = Off; RightLight = On; }
/********* 原地右转模块 *******/ void RunRightRoundRight(void) { //设置电机控制变量 LA = 1; LB = 0; RA = 0; RB = 0; //设置指示灯 MiddleLight = Off; LeftLight = Off; RightLight = On; } void run_md(void) { if(run_mode==1) RunStop(); else if(run_mode==2) RunForward(); else if(run_mode==3) RunLeft(); else if(run_mode==4) RunRight(); } void ad_to_mode(void) {if((a[0]<240)&&(a[1]<240)) {if(a[0]>a[1]) { if((a[0]-a[1])>25) run_mode=3; else run_mode=2; } else if(a[1]>a[0]) {if((a[1]-a[0])>25) run_mode=4; else run_mode=2; } } else if((a[0]>240)&&(a[1]<240)) { if(a[1]>220) run_mode=4; else if(a[1]<180) run_mode=3; else if((a[1]>180)&&(a[1]<220)) run_mode=2; } else if((a[1]>240)&&(a[0]<240)) { if(a[0]>220) run_mode=3; else if(a[0]<180) run_mode=4; else if((a[0]>180)&&(a[0]<220)) run_mode=2; } }
//main程序=================================================================== void main(void) { daley(100);//系统延时 MCU_init();//单片机初始化 EnableInterrupts; beef_time=1; //主控程序============================================== for(;;) { beef_conr(); AD_porm(); //run_md(); //ad_to_mode(); // //if((a[0]<100)&&(a[1]<100)) //{ /// RunBackward(); //} //else //{ RunForward(); //} if(rx_data==8) { rx_data=0; RunForward(); } else if(rx_data==1) { rx_data=0; RunLeftRoundLeft(); } else if(rx_data==3) { rx_data=0; RunStop(); } } } //下面的与应用程序无关不必去看========================================================================== interrupt 15 void Timer15_Interrupt(void) { ;} interrupt 14 void Timer14_Interrupt(void) { ;} interrupt 13 void Timer13_Interrupt(void) { ;} interrupt 12 void Timer12_Interrupt(void) { ;} interrupt 11 void Timer11_Interrupt(void) { ;} interrupt 10 void Timer10_Interrupt(void) { ;} interrupt 9 void Timer9_Interrupt(void) { ;} interrupt 8 void Timer8_Interrupt(void) { ;} interrupt 7 void Timer7_Interrupt(void) { ;} interrupt 5 void Timer5_Interrupt(void) { ;} interrupt 4 void Timer4_Interrupt(void) { ;} interrupt 3 void Timer3_Interrupt(void) { ;}
interrupt 1 void Timer1_Interrupt(void) { ;} |