简易智能小车_源程序
- 格式:doc
- 大小:18.00 KB
- 文档页数:3
简易智能小车——2003年全国大学生电子设计竞赛,c51源程序系统的单片机程序#include "reg52.h"#define det_Dist 2.55 //单个脉冲对应的小车行走距离,其值为车轮周长/4 #define RD 9 //小车对角轴长度#define PI 3.1415926#define ANG_90 90#define ANG_90_T 102#define ANG_180 189/*============================全局变量定义区============================*/sbit P10=P1^0; //控制继电器的开闭sbit P11=P1^1; //控制金属接近开关sbit P12=P1^2; //控制颜色传感器的开闭sbit P07=P0^7; //控制声光信号的开启sbit P26=P2^6; //接收颜色传感器的信号,白为0,黑为1sbit P24=P2^4; //左sbit P25=P2^5; //右接收左右光传感器的信号,有光为0unsigned char mType=0; //设置运动的方式,0 向前1 向左2 向后3 向右unsigned char Direction=0; //小车的即时朝向0 朝上1 朝左2 朝下3 朝右unsigned sX=50; unsigned char sY=0; //小车的相对右下角的坐标CM(sX,sY)unsigned char StartTask=0; //获得铁片后开始执行返回卸货任务,StartTask置一unsigned char Inter_EX0=0; // 完成一个完整的任务期间只能有一次外部中断// Inter_EX0记录外部中断0的中断状态// 0 动作最近的前一次未中断过,// 1 动作最近的前一次中断过unsigned char cntIorn=0; //铁片数unsigned char bkAim=2; //回程目的地,0为A仓库,1为B仓库,2为停车场,//(在MAIN中接受铁片颜色判断传感器的信号来赋值)unsigned char Light_Flag=0;//进入光引导区的标志(1)unsigned int cntTime_5Min=0;//时间周期数,用于T0 精确定时unsigned int cntTime_Plues=0; //霍尔开关产生的脉冲数/*============================全局变量定义区============================*//*------------------------------------------------*//*-----------------通用延迟程序-------------------*//*------------------------------------------------*/void delay(unsigned int time) // time*0.5ms延时{unsigned int i,j;for(j=0;j<time;j++){for(i=0;i<60;i++){;}}}/*-----------------------------------------------*//*-------------------显示控制模块----------------*//*-----------------------------------------------*//*数码管显示,显示铁片的数目(设接在P0,共阴)*/void Display(unsigned char n){charNumb[12]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x37,0x7 7};P0=Numb[n];}/*-----------------------------------------------*//*-------------------传感器模块------------------*//*-----------------------------------------------*//*光源检测程序: *//*用于纠正小车运行路线的正确性*/unsigned char LightSeek(){ void Display(unsigned char);bit l,r;l=P24;r=P25;if(l==0&&r==1){//Display(1);return (3); //偏左,向右开}if(r==0&&l==1){//Display(3);return(1); //偏右,向左开}if((l==1&&r==1)||(l==0&&r==0)){//Display(9);return(0); //没有偏离,前进}}/*铁片检测程序: *//*判断铁片的颜色,设定bkAim,0为A仓库,1为B仓库,2为停车场*/ void IornColor(){delay(4000);bkAim=(int)(P26);Display((int)(P26)+2);}/*-----------------------------------------------*//*------------------运动控制模块-----------------*//*-----------------------------------------------*//*====基本动作层:完成基本运动动作的程序集====*//*运动调整程序: *//*对小车的运动进行微调*/void ctrMotor_Adjust(unsigned char t){if(t==0){P2=P2&240|11; //用来解决两电机不对称的问题delay(6);}if(t==3){P2=P2&250; //向左走delay(1);}if(t==1){P2=(P2&245);delay(1); //向右走}P2=((P2&240)|15);delay(10);}/*直走程序: *//*控制小车运动距离,dist为运动距离(cm),type为运动方式(0 2)*/ /*只改变小车sX 和sY的值而不改变Direction的值. */ void ctrMotor_Dist(float dist,unsigned char type){unsigned char t=0;mType=type;P2=((P2&240)|15);cntTime_Plues=(int)(dist/det_Dist);while(cntTime_Plues){if(Inter_EX0==1&&StartTask==0){cntTime_Plues=0;break;}if(Light_Flag==1) t=LightSeek();if(type==0) //向前走{P2=P2&249;delay(40);ctrMotor_Adjust(t);}if(type==2) //向后退{P2=P2&246;delay(50);ctrMotor_Adjust(t);}P2=((P2&240)|15);if(mType==2) delay(60);//刹车制动0.5mselse delay(75);}}/*拐弯程序: *//*控制小车运动角度,type为运动方式(1 3)*//*只改变小车Direction的值而不改变sX 和sY的值*/void ctrMotor_Ang(unsigned char ang,unsigned char type,unsigned char dir) {unsigned char i=0;mType=type;P2=((P2&240)|15);cntTime_Plues=(int)((PI*RD*90/(180*det_Dist)*1.2)*ang/90);while(cntTime_Plues){if(Inter_EX0==1&&StartTask==0){cntTime_Plues=0;break;}if(type==1) //向左走{P2=P2&250;delay(100);ctrMotor_Adjust(0);}if(type==3) //向右走{P2=P2&245;delay(100);ctrMotor_Adjust(0);}P2=((P2&240)|15);delay(50);//刹车制动0.5ms}if(!(Inter_EX0==1&&StartTask==0)){Direction=dir;}}/*====基本路线层:描述小车基本运动路线的程序集====*//*当小车到达仓库或停车场时,放下铁片或停车(0,1为仓库,2为停车场)*/ void rchPlace(){unsigned int time,b,s,g;time=(int)(cntTime_5Min*0.065535);//只有一个数码管时,轮流显示全过程秒数个十百b=time%100;s=(time-b*100)%100;g=(time-b*100-s*10)%10;if(bkAim==2){//到达停车场了,停车EA=0;P2=((P2&240)|15);while(1){Display(10); //Ndelay(2000);Display(cntIorn);delay(2000);Display(11);//Adelay(2000);Display(b);delay(2000);Display(s);delay(2000);Display(g);delay(2000);}}else{if(Inter_EX0==1&&StartTask==1)P10=0; //到达仓库,卸下铁片}}/*无任务模式: *//*设置小车的固定运动路线,未发现铁片时的运动路线*/void BasicRoute(){ //Light_Flag=1;ctrMotor_Dist(153,0);//Light_Flag=0;ctrMotor_Ang(ANG_90,1,1);ctrMotor_Dist(100-sX,0);ctrMotor_Dist(125,2);ctrMotor_Dist(73,0);ctrMotor_Ang(ANG_90,1,2);//Light_Flag=1;ctrMotor_Dist(153,0);//Light_Flag=0;ctrMotor_Ang(ANG_180,1,0);rchPlace();}/*任务模式: *//*设置小车的发现铁片后的运动路线*/void TaskRoute(){//基本运行路线表,记载拐弯0 向前1 左拐2 向后3 右拐,正读去A区;反读去B区StartTask=1;ctrMotor_Ang(ANG_90_T,1,2);if(bkAim==1) //仓库A{ctrMotor_Dist(10,0);P2=((P2&240)|15);delay(60);ctrMotor_Ang(ANG_90_T,1,3);ctrMotor_Dist(100-sX,2);ctrMotor_Ang(ANG_90_T,1,2);Light_Flag=1;ctrMotor_Dist(153,2);Light_Flag=0;// ctrMotor_Ang(208,1,0);}else if(bkAim==0) //仓库B{ctrMotor_Dist(10,0);P2=((P2&240)|15);delay(60);ctrMotor_Ang(ANG_90_T,1,3);ctrMotor_Dist(100-sX,0);ctrMotor_Ang(ANG_90_T,1,0);Light_Flag=1;ctrMotor_Dist(153,2);Light_Flag=0;//ctrMotor_Ang(208,1,0);}delay(5000);rchPlace();}/*---------------------------------------------*//*-------------------主程序段------------------*/ /*---------------------------------------------*/void main(){delay(4000);P2=0xff; //初始化端口P07=0;P1=0;TMOD=0x01; //初始化定时器0/1 及其中断TL0=0;TH0=0;TR0=1;ET0=1;ET1=1;IT0=1; //初始化外部中断EX0=1;IT1=1;EX1=1;EA=1;P11=1;while(1){Display(cntIorn);bkAim=2;BasicRoute();if(Inter_EX0==1){TaskRoute();//按获得铁片后的路线运动IE0=0;EX0=1;}Inter_EX0=0;}}/*----------------------------------------------------*//*----------------------中断程序段--------------------*//*----------------------------------------------------*//*定时器0中断程序: *//*当时间过了5分钟,则就地停车并进入休眠状态*/void tmOver(void) interrupt 1{cntTime_5Min++;TL0=0;TH0=0;if(cntTime_5Min>=4520){Display(5);P2=((P2&240)|15);EA=0; //停车程序P07=1;delay(4000);PCON=0X00;while(1);}}/*外部中断0中断程序: *//*发现铁片,发出声光信号并将铁片吸起,发光二极管和蜂鸣器*//*并联在一起(设接在P07). 0为A仓库,1为B仓库,2为停车场*/ void fndIorn(void) interrupt 0{unsigned char i;P10=1;P2=((P2&240)|15); //停车P07=1;delay(1000);//刹车制动0.5msP07=0;Inter_EX0=1;cntIorn++;Display(cntIorn);for(i=0;i<40;i++){P2=P2&249;delay(2);P2=((P2&240)|15);delay(2);}P2=P2&249;delay(100);P2=((P2&240)|15); //停车IornColor(); //判断铁片黑白,设置bkAimfor(i=0;i<95;i++){P2=P2&249;delay(3);P2=((P2&240)|15);delay(2);}P2=((P2&240)|15); //停车delay(4000); //把铁片吸起来EX0=0;}/*外部中断1中断程序: *//*对霍尔开关的脉冲记数,对小车的位置进行记录,以便对小车进行定位*/ void stpMove(void) interrupt 2{cntTime_Plues--;if(Direction==0) //向上{if(mType==0) sY+=det_Dist;else if(mType==2)sY-=det_Dist;}else if(Direction==1) //向左{if(mType==0) sX+=det_Dist;else if(mType==2)sX-=det_Dist;}else if(Direction==2) //向下{if(mType==0) sY-=det_Dist;else if(mType==2)sY+=det_Dist;}else if(Direction==3) //向右{if(mType==0) sX-=det_Dist;else if(mType==2)sX+=det_Dist;}}。
机器人智能小车制作与编程
一、智能小车的制作
1、准备材料:电机、智能小车及其相关的板、轮子、电池、杜邦线、螺丝刀、钳子、电钻、活动榫头、把手以及其他相关材料。
2、连接电机与电池:将电机与电池连接起来,用杜邦线将正极引脚
连接到电机的正极,负极引脚连接到电机的负极,确保电池与电机之间的
稳定连接和电路的正确性。
3、安装电机:将电机安装在智能小车的底盘上,使用螺丝刀将电机
固定在底盘上,确保电机的稳定性和牢固性。
4、连接轮子:将轮子连接到电机上,将活动榫头连接到轮子上,再
将把手连接到活动榫头上,以保证轮子与电机之间的稳定连接。
5、安装智能小车板:将智能小车板安装在轮子上,使用螺丝刀将其
固定在轮子上,以保证智能小车板的稳定性和牢固性。
二、智能小车的编程
2、配置参数:将智能小车的电机、电池、摄像头等硬件连接到计算
机上,打开Arduino IDE软件,根据硬件的设置进行参数配置,确保硬件
参数的正确性。
3、编写代码:根据智能小车的功能,利用Arduino IDE进行软件编写,编写完成后,将代码上传到智能小车板上。
多功能电动智能小车学院:电子科学与工程学院一引言1.作品设计的目的:本次设计智能小车的目的是为了实践电路设计的方法和技巧,将书本中的理论知识运用到实践中去,做到活学活用,深入了解电子元器件及其他元器件的基本用途和使用方法,并且能够灵活快速的判断电路中出现的故障,学会独立设计电路,积累更多的设计经验,加强并掌握焊接的能力和技巧,完成预期的要求。
2.作品设计的意义:智能小车实质上是众所周知的简易机器人雏形。
机器人设计是一个极富挑战性的高技术密集型项目,融小车机械、机器人学、机电一体化、单片机、数据融合、精密仪器、实时数字信号处理、图象处理与图象识别、知识工程与专家系统、决策、轨迹规划、自组织与自学习理论、多智能体协调、以及无线通讯等理论和技术于一体,既是典型的智能机器人系统,又为研究发展多智能体系统、多机器人之间的合作与对抗提供了生动的研究模型。
机器人设计通过提供标准任务,使研究人员利用各种技术来获得最佳解决方案。
机器人设计所采用的理论与技术可应用于工业生产、自动化流水线、救援、教育等领域,从而有效推动国家科学技术等其他高、精、尖领域的发展本小组本次研制的多功能智能小车具有寻迹、避障、消防和转向指示功能,可用与探测火源以及到某些人类不便接近的地点执行特殊任务,同时也是在机器人研究领域做一次大胆尝试。
3简易智能小车的原理:以单片机为电路的中央处理器来处理传感器采集到的数据,处理完毕后通过电机驱动电路来驱动电机。
电源部分为整个电路模块提供动力。
整体电路共分为七个部分:MCU控制电路、电机驱动电路、电源供电电路、寻迹检测电路、避障检测电路、LED显示部分,探测火源与灭火部分。
二总体方案设计(1)电动车车体的选择方案一:自制小车。
可在车模店选购配件组装,或者自行加工。
优点:这种方法能够制作出完全符合自身设计意图的车体。
缺点:需要较多时间和高水平的加工工艺。
方案二:配置成品的玩具电动小汽车。
优点:较方便。
缺点:不完全符合使用要求,需要做大量修改。
智能小车程序(共三个)第一个:#include "reg52.h"#define det_Dist 2.55 //单个脉冲对应的小车行走距离,其值为车轮周长/4#define RD 9 //小车对角轴长度#define PI 3.1415926#define ANG_90 90#define ANG_90_T 102#define ANG_180 189/*============================全局变量定义区============================*/sbit P10=P1^0; //控制继电器的开闭sbit P11=P1^1; //控制金属接近开关sbit P12=P1^2; //控制颜色传感器的开闭sbit P07=P0^7; //控制声光信号的开启sbit P26=P2^6; //接收颜色传感器的信号,白为0,黑为1sbit P24=P2^4; //左sbit P25=P2^5; //右接收左右光传感器的信号,有光为0unsigned char mType=0; //设置运动的方式,0 向前1 向左2 向后3 向右unsigned char Direction=0; //小车的即时朝向0 朝上1 朝左2 朝下3 朝右unsigned sX=50; unsigned char sY=0; //小车的相对右下角的坐标CM(sX,sY)unsigned char StartTask=0; //获得铁片后开始执行返回卸货任务,StartTask置一unsigned char Inter_EX0=0; // 完成一个完整的任务期间只能有一次外部中断// Inter_EX0记录外部中断0的中断状态// 0 动作最近的前一次未中断过,// 1 动作最近的前一次中断过unsigned char cntIorn=0; //铁片数unsigned char bkAim=2; //回程目的地,0为A仓库,1为B仓库,2为停车场,//(在MAIN中接受铁片颜色判断传感器的信号来赋值)unsigned char Light_Flag=0;//进入光引导区的标志(1)unsigned int cntTime_5Min=0;//时间周期数,用于T0 精确定时unsigned int cntTime_Plues=0; //霍尔开关产生的脉冲数/*============================全局变量定义区============================*//*------------------------------------------------*//*-----------------通用延迟程序-------------------*//*------------------------------------------------*/void delay(unsigned int time) // time*0.5ms延时{unsigned int i,j;for(j=0;j<time;j++){for(i=0;i<60;i++){;}}}/*-----------------------------------------------*//*-------------------显示控制模块----------------*//*-----------------------------------------------*//*数码管显示,显示铁片的数目(设接在P0,共阴)*/void Display(unsigned char n){char Numb[12]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x37,0x77}; P0=Numb[n];}/*-----------------------------------------------*//*-------------------传感器模块------------------*//*-----------------------------------------------*//*光源检测程序: *//*用于纠正小车运行路线的正确性*/unsigned char LightSeek(){ void Display(unsigned char);bit l,r;l=P24;r=P25;if(l==0&&r==1){//Display(1);return (3); //偏左,向右开}if(r==0&&l==1){//Display(3);return(1); //偏右,向左开}if((l==1&&r==1)||(l==0&&r==0)){//Display(9);return(0); //没有偏离,前进}}/*铁片检测程序: *//*判断铁片的颜色,设定bkAim,0为A仓库,1为B仓库,2为停车场*/ void IornColor(){delay(4000);bkAim=(int)(P26);Display((int)(P26)+2);}/*-----------------------------------------------*//*------------------运动控制模块-----------------*//*-----------------------------------------------*//*====基本动作层:完成基本运动动作的程序集====*//*运动调整程序: *//*对小车的运动进行微调*/void ctrMotor_Adjust(unsigned char t){if(t==0){P2=P2&240|11; //用来解决两电机不对称的问题delay(6);}if(t==3){P2=P2&250; //向左走delay(1);}if(t==1){P2=(P2&245);delay(1); //向右走}P2=((P2&240)|15);delay(10);}/*直走程序: *//*控制小车运动距离,dist为运动距离(cm),type为运动方式(0 2)*/ /*只改变小车sX 和sY的值而不改变Direction的值. */ void ctrMotor_Dist(float dist,unsigned char type){unsigned char t=0;mType=type;P2=((P2&240)|15);cntTime_Plues=(int)(dist/det_Dist);while(cntTime_Plues){if(Inter_EX0==1&&StartTask==0){cntTime_Plues=0;break;}if(Light_Flag==1) t=LightSeek();if(type==0) //向前走{P2=P2&249;delay(40);ctrMotor_Adjust(t);}if(type==2) //向后退{P2=P2&246;delay(50);ctrMotor_Adjust(t);}P2=((P2&240)|15);if(mType==2) delay(60);//刹车制动0.5mselse delay(75);}}/*拐弯程序: *//*控制小车运动角度,type为运动方式(1 3)*//*只改变小车Direction的值而不改变sX 和sY的值*/void ctrMotor_Ang(unsigned char ang,unsigned char type,unsigned char dir) {unsigned char i=0;mType=type;P2=((P2&240)|15);cntTime_Plues=(int)((PI*RD*90/(180*det_Dist)*1.2)*ang/90);while(cntTime_Plues){if(Inter_EX0==1&&StartTask==0){cntTime_Plues=0;break;}if(type==1) //向左走{P2=P2&250;delay(100);ctrMotor_Adjust(0);}if(type==3) //向右走{P2=P2&245;delay(100);ctrMotor_Adjust(0);}P2=((P2&240)|15);delay(50);//刹车制动0.5ms}if(!(Inter_EX0==1&&StartTask==0)){Direction=dir;}}/*====基本路线层:描述小车基本运动路线的程序集====*//*当小车到达仓库或停车场时,放下铁片或停车(0,1为仓库,2为停车场)*/void rchPlace(){unsigned int time,b,s,g;time=(int)(cntTime_5Min*0.065535);//只有一个数码管时,轮流显示全过程秒数个十百b=time%100;s=(time-b*100)%100;g=(time-b*100-s*10)%10;if(bkAim==2){//到达停车场了,停车EA=0;P2=((P2&240)|15);while(1){Display(10); //Ndelay(2000);Display(cntIorn);delay(2000);Display(11);//Adelay(2000);Display(b);delay(2000);Display(s);delay(2000);Display(g);delay(2000);}}else{if(Inter_EX0==1&&StartTask==1)P10=0; //到达仓库,卸下铁片}}/*无任务模式: *//*设置小车的固定运动路线,未发现铁片时的运动路线*/void BasicRoute(){ //Light_Flag=1;ctrMotor_Dist(153,0);//Light_Flag=0;ctrMotor_Ang(ANG_90,1,1);ctrMotor_Dist(100-sX,0);ctrMotor_Dist(125,2);ctrMotor_Dist(73,0);ctrMotor_Ang(ANG_90,1,2);//Light_Flag=1;ctrMotor_Dist(153,0);//Light_Flag=0;ctrMotor_Ang(ANG_180,1,0);rchPlace();}/*任务模式: *//*设置小车的发现铁片后的运动路线*/void TaskRoute(){//基本运行路线表,记载拐弯0 向前1 左拐2 向后3 右拐,正读去A区;反读去B区StartTask=1;ctrMotor_Ang(ANG_90_T,1,2);if(bkAim==1) //仓库A{ctrMotor_Dist(10,0);P2=((P2&240)|15);delay(60);ctrMotor_Ang(ANG_90_T,1,3);ctrMotor_Dist(100-sX,2);ctrMotor_Ang(ANG_90_T,1,2);Light_Flag=1;ctrMotor_Dist(153,2);Light_Flag=0;// ctrMotor_Ang(208,1,0);}else if(bkAim==0) //仓库B{ctrMotor_Dist(10,0);P2=((P2&240)|15);delay(60);ctrMotor_Ang(ANG_90_T,1,3);ctrMotor_Dist(100-sX,0);ctrMotor_Ang(ANG_90_T,1,0);Light_Flag=1;ctrMotor_Dist(153,2);Light_Flag=0;//ctrMotor_Ang(208,1,0);}delay(5000);rchPlace();}/*---------------------------------------------*//*-------------------主程序段------------------*/ /*---------------------------------------------*/void main(){delay(4000);P2=0xff; //初始化端口P07=0;P1=0;TMOD=0x01; //初始化定时器0/1 及其中断TL0=0;TH0=0;TR0=1;ET0=1;ET1=1;IT0=1; //初始化外部中断EX0=1;IT1=1;EX1=1;EA=1;P11=1;while(1){Display(cntIorn);bkAim=2;BasicRoute();if(Inter_EX0==1){TaskRoute();//按获得铁片后的路线运动IE0=0;EX0=1;}Inter_EX0=0;}}/*----------------------------------------------------*//*----------------------中断程序段--------------------*//*----------------------------------------------------*//*定时器0中断程序: *//*当时间过了5分钟,则就地停车并进入休眠状态*/ void tmOver(void) interrupt 1{cntTime_5Min++;TL0=0;TH0=0;if(cntTime_5Min>=4520){Display(5);P2=((P2&240)|15);EA=0; //停车程序P07=1;delay(4000);PCON=0X00;while(1);}}/*外部中断0中断程序: *//*发现铁片,发出声光信号并将铁片吸起,发光二极管和蜂鸣器*//*并联在一起(设接在P07). 0为A仓库,1为B仓库,2为停车场*/ void fndIorn(void) interrupt 0{unsigned char i;P10=1;P2=((P2&240)|15); //停车P07=1;delay(1000);//刹车制动0.5msP07=0;Inter_EX0=1;cntIorn++;Display(cntIorn);for(i=0;i<40;i++){P2=P2&249;delay(2);P2=((P2&240)|15);delay(2);}P2=P2&249;delay(100);P2=((P2&240)|15); //停车IornColor(); //判断铁片黑白,设置bkAimfor(i=0;i<95;i++)P2=P2&249;delay(3);P2=((P2&240)|15);delay(2);}P2=((P2&240)|15); //停车delay(4000); //把铁片吸起来EX0=0;}/*外部中断1中断程序: *//*对霍尔开关的脉冲记数,对小车的位置进行记录,以便对小车进行定位*/ void stpMove(void) interrupt 2{cntTime_Plues--;if(Direction==0) //向上{if(mType==0) sY+=det_Dist;else if(mType==2)sY-=det_Dist;}else if(Direction==1) //向左{if(mType==0) sX+=det_Dist;else if(mType==2)sX-=det_Dist;}else if(Direction==2) //向下{if(mType==0) sY-=det_Dist;else if(mType==2)sY+=det_Dist;}else if(Direction==3) //向右{if(mType==0) sX-=det_Dist;else if(mType==2)sX+=det_Dist;}第二个:#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit moto1=P1^5;sbit moto2=P1^6;sbit moto3=P2^0;sbit moto4=P2^1;sbit en1=P1^7;sbit en2=P2^2;//*循迹口七个红外传感器*///////////////sbit left1=P1^0;//*左边传感器*//sbit left2=P1^1;sbit left3=P1^2;sbit mid=P1^3;//*黑线位置*//sbit right1=P1^4;sbit right2=P2^3;sbit right3=P2^4;//*右边传感器*//////////////// sbit hled=P0^0;sbit bled=P0^1;sbit lled=P0^2;sbit rled=P0^3;sbit bizhang=P2^5;uchar pro_head;uchar pro_back;uchar i;uchar j; //前后占空比标志void delay(uint z){uchar i;while(z--){for(i=0;i<121;i++);}}/********初始化定时器,中断************/ void init(){TMOD=0x01;TH0=(65536-100)/256;TL0=(65536-100)%256;EA=1;TR0=1;en1=1;en2=1;}void time0(void) interrupt 1{i++;j++;if(i<=pro_back){en1=1;}else{en1=0;}if(i==40){en1=~en1;i=0;}if(j<=pro_head){en2=1;}else{en2=0;}if(j==40){en2=~en2;j=0;}TH0=(65536-100)/256;TL0=(65536-100)%256;}void qianjin()//*直行*///////////////////// {pro_back=15;pro_head=5;moto1=0;moto2=0;moto4=0;lled=1;rled=1;bled=1;}void turn_right1()//*右转1函数*//{pro_back=10;pro_head=15;moto1=0;moto2=1;moto3=1;moto4=0;}。
'*************************************************//***************************************************//// 智能小车控制器基于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;}}。
/*预处理命令*/#include<reg52.h> //包含单片机寄存器的头文件#include<intrins.h> //包含_nop_()函数定义的头文件#define uchar unsigned char#define uint unsigned int#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};sbit IRIN=P3^2; //红外接收器数据线sbit LCD_RS = P0^7;sbit LCD_RW = P0^6;sbit LCD_EN = P0^5;uchar begin[]={"My car!"};uchar cdis1[]={"jiansu!"};uchar cdis2[]={"qianjin!"};uchar cdis3[]={"jiasu!"};uchar cdis4[]={"zuozhuang!"};uchar cdis5[]={"STOP!"};uchar cdis6[]={"youzhuan!"};uchar cdis8[]={"daoche!"};sbit M1 = P1^0;sbit M2 = P1^1;sbit M3 = P1^2;sbit M4 = P1^3;sbit EN12 = P1^4;sbit EN34 = P1^5;uchar IRCOM[7];uchar m,n;uchar t=2;uchar g;uchar code digit[]={"0123456789"};uint v;uchar count;bit flag;void delayxms(uchar t);void delay(unsigned char x) ;void delay1(int ms);void motor();void lcd_display();/*检查LCD忙状态lcd_busy为1时,忙,等待。
十个中文例程教会你轻松上手制作Arduino智能小车Arduino简介Arduino 是一款便捷灵活、方便上手的开源电子原型平台,包含硬件(各种型号的arduino 板)和软件(arduino IDE)。
适用于艺术家、设计师、爱好者和对于“互动”有兴趣的朋友们。
Arduino能通过各种各样的传感器来感知环境,通过控制灯光、马达和其他的装置来反馈、影响环境。
板子上的微控制器可以通过Arduino的编程语言来编写程序,编译成二进制文件,烧录进微控制器对Arduino的编程是利用Arduino编程语言(基于Wiring)和Arduino开发环境(based on Processing)来实现的。
基于Arduino的项目,可以只包含Arduino,也可以包含Arduino和其他一些在PC上运行的软件,他们之间进行通信(比如Flash, Processing, MaxMSP)来实现。
你可以自己自己动手制作,也可以购买成品套装;Arduino所使用到的软件都可以免费下载。
硬件参考设计(CAD 文件)也是遵循availableopen-source协议, 你可以非常自由地根据你自己的要求去修改他们。
本文精选了Arduino教程、例程、设计案例,集结了国内外官方资料和资深工程师的经验,是学习AArduino的必备宝典。
小车、机器人篇1、Arduino互动玩偶BOXZ此设计制作在2013年Atmel AVR英雄视频大赛中荣获奖励,并且参与了2014的深圳制汇节。
BOXZ,昵称盒仔,其创意始于2012年6月初。
当时的想法是设计一款基于Arduino 的入门级机器人,可以和三五好友在有限的空间里进行踢足球等互动,而且要做到取材容易制作简单,在设计的上采用了模块化的接插结构,同时还要注重外观拥有个性。
2、基于Arduino的自平衡遥控小车车模平衡控制也是通过负反馈来实现的。
因为车模有两个轮子着地,车体只会在轮子滚动的方向上发生倾斜。
项目名称:智能小车系别:信息工程系专业: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驱动芯片,信号检测模块,循迹避障绪论(一)智能小车的作用和意义自第一台工业机械人诞生以来,机械人的进展已经遍及机械、电子、冶金、交通、宇航、国防等领域。
最近几年来机械人的智能水平不断提高,而且迅速地改变着人们的生活方式。
人们在不断探讨、改造、熟悉自然的进程中,制造能替代人劳动的机械一直是人类的妄图。
随着科学技术的进展,机械人的感系统,关于视觉的各类技术而言图像处置技术已相当发达,而基于图像的明白得技术还很掉队,机械视觉需要通过大量的运算也只能识别一些结构化环境简单的目标。
智能寻光小车源程序#include#define uchar unsigned char//宏定义#define uint unsigned int//宏定义sbit zuo1=P0^0;//定义控制左边电机的单片机引脚sbit zuo2=P0^1;//定义控制左边电机的单片机引脚sbit you1=P0^2;//定义控制右边电机的单片机引脚sbit you2=P0^3;//定义控制右边电机的单片机引脚sbit qh=P1^0;//前后控制位sbit zy=P1^1;//左右控制位sbit ting=P1^2;//停止控制位void delay(uint z)//一个带参数的延时程序{int i,j;//定义两个变量for(i=10;i>0;i--)for(j=z;j>0;j--);//将参数z赋值给j}void goright()//前进右转子程序{zuo1=0;zuo2=1;//左边轮子正转delay(24);//pwm有用值,越大左边方向的轮子越快zuo1=1;//关闭左边轮子you1=0;you2=1; //右边轮子正转delay(10);//pwm有用值,越大右边的轮子越快you1=1;//关闭右边轮子delay(80);//pwm无用值,越大,小车跑的越慢}void goleft()//前进左转子程序{zuo1=0;zuo2=1;//左边轮子正转delay(10);//pwm有用值,越大左边方向的轮子越快zuo1=1;//关闭左边轮子you1=0;you2=1; //右边轮子正转delay(24);//pwm有用值,越大右边的轮子越快you1=1;//关闭右边轮子delay(80);//pwm无用值,越大,小车跑的越慢}void down()//停止子程序{zuo1=1;zuo2=1;you1=1;you2=1; //左右轮全部停止}void main(){while(1){zy=1;qh=1;ting=1;//初始化各个引脚while(ting==1)//如果中间传感器检测到光亮则认为是遇到光源,就停止{down();}if(qh==0&&zy==1)//当前后传感器为0且左边传感器触发时,前进左转goleft();if(qh==0&&zy==0)//当前后传感器为0且右边传感器触发时,前进右转goright();}}。
#include<reg51.H>#include <intrins.h>//#include"lcd.h"sbit TX=P2^7;sbit RX=P2^6;sbit PWM=P1^4;sbit Beep=P3^7;sbit led1=P3^3;sbit led2=P3^4;sbit led3=P3^5;/***********蓝牙切换按键**********/sbit k1=P3^6;/***自定义一些数据,注意这些数据对应“51智能车蓝牙无线遥控.exe”软件上的数据设置**/#define leftdata 0x11#define rightdata 0x22#define forwarddata 0x33#define backdata 0x44#define stopdata 0x55#define uchar unsigned char#define uint unsigned intunsigned char receiveData,high_velosity,low_velosity; void UsartConfiguration();/***********电机端口定义************************/sbit IN1=P1^0; //为高电平时,左电机后转sbit IN2=P1^1; //为高电平时,左电机正转sbit IN3=P1^2; //为高电平时,右电机正转sbit IN4=P1^3; //为高电平时,右电机后转/**************无线遥控模块定义****************/sbit Key_A = P2^0; //B键信号端对应D0sbit Key_B = P2^1; //D键信号端对应D1sbit Key_C = P2^2; //C键信号端对应D2sbit Key_D = P2^3; //C键信号端void delay0(int a);void delay15us(void);void delay1ms(int z);void di(); //蜂鸣器函数声明unsigned int time;//用于存放定时器时间值unsigned int S; //用于存放距离的值char flag =0; //量程溢出标志位char f1,f2,f3,f4,n0;int a;int n;//运行次数判断标志int s_left,s_right;void Delay10us(unsigned char i){unsigned char j;do{j = 10;do{_nop_();}while(--j);}while(--i);}/******************************************************** *************************************//*****************电机程序********************//******************************************************** ************************************/void loop(){IN1=1; //左电机IN2=0;IN3=1; //右电机IN4=0;}void runfront(){IN1=1; //左电机IN2=0;IN3=0; //右电机IN4=1;}//小车后退函数void runback(){IN1=0; //左电机IN2=1;IN3=1; //右电机IN4=0;}//小车左转void runleft(){IN1=0; //左电机IN2=0;IN4=1;}//小车右转void runright(){IN1=1; //左电机IN2=0;IN3=0; //右电机IN4=0;}////小车左后转//void runbackleft() //{// IN1=0; //左电机// IN2=0;// IN3=0; //右电机// IN4=1;//}////小车右后转//void runbackright() //{// IN2=0;// IN3=0; //右电机// IN4=0;//}//小车停止函数void stop(){IN1=0; //左电机IN2=0;IN3=0; //右电机IN4=0;}/******************************************************** *************************************//***********蓝牙程序************/ /******************************************************** ************************************/void delay(unsigned int a){unsigned int b;for(;a>0;a--)for(b=3;b>0;b--);}//左电机转void left_motor_runfront(unsigned int a) {IN1=1; //左电机IN2=0;delay(a);IN1=0;IN2=0;delay(100-a);}void right_motor_runfront(unsigned int a) {IN3=0; //右电机IN4=1;delay(a);IN3=0;IN4=0;delay(100-a);}void left_motor_back(unsigned int a){IN1=0; //左电机IN2=1;delay(a);IN1=0;IN2=0;delay(100-a);}void right_motor_back(unsigned int a) {IN3=1; //右电机IN4=0;delay(a);IN3=0;IN4=0;delay(100-a);}void left_motor_stop(){IN1=0; //左电机IN2=0;}void right_motor_stop(){IN3=0; //左电机IN4=0;}//PWM调速void PWM_RUNFRONT(unsigned int a,unsigned int b) //a属于0~100{left_motor_runfront(a);right_motor_runfront(b);}void PWM_RUNBACK(unsigned int a,unsigned int b) //a属于0~100{left_motor_back(a);right_motor_back(b);}void PWM_RUNLEFT(unsigned int a) //a属于0~100 {right_motor_runfront(a);left_motor_stop();}void PWM_RUNRIGHT(unsigned int a) //a属于0~100 {right_motor_stop();left_motor_runfront(a);}void bluestop(){left_motor_stop() ;right_motor_stop() ;}void UsartConfiguration(){SCON=0X50; //设置为工作方式1TMOD=TMOD|0x21; //设置计数器工作方式2PCON=0X80; //波特率加倍TH1=0XFA; //计数器初始值设置,注意波特率是4800的TL1=0XFA;ES=1; //打开接收中断EA=1; //打开总中断TR1=1;TH0=0;TL0=0;ET0=1; //打开计数器}/******************************************************** ************************ 函数名:Delay(unsigned int i)* 函数功能: 延时函数* 输入: 无* 输出: 无********************************************************* **********************/void Usart() interrupt 4{receiveData=SBUF;//出去接收到的数据RI = 0;//清除接收中断标志位if(receiveData==0x66){low_velosity=1;high_velosity=0;// write_com(0x80);}if(receiveData==0x77){low_velosity=0;high_velosity=1;}}/******************************************************** *************************************//***********舵机程序************/ /******************************************************** ************************************/void delayx(int t){char j;for(;t>0;t--)for(j=19;j>0;j--);}void degree0(){int i;for(i=0;i<10;i++){delayx(10);//1msPWM=0;delayx(390);//19ms}}void degree90(){int i;for(i=0;i<10;i++){PWM=1;delayx(24);//50PWM=0;delayx(376);//18.5ms}}void degree180(){int i;for(i=0;i<15;i++){delayx(40);//1.5msPWM=0;delayx(360);//18.5ms}}/******************************************************** *************************************//**************超声波程序**************//******************************************************** *************************************//****A键被按下后,前进*****/void Count1(void){time=TH1*256+TL1;TH1=0;TL1=0;S=(time*1.7)/100;n++;if(S<=30&&n==1){led1=0;stop();degree0();di();}if(S>30&&n==1){led1=1;runfront();n=0;}if(n==2){s_left=S; degree180();di();}if(n==3){s_right=S;degree90();di();n=0; //标志位清零if(s_left>s_right){led2=1;delay1ms(50);led2=0;delay1ms(50);runright();delayx(1250);}else{led3=1;delay(800);led3=0;delay(500);runleft();delayx(1250);}}}/********超声波高电平脉冲宽度计算程序***************/ void Timer_Count(void){TR1=1; //开启计数while(RX); //当RX为1计数并等待TR1=0; //关闭计数//Count1(); //计算}/******************************************************** /void StartModule() //启动模块{TX=1; //启动一次模块Delay10us(2);TX=0;}/******************************************************** *************************************//********************主程序*******************//******************************************************** *************************************/void main(void){UsartConfiguration();while(1){if(k1==0&&n0==0){delay1ms(20);if(k1==0){n0++;}}else if(k1==0&&n0==1){delay1ms(20);if(k1==0){n0--;}}if(n0==0){if(Key_B==0&&Key_D==0&&Key_C==0&&Key_A= =1) //A键被按下{f1=1;f2=0;f3=0;f4=0;di();}elseif(Key_A==0&&Key_D==0&&Key_B==1&&Key_C==0) //B键被按下{f1=0;f2=1;f3=0;f4=0;di();}elseif(Key_B==0&&Key_D==0&&Key_A==0&&Key_C==1) //C键被按下{f1=0;f2=0;f3=1;f4=0;di();}elseif(Key_D==1&&Key_B==0&&Key_A==0&&Key_C==0) //D键被按下{f1=0;f2=0;f3=0;f4=1;di();}if(f1){StartModule();for(a=951;a>0;a--){if(RX==1){Timer_Count();Count1();}}}if(f2){runback();}if(f3){loop();}if(f4){stop();}}if(n0==1){if(low_velosity){switch(receiveData){case leftdata: PWM_RUNLEFT(30); break;case rightdata: PWM_RUNRIGHT(30); break;case forwarddata: PWM_RUNFRONT(64,70); break;case backdata: PWM_RUNBACK(64,70); break;case stopdata: bluestop(); break;}}if(high_velosity){switch(receiveData){case leftdata: PWM_RUNLEFT(50); break;case rightdata: PWM_RUNRIGHT(50); break;case forwarddata:PWM_RUNFRONT(94,100); break;case backdata: PWM_RUNBACK(94,100); break;case stopdata: stop(); break;}}}}}/*****************蜂鸣器*********************/void di(){int i;for(i=0;i<150;i++){Beep= 1;delay0(20);}Beep=0;}void delay0(int a){char j;int i;for(i=a; i > 0; i--)for(j = 200; j > 0; j--); }void delay1ms(int z) //延时1ms {int x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}。
简易智能小车——2003年全国大学生电子设计竞赛, c51源程序系统的单片机程序
#include ""
#define det_Dist */
void ctrMotor_Dist(float dist,unsigned char type) {unsigned char t=0;
mType=type;
P2=((P2&240)|15);
cntTime_Plues=(int)(dist/det_Dist);
while(cntTime_Plues)
{
if(Inter_EX0==1&&StartTask==0)
{
cntTime_Plues=0;
break;
}
if(Light_Flag==1) t=LightSeek();
if(type==0) 0为A仓库,1为B仓库,2为停车场*/ void fndIorn(void) interrupt 0
{
unsigned char i;
P10=1;
P2=((P2&240)|15); //停车
P07=1;
delay(1000);//刹车制动
P07=0;
Inter_EX0=1;
cntIorn++;
Display(cntIorn);
for(i=0;i<40;i++)
{
P2=P2&249;
delay(2);
P2=((P2&240)|15);
delay(2);
}
P2=P2&249;
delay(100);
P2=((P2&240)|15); //停车
IornColor(); //判断铁片黑白,设置bkAim
for(i=0;i<95;i++)
{
P2=P2&249;
delay(3);
P2=((P2&240)|15);
delay(2);
}
P2=((P2&240)|15); //停车
delay(4000); //把铁片吸起来
EX0=0;
}
/*外部中断1中断程序: */
/*对霍尔开关的脉冲记数,对小车的位置进行记录,以便对小车进行定位*/ void stpMove(void) interrupt 2
{
cntTime_Plues--;
if(Direction==0) //向上
{
if(mType==0) sY+=det_Dist;
else if(mType==2)
sY-=det_Dist;
}
else if(Direction==1) //向左
{
if(mType==0) sX+=det_Dist;
else if(mType==2)
sX-=det_Dist;
}
else if(Direction==2) //向下
{
if(mType==0) sY-=det_Dist;
else if(mType==2)
sY+=det_Dist;
}
else if(Direction==3) //向右
{
if(mType==0) sX-=det_Dist; else if(mType==2)
sX+=det_Dist;
}
}。