基于51单片机的智能循迹避障小车+C源程序文件

合集下载

基于51单片机智能小车循迹程序

基于51单片机智能小车循迹程序

#include<reg52.h>#define uchar unsigned char#define uint unsigned int////电机驱动模块位定义////sbit M11=P0^0;//左轮sbit M12=P0^1;sbit M23=P0^2;//右轮sbit M24=P0^3;sbit ENA=P0^4;//左轮使能PWM输入改变dj1数值控制转速sbit ENB=P0^5;//右轮使能PWM输入改变dj2数值控制转速////占空比变量定义////unsigned char dj1=0;unsigned char dj2=0;uchar t=0;////红外对管位定义////sbit HW1=P1^0;//左前方sbit HW2=P1^1;//右前方sbit HW3=P1^2;//左后方sbit HW4=P1^3;//右后方////小车前进////void qianjin(){M11=1;//左轮M12=0;//M23=1;//右轮M24=0;//dj1=50;dj2=50;}////向左微调////void turnleft2(){M11=1;M12=0;M23=1;M24=0;dj1=7;//左轮dj2=50;//右轮}////向右微调////void turnright2(){M11=1;M12=0;M23=1;M24=0;dj1=50;dj2=7;}////向左大调////void left(){M11=0;M12=1;M23=1;M24=0;dj1=7;dj2=80;}////向右大调////void right(){M11=1;M12=0;M23=0;M24=1;dj1=80;dj2=7;}////循迹动作子函数////void xj(){if(HW1==0&&HW2==0&&HW3==0&&HW4==0)//前进逻辑{qianjin();}if(HW1==1&&HW2==0&&HW3==0&&HW4==0)//左右微调{turnleft2();}if(HW1==0&&HW2==1&&HW3==0&&HW4==0){turnright2();}if(HW1==1&&HW2==0&&HW3==1&&HW4==0)//左右大调{left();}if(HW1==0&&HW2==1&&HW3==0&&HW4==1){right();}}////初始化////void init(){TMOD=0x01;TH0=(65536-500)/256;TL0=(65536-500)%256;EA=1;ET0=1;TR0=1;}////定时器0中断////void timer0() interrupt 1 using 1{TH0=(65536-500)/256;TL0=(65536-500)%256;t++;if(t<dj1)ENA=1;else ENA=0;if(t<dj2)ENB=1;else ENB=0;if(t>=50){t=0;}}void main(){init();P1=0Xff;while(1){/////////////////循迹模式/////////////////////xj();}}。

智能小车循迹、避障、红外遥控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单片机智能小车循迹程序

基于51单片机智能小车循迹程序

#include <reg51.h>#include <stdio.h>#define uint unsigned int#define uchar unsigned char/**********************************/uchar led_data[9]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82, 0xf8,0x80}; uchar turn_count=0;bit end=0; //圈数跑完标志/*********************************/sbit xg0=P1^0; //左寻轨对管sbit xg1=P1^1; //中间寻轨对管sbit xg2=P1^2; //右寻轨对管sbit xz=P1^3; //感应挡板对管/*********************************/sbit Q_IN1=P2^0; //车前左轮控制sbit Q_IN2=P2^1;sbit Q_IN3=P2^2; //车前右轮控制sbit Q_IN4=P2^3;sbit H_IN1=P2^4; //车尾左轮控制sbit H_IN2=P2^5;sbit H_IN3=P2^6; //车尾右轮控制sbit H_IN4=P2^7;sbit Q_ENA=P3^0; //车前左轮使能,PWMsbit Q_ENB=P3^1; //车前右轮使能,sbit H_ENA=P3^6; //车尾左轮使能,sbit H_ENB=P3^7; //车尾右轮使能,/****************************************/#define stra_q_l 100 //直线行走时,四个轮子占空比调试#define stra_q_r 100#define stra_h_l 100#define stra_h_r 100#define turn_q_l 100 //转弯时四个轮子的占空比调试#define turn_q_r 100#define turn_h_l 100#define turn_h_r 100#define turnr_time 2900//右转弯时的延时常数#define turnl_time 3000 //左转弯时的延时常数#define dt_time 5800 //原地掉头时延时常数#define over_time 1000 //停止延时#define back_time 2500 //走完环形,回到直道延时转弯#define black_time 1500 //过黑线的时间#define correct_l_time 700 //左矫正时间#define correct_r_time 700 //右矫正时间#define hou_time 200/***************************************/uchar q_duty_l,q_duty_r,h_duty_l,h_duty_r,//车前后左右轮占空比i=0,j=0,k=0,m=0;/**************************************/void delay_cir(uint n){uchar x;while(n--){for(x=0; x<250;x++);};}/***********************************/void delay(uint ct) // 延时函数{uint t;t=ct;while(t--);}/***************************************/ void straight() //直走{q_duty_l=stra_q_l;q_duty_r=stra_q_r;h_duty_l=stra_h_l;h_duty_r=stra_h_r;Q_IN1=1;Q_IN2=0;Q_IN3=1;Q_IN4=0;H_IN1=1;H_IN2=0;H_IN3=1;H_IN4=0;}/***************************************/ void houtui() //后退{q_duty_l=stra_q_l;q_duty_r=stra_q_r;h_duty_l=stra_h_l;h_duty_r=stra_h_r;Q_IN1=0;Q_IN2=1;Q_IN3=0;Q_IN4=1;H_IN1=0;H_IN2=1;H_IN3=0;H_IN4=1;}/***************************************/ void turn_left() //左转{q_duty_l=turn_q_l;q_duty_r=turn_q_r;h_duty_l=turn_h_l;h_duty_r=turn_h_r;Q_IN1=0; //左轮反转Q_IN2=1;H_IN1=0;Q_IN3=1; //右轮正转Q_IN4=0;H_IN3=1;H_IN4=0;delay(turnl_time);}/***********************************/ void turn_right() //右转{q_duty_l=turn_q_l;q_duty_r=turn_q_r;h_duty_l=turn_q_l;h_duty_r=turn_q_r;Q_IN1=1; //左轮正转Q_IN2=0;H_IN1=1;H_IN2=0;Q_IN3=0; //右轮反转Q_IN4=1;H_IN3=0;delay(turnr_time);}/**************************************************/ void turn_round() //原地掉头{q_duty_l=turn_q_l;q_duty_r=turn_q_r;h_duty_l=turn_h_l;h_duty_r=turn_h_r;Q_IN1=0; //左轮反转Q_IN2=1;H_IN1=0;H_IN2=1;Q_IN3=1; //右轮正转Q_IN4=0;H_IN3=1;H_IN4=0;delay(dt_time);}/******************************************************/void over() //小车停止{Q_IN1=0;Q_IN2=0;Q_IN3=0;Q_IN4=0;H_IN1=0;H_IN2=0;H_IN3=0;H_IN4=0;}/*****************************************************/ void correct_right() //左偏,向右矫正{q_duty_l=turn_q_l;q_duty_r=turn_q_r;h_duty_l=turn_q_l;h_duty_r=turn_q_r;Q_IN1=1; //左轮正转Q_IN2=0;H_IN1=1;H_IN2=0;Q_IN3=0; //右轮反转Q_IN4=1;H_IN3=0;H_IN4=1;delay(correct_r_time);}void correct_left() //右偏,向左矫正{q_duty_l=turn_q_l;q_duty_r=turn_q_r;h_duty_l=turn_h_l;h_duty_r=turn_h_r;Q_IN1=0; //左轮反转Q_IN2=1;H_IN1=0;H_IN2=1;Q_IN3=1; //右轮正转Q_IN4=0;H_IN3=1;H_IN4=0;delay(correct_l_time);}/*************************************/ void xunji(){if(xg1==1){turn_count++;over();delay(over_time);if(turn_count==1){straight();delay(black_time);}elseif(turn_count==2){houtui();delay(hou_time);turn_left();}elseif(turn_count==3) {houtui();delay(hou_time); turn_right();}elseif(turn_count==4) {houtui();delay(hou_time); turn_right();}elseif(turn_count==5) {straight();delay(black_time); }elseif(turn_count==6) {houtui();delay(hou_time); turn_right();}elseif(turn_count==7) {houtui();delay(hou_time); turn_right(); straight();delay(back_time); turn_left();}elseif(turn_count==8) {straight();delay(black_time); }elseif(turn_count==9) {houtui();delay(100);turn_round();}if(turn_count>=9){turn_count=0;cir_count++;circle--;}{end=1;over();delay(500);}}elseif((xg0==0)&&(xg1==0)&&(xg2==0)) {straight();}elseif((xg0==1)&&(xg1==0)&&(xg2==0)) {over();delay(over_time);houtui();delay(hou_time);correct_right();}//左偏,向右矫正elseif((xg0==0)&&(xg1==0)&&(xg2==1)){over();delay(over_time);houtui();delay(hou_time);correct_left();} //右偏,向左矫正}/***********************************************/ void int0(void) interrupt 0 //中断圈数设定{EX0=0;delay_cir(250);circle++;if(circle>8){circle=0;}P0=led_data[circle];EX0=1;}/*************************************/void time1(void) interrupt 3 //T1溢出中断,电机调速{i++;j++;k++;m++;if(i<q_duty_l)Q_ENA=1;else Q_ENA=0;if(i>100){Q_ENA=1;i=0;}if(j<q_duty_r)Q_ENB=1;else Q_ENB=0;if(j>100 ){Q_ENB=1;j=0;}if(k<h_duty_l)H_ENA=1;else H_ENA=0;if(k>100){H_ENA=1;k=0;}if(m<h_duty_r)H_ENB=1;else H_ENB=0;if(m>100){H_ENB=1;m=0;}P0=led_data[circle];TH1=0XFF;TL1=0XF6;}/*************************************/ void main(){P0=led_data[circle];P1=0xFF;P1=0XFF; //P1口做输入P2=0X00; //P2口初始化,小车禁止P3=0XFF;TMOD=0X11;//T0,T1,工作方式1TH1=0XFF; //T1中断一次10USTL1=0XF6;TR1=1;EX0=1;ET1=1;EA=1;while(1){while((xz==1)&&(end!=1)) //无挡板,扫描对管,前进{xunji();};};}。

51的智能循迹小车代码

51的智能循迹小车代码

#include<reg52.h>#define sense P1 /*宏定义光电传感器端口*/#define input1 P0 /*左电机的IN1,IN2定义在P0口*/#define input2 P2 /*右电机的IN3,IN4及ENA,ENB定义在P2口*/ //宏定义电机的具体端口sbit MOTO1_INT1=P0^0;sbit MOTO1_INT2=P0^1;sbit MOTO1_ENA=P2^0;sbit MOTO2_INT3=P2^5;sbit MOTO2_INT4=P2^4;sbit MOTO2_ENB=P2^2;//宏定义传感器的具体端口sbit sense_L=P1^3;sbit sense_R=P1^6;//宏定义金属传感器端口sbit METAL=P1^1;//宏定义DELAY函数中的一些变量int Dtime1=20000;int Dtime2=2000;int i=0;unsigned char SIGNAL(void); //传感器信号分析函数void DELAY(void); //延时函数void main(){int a;MOTO1_INT1=1; //使车开始时运动MOTO1_INT2=0;MOTO1_ENA=1;MOTO2_INT3=1;MOTO2_INT4=0;MOTO2_ENB=1;while(1){if(METAL==1) //有金属时车停止DELAY();else{a=SIGNAL();switch(a){case 1:input2=0x25;break; //前进case 2:input2=0x24;break; //左转case 3:input2=0x21;break; //右转default:break;}}}}void DELAY() //延时函数{input2=0x20; //使驱动芯片的两个使能端为0,使两个电机停转for(i=0;i<Dtime1;i++); //实现延时,用DTIME控制input2=0x25; //使驱动芯片的两个使能端为1,使两个电机重新转for(i=0;i<Dtime2;i++);}unsigned char SIGNAL(){unsigned char Re;Re=sense&0x28;if(Re==40)return 1;//前进else if(Re==8)return 2;//左转else if(Re==32)return 3;//右转else return 1;//有错时前进}。

基于51单片机的无线控制循迹壁障循光小车

基于51单片机的无线控制循迹壁障循光小车

项目总结-----循迹壁障循光小车程序如下所示:系统1(上):#include"reg52.h"#include"intrins.h"#define uchar unsigned char#define uint unsigned intuchar Rem_Code[3];uint TimeCount;sbit Get_Rem=P2^0;sbit AO= P2^4;sbit BO = P2^5;sbit CO = P2^6;sbit DO= P2^7;void delay_ms(int z){int i,j;for(i=z;i>=0;i--)for(j=110;j>=0;j--);}void delay8(uint t){while(--t);}void Delay100us(void){delay8(13); //8-18}void Remote_Process(void){uchar i,j,Count=0;Delay100us();if(TimeCount>0)//当按键按下释放后该值不在赋值就同通过递减直到该值等于0{ //等于0后表示按键释放TimeCount--;}if(Get_Rem==0)//如果有低电平就进入解码{for(Count=0;Count<100;Count++) //判断12毫秒左右的引导码{Delay100us(); //100us*100=10msif(Get_Rem==1) //如果在延时10毫秒期间有高电平出现就是干扰信号退出解码{return;}}while(Get_Rem==0);//等待低电平结束for(j=0;j<3;j++) //8位地址码+ 4位数据码{for(i=0;i<8;i++){Count=0;do{Delay100us();Count++;if(Count>20)//如果在大于2毫秒高电平还没有结束认为是干扰退出解码{ //理论上是1.2毫秒,我们2毫秒留有余量,防止遥控批量中的误差return;}}while(Get_Rem==1);//计算高平时间并等待结束Count=0;do{Delay100us();Count++;if(Count>20)//如果在大于2毫秒低平还没有结束认为是干扰退出解码{return;}}while(Get_Rem==0);//计算低电平时间并等待结束Rem_Code[j]<<=1;//数据从高位开始接收所以每次向左移一位if(Count<8) //如果低电平时间小于800毫秒认为该位为1如果不加,则为0{Rem_Code[j]++;}}}ACC=Rem_Code[2];if(ACC==0xc0){AO = 1;BO = 0;CO = 1;DO = 1;delay_ms(10);BO = 1;}if(ACC==0x30){AO = 1;BO = 1;CO = 1;DO = 0;delay_ms(10);DO = 1;}if(ACC==0x0c) {AO = 0;BO = 1;CO = 1;DO = 1;delay_ms(10);AO = 1;}if(ACC==0x03) {AO = 1;BO = 1;CO = 0;DO = 1;delay_ms(8);CO = 1;}if(TimeCount==0)TimeCount=1000;//按键按下标志}}void main(){while(1){Remote_Process();//遥控处理}}1.系统2(下):/************************************************ 按键A:壁障模式按键B:循迹模式按键C:循光模式按键D:停止************************************************/#include"AT89x52.h"//#include"global.h"#include"intrins.h"//#include"51hei.H"#define uchar unsigned char#define uint unsigned int//uchar Rem_Code[3];//uint TimeCount;//sbit Get_Rem=P2^7;//sbit sb = P3^2; //外部中断sbit AO= P2^4; //与上面的单片机连接的端口sbit BO = P2^5; //与上面的单片机连接的端口sbit CO = P2^6; //与上面的单片机连接的端口sbit DO= P2^7; // 与上面的单片机连接的端口sbit hw1 = P1^1; //后外端口sbit hw2 = P1^2;sbit hw3 = P1^0;sbit gm1 = P0^6;sbit gm2 = P0^7;sbit IB1=P1^5; //驱动端口sbit IA1=P1^6;sbit IB2=P1^3;sbit IA2=P1^4;sbit ENA=P2^2;sbit ENB=P2^3;sbit Led_on=P0^0;int n=0;int m=0;int ms_100_you=100; //占空比的时间片int ms_100_zuo=100; // 占空比的时间片//int ms_10 = 12;int ms_houtui_200 = 300; //超声波壁障时后退的时间片int ms_hwled = 1000; //红外的流水灯的时间片int ms_hwbee_50 = 50;sbit bee = P0^5;sbit ECHO = P2^1; //超声波的端口sbit TRIG = P2^0;unsigned int time = 0;unsigned int timer = 0;unsigned char hw_flag;unsigned long S = 0;int ceshi_time=200;int Flag=0;//void Remote_Process();void qian_jin_fast() //快速前进{if (ms_100_zuo<=100 && ms_100_zuo>58) //左轮速度{IA2=0;IB2=1;}else if(ms_100_zuo<=58&& ms_100_zuo>0) // 15{IA2=1;IB2=1;}else if(ms_100_zuo<=0){ms_100_zuo=100;}if (ms_100_you<=100 && ms_100_you>10) //右轮速度{IA1=1;IB1=0;}else if(ms_100_you<=10 && ms_100_you>0) // 15{IA1=1;IB1=1;}else if (ms_100_you<=0){ms_100_you=100;}}void qian_jin_slow() //慢速前进{if (ms_100_you<=100 && ms_100_you>65){IA1=1;IB1=0;}else if(ms_100_you<=65 && ms_100_you>0) // 15 {IA2=1;IB2=1;}else if (ms_100_you<=0){ms_100_you=100;}if (ms_100_zuo<=100 && ms_100_zuo>35){IA2=0;IB2=1;}else if(ms_100_zuo<=35 && ms_100_zuo>0) // 15 {IA2=1;IB2=1;}else if(ms_100_zuo<=0){ms_100_zuo=100;}}void hou_tui_fast() //快速后退{if (ms_100_zuo<=100 && ms_100_zuo>65) //左轮速度{IA2=1;IB2=0;}else if(ms_100_zuo<=65&& ms_100_zuo>0) // 15{IA2=1;IB2=1;}else if(ms_100_zuo<=0){ms_100_zuo=100;}if (ms_100_you<=100 && ms_100_you>14) //右轮速度{IA1=0;IB1=1;}else if(ms_100_you<=14 && ms_100_you>0) // 15{IA1=1;}else if (ms_100_you<=0){ms_100_you=100;}}void hou_tui_slow() //慢速后退{if (ms_100_zuo<=100 && ms_100_zuo>75){IA2=1;IB2=0;}else if(ms_100_zuo<=75 && ms_100_zuo>0) // 15 {IA2=1;IB2=1;}else if(ms_100_zuo<=0){ms_100_zuo=100;}if (ms_100_you<=100 && ms_100_you>65){IB1=1;}else if(ms_100_you<=65 && ms_100_you>0) // 15{IA2=1;IB2=1;}else if (ms_100_you<=0){ms_100_you=100;}}void zuo_zhuan() //左转{if (ms_100_zuo<=100 && ms_100_zuo>65) //左轮速度{IA2=1;IB2=0;}else if(ms_100_zuo<=65&& ms_100_zuo>0) // 15{IA2=1;IB2=1;}else if(ms_100_zuo<=0)ms_100_zuo=100;}if (ms_100_you<=100 && ms_100_you>8) //右轮速度{IA1=1;IB1=0;}else if(ms_100_you<=8 && ms_100_you>0) // 15{IA1=1;IB1=1;}else if (ms_100_you<=0){ms_100_you=100;}}void you_zhuan() //右转{if (ms_100_zuo<=100 && ms_100_zuo>56) //左轮速度{IA2=0;IB2=1;else if(ms_100_zuo<=56&& ms_100_zuo>0) // 15{IA2=1;IB2=1;}else if(ms_100_zuo<=0){ms_100_zuo=100;}if (ms_100_you<=100 && ms_100_you>10) //右轮速度{IA1=0;IB1=1;}else if(ms_100_you<=10 && ms_100_you>0) // 15{IA1=1;IB1=1;}else if (ms_100_you<=0){ms_100_you=100;}}void stop_zhuan(){IA1=1;IB1=1;IA2=1;IB2=1;}/******************************光敏控制的函数*********************************************/void gm_judge(){if (gm1 == 1 && gm2 == 0) zuo_zhuan();else if(gm1 == 0 && gm2 == 1) you_zhuan();else qian_jin_fast();}/*************************************红外控制函数**********************************************/void hw_judge(){if((hw1==0 && hw2==0) || (hw1!=0 && hw2!=0 && hw3==1)) qian_jin_fast();//前else if(hw1==0 && hw2!=0) you_zhuan(); // 右else if(hw1!=0 && hw2==0) zuo_zhuan(); //做else if(hw1!=0 && hw2!=0 && hw3==0) stop_zhuan(); //停}/************************************超声波计算距离的函数******************************************************/void Conut(void){time = TH0 * 256 + TL0;TH0 = 0;TL0 = 0;S=(time * 1.7) / 100;//算出来是CMif(S<=10&&S>0){P0=0xe0;}else if(S>10&&S<=20){P0=0xf0;}else if(S>20&&S<=30){P0=0xf8;}else if (S>30&&S<=40){P0=0xfc;}else{P0=0xff;}}/********************************超声波信号发送和接收函数**********************************************/void chaoshengbo(){switch(m){case 0:if (ECHO!=0) {TR0=1;m=1;}else if(ECHO==0) {TR0=0;m=0;} break;case 1: {if (ECHO!=0) {m=1;}else if(ECHO==0){TR0=0;m=2;}} break;case 2:{Conut();m=0;} break;}}//void delay8(uint t)//{//while(--t);//}////void Delay100us(void)//{//delay8(13); //8-18//}//////因为他的格式是00表示"0"11表示"1"01表示"F"所以我们要把12位乘以2等于24位刚好是3个字节////第一二个字节是地址码,第三个字节是数据码////发射芯片采用的是PT2262芯片用4.7M的震荡电阻315M发射////遥控我们全部默认地址码是FFFFFFFF 单片机解码出来就是0x55 0x55////遥控处理函数//void Remote_Process(void)//{// uchar i,j,Count=0;// Delay100us();// if(TimeCount>0)//当按键按下释放后该值不在赋值就同通过递减直到该值等于0// {//等于0后表示按键释放// TimeCount--;// }//// if(Get_Rem==0)//如果有低电平就进入解码// {// for(Count=0;Count<100;Count++)//判断12毫秒左右的引导码// {// Delay100us();//100us*100=10ms// if(Get_Rem==1)//如果在延时10毫秒期间有高电平出现就是干扰信号退出解码// {// return;// }// }// while(Get_Rem==0);//等待低电平结束// for(j=0;j<3;j++)//8位地址码加4位数据码// {// for(i=0;i<8;i++)// {// Count=0;// do// {// Delay100us();// Count++;// if(Count>20)//如果在大于2毫秒高电平还没有结束认为是干扰退出解码// {//理论上是1.2毫秒,我们2毫秒留有余量,防止遥控批量中的误差// return;// }// }while(Get_Rem==1);//计算高平时间并等待结束// Count=0;// do// {// Delay100us();// Count++;// if(Count>20)//如果在大于2毫秒低平还没有结束认为是干扰退出解码// {// return;// }// }while(Get_Rem==0);//计算低电平时间并等待结束// Rem_Code[j]<<=1;//数据从高位开始接收所以每次向左移一位// if(Count<8)//如果低电平时间小于800毫秒认为该位为1// {// Rem_Code[j]++;// }// }// }// //huqin// ACC=Rem_Code[2];// if(ACC==0x0c) //a// {// Flag=1;// delay8(5);// }// if(ACC==0xc0) //b// {// Flag=2;// delay8(5);// }// if(ACC==0x03) // c// {// Flag=3;// delay8(5);// }// if(ACC==0x30) //d// {// Flag=4;// delay8(5);// }//// if(TimeCount==0)//为0表示是新的一次按下对其进行处理// {//如过该值大于0表示已经按下不在处理,保证按下一次只做一次处理// // if((Rem_Code[0]==Addr_Code_H)&&(Rem_Code[0]==Addr_Code_L)) // // {//// if(Rem_Code[2]==Key_A)//如果数据与A键的值相等表示A键按下对其处理// // {//试验用A键来控制继电器的开关// // Com_Relay;//继电器取反// // Nokia3310();//显示继电器的状态// // Bz_Out();//蜂鸣器响一声// // }// // }// //P2_2=0;// }// TimeCount=1000;//按键按下标志// }//}// void hw_judge()//{// if((hw1==0&&hw2==0)||(hw1!=0&&hw2!=0&&hw3==1)) hw_flag=1; //前// else if(hw1==0&&hw2!=0) hw_flag=2; // 右// else if(hw1!=0&&hw2==0) hw_flag=3; //左// else if(hw1!=0&&hw2!=0&&hw3==0) hw_flag=4; //停//}////void hw_movement()//{// switch(hw_flag)// {// case 1: qian_jin_fast();break;// case 2: you_zhuan();break;// case 3: zuo_zhuan();break;// case 4: stop_zhuan();break;// }// }/*****************************主函数******************************************/void main(){TMOD=0x11; //设T0为方式1,GATE=1;TH0 = 0;TL0 = 0;TH1 = (65536-1000)/256;TL1 = (65536-1000)%256;ET0=1; //允许T0中断ET1=1; //允许T1中断TR1=1; //开启定时器EA=1; //开启总中断Led_on = 1;ENA=1;ENB=1;// IT0 = 0;// EX0 = 1;while(1){while (Flag==1){chaoshengbo();}while(Flag==5){qian_jin_fast();}while(Flag==2){hw_judge();bee=1;}while(Flag==3){gm_judge();bee=1;}while(Flag==4){stop_zhuan();bee=1;}while (Flag==0){stop_zhuan();}}}//void zd0() interrupt 0 //{// Remote_Process(); // ms_10 = 12;// sb = 1;//}/**定时器1***/void zd3() interrupt 3 //T1中断用来扫描数码管和计800MS启动模块{int i = 0;TH1 = (65536-1000) / 256;TL1 = (65536-1000) % 256;/****************************端口信号处理*******************************************/if(AO == 0)Flag = 1;else if(BO == 0)Flag = 2;else if(CO == 0)Flag = 3;else if(DO == 0)Flag = 4;//// ms_10--;// if(ms_10<=0)// {// sb = 0;// // ms_10 = 12;// }ms_100_zuo--;ms_100_you--;// if (Flag==4)// {// bee = 1;// ceshi_time--;// if (ceshi_time<=0)// {// Flag=5;// ceshi_time=300;// }// }/*************************红外的流水灯效果*****************************************/if (Flag==2){ms_hwled--;if (ms_hwled<=1000&& ms_hwled>750){P0=0xfc;}else if ( ms_hwled<=750 && ms_hwled>500){P0=0xfa;}else if ( ms_hwled<=500 && ms_hwled>250){P0=0xf6;}else if ( ms_hwled<=250 && ms_hwled>0){P0=0xee;}else if ( ms_hwled<=0)ms_hwled=1000;}}// else if(Flag == 2)// {// bee = 1;// }// else if(Flag==1)// {// if(S<=35 && S>0)// {// ms_houtui--;// if (ms_houtui<=100)// {// hou_tui_fast();// }// else if (ms_houtui<=50)// { n=n%2;// switch (n)// {//// case 0:you_zhuan();bee=0;break; //// case 1:zuo_zhuan();bee=0;break; // case 0:you_zhuan();break;// case 1:zuo_zhuan();break;// }//// }// }// else// qian_jin_fast();// bee=1;// ms_houtui=100;// }/*************************超声波壁障效果********************************************/else if(Flag==1){Led_on = 0;if(S<=30 && S>0){ms_houtui_200--;hou_tui_fast();if(ms_houtui_200<=0){n=n%2;switch (n){case 0:you_zhuan();bee=0;break;case 1:zuo_zhuan();bee=0;break;}// ms_houtui = 100;}}else{ ms_houtui_200=300;qian_jin_fast();bee=1;}timer++;if(timer>= 800){n++;timer=0;TRIG=1; //800MS 启动一次模块i = 0;for(;i<20;i++)_nop_();TRIG=0;}}}。

基于51单片机的避障小车程序

基于51单片机的避障小车程序

基于51单片机的避障小车程序程序中有我写的注释,看不懂程序的话,可以参考。

#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit IN1=P2^1;//左电机输入端1sbit IN2=P2^2;//左电机输入端2sbit IN3=P2^3;//右电机输入端1sbit IN4=P2^4;//右电机输入端2sbit ENA=P2^0;//右电机使能控制端sbit ENB=P2^5;//左电机使能控制端sbit TX=P1^0;//超声波发送控制端sbit RX=P1^1;//超声波接收控制端uint time=0,ERROR;//用于存放定时器时间值uint PWM1,PWM2,num1=0,num2=0;uint s=0;//用于存放距离的值uchar tt=0;void Delay20us()//@11.0592MHz 延时20us{unsigned char i;_nop_();_nop_();_nop_();i = 52;while (--i);}void forwardg()//前进函数{IN1=1;IN2=0;IN3=1;IN4=0;PWM1=15;PWM2=18;}void stopg()//停止函数{IN1=1;IN2=1;IN3=1;IN4=1;PWM1=0;PWM2=0;}void count()//测距函数{tt=200;if(tt==200)//20ms超声波发送一次{tt=0;TX=1;//超声波发送端Delay20us();//延时20usTX=0;//超声波发送端ERROR=50000;//while(RX==0&&ERROR>0)//判断是否有接收&&等待时常{ERROR--;//等待时长}if(RX==1)//超声波有接收RX=1{TR0=1;//开始计时while(RX&&!TF0);//接收完毕(RX=0)或者超出量程结束语句TR0=0;//停止计时if(TF0==1)//如果溢出(超出量程){TF0=0;//置溢出标志位为0s=999;//直行控制}else{time=TH0*256+TL0;TH0=0;TL0=0;s=(time*1.7)/100;//距离计算公式}}else{s=999;}}}void time0init()//定时器0初始化{TMOD|=0x01;//设置定时器0为工作方式1TH0=0;TL0=0;//定时器赋初值}void time1init()//定时器1初始化{ET1=1;//开定时器中断TR1=1;//开定时器1中断TH1=0xFF;//定时器赋初值TL1=0xA3;TMOD|=0x10;//设置定时器1为工作方式1}void time1() interrupt 3//定时计数器1中断{TH1=0xFF;TL1=0xA3;//赋初值tt++;num1++;num2++;if(num1>=100) //PWM的周期为100*0.1=10ms num1=0;if(num2>=100)num2=0;if(num1<PWM1)ENA=1;//打开右电机使能控制端if(num2<PWM2)ENB=1;if(num1>=PWM1)ENA=0;//关闭右电机使能控制端if(num2>=PWM2)ENB=0;}void main(){time0init();time1init();EA=1;//开总中断while(1){count();//调用距离计算函数if(s>=6)//大于等于6厘米前进{forwardg();}else{stopg();}}}。

寻迹避障小车51程序(绝版模块化程序)

寻迹避障小车51程序(绝版模块化程序)

M a i n.c #include "common.h"#include "motor.h"#include "timer.h"uchar speed_l;uchar speed_r;sbit out = P3^7;void main(){P1 = 0xff;flag_l = 0;flag_r = 0;sensor_ldata = 0;sensor_rdata = 0;avoid_keyfunc = 0;findline_keyfunc = 0;motor_stop();timerinit();while(1){/*********************************************************循迹功能*********************************************************/while(findline_keyfunc){/**************************************************************** 正常情况下前进****************************************************************/ if(sensor == 0x27){motor_go();speed_l = 50;speed_r = 47;}/****************************************************************如果小车偏左****************************************************************/if((sensor == 0x37) || (sensor == 0x17) || (sensor == 0x0f) || (sensor == 0x1f) || (sensor == 0x3f)){motor_r();speed_l = 45;speed_r--;if(speed_r == 30){speed_r = 31;}}/**************************************************************** 如果小车偏右****************************************************************/if((sensor == 0x67) || (sensor == 0x47) || (sensor == 0x87) || (sensor == 0xc7) ||(sensor == 0xe7)){motor_l();speed_r = 45;speed_l--;if(speed_l == 30){speed_l = 31;}}}/////////////////////////////////////////////////////////////////// /////****************************************************************** * 避障功能******************************************************************* / while(avoid_keyfunc){/*********************************************************** 如果没有检测到有障碍物***********************************************************/ if((sensor_ldata == 1) && (sensor_rdata == 1)){motor_go();speed_l = 48;speed_r = 50;}/*********************************************************** 如果检测到右边有障碍物***********************************************************/ if((sensor_ldata == 1) && (sensor_rdata == 0)){motor_go();speed_l--;speed_r = 100;if(speed_l == 10){speed_l = 11;}}/****************************************************** 如果左边检测到有障碍物******************************************************/ if((sensor_ldata == 0) && (sensor_rdata == 1)){motor_go();speed_r--;speed_l = 100;if(speed_r == 10){speed_r = 11;}}/****************************************************** 如果都检测到有障碍物******************************************************/ if((sensor_ldata == 0) && (sensor_rdata == 0)){motor_go();speed_r = 100;speed_l = 10;}//////////////////////////////////////}/////////////////////////////////////motor_stop();}}MAIN.H#ifndef MAIN_H#define MAIN_Hextern uchar speed_l;extern uchar speed_r;#endifMotor.c#include "common.h"#include "timer.h"sbit in1 = P2^0;sbit in2 = P2^1; //左电机sbit in3 = P2^2;sbit in4 = P2^3;//右电机sbit ENA = P2^4; //只有当ENA=1时左电机才能转sbit ENB = P2^5; // 只有。

基于51单片机的智能避障小车开发

基于51单片机的智能避障小车开发

L298N的详细资料驱动直流电机电机驱动电路;电机转速控制电路(PWM信号)主要采用L298N,通过单片机的I/O输入改变芯片控制端的电平,即可以对电机进行正反转。

驱动原理图L298电机驱动模块实物图我正在用L298N驱动我的小车的两个直流减速电机,其实它很好用,1和15和8引脚直接接地,4管脚VS接2.5到46的电压,它是用来驱动电机的,9引脚是用来接4.5到7V的电压的,它是用来驱动L298芯片的,记住,L298需要从外部接两个电压,一个是给电机的,另一个给L298芯片的6和11引脚是它的使能端,一个使能端控制一个电机,至于那个控制那个你自己焊接,你可以把它理解为总开关,只有当它们都是高电平的时候两个电机才有可能工作,5,7,10,12是298的信号输入端和单片机的IO口相连,2,3,13,14是输出端,输入5和7控制输出2和3, 输入的10,12控制输出的13,14L298N型驱动器的原理及应用L298N是SGS公司的产品,内部包含4通道逻辑驱动电路。

是一种二相和四相电机的专用驱动器,即内含二个H桥的高电压大电流双全桥式驱动器,接收标准TTL逻辑电平信号,可驱动46V、2A以下的电机。

L298N的恒压恒流桥式2A驱动芯片L298N说明及应用L298是SGS公司的产品,比较常见的是15脚Multiwatt封装的L298N,内部同样包含4通道逻辑驱动电路。

可以方便的驱动两个直流电机,或一个两相步进电机。

L298N芯片可以驱动两个二相电机,也可以驱动一个四相电机,输出电压最高可达50V,可以直接通过电源来调节输出电压;可以直接用单片机的IO口提供信号;而且电路简单,使用比较方便。

L298N 可接受标准TTL逻辑电平信号V SS,V SS可接4.5~7 V电压。

4脚VS接电源电压,VS电压范围VIH为+2.5~46 V。

输出电流可达2.5 A,可驱动电感性负载。

1脚和15脚下管的发射极分别单独引出以便接入电流采样电阻,形成电流传感信号。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4.1系统软件流程图............................................................9
4.2系统程序........................................................................9
项目名称:智能小车
系别: 信息工程系
专业:11电气工程及其自动化
:亮、占闯、康
指导老师:王蕾
占闯联系:1308253761qq.
摘要:...............................................................................................3关键词:.............................................................................................3
2.5电源模块.......................................................................7
三、自动循迹避障小车总体设计………………………………..7
四、软件设计及说明.....................................................................8
随着科学技术的发展,机器人的感系统,对于视觉的各种技术而言图像处理技术已相当发达,而基于图像的理解技术还很落后,机器视觉需要通过大量的运算也只能识别一些结构化环境简单的目标。视觉传感器的核心器件是摄像管或CCD,目前的CCD已能做到自动聚焦。但CCD传感器的价格、体积和使用方式上并不占优势,因此在不要求清晰图像只需要粗略感觉的系统中考虑使用接近觉传感器是觉传感器种类越来越多,其中视觉传感器成为自动行走和驾驶的重要部件。视觉的典型应用领域为自主式智能导航一种实用有效的方法。
2.3电机驱动模块................................................................6
2.4机械模块........................................................................7
绪论:.................................................................................................3
一、系统设计.............................................................................4
五、系统测试过程.......................................................................12
六、总结.......................................................................................13
机器人要实现自动导引循迹功能和避障功能就必须要感知导引线和障碍物,感知导引线相当给机器人一个视觉功能。避障控制系统是基于自动导引小车系统,基于它的智能小车实现自动识别路线,判断并自动避开障碍,选择正确的行进路线。使用传感器感知路线和障碍并作出判断和相应的执行动作。
该智能小车可以作为机器人的典型代表。它可以分为三大组成部分:传感器检测部分、cpu、执行部分。机器人要实现自动循迹避障功能,感知导引线和障碍物。可以实现小车自动识别路线,选择正确的行进路线,并检测到障碍物自动躲避。基于上述要求,传感检测部分考虑到小车一般不需要感知清晰的图像,只要求粗略感知即可,所以可以舍弃昂贵的CCD传感器而考虑使用价廉物美的红外光电传感器来充当。智能小车的执行部分,是由直流电机来充当的,要控制小车的行进方向。单片机驱动直流电机一般有两种方案:第一,勿需占用单片机资源,直接选择有PWM功能的单片机,这样可以实现精确调速;第二,可以由软件模拟PWM输出调制,需要占用单片机资源,难以精确调速,但单片机型号的选择余地较大。考虑到实际情况,本文选择第二种方案。CPU使用STC89C52单片机,配合软件编程实现。
关键词:智能循迹避障小车,STC89C52单片机,L298N驱动芯片,信号检测模块,循迹避障
绪论
(一)智能小车的作用和意义
自第一台工业机器人诞生以来,机器人的发展已经遍及机械、电子、冶金、交通、宇航、国防等领域。近年来机器人的智能水平不断提高,并且迅速地改变着人们的生活方式。人们在不断探讨、改造、认识自然的过程中,制造能替代人劳动的机器一直是人类的梦想。
2.1循迹+避障模块..............................................................5
2.2主控模块........................................................................6
七、附录:系统元器件..................................................................13
摘要
本设计主要有三个模块包括信号检测模块、主控模块、电机驱动模块。信号检测模块采用红外光对管,用以对有无障碍与黑线进行检测。主控电路采用宏晶公司的8051核心的STC89C52单片机为控制芯片。电机驱动模块采用意法半导体的L298N专用电机驱动芯片,单片控制与传统分立元件电路相比,使整个系统有很好的稳定性。信号检测模块将采集到的路况信号传入STC89C52单片机,经单片机处理过后对L298N发出指令进行相应的调整。通过有无光线接收来控制电动小车的转向,从而实现自动循迹避障的功能。
1.1、任务及要求...................................................................4
1.2车体方案认证与选择......................................................4
二、硬件设计及说明....................................................................5
相关文档
最新文档