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

合集下载

基于51单片机设计智能避障小车

基于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单片机的避障小车设计

基于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单片机的红外避障+超声波避障程序

基于51单片机的红外避障+超声波避障程序

基于51单⽚机的红外避障+超声波避障程序最近在学习关于51单⽚机控制智能⼩车,学习了很多⼤佬优秀的代码和思路受到了⼀些启发,决定按⾃⼰的逻辑尝试⼀下关于红外避障+超声波避障的程序经过实际测试,当PWM在50%左右,效果还⾏,但当全速前进时效果不是很理想代码还有待改进,有些地⽅逻辑⽐较混乱,单纯只是为了能跑通,有待优化先记录⼀下,毕竟也花了不少时间来写和调试#include<reg52.H>#include "test2.h"#include <stdlib.h>sbit P22 = P2^2;sbit P23 = P2^3;sbit P24 = P2^4;sbit TRIG = P2^1;sbit ECHO = P2^0;sbit left_zhangai = P3^4;sbit right_zhangai = P3^5;unsigned char flag = 0;unsigned char i;unsigned int out_TH0, out_TL0, distance;void left_bizhang(){for (i = 0; i < 30; i++) //90 = 90{car_left_backward();}}void right_bizhang(){for (i = 0; i < 30; i++) //90 = 90{car_right_backward();}}void all_bizhang(){for (i = 0; i < 30; i++) //90 = 90{car_right_backward();}}void back_bizhang(){for (i = 0; i < 10; i++)car_straight_backward();for (i = 0; i < 10; i++)car_left_backward();}void init_time(){TMOD = 0x11; //启动0 1两个定时器TH0 = 0;TL0 = 0;TR0 = 0;TR1 = 0;TH1 = 238;TL1 = 0;TF0 = 0; //中断溢出标志位TF1 = 1;ET0 = 1;ET1 = 1;EA = 1;}void run(){P22 = 1;P24 = 1;left_zhangai = 1;right_zhangai = 1;TRIG = 0; // 先给控制端初始化为0car_straight_forward_per50();distance = 100;while(1){/////////////////////////////label:if (left_zhangai == 1&&right_zhangai == 1){car_straight_forward_per50();}else{if (left_zhangai == 0&&right_zhangai == 0) {all_bizhang();}if (right_zhangai == 0&&left_zhangai == 1) {right_bizhang();}if (left_zhangai == 0&&right_zhangai == 1) {left_bizhang();}}init_time(); //初始化定时器flag = 0; //置溢出标志位为0//控制⼝发⼀个10US 以上的⾼电平TRIG = 1;TR1 = 1; //启动定时器1delay_10um(2);TRIG = 0;//等待接收端出现⾼电平while(!ECHO){if (TH1 == 0){distance = 200;goto label;}};TR0 = 1; //启动计时器开始计时while(ECHO){if (TH1 == 0){distance = 200;goto label;}}; //等待⾼电平结束TR0 = 0; //关闭低电平out_TH0 = TH0; //取定时器的值out_TL0 = TL0;distance = (TH0*256 + TL0)*1.7/100;if (flag == 1){flag = 0;}else if (distance >= 200){car_straight_forward_per50();}else if (distance <= 10){back_bizhang();}else if (distance <= 20){all_bizhang();}///////////////////////////////////////// }}void timer0() interrupt 1//中断函数{flag=1; //溢出标志位置1}。

基于51单片机的循迹避障小车的设计ppt课件

基于51单片机的循迹避障小车的设计ppt课件
8
主要模块的选择
A
主控器
B
传感器
C
驱动电机
D
电机驱动
51单片机
红外对管ST188+多集 成模块E18-D50NK
直流电机
(供电单元采用多节电池串联供电)
编辑版pppt
功率三极管
9
第三 部分
第三部分 硬件部分设计
主控器AT89C51 复位电路和时钟电路 传感器模块
编辑版pppt
10
主控器AT89C51
基于51单片机的 循迹避障小车的设计
编辑版pppt
1
目录
第一部分 研究背景
第二部分 系统方案
第三部分 硬件部分设计
第四部分 调试制作
编辑版pppt
2
第一 部分
第一部分 研究背景
研究现状 研究意义 主要内容
编辑版pppt
3
研究现状
在世界经济多元化的环境下,很
多国家都在积极开展研究和开发智能 车。在二十世纪高新技术不断发展的 时代,移动机器人是成为机器人技术 的一个重要分支。
编辑版pppt
循迹示意图 红外光电传感器ST188结构与实物图
15
避障模块
本设计避障模块拟选用的是集成模块E18-D50NK,该传感器是一种红外光电 管。这是一种集发射与接收于一体的光电式传感器,其检测距离可以根据我们的
需要进行调节。
此传感器探测距离远,抗干扰性强,且价格低廉,容易使用,已在机器人行业
中得到广泛应用,是我们避障功能设计的最佳选择。该传感器实物图如图:
该传感器原理:前方无障碍输出高电
平(1),有障碍输出口(黄色)电平会 从高电平变成低电平(0),工作原理已 经标在图上。背面图有一个电位器可

基于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单片机的模块化智能小车(有图有真相)!L298N 电机驱动芯片L电机驱动模块背面STC89C52最小系统背面小车底盘(拆自玩具遥控工程车)!5线4相步进电机(512:1)超声波测距模块装配好51最小系统和电机驱动模块的小车步进电机+超声模块装上了步进电机和超声模块连接好线后的造型+步进电机驱动电路ULN2003大功告成!土豆网上传了视频,但程序没有好好写,导致跑起来很不爽,这是很久以前的一个视频链接:/programs/view/q0naSUSlV-Q/欢迎大家多多交流QQ769942445这是源代码:#include "reg51.h"#include "intrins.h"#define uchar unsigned char#define uint unsigned int#define ulong unsigned long#define Moto3 P0/* sbit Moto3_a=P0^0; //5线4相步进电机sbit Moto3_b=P0^1;sbit Moto3_c=P0^2;sbit Moto3_d=P0^3;*/sbit Moto1_l=P2^0; //左电机sbit Moto1_r=P2^1;sbit Moto2_l=P2^2; //右电机sbit Moto2_r=P2^3;sbit TX=P2^4;sbit RX=P2^5;bitflag,flager;ucharhehe,flag_front,flag_left,flag_right;uint time;ulong S;ucharabcd[4]={0x01,0x02,0x04,0x08}; //电机导通相序A-B-C-D uchardcba[4]={0x08,0x04,0x02,0x01}; //电机导通相序D-C-B-Avoid delay1(uchar x){ uchara,b;for(a=0;a<x;a++)for(b=0;b<100;b++);}void Moto3_left(){ uchari,j;for(j=0;j<80;j++){ for(i=0;i<4;i++){ Moto3=abcd[i];delay1(10);}}}void Moto3_right(){ uchari,j;for(j=0;j<80;j++){ for(i=0;i<4;i++){ Moto3=dcba[i];delay1(10);}}}void delay(uchar n) //延时n*1ms{uchara,b,c;for(c=n;c>0;c--)for(b=142;b>0;b--)for(a=2;a>0;a--);}void left(){ Moto1_l=1;Moto1_r=0;Moto2_l=0;Moto2_r=1;}void right(){ Moto1_l=0;Moto1_r=1;Moto2_l=1;Moto2_r=0;}void go(){ Moto1_l=0;Moto1_r=1;Moto2_l=0;Moto2_r=1;}void back(){ Moto1_l=1;Moto1_r=0;Moto2_l=1;Moto2_r=0;}void stop(){ Moto1_l=1;Moto1_r=1;Moto2_l=1;Moto2_r=1;}void TX_10us() //启动一次模块{ TX=1;_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();TX=0;}void count() //计算{ time=TH0*256+TL0;S=(time*1.7)/100; //距离单位:cmTH0=0x00;TL0=0x00;if(S>30||flag==1) //10cm以内有效{ flag=0;}else{ flager=1; //障碍标志}}void test(){ TX_10us();while(!RX); //当RX为零时等待TR0=1; //开启计数while(RX); //当RX为1计数并等待TR0=0; //关闭计数count();}void delayer(uint n){ uinta,b,c;for(c=n;c>0;c--)for(b=100;b>0;b--)for(a=500;a>0;a--);}voidinit(){ TMOD=0x01;TH0=0x00;TL0=0x00;ET0=1;EA=1;}main(){ init();while(1)flag_front=flager;flager=0;Moto3_left();test();flag_left=flager;flager=0;aa: Moto3_right();test();flag_front=flager;flager=0;Moto3_right();test();flag_right=flager;flager=0;hehe=flag_front+(flag_left<<1)+(flag_right<<2);switch(hehe){ case 0x01:back();delayer(3);right();delayer(3);break;case 0x02:right();delayer(1);break;case 0x03:right();delayer(2);break;case 0x04:left();delayer(1);break;case 0x05:left();delayer(2);break;case 0x07:back();delayer(3);right();delayer(3);break;default:break;}go();flag_front=0;flag_left=0;flag_right=0;test();flag_right=flager;flager=0;Moto3_left();test();flag_front=flager;flager=0;Moto3_left();test();flag_left=flager;flager=0;hehe=flag_front+(flag_left<<1)+(flag_right<<2);switch(hehe){ case 0x01:back();delayer(3);right();delayer(3);break;case 0x02:right();delayer(1);break;case 0x03:right();delayer(2);break;case 0x04:left();delayer(1);break;case 0x05:left();delayer(2);break;case 0x07:back();delayer(3);right();delayer(3);break;default:break;}go();flag_front=0;flag_left=0;flag_right=0;gotoaa;}}void time0()interrupt 1{ flag=1;}。

基于51单片机循迹避障太阳能小车软硬件设计原理

基于51单片机循迹避障太阳能小车软硬件设计原理

基于51单片机循迹避障太阳能小车软硬件设计原理下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。

文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!一、引言一款基于51单片机的循迹避障太阳能小车是一种集成了光电传感器、红外传感器、电机驱动器等各种器件的智能小车。

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

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

基于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单片机小车循迹避障原理

51单片机小车循迹避障原理
51单片机小车循迹避障的原理主要包括以下步骤:
1. 传感器检测:小车通过安装的传感器检测路径和障碍物。

寻迹传感器利用黑色对光线的反射率小这个特点,当检测到黑线时,传感器上的开关指示灯会熄灭,输出的是高电平。

如果没有经过黑线,一直保持低电平。

红外传感器在有障碍物时灯会亮,所以有障碍物代表低电平,没有障碍物高电平。

2. 信息处理:51单片机接收并处理传感器的信号。

根据传感器的信号,单片机判断出小车是否偏离了预定路径,或者前方是否有障碍物。

3. 电机控制:根据信息处理的结果,单片机控制电机转动。

例如,如果检测到小车偏离了预定路径,单片机将发送信号使电机转动,使小车回到正确的路径上。

如果检测到前方有障碍物,单片机将发送信号使电机停止转动,避免小车撞到障碍物。

4. 循环检测:小车在行进过程中不断重复上述步骤,确保能够持续地沿着预定路径行进并避开障碍物。

这就是51单片机小车循迹避障的基本原理。

实际的实现可能会更复杂,可能需要更多的传感器和控制逻辑来确保小车的稳定和安全运行。

寻迹避障小车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脚下管的发射极分别单独引出以便接入电流采样电阻,形成电流传感信号。

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

基于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单片机智能巡线避障小车毕业论文

基于51单片机智能巡线避障小车毕业论文

基于51单片机智能巡线避障小车1系统方案确定及主要元件的选择1.1 系统方案确定本次设计的智能小车实现的基本功能如下:❖实时检测路径,并按照指定路线行驶;❖实时检测障碍物,并躲过继续行驶;❖实时显示当前速度,并显示在lcd1602上为此以AT89C52为主控芯片,主要包括避障模块、电源模块、声控模块、电机驱动模块等,系统框图如图2.3所示。

通过寻迹及避障传感器来采集周围环境信息来反馈给CPU,通过主控的处理,来控制电机的运转,从而实现寻迹与避障,达到智能行驶。

且本设计添加了声控效果,通过声音传感器来对小车发出指令,让其行驶与停止。

为了能够更好地完成本次设计任务,我们采用三轮车,其前轮驱动,前轮左右两边各用一个电机驱动,调制前面两个轮子的转速起停从而达到控制转向的目的,后轮是万象轮,起支撑的作用,并通过软件程序控制,与硬件架构相结合,从而实线自动寻迹、避障的功能。

1.2 主要元件的选择1.2.1 主控器按照题目要求,控制器主要用于控制电机,通过相关传感器对路面的轨迹信息进行处理,并将处理信号传输给控制器,然后控制器做出相应的处理,实现电机的前进和后退,保证在允许范围内实线寻迹避障。

方案一:可以采用ARM为系统的控制器,优点是该系统功能强大,片上外设集成度搞密度高,提高了稳定性,系统的处理速度也很高,适合作为大规模实时系统的控制核心。

而小车的行进速度不可能太高,那么对系统处理信息的要求也就不会太高。

若采用该方案,必将在控制上遇到许许多多不必要增加的难题。

方案二:使用51单片机作为整个智能车系统的核心。

用其控制智能小车,既可以实现预期的性能指标,又能很好的操作改善小车的运行环境,且简单易上手。

对于我们的控制系统,核心主要在于如何实现小车的自动控制,对于这点,单片机就拥有很强的优势——控制简单、方便、快捷,单片机足以应对我们设计需求[5]。

51单片机算术运算功能强,软件编程灵活、自由度大,功耗低、体积小、技术成熟,且价格低廉。

《基于51单片机的红外避障自动车的实现》技术报告

《基于51单片机的红外避障自动车的实现》技术报告

《基于51单片机的红外避障自动车的实现》技术报告技术报告:基于51单片机的红外避障自动车的实现引言红外避障技术在自动车领域中具有重要的应用潜力。

本报告旨在介绍一种基于51单片机的红外避障自动车的实现方法。

该自动车能够通过红外遥感技术检测周围环境并避开障碍物,实现自主导航功能。

一、系统硬件设计1.硬件平台选择本系统主要采用51单片机作为主控制器,因其资源丰富、易于编程和低成本等特点。

另外,还需要模块包括红外传感器模块和马达驱动模块。

2.红外传感器模块设计红外传感器模块通过红外发射管和接收管组成。

发射管发出红外光,在遇到障碍物时,被障碍物反射回的红外光通过接收管被接收到。

根据接收到的光线强度和反射时间,可以确定是否有障碍物存在。

3.马达驱动模块设计马达驱动模块通过电路连接到51单片机输出口,用于控制电机的转动。

当检测到有障碍物存在时,系统会发送信号给马达驱动模块,从而控制车辆停止或改变方向。

二、系统软件设计1.硬件初始化在程序的开始部分,需要对51单片机和各个硬件模块进行初始化,包括设置引脚的输入输出方式、红外传感器和马达的初始化等。

2.红外传感器数据采集与处理通过相关的接口和程序代码,可以实现对红外传感器的数据采集和处理。

利用红外传感器模块发射红外光,并通过接收模块接收到反射的光线信号。

通过采集到的信号强度和反射时间,可以判断是否有障碍物存在。

3.障碍物检测与避障根据红外传感器采集到的数据,判断是否有障碍物存在。

如果有障碍物,则需要控制车辆停止或改变方向来避开障碍物。

通过控制马达驱动模块,可以实时改变车辆的行驶方向。

4.车辆导航控制车辆导航控制部分主要是根据红外传感器采集到的数据和障碍物检测结果,实时控制车辆的行驶方向。

通过对数据的处理和逻辑判断,可以决定车辆的下一步行动,例如前进、后退、左转或右转等。

三、实验结果与讨论在实验中,我们成功实现了基于51单片机的红外避障自动车的功能。

通过红外传感器模块,我们可以有效地检测到周围的障碍物,并及时避开,实现了自主导航。

51自动避障小车整体程序

51自动避障小车整体程序

#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit Trig=P3^0;sbit Echo=P3^3;sbit control=P3^5;uint dis,flag=0,timeH,timeL,succeed_flag,time;void tran_ret();void delay_nus(uint n);void delay_ms(long int m);void delay_n100us(uint n);void run();//void backrun();//void freestop();void turnleft();void turnright ();void Sturnround();void Nturnround();void servo_turn(int gao);//********************************************************************** //主函数void main(){TMOD=0x01;EA=1;ET0=1;IT1=0;Trig=0;servo_turn(0);delay_ms(5000);while(1){tran_ret();if(dis>30){run();}else{P1=0XFF;servo_turn(-90);delay_ms(5000);tran_ret();if (dis>30){turnleft();P1=0XFF;servo_turn(0);delay_ms(5000);run();}else{P1=0XFF;servo_turn(90);delay_ms(5000);tran_ret();if (dis>30){turnright();servo_turn(0);delay_ms(5000);run();}else{Nturnround ();servo_turn(0);delay_ms(5000);run();}}}}}//***************************************************************************** ********//子函数//***************************************************************************** *********//全速前进void run(){P1=0xaa;//delay_ms(60);//P1=0xff;}/*//全速后退void backrun() { P1=0x55;delay_ms(19);P1=0x00;delay_ms(1); } *///自由停止/*void freestop () {P1=0x00;delay_ms(20); } *///左转void turnleft() {P1=0x0a;delay_ms(100);//P1=0xff;}//右转void turnright() {P1=0xa0;delay_ms(100); // P1=0xff;}/*//原地顺时针打转void Sturnround() {P1=0xa0;delay_ms(40);P1=0x00;delay_ms(1); } *///原地逆时针打转void Nturnround () {P1=0x0a;delay_ms(100);// P1=0x00;}//发射void tran_ret(){EA=0; //关总中断Trig=1; //超声波输入端delay_nus(20);//延时20usTrig=0; //产生一个20us的脉冲while(Echo==0); //等待Echo回波引脚变高电平succeed_flag=0; //清测量成功标志EA=1;EX1=1; //打开外部中断0TH0=0;//定时器1清零TL0=0; //定时器1清零TF0=0; //计数溢出标志ET0=1;TR0=1; //启动定时器1delay_ms(20); //等待测量的结果TR0=0; //关闭定时器1EX1=0; //关闭外部中断0if(succeed_flag==1){time=timeH*256+timeL;dis=time*0.0182; //cm/////12MHZ疑问之处us//////////////////////////////////////// display(distance);}if(succeed_flag==0){dis=200; ////////////// test = !test; //测试灯变化}}//延时函数1void delay_ms(long int n){uint i,j;for(i=n;i>0;i--)for(j=110;j>0;j--);}//延时函数2void delay_nus(uint n){uint i;for(i=n;i>0;i--);}//延时函数3void delay_n100us(uint n){uint i;while(n--){for(i=7;i>0;i--);}}//中断函数void exter1() interrupt 2 // 外部中断1 {timeH =TH0; //取出定时器的值timeL =TL0; //取出定时器的值succeed_flag=1;//至成功测量的标志EX1=0; //关闭外部中断TR0=0;}void servo_turn(int offset){int servo,gao;control=0;servo=14;offset/=9;gao=servo-offset;control=1;delay_n100us(gao);control=0;delay_n100us(200-gao);}。

51避障小车

51避障小车
SB1=!SB1; //蜂鸣器闪响
return;
}
void ControlCar(unsigned char ConType) //定义电机控制子程序
{
M1A=0; //将M1电机A端初始化为0
M1B=0; //将M1电机B端初始化为0
M2A=0; //将M2电机A端初始化为0
M2B=0; //将M2电机B端初始化为0
switch(ConType) //判断用户设定电机形式
{
case 1: //前进//判断用户是否选择形式1
{ M1A=1; //M1电机正转
M2A=1; //M2电机正转
break;
}
case 2: //后退//判断用户是否选择形式2
{ M1B=1; //M1电机反转
M2B=1; //M2电机反转
break;
}
case 3: //左转//判断用户是否选择形式3
{ M1B=1; //M1电机反转
M2A=1; //M2电机正转
break;
}
case 4: //右转//判断用户是否选择形式4
{ M1A=1; //M1电机正转
M2B=1; //M2电机反转
break;
}
case 8: //停止//判断用户是否选择ቤተ መጻሕፍቲ ባይዱ式8
sbit FontIR=P3^7; //定义前方正前方红外探头端口
sbit M1A=P0^0; //定义左侧电机驱动A端
sbit M1B=P0^1; //定义左侧电机驱动B端
sbit M2A=P0^2; //定义右侧电机驱动A端
sbit M2B=P0^3; //定义右侧电机驱动B端
sbit B1=P0^4; //定义语音识识别传感器端口

基于51的避障循迹重力感应遥控的智能小车设计(C语言)

基于51的避障循迹重力感应遥控的智能小车设计(C语言)

基于51的避障/循迹/重力感应遥控的智能小车设计1 绪论1.1 选题背景随着汽车工业的迅速发展,关于汽车的研究也就越来越受人关注。

全国电子大赛和省内电子大赛几乎每次都有智能小车这方面的题目,全国各高校也都很重视该题目的研究。

可见其研究意义很大。

本设计就是在这样的背景下提出的,指导教师已经有充分的准备。

本题目是结合科研项目而确定的设计类课题。

设计的智能电动小车应该能够实现适应能力,能自动避障,可以智能规划路径。

智能化作为现代社会的新产物,是以后的发展方向,他可以按照预先设定的模式在一个特定的环境里自动的运作,无需人为管理,便可以完成预期所要达到的或是更高的目标。

同遥控小车不同,遥控小车需要人为控制转向、启停和进退,比较先进的遥控车还能控制器速度。

常见的模型小车,都属于这类遥控车;智能小车,则可以通过计算机编程来实现其对行驶方向、启停以及速度的控制,无需人工干预。

操作员可以通过修改智能小车的计算机程序来改变它的行驶方向。

因此,智能小车具有再编程的特性,是机器人的一种。

中国自1978年把“智能模拟”作为国家科学技术发展规划的主要研究课题,开始着力研究智能化。

从概念的引进到实验室研究的实现,再到现在高端领域(航天航空、军事、勘探等)的应用,这一过程为智能化的全面发展奠定基石。

智能化全面的发展是实现其对资源的合理充分利用,以尽可能少的投入得到最大的收益,大大提高工业生产的效率,实现现有工业生产水平从自动化向智能化升级,实现当今智能化发展由高端向大众普及。

从先前的模拟电路设计,到数字电路设计,再到现在的集成芯片的应用,各种能实现同样功能的元件越来越小为智能化产物的生成奠定了良好的物质基础。

智能小车,是一个集环境感知、规划决策,自动行驶等功能于一体的综合系统,它集中地运用了计算机、传感、信息、通信、导航、人工智能及自动控制等技术,是典型的高新技术综合体。

1.2 智能小车研究现状智能车辆作为智能交通系统的关键技术,是许多高新技术综合集成的载体。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit IN1=P2^1;//左电机输入端1
sbit IN2=P2^2;//左电机输入端2
sbit IN3=P2^3;//右电机输入端1
sbit IN4=P2^4;//右电机输入端2
sbit 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();//延时20us
TX=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;//置溢出标志位为0
s=999;//直行控制
}
else
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
s=(time*1.7)/100;//距离计算公式
}
}
else
{
s=999;
}
}
}
void time0init()//定时器0初始化
{
TMOD|=0x01;//设置定时器0为工作方式1
TH0=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();
}
}
}。

相关文档
最新文档