智能循迹避障小车C语言代码

合集下载

智能小车循迹、避障、红外遥控C语言代码

智能小车循迹、避障、红外遥控C语言代码

智能小车循迹、避障、红外遥控C语言代码//智能小车避障、循迹、红外遥控 C 语言代码// 实现功能有超声波避障,红外遥控智能小车,红外传感器实现小车自动循迹, 1602 显示小车的工作状态,另有三个独立按键分别控制三种状态的转换// 注:每个小车的引脚配置都不一样,要注意引脚的配置,但是我的代码注释比较多,看起来比较容易一点#include <> #include <> #include"" #include <> #define uchar unsigned char #define uint unsigned int uchar ENCHAR_PuZh1[8]=" uchar ENCHAR_PuZh2[8]=" uchar ENCHAR_PuZh3[8]=" uchar ENCHAR_PuZh4[8]=" uchar ENCHAR_PuZh5[8]=" run back stop left right "; ";//1602 显示数组H. H. H. uchar ENCHAR_PuZh6[8]=" xunji "; uchar ENCHAR_PuZh7[8]=" bizhang"; uchar ENCHAR_PuZh8[8]=" yaokong"; #define HW P2 #define PWM /****************************** P1 //红外传感器引脚配置P2k 口/* L298N 管脚定义*/ 超声波引脚控制******************************/ sbit ECHO=P3A2; sbit TRIG=P3A3;///// 红外控制引脚配置 sbit sbituchar KEY2=P3A7; KEY 仁 P3M;state_total=3,state_2=0;// 2 为红外遥控 ucharuchar time_1 uchar 局变量 // 超声波接收引脚定义 // 超声波发送引脚定义// 红外接收器数据线 // 独立按键控制总状态控制全局变量 state_1,DAT; // 红外扫描标志位time_1=0,time_2=0;// 定时器1 中断全局变量控制转弯延时计数也做延时一次time,timeH,timeL,state=0;// 超声波测量缓冲变量count=0;//1602 显示计数兼红外遥控按键state_total =2 兼循迹按键state_total= 0 自动避障 state_total=10 为自动循迹模块 1 为自动避障模块 time_ 2 控制 PWM 脉冲计数state 为超声波状态检测控制全uint /**************************/ unsigned char IRC0M[7]; // 红外接收头接收数据缓存unsigned char Number,distance[4],date_data[8]={0,0,0,0,0,0,0,0}; /********* voidvoid voidIRC0M[2 ]存放的为数据 // 红外接收缓存变量 **/ IRdelay(char x); //x* 红外头专用 delay run(); back();void stop(); void left_90(); void left_180(); void right_90(); void delay(uint dat); //void init_test();void delay_100ms(uint ms) ;void display(uchar temp); void bizhang_test(); void xunji_test(); void hongwai_test();void Delay10ms(void);void init_test()// 定时器 0{ 1 外部中断 // 超声波显示驱动 0 1 延时初始化 TMOD=0x11; TH1=0Xfe; TL1=0x0c; TF0=0; TF1=0; ET0=1; ET1=1; EA=1;// 设置定时器 0 1 // 装入初值定时一次为工作方式 1 16 位初值定时器2000hz// 定时器 // 定时器 // 允许定时器// 允许定时器 0 方式 1 计数溢出标志 1 方式 1 计数溢出标志 0 中断溢出 1 中断溢出//开总中断 if(state_total==1)// 为超声波模块时初始化 {TRIG=0; ECHO=0; EX0=0; IT0=1;}if(state_total==2)// 发射引脚低电平 // 接收引脚低电平 // 关闭外部中断// 由高电平变低电平,触发外部中断 0// 红外遥控初始化{ IT1=1; EX1=1;TRIG=1;}del ay(60);} void main(){ uint i; delay(50); init_test(); TR1=1; LCD1602_Init() ; delay(50); while(state_2==0)// 外部中断 1 为负跳变触发 // 允许外部中断 1 // 为高电平 I/O 口初始化// 等待硬件操作// 开启定时器 1{if(KEY1==0){Delay10ms(); // 消除抖动 if(KEY1==0) {state_total=0; // 总状态定义 0 为自动循迹模块 1 为自动避障模块2 为红外遥控while((i<30)&&(KEY1==0))// 检测按键是否松开{Delay10ms(); i++;}i=0;}}if(TRIG==0){while((i<30)&&(TRIG==0))// 检测按键是否松开{Delay10ms(); i++;}i=0;}if(KEY2==0){while((i<30)&&(KEY2==0))// 检测按键是否松开{Delay10ms(); i++; }i=0;// 检测按键 s1 是否按下//检测按键s2是否按下障模块Delay10ms(); // 消除抖动 if(TRIG==0) { state_total=1; 2 为红外遥控//总状态定义 0 为自动循迹模块 1 为自动避// 检测按键 s3 是否按下障模块Delay10ms(); // 消除抖动 if(KEY2==0) { state_total=2; 2 为红外遥控// 总状态定义 0 为自动循迹模块1 为自动避}}} init_test();delay(50); // 等待硬件操作50us TR1=0; // 关闭定时器 1 if(state_total==1) {//SPEED=90; bizhang_test();} if(state_total==0) {// SPEED=98; 电平// 自动循迹速度控制// 自动循迹速度控制高电平持续次数占空比为10 的低电平高电平持续次数占空比为40 的低xunji_test(); }if(state_total== 2){//SPEED=98; // 自动循迹速度控制高电平持续次数占空比为40 的低电平hongwai_test(); }void 断号init0_suspend(void)2 外部中断0 4 串口中断外部中断 1timeH=TH0;timeL=TL0;state=1;EX0=0;}void 断号0{if(state_total==1) { TH0=0X00;TL0=0x00;}if(state_total==0) { TH0=0Xec;TL0=0x78;time_1++;interrupt 0 //3 为定时器 1 的中断号 1 定时器0 的中// 记录高电平次数//// 标志状态为// 关闭外部中断1,表示已接收到返回信号//3 为定时器 1 的中断号2 外部中断0 4 串口中断time0_suspend0(void) interrupt 1外部中断 1// 自动避障初值装入// 装入初值// 自动循迹初值装入// 装入初值定时一次200hz// 控制转弯延时计数1 定时器0 的中}}void IR_IN(void){unsigned char j,k,N=0;EX1 = 0; IRdelay(5); if (TRIG==1) { EX1 =1; return;}//确认IR 信号出现//等IR 变为高电平,跳过 9ms 的前导低电平信号。

智能循迹避障小车完整程序(亲测好使)

智能循迹避障小车完整程序(亲测好使)

智能循迹避障小车完整程序(亲测好使)/*******************************************//利用51定时器产生PWM波来调节电机速度//速度变化范围从0-100可调//使用三路做寻迹使用,哪一路检测在黑线哪一路为//高电平//没检测到黑线表示有反射对应输出低电平信号*********************************************/#include<>#define uint unsigned int#define uchar unsigned char/*电机四个接口定义*/sbit in1=P0^0;sbit in2=P0^1;sbit in3=P0^2;sbit in4=P0^3;/*计时器*/uchar j,k,i,a,A1,A2,second,minge,minshi;sbit dula=P2^6;sbit wela=P2^7;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};uchar code table2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1};void delay(uchar i){for(j=i;j>0;j--)for(k=110;k>0;k--);}void display(uchar sh_c,uchar g_c,uchar min_ge,uchar min_shi) {dula=1;P0=table[sh_c];dula=0;P0=0xff;wela=1;P0=0xfb;wela=0;delay(5);dula=1;P0=table[g_c];dula=0;P0=0xff;wela=1;P0=0xf7;wela=0;delay(5);dula=1;P0=table[min_shi];dula=0;P0=0xff;wela=1;P0=0xfe;wela=0;delay(5);dula=1;P0=table2[min_ge];dula=0;P0=0xff;wela=1;P0=0xfd;wela=0;delay(5);}/*左、中、右三路循迹传感器接口定义*/ sbit zuo=P1^0; sbit zhong=P1^1;sbit you=P1^2;/*避障接口定义*/sbit bz_zuo=P1^3;sbit bz_zhong=P1^4;sbit bz_you=P1^5;uchar count = 0;/*利用定时器0定时中断,产生PWM波*/ void Init_timer() {TH0 = (65535-10)/256;TL0 = (65535-10)%256;TMOD = 0x01;TR0 = 1;ET0 = 1;EA = 1;}/*左轮速度调节程序*/void zuolun(uchar speed){if(count <= speed) //count计数变量{in1 = 1;in2 = 0;}else{in1 = 0;in2 = 1;}}void youlun(uchar speed) //同上{if(count<= speed){in3 = 1;in4 = 0;}else{in3 = 0;in4 = 1;}}void Inline() //检测黑线信号{uchar temp;temp =P1;switch(temp){case 0x01:zuolun(0); youlun(90);break; //左侧循迹传感器压线,小车向左前修正case 0x02:zuolun(100);youlun(100);break; //中间循迹传感器压线,保持直走此处两值使电机速度保持相同case 0x04:zuolun(90); youlun(0);break; //右侧循迹传感器压线,小车向右前修正case 0x08:zuolun(90); youlun(0);break; //左侧避障传感器有信号小车右转case 0x10:zuolun(90); youlun(0);break; //中间避障传感器有信号小车左转case 0x20:zuolun(90); youlun(0);break; //右侧避障传感器有信号小车左转}/*if(zuo==1){zuolun(10);youlun(50);}else if(zhong==1){zuolun(99);youlun(99);}else if(you==1){zuolun(50);youlun(10);} */}void main() //主函数{Init_timer(); //调用函数while(1){Inline();minge=0;minshi=0;second++;if(second==60)second=0,minge++;A1=second/10;A2=second%10;if(minge==10)minge=0,minshi++;for(a=200;a>0;a--){display(A1,A2,minge,minshi);};}}void Timer0_int()interrupt 1 //定时器中断计数{TH0 = (65535-10)/256;TL0 = (65535-10)%256;count ++;if(count >= 100){count = 0;}}。

循迹小车程序代码

循迹小车程序代码

//(在MAIN中接受铁片颜色判断传感器的信号来赋值) unsigned char Light_Flag=0;//进入光引导区的标志(1) unsigned int cntTime_5Min=0;//时间周期数,用于 T0 精确定时 unsigned int cntTime_Plues=0; //霍尔开关产生的脉冲数 /*============================全局变量定义区 ============================*/ /*------------------------------------------------*/ /*-----------------通用延迟程序-------------------*/ /*------------------------------------------------*/ void delay(unsigned int time) { unsigned int i,j; for(j=0;j<time;j++) { for(i=0;i<60;i++) {;} } } /*-----------------------------------------------*/ /*-------------------显示控制模块----------------*/ /*-----------------------------------------------*/ /*数码管显示,显示铁片的数目(设接在P0,共阴)*/ void Display(unsigned char n) { char Numb[12]= {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x37,0x77}; P0=Numb[n]; } // time*0.5ms延时

pwm调速控制小车循迹壁障c程序

pwm调速控制小车循迹壁障c程序

pwm调速控制小车循迹壁障c程序#include< reg51.h >#define uchar unsigned char#define uint unsigned int#define MOTOR_C P1 //P1口作为电机的控制口。

//#define SIGNAL P3 //P3口的低两位为循迹传感器输入口。

#define SHELVES 10 //速度总档数。

#define BACK 0xfa //后退。

#define FORWARD 0xf5 //前进。

sbit senserr = P3^2; //(右)循迹。

sbit senserl = P3^3; //(左)循迹。

sbit hwf = P3^0; //(前)红外壁障传感器入口。

sbit hwb = P3^1; //(后)红外壁障传感器入口。

sbit PWM_R = P1^0; //右电机PWM输入口。

sbit PWM_L = P1^2; //左电机PWM输入口。

sbit PWM_HR = P1^1; //(后退)右电机。

sbit PWM_HL = P1^3; //(后退)左电机。

void timer0_init( void ); //定时器0初始化函数。

void timer1_init( void ); //定时器1初始化函数。

void right( void ); //前进右转弯函数。

void left( void ); //前进左转弯函数。

void forward( void ); //前进函数。

void hright(void); //后退右转函数。

void hleft(void); //后退左转函数。

void back(void); //后退函数。

uchar percent_l = 0; //(前进)左轮占空比。

uchar percent_r = 0; //(前进)右轮占空比。

uchar percent_hl = 0; //(后退)左轮占空比。

智能循迹小车电磁组C语言源代码(stc12c5a芯片)

智能循迹小车电磁组C语言源代码(stc12c5a芯片)

智能循迹小车电磁组C语言源代码(stc12c5a芯片)#include#include#define FOSC 18432000L#define BAUD 9600#define ADC_POWER 0x80 //ADC power control bit 电源控制位#define ADC_FALG 0x10 //ADC complete flag 标志位#define ADC_START 0x08 //ADC start control bit 启动控制位#define ADC_SPEEDLL 0x00 //420 clocks#define ADC_SPEEDL 0x20 //280 clocks#define ADC_SPEEDH 0x40 //140 clocks#define ADC_SPEEDHH 0x60 //70 clockstypedef unsigned char BYTE;typedef unsigned int WORD;float bj1,bj2;int cg1,cg2,go;go=0x05; //电机驱动设为0101BYTE ch=0;void InitADC();void Delay(WORD n);void kongzhi();void PWM();void GetADCResult(BYTE ch);void main(){P0=0X00; //P0口的LED灯全亮InitADC(); //初始化ADIE=0xa0;PWM(); //调用PWM函数while(1){GetADCResult(ch); //读取AD值并赋值给变量kongzhi(); //调用控制函数}}void GetADCResult(BYTE ch) //读取AD的函数{ADC_CONTR &=!ADC_FALG;for(ch=0;ch<2;ch++){switch(ch){case 0: ADC_CONTR=0xe9; //定义P1.1为AD转换 1110 1001 _nop_();_nop_();_nop_();_nop_();while(!(ADC_CONTR&ADC_FALG));ADC_CONTR&=~ADC_FALG; //清除falg位cg1=ADC_RES; //把传到P1.1口的AD值(二进制)赋值给cg1 break;case 1: ADC_CONTR=0xea; //定义P1.2口为AD转换1110 1010_nop_();_nop_();_nop_();_nop_();while(!(ADC_CONTR&ADC_FALG));ADC_CONTR&=~ADC_FALG;cg2=ADC_RES; //把传到P1.2口的AD值(二进制)赋值给cg2 break;default: break;}}if(++ch>=2) ch=0;}void InitADC() //初始化AD函数{P1ASF=0XE7; // 1110 0111 //定义为AD转换的IO口P1M0=0xE7 ; // P1.7-P1.0:1110 0111P1M1=0xE7 ; // P1.7-P1.0:1110 0111ADC_RES=0;ADC_CONTR=0xe9;Delay(2);}void Delay(WORD n) //延时函数{WORD x;while(n--){x=5000;while(x--);}}void kongzhi(){bj1=((cg2*5/256)-(cg1*5/256)); //两个传感器所检测到的电压的差值bj2=((cg1*5/256)-(cg2*5/256));if((bj1<1)&&(bj2<1)) //全速{CCAP0H=0x08; //左轮CCAP1H=0x00; //右轮P3=go;}else if(bj1>4/3) //强左拐{CCAP0H=0x40; //左轮CCAP1H=0x00; //右轮P3=go;}else if(bj1>1&&bj1<4/3) //微左拐{CCAP0H=0x22; //左轮CCAP1H=0x00; //右轮P3=go;}else if(bj2>1&&bj2<4/3) //微右拐{CCAP0H=0x00; //左轮CCAP1H=0x18; //右轮P3=go;}else if(bj2>4/3) //强右拐{CCAP0H=0x00; //左轮CCAP1H=0x35; //右轮P3=go;}}void PWM(){CCON=0;CL=0;CH=0;CMOD=0X02;CCAP0H=CCAP0L=0X80;CCAPM0=0X42; //允许比较器功能、PWM脉宽输出CCAP1H=CCAP1L=0X80;PCA_PWM0=0x00; //组成9位P1.3PCA_PWM1=0x00; //组成9位P1.4CCAPM1=0X42;CR=1; //启动PCA计数器阵列}。

智能循迹小车c程序完美-详尽)

智能循迹小车c程序完美-详尽)

/*-----------------------------------------------------------------------------小车运行主程序---------------------------------------------------------------------------简介:@模块组成:红外对管检测模块----五组对管,五个信号采集端口直流电机驱动模块----驱动两个直流电机,另一个轮子用万向轮单片机最小系统------用于烧写程序,控制智能小车运动 @功能简介:在白色地面或皮质上用黑色胶带粘贴出路线路径宽度微大于相邻检测管间距。

这样小车便可在其上循迹运行。

@补充说明:该程序采取“右优先”的原则:即右边有黑线向右转,若无,前方有黑线,向前走,若无,左边有黑线,向左转,若全无,从右方向后转。

程序开头定义的变量的取值是根据我的小车所调试选择好的,如果采用本程序,请自行调试适合自己小车的合适参数值。

编者:陈尧,黄永刚(江苏大学电气学院二年级,三年级)1.假定:IN1=1,IN3=1时电机正向转动,必须保证本条件2.假定:遇到白线输出0,遇到黑线输出1;如果实际电路是:遇到白线输出1,遇到黑线输出0,这种情况下只需要将第四,第五句改成:#define m0 1#define m1 0即可。

3.说明1:直行---------------速度full_speed_left,full_speed_right.转弯,调头速度------correct_speed_left,correct_speed_right.微小校正时---------高速轮full_speed_left,full_speed_right;低速轮correct_speed.可以通过调节第六,七,八,九,十条程序,改变各个状态下的占空比(Duty cycle ),以求达到合适的转弯,直行速度4.lenth----------length检测到黑线到启动转动的时间间隔5.width----------mid3在黑线上到脱离黑线的时间差6.mid3-----------作为判断中心位置是否进入黑线的标志,由于运行的粗糙性和惯性,常取其他对管的输出信号作为判断条件7.check_right----若先检测到左边黑线,并且左边已出黑线,判断右端是否压黑线时间拖延----------------------------------------------------------------------------------------------------------------*/#include<STC12C5A60S2.h>#define uchar unsigned char#define uint unsigned int#define m0 1//黑线m1,白线m0#define m1 0#define full_speed_left 40 //方便调节各个状态的占空比,可用参数组:(30,35,6,25,30,68000,27000,500);#define full_speed_right 45 //(40,45,6,25,30,68000,27000,500);#define correct_speed 6 //校正时的低速轮的占空比#define turn_speed_left 25#define turn_speed_right 30#define lenth 68000 //测试数据:10000--》100--》500--》2000--80000--76000--68000 #define width 27000 //500--》10-->2000--》60000--30000---》27000#define check_right 500 //2000--》20--》200--》500#define midl left1#define midr right5uchar Duty_left,Duty_right,i=0,j=0; //左右占空比标志,取1--100sbit IN1=P2^0;sbit IN2=P2^1;sbit IN3=P2^2;sbit IN4=P2^3;sbit ENA=P1^0;sbit ENB=P1^1;//循迹口五组红外对管,依次对应从左往右第1,2,3,4,5五组sbit left1 =P1^6;sbit left2 =P1^5;sbit mid3 =P1^4;sbit right4=P1^3;sbit right5=P1^2;void line_left();void line_right();void line_straight()reentrant;//----------------------------------------void delay(long int Delay_time)//延时函数{uint t=Delay_time;while(t--);}//-----------------------------------------void init() //定时器初始化{left1=m0; //初始化left2=m0; //白线位置mid3 =m1; //黑线位置right4=m0;right5=m0;TMOD|=0x01;TH0=(65536-66)/256;TL0=(65536-66)%256;EA=1;ET0=1;TR0=1;ENA=1; //使能端口,初始化ENB=1;}//--------------------------------------------void time0(void)interrupt 1 //中断程序{i++; //调速在中断中执行j++;if(i<=Duty_left)ENA=1;else ENA=0;if(i>100){ENA=1;i=0;}if(j<=Duty_right)ENB=1;else ENB=0;if(j>100){ENB=1;j=0;}TH0=(65536-66)/256; //取约150HZ,12M晶振,每次定时66us,分100次,这样开头定义的变量正好直接表示占空比的数值TL0=(65536-66)%256;}//-----------------------------------------------void correct_left()//向左校正,赋值{Duty_left =correct_speed;Duty_right=full_speed_right;IN1=1;IN2=0;IN3=1;IN4=0;}//------------------------------------------------void correct_right()//向右校正,赋值{Duty_left =full_speed_left;Duty_right=correct_speed;IN1=1;IN2=0;IN3=1;IN4=0;}//--------------------------------------------------void turn_left()//左转,赋值{Duty_left =turn_speed_left;Duty_right=turn_speed_right;IN1=0; //转弯时一个正转,一个反转,IN2=1;IN3=1;IN4=0;}//---------------------------------------------------void turn_right()//右转,赋值{Duty_left =turn_speed_left;Duty_right=turn_speed_right;IN1=1; //转弯时一个正转,一个反转,IN2=0;IN3=0;IN4=1;}//-----------------------------------------------------void straight() //直走,赋值{Duty_left =full_speed_left; //左右电机占空比初始化,调节直线运动速度Duty_right=full_speed_right; //鉴于左右轮电机内部阻力不同,故占空比取不同值,这组值需要单独写程序取值IN1=1;IN2=0;IN3=1;IN4=0;}//-----------------------------------------------------void line_straight()reentrant //函数名后加reentrant可以递归调用,//一直走黑直线时{straight();if(right5==m1){line_right();}elseif(left1==m1){line_left();}elseif(left2==m1) //防止校正时,小车冲出过大,导致2,4号检测管屏蔽了两端检测管的检测,避免其走直线时出轨while(left2==m1){correct_left();if(right5==m1){line_right();goto label3;}else if(left1==m1){line_left();goto label3;}}elseif(right4==m1) //防止校正时,小车冲出过大,导致2,4号检测管屏蔽了两端检测管的检测,避免其走直线时出轨while(right4==m1){correct_right();if(right5==m1){ line_right(); goto label3;}else if(left1==m1){line_left();goto label3;}}elseif((left1==m0)&&(left2==m0)&&(mid3==m0)&&(right4==m0)&&(right5==m0)){straight();//delay(lenth);while(right4==m0) //本来应该是用mid3,但是为了提高灵敏度,选择right4;向左时,可取left2对管{turn_right();}if(mid3==m1){line_straight();}}label3: ; //什么都不做}//------------------------------------------------------------------------- void line_right() //右边有黑线时{straight();//这里的直走是在不管红外检测结果的直行delay(lenth);if(mid3==m1){turn_right();//执行向右转的赋值label:delay(width); //由width值决定转弯时mid3经过黑线宽度时所需要的时间 if(mid3==m0)while(right4==m0){}elsegoto label;}elseif(mid3==m0){turn_right();while(right4==m0){}if(midr==m1){line_straight();}}}//-----------------------------------------------------------------void line_left() //左边出现黑线时{while(left1==m1){if(right5==m1){line_right();goto label2;}}delay(check_right);//左边遇到黑线时,左边出了黑线之后,继续延时一段时间,判断右边是否遇到黑线,//若遇到黑线,执行line_right()函数if(right5==m1){line_right();goto label2;}if((mid3==m1)||(left2==m1)||(right4==m1)){line_straight();}else{while(left2==m0){turn_left();}if(midl==m1)line_straight();}label2: ;}//--------------------------------------------------------------------void detect_infrared() //循迹,红外检测{if(right5==m1){line_right();}elseif(left1==m1){line_left();}elseif(left2==m1){correct_left();}elseif(right4==m1){correct_right();}elseline_straight();}//--------------------------------------void main(void)//主程序部分{init();while(1) //循环检测红外对管采集的电平信号{detect_infrared();}}。

循迹小车的C语言程序(带注释)

循迹小车的C语言程序(带注释)

/************ ******** *
第二部分 电机控制子函数 ************* ******** ******* /
void forward1()// { IN1=0; IN2=1; }
电机
1
前进
void forward2()// { IN3=0; IN4=1; }
电机
2
前进
void back1()// { IN1=1; IN2=0; }
当第一、二个 LED 检测到黑线时,小车左转
if(RP1==0&&RP2==0&&RP3==0&&RP4==1) turn(count1,0,coun t2,200); // 0001
当第一、二、三个 LED 检测到黑线时, 小车
左大转
/************ ******** ***
小车右转*******************************/
当最右边的 LED 检测到黑线时,小车左转
if(RP1==1&&RP2==0&&RP3==1&&RP4==1)
turn(count1,80,coun t2,150); // 1011
当第二个 LED 检测到黑线时,小车偏左转
if(RP1==0&&RP2==0&&RP3==1&&RP4==1) turn(count1,0,coun t2,100); // 0011
void time0()interrupt 1 { TH0=(65536-1000)/256;// TL0=(65536-1000)%256; count1++; count2++; if(count1>=500)// count1=0; if(count2>=500)// count2=0; }

自动避障红外电动小车C51程序

自动避障红外电动小车C51程序
#define LCD_Data P0
#define Busy 0x80 //用于检测LCD状态字中的Busy标识
sbit c=P1^2; //转向灯使能端
uchar code talk1[]={"backward"};
uchar code talk2[]={"forward"};
uchar code talk3[]={"Turnleft"};
****************************/
void infrared_ray()interrupt 0 using 3
{ uchar i=90;
flage=0x01; //接受标志位
while(i--); //减小灵敏度
EX0=0; //关掉中断,等到发射方波后才开启,处于别动
}
//延时子程序
LCD_Data = WCLCD;
LCD_RS= 0;
LCD_RW= 0;
LCD_E = 0; //延时,为了安全
LCD_E = 0;
LCD_E = 0; //延时
LCD_E = 1;
}
void LCDInit(void) //LCD初始化
{
Delay400Ms();
LCD_Data = 0;
WriteCommandLCD(0x38,0); //三次显示模式设置,不检测忙信号
//右边有障碍物,左转
else if(temp==0x02) {control(2,dj_state3,right_light ); temp =0x00;}
//两个方向都有障碍物,后退,右转
else if(temp==0x03) {control(10,dj_state4,back_light );

循迹小车代码

循迹小车代码

#include<reg52.h>#define uchar unsigned char#define uint unsigned intuint a,d,y,z,h,q;sbit out1 = P0^0 ;//电机驱动输出控制管脚配置sbit out2 = P0^1 ;sbit out3 = P0^2 ;sbit out4 = P0^3 ;sbit in1 = P2^0;//循迹模块的信号输入管脚配置sbit in2 = P2^1;sbit in3 = P2^2;sbit in4 = P2^3;sbit in5 = P2^4;delay(uint a);int zuozhuan(uint z)//控制小车做左转动作(参数z和a可以用来调节左转时间,本程序设定//为不同参数表示每次调用程序左转时间相同不可变,没有调节转弯时间的功能){out1=1;out2=0;out3=0;out4=1;delay(a);}int youzhuan(uint y)//控制小车做右转动作(参数y和a可以用来调节右转时间,本程序设定//为不同参数表示每次调用程序右转时间相同不可变,没有调节转弯时间的功能){out1=0;out2=1;out3=1;out4=0;}int houtui(uint h)//控制小车可以使小车倒退行驶(参数功能与转弯类似){out1=0;out2=1;out3=0;out4=1;delay(a);out1=0;out2=0;out3=0;out4=0;delay(20);}int dengdai (uint d) //使小车停止当前所有动作,停止时间可调。

{out1=0;out2=0;out3=0;out4=0;delay(d);}void qianjin(q)//使小车向前行驶,行驶时间可调{out1=1;out2=0;out3=1;out4=0;delay(q);}void xunji(){P1=P1|0XF0; d elay(5);if(in1==0){dengdai();youzhuan(100);while(in3==1);}else if(in5==0){dengdai();zuozhuan(100);while(in3==1);}else if(in2==0){dengdai();youzhuan(30);}else if(in4==0){dengdai();zuozhuan(30);}else if(in3==0) {qianjin(20); }else {qianjin(20);}}int delay(uint a)//延时子函数{uint x,y;for(x=a;x>0;x--)for(y=110;y>0;y--);}void main(){delay(2000);while(1)xunji();}#include<reg52.h>#define uchar unsigned char#define uint unsigned int//D0-D7:f,b,a,e,d,h,c,g 共阴依次编码//74LS04反相器驱动数码管uchar code table[10] = {0x5F,0x42,0x9E,0xD6,0xC3,0xD5,0xDD,0x46,0xDF,0xD7}; uchar i = 0; //用于0-3数码管轮流显示uint j = 0; //计时的次数uint time=0; //计时uint pwm=16; //占空比uint speed; //调制PWM波的当前的值sbit R=P3^2; //右边传感器P3^2 sbit L=P3^3; //左边传感器P3^3 //电机驱动口定义sbit ENB=P1^0; //前轮电机停止控制使能sbit ENA=P1^1; //后轮控制调速控制端口sbit IN1=P1^2; //前轮sbit IN2=P1^3; //前轮sbit IN3=P1^4; //后轮sbit IN4=P1^5; //后轮void Init() {TMOD = 0x12; //定时器0用方式2,定时器1用方式1TH0=(256-200)/256; //pwmTL0=(256-200)/256;TH1 = 0x0F8; //定时2msTL1 = 0x30;EA = 1;ET0 = 1;ET1 = 1;TR0 = 1;TR1 = 1;}void tim0(void) interrupt 1 //产生PWM{speed ++;if(speed <= pwm) //pwm 就相当于占100的比例{ENA = 1;}else if(speed < 100){ENA = 0;}elsespeed = 0;}void time1() interrupt 3 //定时2ms{TH1 = 0x0F8;TL1 = 0x30;i =(i+1) % 4; //0-3循环j++;if(i == 0) //显示最低位数码管{P0 = 0x00; //段选清零防止乱码P0 = table[time%10]; //送段码信号}if(i == 1){P0 = 0x00;P0 = table[time/ 10% 10];}if(i == 2){P0 = 0x00;P0 = table[time/ 100% 10];}if(i == 3){P0 = 0x00;P0 = table[time/ 1000% 10];}P2 = ( 0x10 << i ); //送位选信号if(j == 500){time ++;//500次为1秒j = 0;}}void forward() //前进{IN2=1;IN1=0;}void back() //后退{IN2=0;IN1=1;}void left() //左转{ENB=1; //打开使能IN3=1;IN4=0;}void right() //右转{ENB=1; //打开使能IN3=0;IN4=1;}void stop() //停止{IN2=0;IN1=0;IN3=0;IN4=0;}void main(){Init(); //定时器初始化while(1){if(R==0 && L==1) //右传感器检测到黑线{right(); //右转forward();while(R==0 && L==1);}if(R==1 && L==0) //左传感器检测到黑线{left();forward();while(R==1 && L==0);}if(R==0 && L==0) //都检测到黑线则停止{stop();j = 0; //定时器仍在工作,计数时间清空}else //都没有检测到黑线{ENB = 0; //关闭转向控制forward();}}}。

循迹小车程序 C语言

循迹小车程序  C语言

#define Left_moto_go {P1_0=1,P1_1=0,P1_2=1,P1_3=0;} //左边两个电机向前走
#define Left_moto_back {P1_0=0,P1_1=1,P1_2=0,P1_3=1;} //左边两个电机向后转
#define Left_moto_Stop {P1_0=0,P1_1=0,P1_2=0,P1_3=0;} //左边两个电机停转
bit Right_moto_stop=1;
bit Left_moto_stop =1;
/************************************************************************/
//延时函数
void delay(unsigned int k)
P1_4 P1_5 接IN5 IN6 当 P1_4=0,P1_5=1; 时右上电机反转
P1_4 P1_5 接IN5 IN6 当 P1_4=0,P1_5=0; 时右上电机停转
P1_6 P1_7 接IN7 IN8 当 P1_6=1,P1_7=0; 时右下电机正转 右下电机接驱动板子输出端(蓝色端子OUT7 OUT8)
P1_2 P1_3 接IN3 IN4 当 P1_2=0,P1_3=1; 时左下电机反转
P1_2 P1_3 接IN3 IN4 当 P1_2=0,P1_3=0; 时左下电机停转
P1_4 P1_5 接IN5 IN6 当 P1_4=1,P1_5=0; 时右上电机正转 右上电机接驱动板子输出端(蓝色端子OUT5 OUT6)
P1_0 P1_1 接IN1 IN2 当 P1_0=0,P1_1=1; 时左上电机反转
P1_0 P1_1 接IN1 IN2 当 P1_0=0,P1_1=0; 时左上电机停转

51单片机循迹避障c语言程序

51单片机循迹避障c语言程序

51单片机循迹避障c语言程序#includereg52.hunsigned char timer1;typedef unsigned char uint8;typedef unsigned int uint16;电机驱动口定义#define out1 0xfa 前进#define out2 0xf6 右转#define out3 0xf9 左转#define out4 0xf5 后退#define out5 0xff 停车sbit zhongbz = P3^3; 中间壁障sbit zuo = P1^0; 左边壁障sbit you = P1^1; 右边壁障sbit PWM=P1^2; 右边电机脉宽调制void system_Ini() 初始化中断{TMOD= 0x11;PWMTH1 = 0xfe; 11.0592TL1 = 0x33;TR1 = 1;IE =0x8A;}void pwm() 脉宽调制{if(timer1100) timer1=0;if(timer130) PWM=0;else PWM=1;}void delay1ms(uint16 z){uint16 x,y;for(x = z; x 0; x--)for(y = 115; y 0; y--);}void BiZhang(){if((zuo == 1&&zhongbz == 1&&you ==1)(zuo == 0 && zhongbz == 1 && you == 0)) 前进{P2 = out1;}if((zuo == 1&&zhongbz == 1&&you ==0) 壁障左转(zuo == 1&&zhongbz == 0&&you ==0)){P2 = out3;}if((zuo == 0&&zhongbz == 1&&you ==1) 壁障右转(zuo == 1&&zhongbz == 0&&you ==1)){P2 = out2;}if(zuo == 0&&zhongbz == 0&&you ==1){P2 = out4;delay1ms(250);P2 = out2;delay1ms(350);}if(((0 == zuo) &&(zhongbz == 0)&& (0 == you))) 如果三边都检测到了障碍物就停止,然后再次判断是否三边都有障碍物{P2 = out4;delay1ms(1000);if(((0 == zuo) &&(zhongbz == 0)&& (0 == you))) 如果再次检测到三边都有障碍物就后退{P2 = out4;delay1ms(100);}}}void main(){system_Ini();while(1){pwm();BiZhang();}}void T1zd(void) interrupt 3 3 为定时器1的中断号{TH1 = 0xfe; 11.0592TL1 = 0x33;timer1++;}。

自动追光自动避障智能小车的源代码

自动追光自动避障智能小车的源代码
return k1;
}
//*********从左向右检测,检测10cm之内的障碍物*************//
void barrier_detection(void)
{
uchar i;
barrier_flag=0;
detector=4;
time_0_count=0;//定时器0工作在15cm障碍物检测
_nop_();
clk=1;
D1=1; //设定通道初始化
_nop_();
_nop_();
_nop_();
clk=0;
_nop_();
_nop_();
_nop_();
clk=1;
D1=1; //设定通道初始化.第3个下降沿
_nop_();
_nop_();
_nop_();
clk=0; //AD转化的初始化完成。
while(detector)
{
EX0 = 0;//关外部中断
IE0 = 0; //清除外部中断0标志位
TR0 = 0;//关闭定时器0
TH0=0xfc;
TL0=0x18;
leftTX=1;
MiddleTX=1;
rightTX=1;
switch(detector)
{
case 4: leftControl=1;MiddleControl=0;rightControl=0;
uchar number1=0; //用于计数500ms,太阳能板对光一次
uchar detector_busy = 0; //超声波正在检测标志位
uchar barrier_flag = 0; //低三位用于表示是否有障碍物;第三位表示左侧探测器探测结果,第二位表示中间探测器探测结果,最低位表示右侧探测器探测结果;1-有,0-无

智能小车C程序

智能小车C程序

一般是用IF语句来判断各种情况,下边是一个小程序,你可以看看#include"reg52.h"#define uint unsigned int#define uchar unsigned char//电机管脚sbit MA1=P3^0;sbit MA2=P3^1;sbit MB1=P3^2;sbit MB2=P3^3;//循迹模块管脚sbit led0=P1^0;sbit led1=P1^1;sbit led2=P1^2;sbit led3=P1^3;sbit led4=P1^4;sbit led5=P1^5;delay(){uint i;for(i=0;i<100;i++);}void zhengzhuan()//正转{MA1=0;MA2=1;MB1=1;MB2=0;}void fanzhuan()//反转{MA1=1;MA2=0;MB1=0;MB2=1;}void zuozhuan()//左转弯{MA1=0;MA2=1;MB1=0;MB2=0;}void youzhuan()//右转弯{MA1=0;MA2=0;MB1=1;MB2=0;}stop()//停止{MA1=0;MA2=0;MB1=0;MB2=0;}main(){while(1){if(led1==0&&led2==0&&led3==1&&led4==0&&led5==0) {void zhengzhuan();//正转}if(led1==0&&led2==0&&led3==0&&led4==0&&led5==0) {void fanzhuan();//反转}if(led1==1&&led2==1&&led3==1&&led4==0&&led5==0) {delay();void zuozhuan();//左转弯}if(led1==0&&led2==0&&led3==1&&led4==1&&led5==1) {delay();void youzhuan();//右转弯}if(led1==0&&led2==1&&led3==1&&led4==1&&led5==0) {stop();//停止}if(led1==0&&led2==0&&led3==0&&led4==0&&led5==0) {void youzhuan();//原地打圈}if(led1==1&&led2==1&&led3==1&&led4==1&&led5==1) {delay();void youzhuan(); //遇到T型区优先考虑向右转}}。

智能小车代码

智能小车代码

智能小车代码一、主程序#include<reg51.h>#include <INTRINS.H>#include "pwm.h"#include "delay.h"#include "tracking.h"#define uchar unsigned char#define uint unsigned intsbit front=P3^3; /*前边红外避障*/sbit right1=P3^4; /*右前红外避障*/sbit right2=P3^5; /*右后红外避障*/sbit left1=P3^6; /*左前红外避障*/sbit left2=P3^7; /*左后红外避障*/sbit shine0=P1^0; /*前趋光*/sbit shine1=P1^1; /*左趋光*/sbit shine2=P1^2; /*右趋光*/sbit beef=P1^3;sbit led=P2^4; /*声光报警led灯*/uchar flag=0;void main(void){ uchar k;int i;beef=1;pwm_init();/*******从A到B******************************/ while(right1==0 || right2==0 ){if(left1==0 && left2==0)go(15,1);else if(left1==1 && left2==0)go(3,15);else if(left1==0 && left2==1)go(15,3);elsego(14,15);}/******转弯进入Ⅰ区***************/go(20,-20); //左转delay(4);TR0=0;stop();delay(1000);TR0=1;go(20,15);delay(180);while(front==1) //检测到白板前直走{go(17,15);}TR0=0;stop();delay(200);TR0=1;go(20,-20); //检测到白板就左转delay(4);TR0=0;stop();delay(1000);TR0=1;while(left1==0 || left2==0) //靠左边白板直走{if(left1==0 && left2==0)go(15,1);else if(left1==1 && left2==0)go(3,15);else if(left1==0 && left2==1)go(15,3);elsego(14,15);}while(right1==0 || right2==0){if(left1==0 && left2==0)go(15,1);else if(left1==1 && left2==0)go(3,15);else if(left1==0 && left2==1)go(15,3);elsego(14,15);}while(front==1){go(15,12);}TR0=0;stop();delay(1000);/*****左转进入Ⅱ区**************/TR0=1;go(-20,20);delay(4);TR0=0;stop();delay(1000);TR0=1;tracking_stop(); //打开循迹,当3个红外同检测到黑线时TR0=0;stop();k=100; //停留5 秒,并发出断续声光报警。

智能循迹小车详细源代码程序(MSP430,PID)

智能循迹小车详细源代码程序(MSP430,PID)
80 }
81 LEFTOUT=Period/100*speed;
82 }
83 void MotorRight(int speed,int direction)
84 {
85 if(speed>max_speed)speed=max_speed;
86
72 {
73 EnableLeftNeg;
74 UnenableLeftPos;
75 }
76 else if(direction==foreward)//正转
77 {
78 EnableLeftPos;
79 UnenableLeftNeg;
17 #define LEFTOUT TACCR1
18 #define RIGHTOUT TACCR2
19 #define SensorIn P5IN
20 #define F 5000//5000hz
21 #define Period (8000000/F)
64 {
65 LEFTOUT=0;
66 RIGHTOUT=0;
67 }
68 void MotorLeft(int speed,int direction)
69 {
70 if(speed>max_speed)speed=max_speed;
71 if(direction==backward)//反转
183 TACCTL2|=OUTMOD_7;//
184 LEFTOUT=0;
185 RIGHTOUT=0;
186 }
187
188 float abs(float a)
189 {

避障跟随测距c语言程序,红外避障小车c语言程序.pdf

避障跟随测距c语言程序,红外避障小车c语言程序.pdf
避障跟随测距c语言程序,红外避障小车c语言程序.pdf
智能小车红外避障智能小车红外避障 c 语言程序语言程序 #include bit RandomFactor = 0 ; bit RandomFactorBuf = 0 ; #include #define FLeftMotor P0_2 = 1 ; P0_3 = 0 #define BLeftMotor P0_2 = 0 ; P0_3 = 1 #define FRightMotor P0_5 = 1 ; P0_4 = 0 #define BRightMotor P0_5 = 0 ; P0_4 = 1 #define LeftStop P0_2 = 0 ; P0_3 = 0 #define RightStop P0_4 = 0 ; P0_5 = 0 #define CarStop P0_2 = 0 ; P0_3 = 0 ; P0_4 = 0 ; P0_5 = 0 #define RightSenser P0_0 #define LeftSenser P0_1 //******************************************************** // 左转 //******************************************************** void TurnLeft_1() { LeftStop ; FRightMotor ; } //******************************************************** // 快速左转 //******************************************************** void TurnLeft_Fast() { BLeftMotor ; FRightMotor ; } //******************************************************** // 右转 //******************************************************** void TurnRight_1() { RightStop ; FLeftMotor ; } //******************************************************** // 快速右转 //******************************************************** void TurnRight_Fast() { BRightMotor ; FLeftMotor ; } //******************************************************** // 用倒退的方式进行车头右转 //******************************************************** void BTurnRight_1() { LeftStop ; BRightMotor ; } //******************************************************** // 用倒退的方式进行车头左转 //******************************************************** void BTurnLeft_1() { RightStop ; BLeftMotor ; } //******************************************************** // 前进 //******************************************************** void FCar() { FLeftMotor ; FRightMotor ; } //************************// 后退 //******************************************************** void BCar() { BLeftMotor ; BRightMotor ; } //******************************************************** // 壁障程序 //******************************************************** void Obstacle_Avoid(void) { if(RightSenser } if((!RightSenser) } if(RightSenser } if(!(RightSenser || LeftSenser)) { RandomFactorBuf = RandomFactor ; while (!(RightSenser || LeftSenser)) { if(RandomFactorBuf) { BTurnLeft_1() ; delay (300) ; } if(!RandomFactorBuf) { BTurnRight_1() ; delay (300) ; } } } if(!PWM) { LeftStop ; RightStop ; } } //******************************************************** // 跟随程序 //******************************************************** void Follow(void) { if(RightSenser RightStop; } if((!RightSenser) } if(RightSenser } if(!(RightSenser || LeftSenser)) { FCar() ; } } //******************************************************** //******************************************************** main() { Timer0Setup(500) ; Timer1Setup(50) ; Obstacle_Avoid() ; // Follow() ; }

智能小车避障C程序

智能小车避障C程序

智能小车的四路避障C程序前,左,后避障传感器现在对应中,右,左三路寻线传感器.#include <stdio.h>#include <intrins.h>#include "STC12C5410AD.H"#include "sio.h"#define MIN9MS 0x0120 //9ms中心是0x0159#define MAX9MS 0x01a0#define MIN45MS 0x0090 //4.5ms中心是0x00ac #define MAX45MS 0x00d0#define MIN225MS 0x0040 //2.25ms中心是0x0056#define MAX225MS 0x0080#define MIN056MS 0x000e //0.56ms中心是0x0015#define MAX056MS 0x001b#define MIN168MS 0x0020 //1.68ms中心是0x0040#define MAX168MS 0x0060sfr ISP_CUNTR = 0xE7;sbit LED1 = P1^1;sbit LED2 = P1^2;sbit IR_FRONT = P3^3;sbit IR_LEFT = P3^4;sbit IR_RIGHT = P3^5;sbit IR_BACK = P1^3;sbit IR_OUT = P1^0;sbit PWM0 = P3^7;sbit MOTO_IN_A1 = P1^7;sbit MOTO_IN_A2 = P1^6;sbit MOTO_IN_B1 = P1^5;sbit MOTO_IN_B2 = P1^4;bit power_stat;static unsigned char car_stat; //小车状态:0,停止;1,前进;2,后退;3,左转;4,右转;ff,自控寻线模式static unsigned char code led_mod_table[3][20] = {{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0},{1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0} };unsigned char idata led_mod = 0;static unsigned char idata led_tick = 0; static unsigned char idata led_ptr = 0;#define IR_SIGNAL_TOTAL 21#define IR_SIGNAL_VALID 18static unsigned char codeir_table[IR_SIGNAL_TOTAL] = {1,1,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0 };static unsigned char codeir_check_table[IR_SIGNAL_TOTAL] = { 0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0 };static unsigned char idata ir_ptr = 0;static unsigned char idata front_signal = 0; static unsigned char idata back_signal = 0;static unsigned char idata left_signal = 0;static unsigned char idata right_signal = 0;static bit front_obj = 0, back_obj = 0, left_obj = 0, right_obj = 0;static void delay(unsigned long v) {while (v--) {}}/** PCA中断计数,根据位置判断信号区域和定义,位置0表示初始,1代表引导码信号,2表示引导码间隔,* 3表示第一个bit的信号,4表示第一个bit的间隔,以次类推...* 更具体见对应的红外线协议.*/static unsigned char idata pca_tick;static unsigned char idata pca_int_count;static unsigned char data pca_int_total; /* 根据引导头确定总长度*/static unsigned int idata period; /* 红外信号占或空周期计数*/static unsigned char idata data_buf[6]; /* 红外线协议数据缓冲区*/static unsigned int idata ccap1; //PCA0上一次的的计数static unsigned char idata frame_dog; //红外帧看门狗,限定时间未接收完成清除工作void time0_isr() interrupt 1{unsigned char tmp;if (ir_table[ir_ptr++]) {IR_OUT = 0;} else {IR_OUT = 1;}ir_ptr %= IR_SIGNAL_TOTAL;tmp = ir_check_table[ir_ptr];if ((!IR_FRONT && tmp) || (IR_FRONT && !tmp)) front_signal++;if ((!IR_LEFT && tmp) || (IR_LEFT && !tmp))left_signal++;if ((!IR_RIGHT && tmp) || (IR_RIGHT && !tmp)) right_signal++;if ((!IR_BACK && tmp) || (IR_BACK && !tmp)) back_signal++;if (ir_ptr == 0) {// com_putchar(front_signal);if (front_signal >= IR_SIGNAL_VALID) front_obj = 1;elsefront_obj = 0;if (back_signal >= IR_SIGNAL_VALID) back_obj = 1;elseback_obj = 0;if (left_signal >= IR_SIGNAL_VALID)left_obj = 1;elseleft_obj = 0;if (right_signal >= IR_SIGNAL_VALID) right_obj = 1;elseright_obj = 0;front_signal = 0;back_signal = 0;left_signal = 0;right_signal = 0;}}void time0_initialize(void){TMOD &= ~0x0F; /* clear timer 0 mode bits */ TMOD |= 0x02; /* put timer 0 into MODE 2 */ TH0 = 0x5C; /* 256 -XTAL*dur/T1_12/1000000, dur=定时器的周期,以us为单位*/TL0 = 0x5C; /* 100us */PT0 = 0; /* 时钟0中断低优先级*/TR0 = 1;ET0 = 1;}static void wakeup (void) interrupt 2{}static void pca_isr (void) interrupt 6{unsigned char i, j;if (CCF1) {CCF1 = 0; //清PCA1中断标志LED1 = IR_RIGHT;LED2 = IR_RIGHT;if (!pca_int_count) { //第一次收到信号if (!IR_RIGHT) {ccap1 = pca_tick * 256 + CCAP1H;pca_int_count++;}} else { //已经收到一些信号period = pca_tick * 256 + CCAP1H - ccap1;ccap1 = pca_tick * 256 + CCAP1H;//com_putchar(period / 256);//com_putchar(period % 256);if (pca_int_count == 1) {if (period < MIN9MS || period > MAX9MS) { //9mspca_int_count = 0;frame_dog = 0;} elsepca_int_count++;} else if (pca_int_count == 2) {if (period > MIN225MS && period <MAX225MS) { //2.25mspca_int_total = 3;pca_int_count++;} else if (period > MIN45MS && period < MAX45MS) { //4.5mspca_int_total = 67;pca_int_count++;} else {pca_int_count = 0;frame_dog = 0;}} else {if (IR_RIGHT) {if (period > MIN056MS && period < MAX056MS) { //0.56msif (pca_int_count >= pca_int_total) { //帧接收完毕,下面进行有效分析.if (pca_int_total == 67) { //完整信号,含有引导信号,设备码8bit,设备反码8bit,命令字8bit,命令字反码8bitif ((data_buf[0] ^ data_buf[1] == 0xff) && (data_buf[2] ^ data_buf[3] == 0xff)) {com_putchar(data_buf[0]);com_putchar(data_buf[2]);if (data_buf[0] == 0x40) {switch (data_buf[2]) {case 0x5F: //左car_stat = 3;break;case 0x5B: //右car_stat = 4;break;case 0x5A: //上car_stat = 1;break;case 0x5E: //下car_stat = 2;break;case 0x56: //菜单car_stat = 0;break;case 0x0: //数字0car_stat = 0xff;break;case 0x12: //POWER// power_stat =~power_stat;break;default:break;}}}} else { //重复信号,仅含有引导信号}pca_int_count = 0;frame_dog = 0;} else {pca_int_count++;}} else {pca_int_count = 0;frame_dog = 0;}} else {j = (pca_int_count - 3) / 2;i = j / 8;j = j % 8;if (period > MIN168MS && period < MAX168MS) { //1.68ms// com_putchar(0x01);data_buf |= (0x01 << j);pca_int_count++;} else if (period > MIN056MS && period < MAX056MS) { //0.56ms// com_putchar(0x00);data_buf &= ~(0x01 << j);pca_int_count++;} else {pca_int_count = 0;frame_dog = 0;}}}}}if (CF) { //PCA计数溢出中断,19.6608MHZ晶体大约6.7ms溢出CF = 0;pca_tick++;if (led_tick++ >= 10) {led_tick = 0;if (led_mod_table[led_mod][led_ptr++]) {LED1 = 0;LED2 = 0;} else {LED1 = 1;LED2 = 1;}led_ptr %= 20;}if (pca_int_count) {frame_dog++;if (frame_dog >= 15) { //100ms后重新开始分析新的红外线数据包pca_int_count = 0;frame_dog = 0;}}}}void auto_power_down() {delay(30000);ISP_CUNTR = 0x20; //从AP复位并从AP执行}void main (void){unsigned char i;unsigned long j;MOTO_IN_A1 = 0;MOTO_IN_A2 = 0;MOTO_IN_B1 = 0;MOTO_IN_B2 = 0;P1M1 = 0xf0; //P1.7~P1.4 强推挽输出EA = 0;power_stat = 0;time0_initialize();com_initialize (); /* initialize interrupt driven serial I/O */com_baudrate (4800); /* setup for 1200 baud */ /*CMOD = 0x01; // #00000000B,PCA空闲计数,PCA计数源=Fosc/12,PCA溢出中断(做一个定时器使用)CCON = 0x00; //PCA中断标志清0,PCA停止计数CL = 0x0;CH = 0x0;CCAPM1 = 0x31; //PCA1上升下降沿捕获*/CMOD = 0x03; /* #00000010B,PCA空闲计数,PCA计数源=fosc/2,PCA溢出中断*/CCON = 0x00; //PCA中断标志清0,PCA停止计数CL = 0x0;CH = 0x0;CCAPM1 = 0x31; //PCA1上升下降沿捕获CCAPM0 = 0x42; //PCA0工作模式:8位pwm PCA_PWM0 = 0x00;CCAP0L = 0x20;CCAP0H = 0x20;EPCA_LVD = 1; //允许PCA和低压检测中断car_stat = 0;pca_tick = 0;pca_int_count = 0;frame_dog = 0;EA = 1; /* Enable Interrupts */CR = 1; //启动PCA计数while (1){if (power_stat) {// auto_power_down();}if (left_obj || right_obj || front_obj || back_obj) { LED1 = 0;LED2 = 0;}switch (car_stat) {case 0:MOTO_IN_A1 = 0;MOTO_IN_A2 = 0;MOTO_IN_B1 = 0;MOTO_IN_B2 = 0;break;case 0xff:if (!front_obj) { //中线传感器检测到黑线MOTO_IN_A1 = 1;MOTO_IN_A2 = 0;MOTO_IN_B1 = 1;MOTO_IN_B2 = 0;j = 50000;while (j) {j--;if (front_obj)break;}} else {TURNLEFT:MOTO_IN_A1 = 0;MOTO_IN_A2 = 1;MOTO_IN_B1 = 1;MOTO_IN_B2 = 0;j = 1000000;while (1) {j--;if (!front_obj) {goto EXIT;}if (!left_obj)goto TURNLEFT;if (!back_obj)goto TURNRIGHT;if (j == 0)goto EXIT;}TURNRIGHT:MOTO_IN_A1 = 1;MOTO_IN_A2 = 0;MOTO_IN_B1 = 0;MOTO_IN_B2 = 1;j = 1000000;while (j) {j--;if (!front_obj)goto EXIT;if (!back_obj)goto TURNRIGHT;if (!left_obj)goto TURNLEFT;}}EXIT:/*MOTO_IN_A1 = 0;MOTO_IN_A2 = 0;MOTO_IN_B1 = 0;MOTO_IN_B2 = 0;delay(5000);*/break;default:break;}PCON |= 0x01;}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
array[0]=(sec%10);
array[1]=(sec/10);
array[2]=(min%10);
array[3]=(min/10);
}
void display()
{
P0=tab[array[0]];
P2=0X01;
delay();
sbit P37=P3^7;
sfr WDT_CONTR=0Xe1;
uint line,flag_stop=1,flag_signal; //小车停止标志位 ,障碍物检测标志位
uint flag_zuo=0,flag_you=0; //偏离黑线标志位
uint number=0;
uint sec=0,min=0,count=0;//时间初始化
delay();
P2=0X00;
}
void delay()
{
uint i;
for(i=500;i>0;i--);
}
void check()
{
P10=1;
_nop_();
_nop_();
flag_signal=P10;
if(flag_signal==0) //检测到障碍物
P2=0X00;
P0=tab[array[1]];
P2=0X02;
delay();
P2=0X00;
P0=tab[array[2]];
P2=0X04;
delay();
P2=0X00;
P0=tab[array[3]];
P2=0X08;
{
P14=0,P15=1,P16=1,P17=1;
}
if(line==0X04||line==0X06)
{
P14=1,P15=1,P16=0,P17=1;
}
}
}
void modify()
WDT_CONTR=0X35; //看门狗
P0=0XC0;
P2=0X00;
P14=0,P15=1,P16=0,P17=1;
TMOD=0X11;
TH1=-5000/256;
TL1=-5000%256;
TH0=-25/256;
TL0=-25%256;
{
P14=0,P15=1,P16=1,P17=1;
}
else
{
P14=0,P15=1,P16=0,P17=1;
}
}
}
WDT_CONTR=0X35;//喂狗
}
}
void leave()
{
if(P33==0)
{
flag_you=1;
P14=1,P15=0,P16=0,P17=1;
}
else if(P37==0)
{
flag_zuo=1;
min++;
sec=0;
}
if(min==60)
{
min=0;
}
modify();
}
}
void timer0(void) interrupt 1 //发射超声波频率40KHz
{
TH0=-25/256;
if(line!=0X00)
{
if(line!=0X1f)
{
TR0=0;//停止定时器0
flag_stop=1;
if(P33==0||P37==0)
{
leave();
}
else
{
motor();
void leave(); //偏离黑线子程序
void display(); //显示程序
void modify(); //时间调整
void motor(); //电机控制子程序
void delay(); //延时子程序
void check(); //障碍物检测子程序
main()
{
#include<reg52.h>
#include<absacc.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar tab[11]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
}
}
if(line==0X1f)
{
TR0=1;//启动定时器0
P14=0,P15=1,P16=0,P17=1;
check();
}
}
else
{
P14=1,P15=1,P16=1,P17=1;
flag_stop=0;
EA=1;
ET1=1;
ET0=1;
TR1=1;
while(1)
{
display();
P3=0Xff;
_nop_();
_nop_();
line=P3;
line=(line&0Xf8);
line=line/8;
P14=0,P15=1,P16=1,P17=0;
}
}

void timer1(void) interrupt 3 //定时器1处于定时 1ms
if(line==0X05)
{
flag_zuo=0;
flag_you=0;
P14=0,P15=1,P16=0,P17=1;
}
if(flag_zuo!=1&&flag_you!=1)
{
if(line==0X01||line==0X03)
uchar array[4]={0X00};
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit P14=P1^4;
sbit P15=P1^5;
sbit P16=P1^6;
sbit P17=P1^7;
sbit P33=P3^3;
{
TH1=-5000/256;
TL1=-5000%256;
if(flag_stop!=0)
{
count++;
}
if(count==200)
{
count=0X00;
sec++;
if(sec==60)
{
TL0=-25%256;
number++;
if(number==2) //发射超声波
{
P11=0;
number=0;
}
else
P11=1;
}
void motor()
{
line=(line&0X0E);
line=line/2; //中间三路黑线
相关文档
最新文档