基于51单片机的智能循迹避障小车 C源程序
基于51单片机设计智能避障小车
单片机设计智能避障小车摘要利用红外对管检测黑线与障碍物,并以STC89C51单片机为控制芯片控制电动小汽车的速度及转向,从而实现自动循迹避障的功能。
其中小车驱动由L298N 驱动电路完成,速度由单片机输出的PWM波控制。
本文首先介绍了智能车的发展前景,接着介绍了该课题设计构想,各模块电路的选择及其电路工作原理,最后对该课题的设计过程进行了总结与展望并附带各个模块的电路原理图,和本设计实物图,及完整的C语言程序。
关键词:智能小车;51单片机;L298N;红外避障;寻迹行驶abstractUsing infrared detection black and obstacles to the line and STC89C51 microcontroller as the control chip to control the speed of the electric car and steering, so as to realize the function of automatic tracking and obstacle avoidance. Which the car driven by the L298N driver circuit is completed, the speed of the microcontroller output PWM wave control. This article first introduces the development of the intelligent car prospect, then introduces the design idea, the subject selection of each module circuit and working principle of the circuit, the design process of the subject is summarized and prospect with each module circuit principle diagram, and the real figure design, and complete C language program.Key words: smart car; 51 MCU; L298N; infrared obstacle avoidance; track driving一、绪论1.1智能小车的意义和作用自第一台工业机器人诞生以来,机器人的发展已经遍及机械、电子、冶金、交通、宇航、国防等领域。
基于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 语言代码// 实现功能有超声波避障,红外遥控智能小车,红外传感器实现小车自动循迹, 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单片机智能小车循迹程序
#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单片机的避障小车设计
单片机原理及系统课程设计专业:班级:姓名:学号:指导教师:基于单片机的避障小车设计1 引言本课程设计以AT89C51单片机为核心,完成了一辆利用超声波传感器来实现避障功能的小车,使小车对其运动方向受到的阻碍作出躲避动作。
本次设计主要研究小车的避障功能,当距离障碍物大于30cm时,小车前进;当距离障碍物小于20cm时,小车停止,舵机分别旋转到前、左、右三向,从而使超声波模块进行测距,并且小车采取相应的避障措施。
2 整体设计方案及原理2.1 总体设计方案本系统选用AT89C51单片机为主控机。
通过扩展必要的外围接口电路,实现对避障小车的设计,具体设计如下:(1)由于小车要进行测距,为了得到较好的避障效果和较精确的距离信息,经综合分析后,决定采用超声波模块进行非接触型测距。
避障小车与障碍物之间的实际距离通过数码管进行显示。
(2)避障小车采用差速方式控制行进方向,通过四个直流电机控制四轮旋转,并采用L298N双H桥直流电机驱动芯片控制直流电机正反转。
(3)超声波模块分别检测前方、左侧及右侧与障碍物之间的距离,因此需要采用舵机进行旋转完成超声波模块三向测距。
2.2 系统组成框图系统模块图如图1所示。
51单片机驱动模块直流电机超声波、舵机组合测距数码管显示图1 系统模块图3 硬件设计本设计选用AT89C51单片机为主控单元;驱动部分:采用L298N双H桥直流电机驱动模块;测距避障部分:采用US100超声波传感器模块;此外,还采用SG90舵机,实现超声波模块方向的变化。
该系统整体电路原理图如附图1所示。
3.1 电机驱动模块本次课程设计采用L298N双H桥直流电机驱动模块,采用SGS公司原装全新的L298N芯片,内部包含4通道逻辑驱动电路,可以直接驱动两路3-16V直流电机,并提供了5V输出接口(输入最低只要6V),可以给5V单片机电路系统供电(低纹波系数),是智能小车电机驱动的必备利器。
L298N芯片是一种二相和四相电机的专用驱动器,即内含二个H桥的高电压大电流双全桥式驱动器,接收标准TTL逻辑电平信号,可驱动46V、2A以下的电机。
基于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;}}}。
自动避障红外电动小车C51程序
#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 );
基于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单片机的智能循迹避障遥控小车
12技术应用卫星电视与宽带多媒体基于51单片机的智能循迹避障遥控小车■空军预警学院 :谢菁【摘要】随着现代科技的迅速发展,智能化小车逐渐被应用到更多领域。
本设计的智能小车采用STC12C5A60S2单片机为主控芯片,以Keil μVision4软件为开发平台,经过软、硬件综合设计,小车可以实现红外遥控、红外循迹和超声波避障等功能。
【关键词】STC12C5A60S2单片机;红外遥控;直流电机;Keil μVision4引言目前,智能车发展速度迅猛,是融合了计算机、造型技术、传感技术、电子、机械、控制、人工智能等多个学科交叉的科技创新技术,在各个领域扮演着重要角色。
同时,在国家级、省级电子设计竞赛以及其它创新设计竞赛中几乎每次都能找到智能车类型题目的踪影,并且全国各类高校对该方向的题目研究也非常重视。
因此,具有广阔的应用前景和较大的研究意义。
在实践过程中,熟悉以单片机为核心控制芯片,采用智能控制算法实现小车的遥控、循迹和避障等功能。
一、总体方案设计本次设计采取的主控芯片是宏晶科技公司生产的STC12C5A60S2单片机。
硬件电路主要由五部分组成,分别为:单片机主控模块,电源模块、电机驱动模块、红外遥控模块、循迹检测模块和超声波避障模块。
如图1所示。
通过红外遥控系统的编/解码专用集成电路芯片来进行遥控操作;利用红外收发管,根据红外信号对不同颜色产生不同反射系数的原理,根据接收管输出电压的变化,单片机驱动直流电机来确定小车行走方向,进而实现循迹功能;利用超声波测量小车与障碍物之间的距离,再通过舵机控制超声波模块对不同方向的障碍物进行探测,将测试数据传送给单片机,单片机就可以根据传感器发来的信号发出命令让小车开始改变原始的方向,从而实现避障功能。
二、系统硬件部分(1)单片机控制模块由STC12C5A60S2单片机构成的最小应用系统如图2所示,主要由电源电路、复位电路、振荡电路和单片机4图1 系统总框图图2 单片机最小系统原理图13技术应用卫星电视与宽带多媒体个部分组成。
寻迹避障小车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 单片机实现前进后退转弯与智能采样控制功能#include <reg52.h>#include<intrins.h>unsigned int tata[8];unsigned char flag=0,flag2=0,flag3=0,n,m;unsigned int Angle,q,length,temp1;sbit A仁P3A2;sbit A2=P3A3;sbit B1=P3A4;sbit B2=P3A5;sbit ENA=P3A6;sbit ENB=P3A7;sbit red1=P1A3;sbit red2=P1A6;void InitUART(void) {TMOD = 0x20;SCON = 0x50;TH1 = 0xFD;TL1 = TH1;PCON = 0x00; ES = 1; TR1 = 1;EA = 1;ENA = 1;ENB = 1;}void delay(void) // 直线延时延时函数{unsigned char a,b;for(b=255;b>0;b --) for(a=38;a>0;a--);}void delay1(void) // 转角延时函数{unsigned char w,y,c;for(c=1;c>0;c--) for(y=97;y>0;y--)for(w=3;w>0;w --);void delay3(void) // 避障延时函数{unsigned char a,b,c; for(c=98;c>0;c--) for(b=100;b>0;b --)for(a=40;a>0;a --);}void delay2(void) // 手动控制延时函数{unsigned char a,b,c;for(c=98;c>0;c--) for(b=15;b>0;b --) for(a=17;a>0;a --) { if(m){ break;}}}void qianjin() // 前进{unsigned char f;A1=1;A2=0;B1=1;B2=0;for(f=0;f<155;f++){A1=0;A2=0;B1=0;B2=1;} // 直线校准语句A1=1;A2=0;B1=1;B2=0;}void zuozhuan() // 左转{A1=1;A2=0;B1=0;B2=1;}void youzhuan() // 右转A1=0;A2=1;B1=1;B2=0;}void houtui(){A1=0;A2=1;B1=0;B2=1;}void tingzhi(){A1=0;A2=0;B1=0;B2=0;}void main(){unsigned char temp;InitUART();while(1){if(flag){flag=0;for(temp=2;temp<8;temp++) // 字符型转成整型函数{tata[temp]=tata[temp]%16;}// 执行转角指令Angle=10*(tata[2]*100+tata[3]*10+tata[4]);m=0;if(Angle<10) // 地面小角度摩擦校正函数{Angle++;}if(tata[1]=='L'){for(q=0;q<Angle;q++){zuozhuan();delay1();if(m){break;}}}else if(tata[1]=='R'){for(q=0;q<Angle;q++){ youzhuan(); delay1(); if(m) { break;}}} tingzhi();delay(); for(temp=2;temp<8;temp++) // 字符型转成整型函数{ tata[temp]=tata[temp]%16;}// 执行前进指令length=100*(tata[5]*100+tata[6]*10+tata[7]);// m=0;if(!m){ for(q=0;q<length;q++){ qianjin(); delay(); delay(); if(m) { break;} if(!red1){ delay1(); if(!red1) { youzhuan(); delay3();while(!red1);}if(!red2){delay1(); if(!red2){zuozhuan(); delay3();while(!red2);}}if((!red1)||(!red2)){houtui();delay3();while((!red1)||(!red2));}}}}if(flag3){m=0;flag3=0;if(tata[1] =='W'){qianjin(); }else if(tata[1]=='A'){A1=0;A2=0;B1=0;B2=1;} elseif(tata[1]=='S'){houtui();}else if(tata[1]=='D'){A1=0;A2=1;B1=0;B2=0;}else if(tata[1]=='T'){tingzhi(); }delay2();}tingzhi();}}void UARTInterrupt(void) interrupt 4 {if(RI) m=1;RI = 0;if(SBUF=='$'){flag2=1;}if(flag2){tata[n]=SBUF;n++;if(n==9&&tata[8]=='*'){n=0;flag=1;flag2=0;}if(n==3&&tata[2]=='#'){n=0;flag3=1;flag2=0;}}。
基于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驱动芯片,信号检测模块,循迹避障绪论(一)智能小车的作用和意义自第一台工业机械人诞生以来,机械人的进展已经遍及机械、电子、冶金、交通、宇航、国防等领域。
最近几年来机械人的智能水平不断提高,而且迅速地改变着人们的生活方式。
人们在不断探讨、改造、熟悉自然的进程中,制造能替代人劳动的机械一直是人类的妄图。
随着科学技术的进展,机械人的感系统,关于视觉的各类技术而言图像处置技术已相当发达,而基于图像的明白得技术还很掉队,机械视觉需要通过大量的运算也只能识别一些结构化环境简单的目标。
51单片机循迹避障C程序
51单片机循迹避障C程序#include<reg51.h>#define uchar unsigned char#define uint unsigned intunsigned char zkb1=0 ;unsigned char zkb2=0 ;unsigned char t=0,a,b,c;sbit IN1=P2^0; //驱动sbit IN2=P2^1;sbit IN3=P2^2;sbit IN4=P2^3;sbit ENA=P1^4;sbit ENB=P1^5;sbit out1=P1^0;sbit out2=P1^1; //寻迹sbit out3=P1^2;sbit out4=P1^3;sbit zuo=P3^3;sbit zhong=P3^4; //避障sbit you=P3^5;void delay(uint z){uint x,y;for(x=z;x>0;x--)for (y=110;y>0;y--);}void init(){ TMOD=0x01;TH0=(65536-1000)/256;TL0=(65536-1000)%256;EA=1;ET0=1;TR0=1;}void timer0() interrupt 1 {TH0=(65536-1000)/256;TL0=(65536-1000)%256; if(t<zkb1)ENA=1;elseENA=0;if(t<zkb2)ENB=1; elseENB=0;t++;if(t>=100){t=0;}}void toward() { zkb1=a;zkb2=b;IN1=0;IN2=1;IN3=0;IN4=1; }void back() { zkb1=a;zkb2=b;IN1=1;IN2=0;IN3=1;IN4=0;delay(800); }void turn_left() { zkb1=a;zkb2=b;IN1=1;IN2=0;IN3=0;IN4=1;delay(200); }void turn_right() { zkb1=a;zkb2=b;IN1=0;IN2=1;IN3=1;IN4=0;delay(200); }void stop(c){zkb1=20;zkb2=20;IN1=1;IN2=1;IN3=1;IN4=1;delay(c);}void main(){ init();zkb1=10;zkb2=10;while(1){if(out1==0&&out2==0&&out3==0&&out4==0) { a=50;b=50;toward();}if(((out1==1)||(out2==1))&&(out3==0)&&(out4==0)){ stop(60);a=90;b=15;turn_right();}if((out1==0)&&(out2==0)&&((out3==1)||(out4==1))){ stop(60);a=15;b=90;turn_left();}if((out1==1)&&(out2==1)&&(out3==1)&&(out4==1)){stop(20);}if(zuo==1&&zhong==1&&you==1){ a=30;b=30;toward();}if(zuo==0&&zhong==1&&you==1){ stop(50);a=40;b=40;back();delay(600);a=90;b=30;turn_right();delay(2500);}if(zuo==1&&zhong==0&&you==1) { stop(50);a=40;b=40;back();delay(800);a=90;b=30;turn_right();delay(2500);}if(zuo==1&&zhong==1&&you==0) { stop(50);a=40;b=40;back();delay(600);a=30;b=90;turn_left();delay(2000);}if(zuo==0&&zhong==0&&you==1) { stop(50);a=40;b=40;back();delay(800);a=90;b=30;turn_right();delay(2500);}if(zuo==1&&zhong==0&&you==0) { stop(50);a=40;b=40;back();delay(800);a=30;b=90;turn_left();delay(2000); }if(zuo==0&&zhong==1&&you==0) { a=25;b=25;toward();}if(zuo==0&&zhong==0&&you==0) { stop(50);a=40;b=40;back();delay(600);a=90;b=30;turn_right();delay(2500);}}}。
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++;}。
基于51单片机智能巡线避障小车毕业论文
基于51单片机智能巡线避障小车1系统方案确定及主要元件的选择1.1 系统方案确定本次设计的智能小车实现的基本功能如下:❖实时检测路径,并按照指定路线行驶;❖实时检测障碍物,并躲过继续行驶;❖实时显示当前速度,并显示在lcd1602上为此以AT89C52为主控芯片,主要包括避障模块、电源模块、声控模块、电机驱动模块等,系统框图如图2.3所示。
通过寻迹及避障传感器来采集周围环境信息来反馈给CPU,通过主控的处理,来控制电机的运转,从而实现寻迹与避障,达到智能行驶。
且本设计添加了声控效果,通过声音传感器来对小车发出指令,让其行驶与停止。
为了能够更好地完成本次设计任务,我们采用三轮车,其前轮驱动,前轮左右两边各用一个电机驱动,调制前面两个轮子的转速起停从而达到控制转向的目的,后轮是万象轮,起支撑的作用,并通过软件程序控制,与硬件架构相结合,从而实线自动寻迹、避障的功能。
1.2 主要元件的选择1.2.1 主控器按照题目要求,控制器主要用于控制电机,通过相关传感器对路面的轨迹信息进行处理,并将处理信号传输给控制器,然后控制器做出相应的处理,实现电机的前进和后退,保证在允许范围内实线寻迹避障。
方案一:可以采用ARM为系统的控制器,优点是该系统功能强大,片上外设集成度搞密度高,提高了稳定性,系统的处理速度也很高,适合作为大规模实时系统的控制核心。
而小车的行进速度不可能太高,那么对系统处理信息的要求也就不会太高。
若采用该方案,必将在控制上遇到许许多多不必要增加的难题。
方案二:使用51单片机作为整个智能车系统的核心。
用其控制智能小车,既可以实现预期的性能指标,又能很好的操作改善小车的运行环境,且简单易上手。
对于我们的控制系统,核心主要在于如何实现小车的自动控制,对于这点,单片机就拥有很强的优势——控制简单、方便、快捷,单片机足以应对我们设计需求[5]。
51单片机算术运算功能强,软件编程灵活、自由度大,功耗低、体积小、技术成熟,且价格低廉。
基于51的避障循迹重力感应遥控的智能小车设计(C语言)
基于51的避障/循迹/重力感应遥控的智能小车设计1 绪论1.1 选题背景随着汽车工业的迅速发展,关于汽车的研究也就越来越受人关注。
全国电子大赛和省内电子大赛几乎每次都有智能小车这方面的题目,全国各高校也都很重视该题目的研究。
可见其研究意义很大。
本设计就是在这样的背景下提出的,指导教师已经有充分的准备。
本题目是结合科研项目而确定的设计类课题。
设计的智能电动小车应该能够实现适应能力,能自动避障,可以智能规划路径。
智能化作为现代社会的新产物,是以后的发展方向,他可以按照预先设定的模式在一个特定的环境里自动的运作,无需人为管理,便可以完成预期所要达到的或是更高的目标。
同遥控小车不同,遥控小车需要人为控制转向、启停和进退,比较先进的遥控车还能控制器速度。
常见的模型小车,都属于这类遥控车;智能小车,则可以通过计算机编程来实现其对行驶方向、启停以及速度的控制,无需人工干预。
操作员可以通过修改智能小车的计算机程序来改变它的行驶方向。
因此,智能小车具有再编程的特性,是机器人的一种。
中国自1978年把“智能模拟”作为国家科学技术发展规划的主要研究课题,开始着力研究智能化。
从概念的引进到实验室研究的实现,再到现在高端领域(航天航空、军事、勘探等)的应用,这一过程为智能化的全面发展奠定基石。
智能化全面的发展是实现其对资源的合理充分利用,以尽可能少的投入得到最大的收益,大大提高工业生产的效率,实现现有工业生产水平从自动化向智能化升级,实现当今智能化发展由高端向大众普及。
从先前的模拟电路设计,到数字电路设计,再到现在的集成芯片的应用,各种能实现同样功能的元件越来越小为智能化产物的生成奠定了良好的物质基础。
智能小车,是一个集环境感知、规划决策,自动行驶等功能于一体的综合系统,它集中地运用了计算机、传感、信息、通信、导航、人工智能及自动控制等技术,是典型的高新技术综合体。
1.2 智能小车研究现状智能车辆作为智能交通系统的关键技术,是许多高新技术综合集成的载体。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
项目名称:智能小车
系别:信息工程系
专业:11电气工程及其自动化
姓名:刘亮、崔占闯、韩康
指导老师:王蕾
崔占闯联系邮箱:1308253761@
目录
摘要: (3)
关键词: (3)
绪论: (3)
一、系统设计 (4)
1.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驱动芯片,信号检测模块,循迹避障
绪论
(一)智能小车的作用和意义
自第一台工业机器人诞生以来,机器人的发展已经遍及机械、电子、冶金、交通、宇航、国防等领域。
近年来机器人的智能水平不断提高,并且迅速地改变着人们的生活方式。
人们在不断探讨、改造、认识自然的过程中,制造能替代人劳动的机器一直是人类的梦想。
随着科学技术的发展,机器人的感系统,对于视觉的各种技术而言图像处理技术已相当发达,而基于图像的理解技术还很落后,机器视觉需要通过大量的运算也只能识别一些结构化环境简单的目标。
视觉传感器的核心器件是摄像管或CCD,目前的CCD已能做到自动聚焦。
但CCD传感器的价格、体积和使用方式上并不占优势,因此在不要求清晰图像只需要粗略感觉的系统中考虑使用接近觉传感器是觉传感器种类越来越多,其中视觉传感器成为自动行走和驾驶的重要部件。
视觉的典型应用领域为自主式智能导航一种实用有效的方法。
机器人要实现自动导引循迹功能和避障功能就必须要感知导引线和障碍物,感知导引线相当给机器人一个视觉功能。
避障控制系统是基于自动导引小车系统,基于它的智能小车实现自动识别路线,判断并自动避开障碍,选择正确的行进路线。
使用传感器感知路线和障碍并作出判断和相应的执行动作。
该智能小车可以作为机器人的典型代表。
它可以分为三大组成部分:传感器检测部分、cpu、执行部分。
机器人要实现自动循迹避障功能,感知导引线和障碍物。
可以实现小车自动识别路线,选择正确的行进路线,并检测到障碍物自动躲避。
基于上述要求,传感检测部分考虑到小车一般不需要感知清晰的图像,只要求粗略感知即可,所以可以舍弃昂贵的CCD 传感器而考虑使用价廉物美的红外光电传感器来充当。
智能小车的执行部分,是由直流电机来充当的,主要控制小车的行进方向。
单片机驱动直流电机一般有两种方案:第一,勿需占用单片机资源,直接选择有PWM功能的单片机,这样可以实现精确调速;第二,可以由软件模拟PWM输出调制,需要占用单片机资源,难以精确调速,但单片机型号的选择余地较大。
考虑到实际情况,本文选择第二种方案。
CPU使用STC89C52单片机,配合软件编程实现。
(二)智能小车的现状
现智能小车发展很快,从智能玩具到其它各行业都有实质成果。
其基本可实现循迹、避障、检测贴片、寻光入库、避崖等基本功能,这几节的电子设计大赛智能小车又在向声控系统发展。
比较出名的飞思卡尔智能小车更是走在前列。
我此次的设计主要实现循迹避障这两
个功能
一、系统设计
本组智能小车的硬件主要有以STC89C52单片机作为核心的主控器部分、自动循迹+避障部分、电机驱动部分。
电机驱动部分和其他部分由一个电源通过串联供电。
小车硬件系统示意图如下:
1.1、任务及要求
设计一个基于直流电机的自动循迹避障小车,使小车能够自动检测地面黑色轨迹和道路两侧的挡板(没有黑线时),并沿着黑色轨迹和挡板行驶。
1.2、车体方案认证与选择
方案一:自己动手制作电动车,一方面材料缺少,另一方面制作过程要花费大量的时间,而且同学中手艺也不好,制作出来的小车还可能机械性能不好。
考虑到时间与性能这两方面,我们放弃了这一方案
方案二:购买小车全套零件,购买的小车全套零件具有组装完整的车架车轮、电机及其驱动电路。
易改装,好控制。
机械性能有保障。
小车图片如下:
综合考虑,最终选择方案二
二、硬件设计及说明
2.1循迹+避障模块
我们选择四路红外探测寻迹光电传感器
此模块是为智能小车、机器人等自动化机械装置提供一种多用途的红外线探测系统的解决方案。
使用红外线发射和接收管等分立元器件组成探头,并使用LM339 电压比较器(加入了迟滞电路更加稳定)做为核心器件构成中控电路。
此系统具有的多种探测功能能极大的满足各种自动化、智能化的小型系统的应用。
此模块的特点:
易于安装,使用简便;
4 路分别独立工作,工作时不受数量限制;
中控板与探头分开,安装位置不受限制;
模块高度≤10 毫米;
安全工作电压范围在 3伏特至 6 伏特之间;
4 路全开工作电流 30 毫安至 5
5 毫安之间。
2.2主控模块
我们采用宏晶公司的STC89C52单片机作为主控制器。
STC89C52是一个高速,低功耗,超强抗干扰的8位单片机,片内含32k 空间的可反复擦写100,000 次Flash 只读存储器,具有4K 的随机存取数据存储器(RAM),32 个I/O口,2个8位可编程定时计数器,且可在线编程、调试,方便地实现程序的下载与整机的调试。
时钟电路和复位电路(与单片机构成最小系统)
1)采用外部时钟,晶振频率为12MHZ
2)采用按键复位
2.3电机驱动模块
电机
电机采用直流减速电机,直流减速电机转动力矩大,体积小,重量轻,装配简单,使用方便。
由于其内部由高速电动机提供原始动力,带动变速(减速)齿轮组,可以产生较大扭力。
可选用减速比为1:74 的直流电机,减速后电机的转速为100r/min。
若车轮直径为6cm,
则小车的最大速度可以达到
V=2πr·v=2*3.14*0.03*100/60=0.314m/s
能够较好的满足系统的要求。
驱动
驱动模块采用专用芯片L298N 作为电机驱动芯片,L298N 是一个具有高电压大电流的全桥
驱动芯片,其响应频率高,一片L298N可以分别控制两个直流电机。
以下为L298N的引脚图
和输入输出关系表。
图L298N外部引脚表1 L298N输入输出关系
驱动电路的设计如图2 所示:
图2 L298N电机驱动电路
L298N 的5、7、10、12 四个引脚接到单片机上,通过对单片机的编程就可实现两个直流电机的PWM调速控制。
2.4电源模块
采用4节普通1.5V干电池单电源供电,采用串联方式同时给单片机与电机供电。
三、自动循迹避障小车总体设计
3.1 总体电路图。