智能循迹小车C程序(完美-详尽)
智能循迹避障小车完整程序(亲测好使)
智能循迹避障小车完整程序(亲测好使)/*******************************************//利用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;}}。
智能小车寻迹入库程序+C
“旋风”入库的程序,在安装路面传感器安装于距离地面1CM的位 置。对于不同的地面环境可以适当修改程序中电机的速度*/ #include <reg51f.h> #include <math.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int #define _Nop() _nop_(),_nop_(),_nop_(),_nop_() /*定义空指令*/ sbit LeftW_F = P1^7; /*控制左轮前进,低有效*/ sbit LeftW_B = P1^6; /*控制左轮后退,低有效*/ sbit RightW_F= P1^5; /*控制右轮前进,低有效*/ sbit RightW_B= P1^4; /*控制右轮后退,低有效*/ sbit ir_send_forword_left = P1^3; /*前端左边红外发射二极管控制信号,低电平发射*/ sbit ir_send_forword_right = P1^2; /*前端右边红外发射二极管控制信号,低电平发射*/ sbit ir_receive_forword = P2^4; /*前端红外信号接收端,低电平则有红外信号反射*/ sbit road_left= P3^2; /*左边路面状态*/ sbit road_right= P3^3; /*右边路面状态*/ sbit smg1 = P3^4; /*LED1 位选信号*/ sbit smg2= P3^5; /*LED2 位选信号*/ uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0x88,0x83,0xc6,0xa1,0x86,0x8e}; uint count=0; uchar idata ir_data_0=0x00; /*当前路面传感器状态存储单元*/ uchar idata ir_data_1=0x00; /*上一次路面传感器状态存储单元*/ /*标准的 160uS 延时时间*/ delay160us() { uint i,j; for(i=0;i<6;i++) {for(j=0;j<5;j++) /*160us*/ {;} } } /*标准的 80mS 延时时间*/ delay() { uint i,j; for(i=0;i<200;i++) {for(j=0;j<100;j++) {;} } } /*---------------------------------------------------------------------------------return value means the barrier's location.return value: 0,0,0,0,R,L,FR,FL. 1:has barrier;0: no
循迹小车的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; }
智能小车寻迹入库程序 C概要
“旋风”智能小车–巡线入库演示程序 } break; case 0x0c: { //左边和右边都有反射信号,小车应该前进 turn_left(; } break; default : break; } } TL1=-20000%256; TH1=-20000/256; //T0 基准 50mS } void main( { uchar bar=0x00; smg2=0; TMOD=0x12; /*定时器初始化*/ TL0=0x20; TH0=0x20; TL1=-20000%256; /*T1 基准 20mS*/ TH1=-20000/256; TR0=1; TR1=1; EA=1; ET1=1; CMOD=0x04; /*选择 PCA 的时钟源*/go_forward(; while(1 { bar=test_ir_io(; P0=table[bar]; switch(bar /*判断寻线是否已经结束*/ { case 0x00: { ; } break; case 0x01: { ; } break; case 0x02: 作者:雷刚编写日期:2006.3.25 6“旋风”智能小车–巡线入库演示程序 { ; } break; case 0x03: /*寻线已经结束,开始穿越障碍*/ { ET1=0; TR1=0; do{ /*小车右转,转到前边没有障碍为止*/turn_right_90(; bar=test_ir_io(; P0=table[bar]; }while(bar!=0x00; delay(; while(1{ if((road_left==1||(road_right==1 /*判断是否进入车库*/ { stop(; /*小车进入车库,小车停车*/ while(1 { smg1=0; /*利用 LED 发出停车提示信息*/ smg2=0; P0=0xbf; delay(; delay(; P0=0xff; smg1=1; smg2=1; delay(; delay(; } } bar=test_ir_io(;P0=table[bar]; switch(bar /*小车在巷道中避障前进*/ { case 0x00: { go_forward_90(; } break; case 0x01: { 作者:雷刚编写日期:2006.3.25 7“旋风”智能小车–巡线入库演示程序 turn_right_90(; } break; case 0x02:{ turn_left_90(; } break; case 0x03: { ; } break; } } }break; default:break; } } } 作者:雷刚编写日期:2006.3.25 8。
循迹小车程序
//大约50ms的延时
//************************************************
void delay_50ms(uint t)
{
uint j;
for(;t>0;t--)
for(j=6245;j>0;j--);
}
void qianjin()//小车前进
P12=1;P13=1;
delay_50us(10);
P10=1;P11=1;
delay_50us(10);
}
void zhuanwan()//小车转弯
{
P10=1;P11=0;P12=0;P13=1;
delay_50ms(15);
{P10=1;P11=1;P12=1;P13=1;}
delay_50ms(100);
{ P10=0;P11=1;
delay_50us(25);
P10=1;P11=1;
delay_50us(10);
P12=0;P13=1;
delay_50us(25);
P12=1;P13=1;
delay_50us(10);
}
void tingzhi()//小车停止
{ P10=1;P11=1;P12=1;P13=1;}
sbit P13=P1^3;//控制右电机后退
sbit LED=P0^0;
sbit zuobian=P3^2; //左边传感器
sbit youbian=P3^3; //右边传感器
//************************************************
//延时函数,在12MHz的晶振频率下
循迹小车程序 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; 时左上电机停转
智能搬运小车C语言程序(完整)
xunji();
delay(20);
}
fangxia();
delay(10);
songkai();
delay(10);
houtui();
qianjinfangxiang();
turn_left2();
}
void main() //主程序
{
time_init();
zkb1=30;
zkb2=30;
qianjinfangxiang();
qianjin();
delay(10);
while(1)
{
xunji();
turn_right2();
else if((RSIGN1==0)&&(RSIGN2==0)&&(LSIGN1==0)&&(LSIGN2==1))//右偏1,左转1
turn_left1();
else if((RSIGN1==0)&&(RSIGN2==0)&&(LSIGN1==1)&&(LSIGN2==1))//右偏2,左转2
zkb1=10;
zkb2=40;
}
void turn_left2()//大左转函数
{
zkb1=0;
zkb2=50;
}
void turn_right1()//小右转函数
{
zkb1=40;
zkb2=10;
}
void turn_right2()//大右转函数
diaotou();
}
}
}
qianjin();
智能红外循迹小车程序
#include<reg52.h>#define uint unsigned int#define uchar unsigned char#define ulong unsigned longsbit you_2=P2^0;//红外探测端口定义sbit you_1=P2^1;sbit zhong=P2^2;sbit zuo_1=P2^3;sbit zuo_2=P2^4;sbit CG=P0^1;sbit DC=P0^0;uchar code L_F[8]= {0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90};//左电机正转uchar code L_B[8]= {0x90,0x80,0xc0,0x40,0x60,0x20,0x30,0x10};//左电机反转uchar code R_F[8]= {0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};//右电机正转uchar code R_B[8]= {0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};//右电机反转uchar code B_F[8]= {0x91,0x83,0xc2,0x46,0x64,0x2c,0x38,0x19};//左反右正uchar code F_B[8]= {0x19,0x38,0x2c,0x64,0x46,0xc2,0x83,0x91}; //左正右反uchar code duandian[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//断电unsigned char code qianjin[]={0x11,0x33,0x22,0x66,0x44,0xcc,0x88,0x99};//前进unsigned char h[]={0x11,0x33,0x22,0x66,0x44,0xcc,0x88,0x99};//uchar i;void delay(uint z){uint k ;uint j;for(k=0; k<z; k++)for(j=0; j<110; j++);}void QJ(unsigned int i){for(i=0;i<8;i++){P1=h[i]=qianjin[i];delay(13);}}void DD(){P1=0x00;delay(300);}void wtj(){while(1){if(P2==0xff){DD();delay(1000);break;}else{QJ(8);}}}void YG_1(){unsigned char i;for(i=0;i<8;i++){P1=h[i]=F_B[i];delay(10);}}void ZG_1(){ unsigned char i;for(i=0;i<8;i++){P1=h[i]=B_F[i];delay(10);}}void byg(){while(1){if(P2==0xfb)break;else if(P2==0xf9)break;else if(P2==0xfd)break;/*if(P2^0==0)break;else if(P2^1==0)break;/*else if(P2^2==0)break;else if(P2^3==0)break;else if(P2^4==0)break;*/elseYG_1();}}void bzg(){while(1){if(P2==0xfb)break;else if(P2==0xf3)break;else if(P2==0xf7)break;/*if(P2^0==0)break;else if(P2^1==0)break;else if(P2^2==0)break;if(P2^3==0)break;else if(P2^4==0)break;*/elseZG_1();}}void YG_2(){//unsigned char i; //unsigned char g;if(P2==0xfa){//delay(4000); wtj();byg();/*for(g=0;g<40;g++){for(i=0;i<8;i++){P1=F_B[i];delay(20);}} */}else if(P2==0xf2){//delay(4000); wtj();byg();/*for(g=0;g<40;g++){for(i=0;i<8;i++){P1=F_B[i];delay(20);}}*/}else if(P2==0xf6){//delay(4000);byg();/*for(g=0;g<40;g++){for(i=0;i<8;i++){P1=F_B[i];delay(20);}}*/}else if(P2==0xf4){//delay(4000); wtj();byg();/*for(g=0;g<40;g++){for(i=0;i<8;i++){P1=F_B[i];delay(20);}}*/}else ;}void ZG_2(){//unsigned char i; //unsigned char g;if(P2==0xeb){//delay(4000); wtj();bzg();/*for(g=0;g<40;g++){for(i=0;i<8;i++){P1=B_F[i];delay(20);}}*/else if(P2==0xe9){//delay(4000); wtj();bzg();/*for(g=0;g<40;g++) {for(i=0;i<8;i++){P1=B_F[i];delay(20);}}*/}else if(P2==0xed){//delay(4000); wtj();bzg();/*for(g=0;g<40;g++) {for(i=0;i<8;i++){P1=B_F[i];delay(20);}}*/}else if(P2==0xe5){//delay(4000); wtj();bzg();/*for(g=0;g<40;g++) {for(i=0;i<8;i++){P1=B_F[i];delay(20);}}*/}else ;}void ZG(){unsigned char i;for(i=0;i<8;i++){P1=h[i]=R_F[i];delay(11);}}void YG(){unsigned char i;for(i=0;i<8;i++){P1=h[i]=L_F[i];delay(11);}}/*void HT(){unsigned char i;for(i=0;i<8;i++){P1=houtui[i];delay(55);}}*/void zd(){while(1){if(P2==0xe0)QJ(8);else if(P2==0xff){while(1){DD();}}else{QJ(80);if(P2==0xff){while(1){DD();}}else{DC=0;break;break;}}}}void zd1(){while(1){if(P2==0xe0)QJ(8);else if(P2==0xff){while(1){DD();}}else{QJ(80);if(P2==0xff)while(1){DD();}}else{DC=0;break;}}}}void hy(){unsigned char i;for(i=0;i<8;i++){P1=h[i];delay(10);}}void main(){DC=1;while(1){QJ(8);if(P2!=0xff){delay(9000);break;}}while(1){DC=1;if(CG==1){delay(9000);DC=1;while(1){switch(P2){case 0xfb:QJ(8);break;//11011case 0xf1:QJ(8);break;//10001case 0xf3:QJ(8);break;//10011case 0xf7:ZG();break;//10111case 0xe7:ZG_1();break;//00111case 0xef:ZG_1();break;//01111case 0xe3:ZG_1();break; //00011case 0xe1:ZG_1();break; //00001case 0xf9:QJ(8);break;//11001case 0xfd:YG();break;//11101case 0xfc:YG_1();break;//11100case 0xfe:YG_1();break;//11110case 0xf8:YG_1();break; //11000case 0xf0:YG_1();break;//10000case 0xfa://11010QJ(16);// delay(4000);YG_2();//f7 break;case 0xf2://10010QJ(16);// delay(4000);YG_2();break;case 0xf6://10110QJ(16);// delay(4000);YG_2();break;case 0xf4://10100QJ(16);// delay(4000);YG_2();break;case 0xeb://01011QJ(16);//delay(4000);ZG_2();//fd break;case 0xe9://01001QJ(16);//delay(4000);ZG_2();break;case 0xed://01101QJ(16);//delay(4000);ZG_2();break;case 0xe5://00101QJ(16);//delay(4000);ZG_2();break;case 0xe0:zd1();break;//00000case 0xff:hy();break;//11111default:QJ(8); break;}}}else{switch(P2){case 0xfb:QJ(8);break;//11011 case 0xf1:QJ(8);break;//10001case 0xf3:QJ(8);break;//10011 case 0xf7:ZG();break;//10111 case 0xe7:ZG_1();break;//00111 case 0xef:ZG_1();break;//01111 case 0xe3:ZG_1();break; //00011 case 0xe1:ZG_1();break; //00001case 0xf9:QJ(8);break;//11001 case 0xfd:YG();break;//11101 case 0xfc:YG_1();break;//11100 case 0xfe:YG_1();break;//11110 case 0xf8:YG_1();break; //11000 case 0xf0:YG_1();break;//10000case 0xfa://11010QJ(16);// delay(4000);YG_2();//f7 break;case 0xf2://10010QJ(16);// delay(4000);YG_2();break;case 0xf6://10110QJ(16);// delay(4000);YG_2();break;case 0xf4://10100QJ(16);// delay(4000);YG_2();break;case 0xeb://01011QJ(16);//delay(4000);ZG_2();//fd break;case 0xe9://01001QJ(16);//delay(4000);ZG_2();break;case 0xed://01101QJ(16);//delay(4000);ZG_2();break;case 0xe5://00101QJ(16);//delay(4000);ZG_2();break;case 0xe0:zd();break;//00000case 0xff:hy();break;//11111default:QJ(8); break;}}}}。
智能小车C语言程序
智能小车C语言程序智能小车黑线循迹C语言程序#include#include#define uchar unsigned char#define uint unsigned intsbit LeftIR=P1^6; //左边红外接收sbit RightIR=P1^7; //右边红外接收sbit ENA=P1^2; // L298的Enable Asbit IN1=P1^0; // L298的Input 1sbit IN2=P1^1; // L298的Input 2sbit ENB=P1^5; // L298的Enable Bsbit IN3=P1^3; // L298的Input 3sbit IN4=P1^4; // L298的Input 4uchar t=0; //中断计数器uchar motor_1=0,motor_2=0; //电机1,2速度值uchar tmp1,tmp2; // 电机当前速度值uchar aa; //定时器1中断计数bit flag=0; //标志位void motor(uchar index, char speed){if(speed>=-100 && speed<=100){if(index==1) // 电机1的处理{motor_1=abs(speed); // 取速度的绝对值if(speed<0) // 速度值为负则反转{IN1=0;IN2=1;}else // 不为负数则正转{IN1=1;IN2=0;}}if(index==2) // 电机1的处理{motor_2=abs(speed); // 取速度的绝对值if(speed<0) // 速度值为负则反转{IN3=0;IN4=1;}else // 不为负数则正转{IN3=1;IN4=0;}}}}void init(){TMOD=0x12; // 设定T0的工作模式为2TH0=0x9B; // 装入定时器的初值TL0=0x9B;TH1=(65536-50000)/256; //设置初值定时50msTL1=(65536-50000)%6;EA=1; // 开中断ET0=1; // 定时器0允许中断ET1=1; //定时器1允许中断TR0=0; // 关闭定时器0TR1=0; // 关闭定时器0ENA=0; //关闭电机1ENB=0; //关闭电机2}void main(){int irDetectLeft,irDetectRight;init();while(1)// 电机实际控制演示{irDetectRight = RightIR;//右边接收irDetectLeft = LeftIR;//左边接收if((irDetectLeft==0)&&(irDetectRight==0))//向前进{motor(1,100);motor(2,100);}if((irDetectLeft==0)&&(irDetectRight==1))//右转{motor(1,-100);motor(2,100);}if((irDetectLeft==1)&&(irDetectRight==0))//左转{motor(1,100);motor(2,-100);}if((irDetectLeft==1)&&(irDetectRight==1)&&(flag==0)) //第一次探测定时器1开始计时{motor(1,100);motor(2,100);TR1=1;}if((irDetectLeft==1)&&(irDetectRight==1)&&(flag==1))//第二次探测时小车停{TR0=0;ENA=0;ENB=0;}}}void timer0() interrupt 1 // T0中断服务程序{if(t==0) // 1个PWM周期完成后才会接受新数值{tmp1=motor_1;tmp2=motor_2;}if(t ENA=1;elseENA=0; // 产生电机1的PWM信号if(t ENB=1;elseENB=0; // 产生电机2的PWM信号t++;if(t>=100)t=0; // 1个PWM信号由100次中断产生}void timer1() interrupt 3{TH1=(65536-50000)/256;TL1=(65536-50000)%6;aa++;if(aa==40) //定时2s后小车开始运动TR0=1;if(aa==60) //定时3s后置标志位{aa=0;flag=1;}}。
智能小车程序(完整)
智能小车程序(完整)智能小车程序---------超长完整版---------#include "reg52.h"#define det_Dist 2.55 //单个脉冲对应的小车行走距离,其值为车轮周长/4#define RD 9 //小车对角轴长度#define PI 3.1415926#define ANG_90 90#define ANG_90_T 102#define ANG_180 189/*============================全局变量定义区============================*/sbit P10=P1^0; //控制继电器的开闭sbit P11=P1^1; //控制金属接近开关sbit P12=P1^2; //控制颜色传感器的开闭sbit P07=P0^7; //控制声光信号的开启sbit P26=P2^6; //接收颜色传感器的信号,白为0,黑为1sbit P24=P2^4; //左sbit P25=P2^5; //右接收左右光传感器的信号,有光为0unsigned char mType=0; //设置运动的方式,0 向前1 向左2 向后3 向右unsigned char Direction=0; //小车的即时朝向0 朝上1 朝左2 朝下3 朝右unsigned sX=50; unsigned char sY=0; //小车的相对右下角的坐标CM(sX,sY)unsigned char StartTask=0; //获得铁片后开始执行返回卸货任务,StartTask置一unsigned char Inter_EX0=0; // 完成一个完整的任务期间只能有一次外部中断// Inter_EX0记录外部中断0的中断状态// 0 动作最近的前一次未中断过,// 1 动作最近的前一次中断过unsigned char cntIorn=0; //铁片数unsigned char bkAim=2; //回程目的地,0为A仓库,1为B仓库,2为停车场,//(在MAIN中接受铁片颜色判断传感器的信号来赋值)unsigned char Light_Flag=0;//进入光引导区的标志(1)unsigned int cntTime_5Min=0;//时间周期数,用于T0 精确定时unsigned int cntTime_Plues=0; //霍尔开关产生的脉冲数/*============================全局变量定义区============================*//*------------------------------------------------*//*-----------------通用延迟程序-------------------*//*------------------------------------------------*/void delay(unsigned int time) // time*0.5ms延时{unsigned int i,j;for(j=0;j<time;j++)< p="">{for(i=0;i<60;i++){;}}}/*-----------------------------------------------*//*-------------------显示控制模块----------------*//*-----------------------------------------------*//*数码管显示,显示铁片的数目(设接在P0,共阴)*/void Display(unsigned char n){charNumb[12]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x37,0x77}; P0=Numb[n];}/*-----------------------------------------------*//*-------------------传感器模块------------------*//*-----------------------------------------------*//*光源检测程序: *//*用于纠正小车运行路线的正确性*/unsigned char LightSeek(){ void Display(unsigned char);bit l,r;l=P24;r=P25;if(l==0&&r==1){//Display(1);return (3); //偏左,向右开}if(r==0&&l==1){//Display(3);return(1); //偏右,向左开}if((l==1&&r==1)||(l==0&&r==0)){//Display(9);return(0); //没有偏离,前进}}/*铁片检测程序: *//*判断铁片的颜色,设定bkAim,0为A仓库,1为B仓库,2为停车场*/ void IornColor(){delay(4000);bkAim=(int)(P26);Display((int)(P26)+2);}/*-----------------------------------------------*//*------------------运动控制模块-----------------*//*-----------------------------------------------*//*====基本动作层:完成基本运动动作的程序集====*/ /*运动调整程序: *//*对小车的运动进行微调*/void ctrMotor_Adjust(unsigned char t){if(t==0){P2=P2&240|11; //用来解决两电机不对称的问题delay(6);}if(t==3){delay(1);}if(t==1){P2=(P2&245);delay(1); //向右走}P2=((P2&240)|15);delay(10);}/*直走程序: *//*控制小车运动距离,dist为运动距离(cm),type为运动方式(0 2)*/ /*只改变小车sX 和sY的值而不改变Direction的值. */ void ctrMotor_Dist(float dist,unsigned char type) {unsigned char t=0;mType=type;P2=((P2&240)|15);cntTime_Plues=(int)(dist/det_Dist);while(cntTime_Plues){if(Inter_EX0==1&&StartTask==0){cntTime_Plues=0;break;}if(Light_Flag==1) t=LightSeek();if(type==0) //向前走{P2=P2&249;delay(40);ctrMotor_Adjust(t);}if(type==2) //向后退{P2=P2&246;delay(50);ctrMotor_Adjust(t);}if(mType==2) delay(60);//刹车制动0.5mselse delay(75);}}/*拐弯程序: *//*控制小车运动角度,type为运动方式(1 3)*//*只改变小车Direction的值而不改变sX 和sY的值*/void ctrMotor_Ang(unsigned char ang,unsigned char type,unsigned char dir) {unsigned char i=0;mType=type;P2=((P2&240)|15);cntTime_Plues=(int)((PI*RD*90/(180*det_Dist)*1.2)*ang/90);while(cntTime_Plues){if(Inter_EX0==1&&StartTask==0){cntTime_Plues=0;break;}if(type==1) //向左走{P2=P2&250;delay(100);ctrMotor_Adjust(0);}if(type==3) //向右走{P2=P2&245;delay(100);ctrMotor_Adjust(0);}P2=((P2&240)|15);delay(50);//刹车制动0.5ms}if(!(Inter_EX0==1&&StartTask==0)){Direction=dir;}}/*====基本路线层:描述小车基本运动路线的程序集====*//*当小车到达仓库或停车场时,放下铁片或停车(0,1为仓库,2为停车场)*/void rchPlace(){unsigned int time,b,s,g;time=(int)(cntTime_5Min*0.065535);//只有一个数码管时,轮流显示全过程秒数个十百b=time%100;s=(time-b*100)%100;g=(time-b*100-s*10)%10;if(bkAim==2){//到达停车场了,停车EA=0;P2=((P2&240)|15);while(1){Display(10); //Ndelay(2000);Display(cntIorn);delay(2000);Display(11);//Adelay(2000);Display(b);delay(2000);Display(s);delay(2000);Display(g);delay(2000);}}else{if(Inter_EX0==1&&StartTask==1)P10=0; //到达仓库,卸下铁片}}/*无任务模式: *//*设置小车的固定运动路线,未发现铁片时的运动路线*/void BasicRoute(){ //Light_Flag=1;ctrMotor_Dist(153,0);//Light_Flag=0;ctrMotor_Ang(ANG_90,1,1);ctrMotor_Dist(100-sX,0);ctrMotor_Dist(125,2);ctrMotor_Dist(73,0);ctrMotor_Ang(ANG_90,1,2);//Light_Flag=1;ctrMotor_Dist(153,0);//Light_Flag=0;ctrMotor_Ang(ANG_180,1,0);rchPlace();}/*任务模式: *//*设置小车的发现铁片后的运动路线*/void TaskRoute(){//基本运行路线表,记载拐弯0 向前1 左拐2 向后3 右拐,正读去A区;反读去B区StartTask=1;ctrMotor_Ang(ANG_90_T,1,2);if(bkAim==1) //仓库A{ctrMotor_Dist(10,0);P2=((P2&240)|15);delay(60);ctrMotor_Ang(ANG_90_T,1,3);ctrMotor_Dist(100-sX,2);ctrMotor_Ang(ANG_90_T,1,2);Light_Flag=1;ctrMotor_Dist(153,2);Light_Flag=0;// ctrMotor_Ang(208,1,0);}else if(bkAim==0) //仓库B{ctrMotor_Dist(10,0);P2=((P2&240)|15);delay(60);ctrMotor_Ang(ANG_90_T,1,3);ctrMotor_Dist(100-sX,0);ctrMotor_Ang(ANG_90_T,1,0);Light_Flag=1;ctrMotor_Dist(153,2);Light_Flag=0;//ctrMotor_Ang(208,1,0);}delay(5000);rchPlace();}/*---------------------------------------------*//*-------------------主程序段------------------*/ /*---------------------------------------------*/void main(){delay(4000);P2=0xff; //初始化端口P07=0;P1=0;TMOD=0x01; //初始化定时器0/1 及其中断TL0=0;TH0=0;TR0=1;ET0=1;ET1=1;IT0=1; //初始化外部中断EX0=1;IT1=1;EX1=1;EA=1;P11=1;while(1){Display(cntIorn);bkAim=2;BasicRoute();if(Inter_EX0==1){TaskRoute();//按获得铁片后的路线运动IE0=0;EX0=1;}Inter_EX0=0;}}/*----------------------------------------------------*//*----------------------中断程序段--------------------*//*----------------------------------------------------*//*定时器0中断程序: *//*当时间过了5分钟,则就地停车并进入休眠状态*/ void tmOver(void) interrupt 1{cntTime_5Min++;TL0=0;TH0=0;if(cntTime_5Min>=4520){Display(5);P2=((P2&240)|15);EA=0; //停车程序P07=1;delay(4000);PCON=0X00;while(1);}/*外部中断0中断程序: *//*发现铁片,发出声光信号并将铁片吸起,发光二极管和蜂鸣器*//*并联在一起(设接在P07). 0为A仓库,1为B仓库,2为停车场*/ void fndIorn(void) interrupt 0{unsigned char i;P10=1;P2=((P2&240)|15); //停车P07=1;delay(1000);//刹车制动0.5msP07=0;Inter_EX0=1;cntIorn++;Display(cntIorn);for(i=0;i<40;i++){P2=P2&249;delay(2);P2=((P2&240)|15);delay(2);}P2=P2&249;delay(100);P2=((P2&240)|15); //停车IornColor(); //判断铁片黑白,设置bkAimfor(i=0;i<95;i++){P2=P2&249;delay(3);P2=((P2&240)|15);delay(2);}P2=((P2&240)|15); //停车delay(4000); //把铁片吸起来EX0=0;}/*外部中断1中断程序: *//*对霍尔开关的脉冲记数,对小车的位置进行记录,以便对小车进行定位*/ void stpMove(void) interrupt 2{cntTime_Plues--;if(Direction==0) //向上{if(mType==0) sY+=det_Dist;else if(mType==2)sY-=det_Dist;}else if(Direction==1) //向左{if(mType==0) sX+=det_Dist;else if(mType==2)sX-=det_Dist;}else if(Direction==2) //向下{if(mType==0) sY-=det_Dist;else if(mType==2)sY+=det_Dist;}else if(Direction==3) //向右{if(mType==0) sX-=det_Dist; else if(mType==2)sX+=det_Dist;}</time;j++)<>。
基于51单片机的智能循迹避障小车C源程序
项目名称:智能小车系别:信息工程系专业:11电气工程及其自动化姓名:刘亮、崔占闯、韩康指导教师:王蕾崔占闯联系邮箱:目录摘要: ...............................................................................................3关键词: (3)绪论: (3)一、系统设计 (4)1.一、任务及要求 (4)1.2车体方案认证与选择 (4)二、硬件设计及说明 (5)2.1循迹+避障模块 (5)2.2主控模块 (6)2.3电机驱动模块 (6)2.4机械模块 (7)2.5 电源模块 (7)三、自动循迹避障小车整体设计 (7)四、软件设计及说明 (8)4.1系统软件流程图 (9)4.2系统程序 (9)五、系统测试进程 (12)六、总结 (13)七、附录:系统元器件 (13)摘要本设计要紧有三个模块包括信号检测模块、主控模块、电机驱动模块。
信号检测模块采纳红外光对管,用以对有无障碍与黑线进行检测。
主控电路采纳宏晶公司的8051核心的STC89C52单片机为操纵芯片。
电机驱动模块采纳意法半导体的L298N专用电机驱动芯片,单片操纵与传统分立元件电路相较,使整个系统有专门好的稳固性。
信号检测模块将搜集到的路况信号传入STC89C52单片机,经单片机处置事后对L298N发出指令进行相应的调整。
通过有无光线接收来操纵电动小车的转向,从而实现自动循迹避障的功能。
关键词:智能循迹避障小车,STC89C52单片机,L298N驱动芯片,信号检测模块,循迹避障绪论(一)智能小车的作用和意义自第一台工业机械人诞生以来,机械人的进展已经遍及机械、电子、冶金、交通、宇航、国防等领域。
最近几年来机械人的智能水平不断提高,而且迅速地改变着人们的生活方式。
人们在不断探讨、改造、熟悉自然的进程中,制造能替代人劳动的机械一直是人类的妄图。
随着科学技术的进展,机械人的感系统,关于视觉的各类技术而言图像处置技术已相当发达,而基于图像的明白得技术还很掉队,机械视觉需要通过大量的运算也只能识别一些结构化环境简单的目标。
巡线智能小车的单片机c语言程序
speed();
}
}
/*************************************************/
void speed()
//速度过高处理
{
if(PWM1ratio>100)
{
PWM2ratio=PWM2ratio-PWM1ratio+100;
PWM1ratio=100;
//定时
/***************************************************************************** *************/
void control() { int state=0;
//调速,调节占空比
uchar sl,sr,a=0,b=0,c=0,d=0,e=0,f=0;
巡线智能小车的单片机 c 语言程序
/**************************** 智 能 小 车 程 序 ************************** 单片机:atml89s52 晶振:12MHz
*********************************************************************/
//延时 ms
} /********************************************** ***********************************************/ uchar time() { uchar t; t=10000/frequency; cisu=t/256+1; temp=cisu; return(256-t/cisu);
智能循迹小车程序
IN5=0;
IN6=1;
IN7=0;
IN8=1;
dj1=15;
dj2=15;
}
void turnleft2()//小车前进向左微调
{
IN5=0;
IN6=1;
IN7=0;
IN8=1;
dj1=7;
dj2=20;
}
void turnright2()//小车前进向右微调
{
IN5=0;
IN6=1;
IN7=0;
{
turnright2();
}
if(HW1==0&&HW2==1&&HW3==1&&HW4==1)
{
turnleft2();
}
if(HW1==1&&HW2==1&&HW3==1&&HW4==0)
{
turnright2();
}
if(num2==3&&HW1==0&&HW2==0&&HW3==0&&HW4==0)
sbit ENB=P3^3;
sbit IN5=P2^4;//电机
sbit IN6=P2^5;
sbit IN7=P2^6;
sbit IN8=P2^7;
void delay(uint x)//延时1ms
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);
}
void qianjin()//小车前进
{
turnright2();
}
循迹小车_完整程序
程序# include <reg51.h>//********驱动芯片L298管脚位声明*****sbit IN1= P1^0;sbit PWM1= P1^1;sbit IN2= P1^2;sbit IN3= P1^3;sbit PWM2= P1^4;sbit IN4= P1^5;//********传感器TCRT5000管脚位声明****sbit XL= P1^6; //左侧第一个传感器sbit XR= P1^7; //右侧第一个传感器sbit YL= P2^0; //左侧第二个传感器sbit YR= P2^1; //右侧第二个传感器//********用于定时计数的两个全局变量位声明****** int count1=0;int count2=0;//********左边电机前进*******void forward_turn1(){IN1=0;IN2=0;}//*********左边电机后退******void reverse_tuen1(){IN1=1;IN2=0;}//*********右边电机前进*******void forward_turn2(){IN3=0;IN4=1;}//**********右边电机后退********void reverse_turn2(){IN3=1;IN4=0;}//***********左边电机速度控制函数******void speed1(int ct,int sd){if(ct<=sd)PWM1=1;elsePWM1=0;}//************右边电机速度控制函数******viod speed2(int ct,int sd){if (ct<=sd)PWM2=1;elsePWM2=0;//*************小车直线前进函数*********void advance (int ct1,int sd1,int ct2,int sd2); {forward_turn1();forward_turn2();speed1(ct1,sd1);speed2(ct2,sd2);}//**********小车左转********void left_turn1(int ct1,int sd1,int ct2,int sd2); {forward_turn1();forward_turn2();speed1(ct1,sd1);speed2(ct2,sd2);}//************小车右转*********viod riht_ turn1(int ct1,int sd1,int ct2,int sd2); {forward_turn1();forward_turn2();speed1(ct1,sd1);speed2(ct2,sd2);}//**************主函数**********main(){TMOD=ox11;TH0=(65536-1000)/256;TL0=(65536-1000)%256;EA=1;ET0=1;TR0=1;TH1=(65536-1000)/256;TL1=(65536-1000)%256;EA=1;ET1=1;TR1=1;while(1){if(XL==0&&XR==0&&YL==0&&YR==0) //传感器未检测到直线,小车直行{advance(count1,500,count2,500);}if(XL==1&&XR==0&&YL==0&&YR==0) //左边内侧传感器检测到黑线,小左转 {Left_turn1(count1,200,count2,500);}if(XL==0&&XR==0&&YL==1&&YR==0) //左边外侧传感器检测到黑线,大左转{Left_turn1(count1,200,count2,700);}if(XL==0&&XR==1&&YL==0&&YR==0) //右边内侧传感器检测到黑线,小右转{right_turn1(count1,500,count2,200);}if(XL==0&&XR==0&&YL==0&&YR=1) //右边外侧传感器检测到黑线,大右转{right_turn1(count1,700,count2,200);}if(XL==1&&XR==0&&YL==1&&YR=0) //左侧两个传感器均检测到黑线,中左转{Left_turn1(count1,200,count2,600);}if(XL==0&&XR==1&&YL==0&&YR=1) //右侧两个传感器均检测到黑线,中右转{right_turn1(count1,600,count2,200);}}}//******中断服务程序*******viod time0() interrupt1;{TH0=(65536-1000)/256;TL0=(65536-1000)%256;count1++;if (count1>=1000)count1=0}viod time1() interrupt1;{TH0=(65536-1000)/256;TL0=(65536-1000)%256;count2++;if (count2>=1000)count2=0}#include<reg52.h>//驱动芯片L298管脚声明sbit IN1=P2^1;sbit IN2=P2^2;sbit IN3=P2^4;sbit IN4=P2^5;sbit PWM1=P2^0;sbit PWM2=P2^3;//传感器管脚位声明sbit L1=P3^0;//左侧第一个对管sbit L2=P3^1;//左侧第二个对管sbit R1=P3^3;//右侧第一个对管sbit R2=P2^2;//右侧第二个对管//定时器全局变量int count1=0;int count2=0;//左电机前进void forward_turn1(){IN1=1;IN2=0;}//左电机后退void back_turn1(){IN1=0;IN2=1;}//右电机前进void forward_turn2(){IN3=0;IN4=1;}//右电机后退void back_turn2(){IN3=1;IN4=0;}//左电机速度控制void speed1(int ct,int sd) {if(ct<=sd)PWM1=1;elsePWM1=0;}//右电机速度控制void speed2(int ct,int sd){if(ct<=sd)PWM2=1;elsePWM2=0;}//小车直线前进void advance(int ct1,int sd1,int ct2,int sd2) {forward_turn1();forward_turn2();speed1(ct1,sd1);speed2(ct2,sd2);}//小车左转void left_turn(int ct1,int sd1,int ct2,int sd2) {forward_turn1();forward_turn2();speed1(ct1,sd1);speed2(ct2,sd2);}//小车右转void right_turn(int ct1,int sd1,int ct2,int sd2) {forward_turn1();forward_turn2();speed1(ct1,sd1);speed2(ct2,sd2);}//主函数main(){TMOD=0X11;TH0=(65536-1000)/256;TL0=(65536-1000)%256;EA=1;ET0=1;TR0=1;TMOD=0X11;TH0=(65536-1000)/256;TL0=(65536-1000)%256;EA=1;ET0=1;TR0=1;while(1){if(L1==0&&R1==0&&L2==0&&R2==0)//小车未检测到黑线{advande(count1,500,count2,500)}if(L1==1&&R1==0&&L2==0&&R2==0)//左边内侧检测到黑线,小左转{left_turn(count1,200,count2,500)}if(L1==0&&R1==0&&L2=1&&R2==0)//左边外侧检测到黑线,大左转{left_turn(count1,200,count2,700)}if(L1==0&&R1==1&&L2=0&&R2==0)//右边内侧检测到黑线,小右转{right_turn(count1,500,count2,200)}if(L1==0&&R1==0&&L2=0&&R2==1)//右边外侧检测到黑线,大右转{right_turn(count1,700,count2,200)}if(L1==1&&R1==0&&L2=1&&R2==0)//左边两侧检测到黑线,中左转{left_turn(count1,200,count2,600)}if(L1==0&&R1==1&&L2=0&&R2==0)//右边两侧检测到黑线,中右转{left_turn(count1,600,count2,200)}if(L1==1&&R1==1&&L2=1&&R2==1)//右边外侧检测到黑线,小右转{IN1=0;IN2=0;IN3=0;IN4=0;}}}//中断服务程序void time0() interrrupt1; {TH0=(65536-1000)/256;TL0=(65536-1000)%256;count1++;if(count1>=1000)count1=0;}void time1() interrrupt1; {TH0=(65536-1000)/256;TL0=(65536-1000)%256;count2++;if(count2>=1000)count2=0;}。
智能小车循迹避障红外遥控C语言代码
.//智能小车避障、循迹、红外遥控C语言代码//实现功能有超声波避障,红外遥控智能小车,红外传感器实现小车自动循迹,1602显示小车的工作状态,另有三个独立按键分别控制三种状态的转换//注:每个小车的引脚配置都不一样,要注意引脚的配置,但是我的代码注释比较多,看起来比较容易一点#include <reg52.h>#include <math.h>#includelcd.h#include <intrins.h>#define uchar unsigned char#define uint unsigned intuchar ENCHAR_PuZh1[8]= run ;//1602显示数组uchar ENCHAR_PuZh2[8]= back ;uchar ENCHAR_PuZh3[8]= stop ;uchar ENCHAR_PuZh4[8]= left ;uchar ENCHAR_PuZh5[8]= right ;uchar ENCHAR_PuZh6[8]= xunji ;uchar ENCHAR_PuZh7[8]= bizhang;uchar ENCHAR_PuZh8[8]= yaokong;#define HW P2 //红外传感器引脚配置P2k口#define PWM P1 /* L298N管脚定义*//******************************超声波引脚控制******************************/sbit ECHO=P3^2; //超声波接收引脚定义兼红外遥控按键state_total =2sbit TRIG=P3^3; //超声波发送引脚定义/////红外控制引脚配置sbit KEY2=P3^7; //红外接收器数据线兼循迹按键state_total= 0sbit KEY1=P3^4; //独立按键p3.4控制自动避障state_total=1uchar state_total=3,state_2=0;//总状态控制全局变量0为自动循迹模块1为自动避障模块2为红外遥控uchar state_1,DAT; //红外扫描标志位uchar time_1=0,time_2=0;//定时器1中断全局变量time_ 2控制PWM脉冲计数time_1控制转弯延时计数也做延时一次0.005suchar time,timeH,timeL,state=0;//超声波测量缓冲变量state为超声波状态检测控制全局变量uint count=0; //1602显示计数/**************************/unsigned char IRCOM[7]; //红外接收头接收数据缓存IRCOM[2]存放的为数据unsigned char Number,distance[4],date_data[8]={0,0,0,0,0,0,0,0}; //红外接收缓存变量/***********/void IRdelay(char x); //x*0.14MS 红外头专用delayvoid run();void 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; //设置定时器0 1 工作方式1 16位初值定时器TH1=0Xfe; //装入初值定时一次为0.0005s 2000hzTL1=0x0c;TF0=0; //定时器0方式1计数溢出标志TF1=0; //定时器1方式1计数溢出标志ET0=1; //允许定时器0中断溢出ET1=1; //允许定时器1中断溢出EA=1; //开总中断if(state_total==1)//为超声波模块时初始化{TRIG=0; //发射引脚低电平ECHO=0; // 接收引脚低电平EX0=0; //关闭外部中断IT0=1; //由高电平变低电平,触发外部中断0 }if(state_total==2) //红外遥控初始化{ IT1=1; //外部中断1为负跳变触发EX1=1; //允许外部中断1TRIG=1; // 3.3为高电平I/O口初始化}delay(60); //等待硬件操作}void main(){ uint i;delay(50);init_test();TR1=1; //开启定时器1LCD1602_Init() ;delay(50);while(state_2==0)'..{if(KEY1==0) //检测按键s1是否按下{Delay10ms(); //消除抖动if(KEY1==0){state_total=0; //总状态定义0为自动循迹模块1为自动避障模块2为红外遥控while((i<30)&&(KEY1==0)) //检测按键是否松开{Delay10ms();i++;}i=0;}}if(TRIG==0) //检测按键s2是否按下{Delay10ms(); //消除抖动if(TRIG==0){state_total=1; //总状态定义0为自动循迹模块为自动避 1 2为红外遥控障模块while((i<30)&&(TRIG==0)) //检测按键是否松开{Delay10ms();i++;}i=0;}}s3是否按下if(KEY2==0) //检测按键{消除抖动Delay10ms(); //if(KEY2==0){1 总状态定义// 0为自动循迹模块为自动避state_total=2;2 为红外遥控障模块检测按键是否松开while((i<30)&&(KEY2==0)) //{Delay10ms();i++;}i=0;'..}}}init_test();delay(50); //等待硬件操作50usTR1=0; //关闭定时器1if(state_total==1){//SPEED=90; //自动循迹速度控制高电平持续次数占空比为10的低电平bizhang_test();}if(state_total==0){// SPEED=98; //自动循迹速度控制高电平持续次数占空比为40的低电平xunji_test();}if(state_total==2){//SPEED=98; //自动循迹速度控制高电平持续次数占空比为40的低电平hongwai_test();}}void init0_suspend(void) interrupt 0 //3 为定时器1的中断号 1 定时器0的中断号0 外部中断1 2 外部中断0 4 串口中断{timeH=TH0; //记录高电平次数timeL=TL0; //state=1; //标志状态为1,表示已接收到返回信号EX0=0; //关闭外部中断0}void time0_suspend0(void) interrupt 1 //3 为定时器1的中断号 1 定时器0的中断号0 外部中断1 2 外部中断0 4 串口中断{if(state_total==1) // 自动避障初值装入{ TH0=0X00; //装入初值TL0=0x00;}if(state_total==0) //自动循迹初值装入{ TH0=0Xec; //装入初值定时一次0.005s 200hzTL0=0x78;time_1++; //控制转弯延时计数'..}}void IR_IN(void) interrupt 2{unsigned char j,k,N=0;EX1 = 0;IRdelay(5);if (TRIG==1){ EX1 =1;return;}//确认IR信号出现while (!TRIG) //等IR变为高电平,跳过9ms的前导低电平信号。
智能循迹小车详细源代码程序(MSP430,PID)
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程序(完美_详尽)
/*小车运行主程序简介: @模块组成:红外对管检测模块---- 五组对管,五个信号采集端口直流电机驱动模块 -- 驱动两个直流电机,另一个轮子用万向轮单片机最小系统 ---- 用于烧写程序,控制智能小车运动@ 功能简介:在白色地面或皮质上用黑色胶带粘贴出路线路径宽度微大于相邻检测管间距。
这样小车便可在其上循迹运行。
@ 补充说明:该程序采取“右优先”的原则:即右边有黑线向右转,若无,前方有黑线,向前走,若无,左边有黑线,向左转,若全无,从右方向后转。
程序开头定义的变量的取值是根据我的小车所调试选择好的,如果采用本程序,请自行调试适合自己小车的合适参数值。
编者:陈尧,黄永刚(江苏大学电气学院二年级,三年级)1. 假定:IN仁1,IN3=1 时电机正向转动,必须保证本条件2. 假定: 遇到白线输出 0,遇到黑线输出 1;如果实际电路是:遇到白线输出1,遇到黑线输出 0,这种情况下只需要将第四,第五句改成:#define m0 1#define m1 0即可。
3. 说明 1:直行--------- 速度 full_speed_left,full_speed_right.转弯 , 调头速度 - c orrect_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<reg52.h>#define uchar unsigned char#define uint unsigned int#define m0 1〃黑线 ml,白线 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--#define midl left1 》20-- 》200-- 》500#define midrright5ucharDuty_left,Duty_right,i=0,j=0; //左右占空比标志,取 1--100 sbit IN仁 P2A0;sbit IN2=P2A1;sbit IN3=P2A2;sbit IN4=P2A3;sbit ENA=P1A0;sbitENB=P1A1;// 循迹口五组红外对管,依次对应从左往右第 1,2,3,4,5 五组 sbitleft1 =P1A6;sbit left2 =P1A5;sbit mid3 =P1A4;sbit right4=P1A3;sbit right5=P1A2;void line_left();void line_right();voidline_straight()reentrant;// ------------------------{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;}}else if((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;}else if(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();}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
-----------------------小车运行主程序---------------------------------------------------------------------------简介:@模块组成:红外对管检测模块----五组对管,五个信号采集端口直流电机驱动模块----驱动两个直流电机,另一个轮子用万向轮单片机最小系统------用于烧写程序,控制智能小车运动 @功能简介:在白色地面或皮质上用黑色胶带粘贴出路线路径宽度微大于相邻检测管间距。
这样小车便可在其上循迹运行。
@补充说明:该程序采取“右优先”的原则:即右边有黑线向右转,若无,前方有黑线,向前走,若无,左边有黑线,向左转,若全无,从右方向后转。
程序开头定义的变量的取值是根据我的小车所调试选择好的,如果采用本程序,请自行调试适合自己小车的合适参数值。
编者:陈尧,黄永刚(江苏大学电气学院二年级,三年级)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();}}。