智能搬运小车C语言程序(完整)

合集下载

智能小车循迹、避障、红外遥控C语言代码

智能小车循迹、避障、红外遥控C语言代码

智能小车循迹、避障、红外遥控C语言代码//智能小车避障、循迹、红外遥控 C 语言代码// 实现功能有超声波避障,红外遥控智能小车,红外传感器实现小车自动循迹, 1602 显示小车的工作状态,另有三个独立按键分别控制三种状态的转换// 注:每个小车的引脚配置都不一样,要注意引脚的配置,但是我的代码注释比较多,看起来比较容易一点#include <> #include <> #include"" #include <> #define uchar unsigned char #define uint unsigned int uchar ENCHAR_PuZh1[8]=" uchar ENCHAR_PuZh2[8]=" uchar ENCHAR_PuZh3[8]=" uchar ENCHAR_PuZh4[8]=" uchar ENCHAR_PuZh5[8]=" run back stop left right "; ";//1602 显示数组H. H. H. uchar ENCHAR_PuZh6[8]=" xunji "; uchar ENCHAR_PuZh7[8]=" bizhang"; uchar ENCHAR_PuZh8[8]=" yaokong"; #define HW P2 #define PWM /****************************** P1 //红外传感器引脚配置P2k 口/* L298N 管脚定义*/ 超声波引脚控制******************************/ sbit ECHO=P3A2; sbit TRIG=P3A3;///// 红外控制引脚配置 sbit sbituchar KEY2=P3A7; KEY 仁 P3M;state_total=3,state_2=0;// 2 为红外遥控 ucharuchar time_1 uchar 局变量 // 超声波接收引脚定义 // 超声波发送引脚定义// 红外接收器数据线 // 独立按键控制总状态控制全局变量 state_1,DAT; // 红外扫描标志位time_1=0,time_2=0;// 定时器1 中断全局变量控制转弯延时计数也做延时一次time,timeH,timeL,state=0;// 超声波测量缓冲变量count=0;//1602 显示计数兼红外遥控按键state_total =2 兼循迹按键state_total= 0 自动避障 state_total=10 为自动循迹模块 1 为自动避障模块 time_ 2 控制 PWM 脉冲计数state 为超声波状态检测控制全uint /**************************/ unsigned char IRC0M[7]; // 红外接收头接收数据缓存unsigned char Number,distance[4],date_data[8]={0,0,0,0,0,0,0,0}; /********* voidvoid voidIRC0M[2 ]存放的为数据 // 红外接收缓存变量 **/ IRdelay(char x); //x* 红外头专用 delay run(); back();void stop(); void left_90(); void left_180(); void right_90(); void delay(uint dat); //void init_test();void delay_100ms(uint ms) ;void display(uchar temp); void bizhang_test(); void xunji_test(); void hongwai_test();void Delay10ms(void);void init_test()// 定时器 0{ 1 外部中断 // 超声波显示驱动 0 1 延时初始化 TMOD=0x11; TH1=0Xfe; TL1=0x0c; TF0=0; TF1=0; ET0=1; ET1=1; EA=1;// 设置定时器 0 1 // 装入初值定时一次为工作方式 1 16 位初值定时器2000hz// 定时器 // 定时器 // 允许定时器// 允许定时器 0 方式 1 计数溢出标志 1 方式 1 计数溢出标志 0 中断溢出 1 中断溢出//开总中断 if(state_total==1)// 为超声波模块时初始化 {TRIG=0; ECHO=0; EX0=0; IT0=1;}if(state_total==2)// 发射引脚低电平 // 接收引脚低电平 // 关闭外部中断// 由高电平变低电平,触发外部中断 0// 红外遥控初始化{ IT1=1; EX1=1;TRIG=1;}del ay(60);} void main(){ uint i; delay(50); init_test(); TR1=1; LCD1602_Init() ; delay(50); while(state_2==0)// 外部中断 1 为负跳变触发 // 允许外部中断 1 // 为高电平 I/O 口初始化// 等待硬件操作// 开启定时器 1{if(KEY1==0){Delay10ms(); // 消除抖动 if(KEY1==0) {state_total=0; // 总状态定义 0 为自动循迹模块 1 为自动避障模块2 为红外遥控while((i<30)&&(KEY1==0))// 检测按键是否松开{Delay10ms(); i++;}i=0;}}if(TRIG==0){while((i<30)&&(TRIG==0))// 检测按键是否松开{Delay10ms(); i++;}i=0;}if(KEY2==0){while((i<30)&&(KEY2==0))// 检测按键是否松开{Delay10ms(); i++; }i=0;// 检测按键 s1 是否按下//检测按键s2是否按下障模块Delay10ms(); // 消除抖动 if(TRIG==0) { state_total=1; 2 为红外遥控//总状态定义 0 为自动循迹模块 1 为自动避// 检测按键 s3 是否按下障模块Delay10ms(); // 消除抖动 if(KEY2==0) { state_total=2; 2 为红外遥控// 总状态定义 0 为自动循迹模块1 为自动避}}} init_test();delay(50); // 等待硬件操作50us TR1=0; // 关闭定时器 1 if(state_total==1) {//SPEED=90; bizhang_test();} if(state_total==0) {// SPEED=98; 电平// 自动循迹速度控制// 自动循迹速度控制高电平持续次数占空比为10 的低电平高电平持续次数占空比为40 的低xunji_test(); }if(state_total== 2){//SPEED=98; // 自动循迹速度控制高电平持续次数占空比为40 的低电平hongwai_test(); }void 断号init0_suspend(void)2 外部中断0 4 串口中断外部中断 1timeH=TH0;timeL=TL0;state=1;EX0=0;}void 断号0{if(state_total==1) { TH0=0X00;TL0=0x00;}if(state_total==0) { TH0=0Xec;TL0=0x78;time_1++;interrupt 0 //3 为定时器 1 的中断号 1 定时器0 的中// 记录高电平次数//// 标志状态为// 关闭外部中断1,表示已接收到返回信号//3 为定时器 1 的中断号2 外部中断0 4 串口中断time0_suspend0(void) interrupt 1外部中断 1// 自动避障初值装入// 装入初值// 自动循迹初值装入// 装入初值定时一次200hz// 控制转弯延时计数1 定时器0 的中}}void IR_IN(void){unsigned char j,k,N=0;EX1 = 0; IRdelay(5); if (TRIG==1) { EX1 =1; return;}//确认IR 信号出现//等IR 变为高电平,跳过 9ms 的前导低电平信号。

智能小车程序c语言

智能小车程序c语言
{
set_motor(1,60,1,120);
bb=2;
}
//左偏
else if( L && ml && mm && !mr&& R )
{
set_motor(1,120,1,60);
bb=3;
}
//
else if( !L && ml && mm && mr&& R)
{
turnleft();
bb=4;
if(bb==4) LCMTextOut(20,"左拐路");
if(bb==5) LCMTextOut(20,"右拐路");
if(bb==6) LCMTextOut(20,"左丁字路");
if(bb==7) LCMTextOut(20,"右丁字路");
if(bb==8) LCMTextOut(20,"中丁字路");
LEn=0;
else
LEn=1;
if(PwmCnt<PwmR)
REn=0;
else
REn=1;
}
void main()
{
Init();
LCMTextInit();
LCMTextOut(1,"智能小车走迷宫");
LCMTextOut(9,"T1");
LCMTextOut(13,"T2");
LCMTextOut(17,"路型");
sbit mr=P2^7;
sbit R =P2^4;

智能循迹小车c程序完美-详尽)

智能循迹小车c程序完美-详尽)

/*-----------------------------------------------------------------------------小车运行主程序---------------------------------------------------------------------------简介:@模块组成:红外对管检测模块----五组对管,五个信号采集端口直流电机驱动模块----驱动两个直流电机,另一个轮子用万向轮单片机最小系统------用于烧写程序,控制智能小车运动 @功能简介:在白色地面或皮质上用黑色胶带粘贴出路线路径宽度微大于相邻检测管间距。

这样小车便可在其上循迹运行。

@补充说明:该程序采取“右优先”的原则:即右边有黑线向右转,若无,前方有黑线,向前走,若无,左边有黑线,向左转,若全无,从右方向后转。

程序开头定义的变量的取值是根据我的小车所调试选择好的,如果采用本程序,请自行调试适合自己小车的合适参数值。

编者:陈尧,黄永刚(江苏大学电气学院二年级,三年级)1.假定:IN1=1,IN3=1时电机正向转动,必须保证本条件2.假定:遇到白线输出0,遇到黑线输出1;如果实际电路是:遇到白线输出1,遇到黑线输出0,这种情况下只需要将第四,第五句改成:#define m0 1#define m1 0即可。

3.说明1:直行---------------速度full_speed_left,full_speed_right.转弯,调头速度------correct_speed_left,correct_speed_right.微小校正时---------高速轮full_speed_left,full_speed_right;低速轮correct_speed.可以通过调节第六,七,八,九,十条程序,改变各个状态下的占空比(Duty cycle ),以求达到合适的转弯,直行速度4.lenth----------length检测到黑线到启动转动的时间间隔5.width----------mid3在黑线上到脱离黑线的时间差6.mid3-----------作为判断中心位置是否进入黑线的标志,由于运行的粗糙性和惯性,常取其他对管的输出信号作为判断条件7.check_right----若先检测到左边黑线,并且左边已出黑线,判断右端是否压黑线时间拖延----------------------------------------------------------------------------------------------------------------*/#include<STC12C5A60S2.h>#define uchar unsigned char#define uint unsigned int#define m0 1//黑线m1,白线m0#define m1 0#define full_speed_left 40 //方便调节各个状态的占空比,可用参数组:(30,35,6,25,30,68000,27000,500);#define full_speed_right 45 //(40,45,6,25,30,68000,27000,500);#define correct_speed 6 //校正时的低速轮的占空比#define turn_speed_left 25#define turn_speed_right 30#define lenth 68000 //测试数据:10000--》100--》500--》2000--80000--76000--68000 #define width 27000 //500--》10-->2000--》60000--30000---》27000#define check_right 500 //2000--》20--》200--》500#define midl left1#define midr right5uchar Duty_left,Duty_right,i=0,j=0; //左右占空比标志,取1--100sbit IN1=P2^0;sbit IN2=P2^1;sbit IN3=P2^2;sbit IN4=P2^3;sbit ENA=P1^0;sbit ENB=P1^1;//循迹口五组红外对管,依次对应从左往右第1,2,3,4,5五组sbit left1 =P1^6;sbit left2 =P1^5;sbit mid3 =P1^4;sbit right4=P1^3;sbit right5=P1^2;void line_left();void line_right();void line_straight()reentrant;//----------------------------------------void delay(long int Delay_time)//延时函数{uint t=Delay_time;while(t--);}//-----------------------------------------void init() //定时器初始化{left1=m0; //初始化left2=m0; //白线位置mid3 =m1; //黑线位置right4=m0;right5=m0;TMOD|=0x01;TH0=(65536-66)/256;TL0=(65536-66)%256;EA=1;ET0=1;TR0=1;ENA=1; //使能端口,初始化ENB=1;}//--------------------------------------------void time0(void)interrupt 1 //中断程序{i++; //调速在中断中执行j++;if(i<=Duty_left)ENA=1;else ENA=0;if(i>100){ENA=1;i=0;}if(j<=Duty_right)ENB=1;else ENB=0;if(j>100){ENB=1;j=0;}TH0=(65536-66)/256; //取约150HZ,12M晶振,每次定时66us,分100次,这样开头定义的变量正好直接表示占空比的数值TL0=(65536-66)%256;}//-----------------------------------------------void correct_left()//向左校正,赋值{Duty_left =correct_speed;Duty_right=full_speed_right;IN1=1;IN2=0;IN3=1;IN4=0;}//------------------------------------------------void correct_right()//向右校正,赋值{Duty_left =full_speed_left;Duty_right=correct_speed;IN1=1;IN2=0;IN3=1;IN4=0;}//--------------------------------------------------void turn_left()//左转,赋值{Duty_left =turn_speed_left;Duty_right=turn_speed_right;IN1=0; //转弯时一个正转,一个反转,IN2=1;IN3=1;IN4=0;}//---------------------------------------------------void turn_right()//右转,赋值{Duty_left =turn_speed_left;Duty_right=turn_speed_right;IN1=1; //转弯时一个正转,一个反转,IN2=0;IN3=0;IN4=1;}//-----------------------------------------------------void straight() //直走,赋值{Duty_left =full_speed_left; //左右电机占空比初始化,调节直线运动速度Duty_right=full_speed_right; //鉴于左右轮电机内部阻力不同,故占空比取不同值,这组值需要单独写程序取值IN1=1;IN2=0;IN3=1;IN4=0;}//-----------------------------------------------------void line_straight()reentrant //函数名后加reentrant可以递归调用,//一直走黑直线时{straight();if(right5==m1){line_right();}elseif(left1==m1){line_left();}elseif(left2==m1) //防止校正时,小车冲出过大,导致2,4号检测管屏蔽了两端检测管的检测,避免其走直线时出轨while(left2==m1){correct_left();if(right5==m1){line_right();goto label3;}else if(left1==m1){line_left();goto label3;}}elseif(right4==m1) //防止校正时,小车冲出过大,导致2,4号检测管屏蔽了两端检测管的检测,避免其走直线时出轨while(right4==m1){correct_right();if(right5==m1){ line_right(); goto label3;}else if(left1==m1){line_left();goto label3;}}elseif((left1==m0)&&(left2==m0)&&(mid3==m0)&&(right4==m0)&&(right5==m0)){straight();//delay(lenth);while(right4==m0) //本来应该是用mid3,但是为了提高灵敏度,选择right4;向左时,可取left2对管{turn_right();}if(mid3==m1){line_straight();}}label3: ; //什么都不做}//------------------------------------------------------------------------- void line_right() //右边有黑线时{straight();//这里的直走是在不管红外检测结果的直行delay(lenth);if(mid3==m1){turn_right();//执行向右转的赋值label:delay(width); //由width值决定转弯时mid3经过黑线宽度时所需要的时间 if(mid3==m0)while(right4==m0){}elsegoto label;}elseif(mid3==m0){turn_right();while(right4==m0){}if(midr==m1){line_straight();}}}//-----------------------------------------------------------------void line_left() //左边出现黑线时{while(left1==m1){if(right5==m1){line_right();goto label2;}}delay(check_right);//左边遇到黑线时,左边出了黑线之后,继续延时一段时间,判断右边是否遇到黑线,//若遇到黑线,执行line_right()函数if(right5==m1){line_right();goto label2;}if((mid3==m1)||(left2==m1)||(right4==m1)){line_straight();}else{while(left2==m0){turn_left();}if(midl==m1)line_straight();}label2: ;}//--------------------------------------------------------------------void detect_infrared() //循迹,红外检测{if(right5==m1){line_right();}elseif(left1==m1){line_left();}elseif(left2==m1){correct_left();}elseif(right4==m1){correct_right();}elseline_straight();}//--------------------------------------void main(void)//主程序部分{init();while(1) //循环检测红外对管采集的电平信号{detect_infrared();}}。

基于51单片机的红外遥控智能小车源程序(C语言)

基于51单片机的红外遥控智能小车源程序(C语言)

/*预处理命令*/#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时,忙,等待。

智能搬运小车

智能搬运小车

1、智能搬运小车一、设计任务设计并制作一个能自动搬运货物的智能电动车,其工作示意图如下。

图中,左边为停车区、货物存储区A 和货物存储区B,并有两个对应的射灯光源;距右边线30 cm 处共放置3 片白色或黑色的薄铁片,铁片之间的距离大于20cm。

二、要求1、基本要求(1)智能车从起跑线出发(车体不得超过起跑线),在无障碍物的情况下,可寻找并搬取铁片,按照不同颜色分送不同存储区,即在光源A 的引导下将黑色铁片搬运到货物存储区A 存放,或在光源B 的引导下将白色铁片搬运到存储区B 存放(装载方式不限制)。

(2)智能车能准确找到铁片的位置。

2、提高部分(1)搬运铁片的过程中,一次只允许搬运1 片,且必须搬运到存储区域内。

(2)要求智能车在8 分钟之内能取走全部铁片,并能返回车库,否则就地停车。

(3)智能车检测到铁片时能发出声光信息,并实时显示铁片数目。

(4)距右边线90cm 处设有障碍线,线上任意位置放有两个障碍物,在有障碍物的情况下,完成基本要求(1)、(2)中的相关操作,且不得与障碍物碰撞。

(5)停车后,能准确显示智能车全程行驶的时间,显示误差的绝对值应小于10 秒。

(6)其它。

三、说明1、测试时共放置3 片铁片,每片的厚度为<=2.0mm,面积为2cm×2cm,黑、白铁片的比例任意给定、初始位置任意给定。

2、两个障碍物的大小分别为24cm×6cm×12cm 和12cm×6cm×12cm,建议用白纸包砖代替。

3、示意图中所有粗黑线段宽度均为5 cm,制作时可以涂墨或粘黑色胶带。

图中的虚线和尺寸标注线不要绘制在白纸上。

4、智能车允许用玩具车改装,但不能由人工遥控。

5、光源A、B 均采用40W-60W 射灯,其底部距地面10cm 左右,摆放位置如图所示,测试前,射灯的照射方向允许微调。

2、电信号测量仪一、设计任务设计并制作一台数字显示的多功能电信号测量仪。

智能小车C语言程序

智能小车C语言程序

智能小车C语言程序智能小车黑线循迹C语言程序#include#include#define uchar unsigned char#define uint unsigned intsbit LeftIR=P1^6; //左边红外接收sbit RightIR=P1^7; //右边红外接收sbit ENA=P1^2; // L298的Enable Asbit IN1=P1^0; // L298的Input 1sbit IN2=P1^1; // L298的Input 2sbit ENB=P1^5; // L298的Enable Bsbit IN3=P1^3; // L298的Input 3sbit IN4=P1^4; // L298的Input 4uchar t=0; //中断计数器uchar motor_1=0,motor_2=0; //电机1,2速度值uchar tmp1,tmp2; // 电机当前速度值uchar aa; //定时器1中断计数bit flag=0; //标志位void motor(uchar index, char speed){if(speed>=-100 && speed<=100){if(index==1) // 电机1的处理{motor_1=abs(speed); // 取速度的绝对值if(speed<0) // 速度值为负则反转{IN1=0;IN2=1;}else // 不为负数则正转{IN1=1;IN2=0;}}if(index==2) // 电机1的处理{motor_2=abs(speed); // 取速度的绝对值if(speed<0) // 速度值为负则反转{IN3=0;IN4=1;}else // 不为负数则正转{IN3=1;IN4=0;}}}}void init(){TMOD=0x12; // 设定T0的工作模式为2TH0=0x9B; // 装入定时器的初值TL0=0x9B;TH1=(65536-50000)/256; //设置初值定时50msTL1=(65536-50000)%6;EA=1; // 开中断ET0=1; // 定时器0允许中断ET1=1; //定时器1允许中断TR0=0; // 关闭定时器0TR1=0; // 关闭定时器0ENA=0; //关闭电机1ENB=0; //关闭电机2}void main(){int irDetectLeft,irDetectRight;init();while(1)// 电机实际控制演示{irDetectRight = RightIR;//右边接收irDetectLeft = LeftIR;//左边接收if((irDetectLeft==0)&&(irDetectRight==0))//向前进{motor(1,100);motor(2,100);}if((irDetectLeft==0)&&(irDetectRight==1))//右转{motor(1,-100);motor(2,100);}if((irDetectLeft==1)&&(irDetectRight==0))//左转{motor(1,100);motor(2,-100);}if((irDetectLeft==1)&&(irDetectRight==1)&&(flag==0)) //第一次探测定时器1开始计时{motor(1,100);motor(2,100);TR1=1;}if((irDetectLeft==1)&&(irDetectRight==1)&&(flag==1))//第二次探测时小车停{TR0=0;ENA=0;ENB=0;}}}void timer0() interrupt 1 // T0中断服务程序{if(t==0) // 1个PWM周期完成后才会接受新数值{tmp1=motor_1;tmp2=motor_2;}if(t ENA=1;elseENA=0; // 产生电机1的PWM信号if(t ENB=1;elseENB=0; // 产生电机2的PWM信号t++;if(t>=100)t=0; // 1个PWM信号由100次中断产生}void timer1() interrupt 3{TH1=(65536-50000)/256;TL1=(65536-50000)%6;aa++;if(aa==40) //定时2s后小车开始运动TR0=1;if(aa==60) //定时3s后置标志位{aa=0;flag=1;}}。

电子设计大赛智能小车完整版程序

电子设计大赛智能小车完整版程序
if(key==1&&key2==1)qusu2();
}
sudu(40,40);
while(!inf);
qusu2();
//
//delay(350);
//sudu(40,40);
//send=0;
//while(!inf)
//{
//if(!key)sudu(0,30);
//if(!key2)sudu源自40,30) ;TMOD=0x01;
ET0=1;
TH0=(65535-1000)/256;
TL0=(65535-1000)%256;
TR0=1;
EA=1;
en11=0;en00=0;
send=0;
while(1)
{
if(xuanze==0)
{
send=0;
if(key==0)sudu(0,30);
if(key2==0)sudu(20,0) ;
sbit inf=P1^1;
sbit send=P1^2;
sbit xuanze=P1^3;
unsigned int t=0,tt,tt2;
unsigned char num=7,count=0;
bit flag=1;
bit flag2=1;
bit flag3=1;
void delay(unsigned int t)
}
void sudu(unsigned char left,unsigned char right)
{tt=left;tt2=right;}
void left()
{
sudu(8,0);
}
void left2()
{EA=0;en0=0;en1=1;delay(130);en1=0;EA=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){delay(1);}if(t==1){P2=(P2&245);delay(1); //向右走}P2=((P2&240)|15);delay(10);}/*直走程序: *//*控制小车运动距离,dist为运动距离(cm),type为运动方式(0 2)*/ /*只改变小车sX 和sY的值而不改变Direction的值. */ void ctrMotor_Dist(float dist,unsigned char type) {unsigned char t=0;mType=type;P2=((P2&240)|15);cntTime_Plues=(int)(dist/det_Dist);while(cntTime_Plues){if(Inter_EX0==1&&StartTask==0){cntTime_Plues=0;break;}if(Light_Flag==1) t=LightSeek();if(type==0) //向前走{P2=P2&249;delay(40);ctrMotor_Adjust(t);}if(type==2) //向后退{P2=P2&246;delay(50);ctrMotor_Adjust(t);}if(mType==2) delay(60);//刹车制动0.5mselse delay(75);}}/*拐弯程序: *//*控制小车运动角度,type为运动方式(1 3)*//*只改变小车Direction的值而不改变sX 和sY的值*/void ctrMotor_Ang(unsigned char ang,unsigned char type,unsigned char dir) {unsigned char i=0;mType=type;P2=((P2&240)|15);cntTime_Plues=(int)((PI*RD*90/(180*det_Dist)*1.2)*ang/90);while(cntTime_Plues){if(Inter_EX0==1&&StartTask==0){cntTime_Plues=0;break;}if(type==1) //向左走{P2=P2&250;delay(100);ctrMotor_Adjust(0);}if(type==3) //向右走{P2=P2&245;delay(100);ctrMotor_Adjust(0);}P2=((P2&240)|15);delay(50);//刹车制动0.5ms}if(!(Inter_EX0==1&&StartTask==0)){Direction=dir;}}/*====基本路线层:描述小车基本运动路线的程序集====*//*当小车到达仓库或停车场时,放下铁片或停车(0,1为仓库,2为停车场)*/void rchPlace(){unsigned int time,b,s,g;time=(int)(cntTime_5Min*0.065535);//只有一个数码管时,轮流显示全过程秒数个十百b=time%100;s=(time-b*100)%100;g=(time-b*100-s*10)%10;if(bkAim==2){//到达停车场了,停车EA=0;P2=((P2&240)|15);while(1){Display(10); //Ndelay(2000);Display(cntIorn);delay(2000);Display(11);//Adelay(2000);Display(b);delay(2000);Display(s);delay(2000);Display(g);delay(2000);}}else{if(Inter_EX0==1&&StartTask==1)P10=0; //到达仓库,卸下铁片}}/*无任务模式: *//*设置小车的固定运动路线,未发现铁片时的运动路线*/void BasicRoute(){ //Light_Flag=1;ctrMotor_Dist(153,0);//Light_Flag=0;ctrMotor_Ang(ANG_90,1,1);ctrMotor_Dist(100-sX,0);ctrMotor_Dist(125,2);ctrMotor_Dist(73,0);ctrMotor_Ang(ANG_90,1,2);//Light_Flag=1;ctrMotor_Dist(153,0);//Light_Flag=0;ctrMotor_Ang(ANG_180,1,0);rchPlace();}/*任务模式: *//*设置小车的发现铁片后的运动路线*/void TaskRoute(){//基本运行路线表,记载拐弯0 向前1 左拐2 向后3 右拐,正读去A区;反读去B区StartTask=1;ctrMotor_Ang(ANG_90_T,1,2);if(bkAim==1) //仓库A{ctrMotor_Dist(10,0);P2=((P2&240)|15);delay(60);ctrMotor_Ang(ANG_90_T,1,3);ctrMotor_Dist(100-sX,2);ctrMotor_Ang(ANG_90_T,1,2);Light_Flag=1;ctrMotor_Dist(153,2);Light_Flag=0;// ctrMotor_Ang(208,1,0);}else if(bkAim==0) //仓库B{ctrMotor_Dist(10,0);P2=((P2&240)|15);delay(60);ctrMotor_Ang(ANG_90_T,1,3);ctrMotor_Dist(100-sX,0);ctrMotor_Ang(ANG_90_T,1,0);Light_Flag=1;ctrMotor_Dist(153,2);Light_Flag=0;//ctrMotor_Ang(208,1,0);}delay(5000);rchPlace();}/*---------------------------------------------*//*-------------------主程序段------------------*/ /*---------------------------------------------*/void main(){delay(4000);P2=0xff; //初始化端口P07=0;P1=0;TMOD=0x01; //初始化定时器0/1 及其中断TL0=0;TH0=0;TR0=1;ET0=1;ET1=1;IT0=1; //初始化外部中断EX0=1;IT1=1;EX1=1;EA=1;P11=1;while(1){Display(cntIorn);bkAim=2;BasicRoute();if(Inter_EX0==1){TaskRoute();//按获得铁片后的路线运动IE0=0;EX0=1;}Inter_EX0=0;}}/*----------------------------------------------------*//*----------------------中断程序段--------------------*//*----------------------------------------------------*//*定时器0中断程序: *//*当时间过了5分钟,则就地停车并进入休眠状态*/ void tmOver(void) interrupt 1{cntTime_5Min++;TL0=0;TH0=0;if(cntTime_5Min>=4520){Display(5);P2=((P2&240)|15);EA=0; //停车程序P07=1;delay(4000);PCON=0X00;while(1);}/*外部中断0中断程序: *//*发现铁片,发出声光信号并将铁片吸起,发光二极管和蜂鸣器*//*并联在一起(设接在P07). 0为A仓库,1为B仓库,2为停车场*/ void fndIorn(void) interrupt 0{unsigned char i;P10=1;P2=((P2&240)|15); //停车P07=1;delay(1000);//刹车制动0.5msP07=0;Inter_EX0=1;cntIorn++;Display(cntIorn);for(i=0;i<40;i++){P2=P2&249;delay(2);P2=((P2&240)|15);delay(2);}P2=P2&249;delay(100);P2=((P2&240)|15); //停车IornColor(); //判断铁片黑白,设置bkAimfor(i=0;i<95;i++){P2=P2&249;delay(3);P2=((P2&240)|15);delay(2);}P2=((P2&240)|15); //停车delay(4000); //把铁片吸起来EX0=0;}/*外部中断1中断程序: *//*对霍尔开关的脉冲记数,对小车的位置进行记录,以便对小车进行定位*/ void stpMove(void) interrupt 2{cntTime_Plues--;if(Direction==0) //向上{if(mType==0) sY+=det_Dist;else if(mType==2)sY-=det_Dist;}else if(Direction==1) //向左{if(mType==0) sX+=det_Dist;else if(mType==2)sX-=det_Dist;}else if(Direction==2) //向下{if(mType==0) sY-=det_Dist;else if(mType==2)sY+=det_Dist;}else if(Direction==3) //向右{if(mType==0) sX-=det_Dist;else if(mType==2)sX+=det_Dist;}。

巡线智能小车的单片机c语言程序

巡线智能小车的单片机c语言程序

speed();
}
}
/*************************************************/
void speed()
//速度过高处理
{
if(PWM1ratio&gt;100)
{
PWM2ratio=PWM2ratio-PWM1ratio+100;
PWM1ratio=100;
//定时
/***************************************************************************** *************/
void control() { int state=0;
//调速,调节占空比
uchar sl,sr,a=0,b=0,c=0,d=0,e=0,f=0;
巡线智能小车的单片机 c 语言程序
/**************************** 智 能 小 车 程 序 ************************** 单片机:atml89s52 晶振:12MHz
*********************************************************************/
//延时 ms
} /********************************************** ***********************************************/ uchar time() { uchar t; t=10000/frequency; cisu=t/256+1; temp=cisu; return(256-t/cisu);

智能小车C程序

智能小车C程序

一般是用IF语句来判断各种情况,下边是一个小程序,你可以看看#include"reg52.h"#define uint unsigned int#define uchar unsigned char//电机管脚sbit MA1=P3^0;sbit MA2=P3^1;sbit MB1=P3^2;sbit MB2=P3^3;//循迹模块管脚sbit led0=P1^0;sbit led1=P1^1;sbit led2=P1^2;sbit led3=P1^3;sbit led4=P1^4;sbit led5=P1^5;delay(){uint i;for(i=0;i<100;i++);}void zhengzhuan()//正转{MA1=0;MA2=1;MB1=1;MB2=0;}void fanzhuan()//反转{MA1=1;MA2=0;MB1=0;MB2=1;}void zuozhuan()//左转弯{MA1=0;MA2=1;MB1=0;MB2=0;}void youzhuan()//右转弯{MA1=0;MA2=0;MB1=1;MB2=0;}stop()//停止{MA1=0;MA2=0;MB1=0;MB2=0;}main(){while(1){if(led1==0&&led2==0&&led3==1&&led4==0&&led5==0) {void zhengzhuan();//正转}if(led1==0&&led2==0&&led3==0&&led4==0&&led5==0) {void fanzhuan();//反转}if(led1==1&&led2==1&&led3==1&&led4==0&&led5==0) {delay();void zuozhuan();//左转弯}if(led1==0&&led2==0&&led3==1&&led4==1&&led5==1) {delay();void youzhuan();//右转弯}if(led1==0&&led2==1&&led3==1&&led4==1&&led5==0) {stop();//停止}if(led1==0&&led2==0&&led3==0&&led4==0&&led5==0) {void youzhuan();//原地打圈}if(led1==1&&led2==1&&led3==1&&led4==1&&led5==1) {delay();void youzhuan(); //遇到T型区优先考虑向右转}}。

智能循迹小车详细源代码程序(MSP430,PID)

智能循迹小车详细源代码程序(MSP430,PID)
80 }
81 LEFTOUT=Period/100*speed;
82 }
83 void MotorRight(int speed,int direction)
84 {
85 if(speed>max_speed)speed=max_speed;
86
72 {
73 EnableLeftNeg;
74 UnenableLeftPos;
75 }
76 else if(direction==foreward)//正转
77 {
78 EnableLeftPos;
79 UnenableLeftNeg;
17 #define LEFTOUT TACCR1
18 #define RIGHTOUT TACCR2
19 #define SensorIn P5IN
20 #define F 5000//5000hz
21 #define Period (8000000/F)
64 {
65 LEFTOUT=0;
66 RIGHTOUT=0;
67 }
68 void MotorLeft(int speed,int direction)
69 {
70 if(speed>max_speed)speed=max_speed;
71 if(direction==backward)//反转
183 TACCTL2|=OUTMOD_7;//
184 LEFTOUT=0;
185 RIGHTOUT=0;
186 }
187
188 float abs(float a)
189 {

智能搬运小车(-完整-)【范本模板】

智能搬运小车(-完整-)【范本模板】

智能搬运小车哈尔滨工程大学信息与通信工程学院080813班摘要:关键词:单片机,PWM,光电传感器,运货小车1.引言1.1智能搬运小车研究的背景和目的:运货是各个行业不可或缺的过程,人工运货随着经济的快速发展,不能完全满足市场的需求。

世界上许多国家都在积极进行智能车辆的研究和开发设计.移动机器人是机器人学中的一个重要分支,出现于20世纪60年代。

当时斯坦福研究院的Nils Nilssen和charles Rosen等人,在1966年至1972年中研制出了取名shakey的自主式移动机器人,目的是将人工智能技术应用在复杂环境下,完成机器人系统的自主推理、规划和控制。

从此,移动机器人从无到有,数量不断增多,智能车辆作为移动机器人的一个重要分支也得到越来越多的关注。

智能搬运小车可以安装不同的末端以完成各种不同形状和状态的工件搬运工作,可以广泛应用于机床上下料,冲压机自动化生产线,自动装配流水线,码垛搬运,集装箱等的自动搬运,大大减轻了人类繁重的体力劳动,具有广阔的市场前景。

1.2智能搬运小车的功能介绍:智能搬运小车希望能够希望得到可以自动抓取货物,循迹行进,自动卸货物的功能。

2.总体方案及论证2。

1系统结构框图:89C52单片机PWM 波直流稳压电源减速直流电机光传感器自动循迹舵机夹取货物电压比较器图1。

系统结构框图2.2具体设计:整个系统包括单片机控制模块、电机驱动模块、光电传感器模块、机械手模块、模拟电源模块、小车车体。

将单片机控制模块,驱动模块固定在小车上端;光电电传感器安装在小车底部;将机械手安装在小车上部的前端;车架结构选择铝板。

2.2.1系统机械部分采用铝板安装设计图纸自行加工。

即根据图纸首先用剪床剪得合适大小的铝板,再用钳工和折床将铝板做成合适的形状,再用钻床钻孔,用车床加工轴,用铣床加工轴套,最后安装即可得到所需的机械部分。

图2.小车底盘图3。

轴承座图4。

前直角图5.中心固定架图6。

中心固定架支架图7。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
xunji();
delay(20);
}
fangxia();
delay(10);
songkai();
delay(10);
houtui();
qianjinfangxiang();
turn_left2();
}
void main() //主程序
{
time_init();
zkb1=30;
zkb2=30;
qianjinfangxiang();
qianjin();
delay(10);
while(1)
{
xunji();
turn_right2();
else if((RSIGN1==0)&&(RSIGN2==0)&&(LSIGN1==0)&&(LSIGN2==1))//右偏1,左转1
turn_left1();
else if((RSIGN1==0)&&(RSIGN2==0)&&(LSIGN1==1)&&(LSIGN2==1))//右偏2,左转2
zkb1=10;
zkb2=40;
}
void turn_left2()//大左转函数
{
zkb1=0;
zkb2=50;
}
void turn_right1()//小右转函数
{
zkb1=40;
zkb2=10;
}
void turn_right2()//大右转函数
diaotou();
}
}
}
qianjin();
else if((RSIGN1==1)&&(RSIGN2==0)&&(LSIGN1==0)&&(LSIGN2==0))//左偏1,右转1
turn_right1();
else if((RSIGN1==1)&&(RSIGN2==1)&&(LSIGN1==0)&&(LSIGN2==0))//左偏2,右转2
}
void houtuifangxiang() //后退方向
{
IN1=0;
IN2=1;
IN3=0;
IN4=1;
}
void qianjin() //直行
{
zkb1=40;
zkb2=40;
}
void turn_left1()//小左转函数
{
TH1=(65536-500)/256;
TL1=(65536-500)%256;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
}
void timer0() interrupt 1
{
TH0=(65536-7100)/256;
TL0=(65536-7100)%256;
delay(20);
if((fjiaqu==0)&&(RSIGN1==1)&&(RSIGN2==1)&&(LSIGN1==1)&&(LSIGN2==1)) //已经到达取物处
{
stop();
delay(1000);///////////
jiaqu();
TH1=(65536-500)/256;
TL1=(65531=1;
else
duoji1=0;
if(t1<jd2)
duoji2=1;
else
duoji2=0;
if(t<zkb1)
PWM1=1;
else
PWM1=0;
if(t<zkb2)
PWM2=1;
else
PWM2=0;
t++;
if(t>=100)
t=0;
}
void timer1() interrupt 3
{
智能搬运小车希望能够希望得到可以自动抓取货物,循迹行进,自动卸货物的功能。
#include<reg52.h>
unsigned char zkb1=0 ; //左边电机的占空比,最大100
unsigned char zkb2=0 ; //右边电机的占空比,最大100
unsigned char t,t1=0; //定时器中断计数器
if(t1<jd3)
duoji3=1;
else
duoji3=0;
t1++;
if(t1==40)
t1=0;
}
void qianjinfangxiang() //前进方向
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
sbit LSIGN2=P2^3; //右边信号2
sbit IN1=P0^0;
sbit IN2=P0^1;
sbit IN3=P0^2;
sbit IN4=P0^3;
sbit PWM1=P0^4; //左直流减速电机
sbit PWM2=P0^5; //右直流减速电机
zkb1=30;/////////////
zkb2=30;
while(!(f1&&f2&&f3&&f4))
{
if(RSIGN1==1) f1=1;
if(RSIGN2==1) f2=1;
if(LSIGN1==1) f3=1;
if(LSIGN2==1) f4=1;
for(j=z;j>0;j--)
for(k=125;k>0;k--);
}
//初始化定时器,中断
void time_init() //O.1ms,0.5ms
{
TMOD=0x11;
TH0=(65536-7100)/256;
TL0=(65536-7100)%256;
sbit duoji1=P1^5; //左舵机
sbit duoji2=P1^6; //右舵机
sbit duoji3=P1^7; //上下舵机
void xunji();
void delay(int z) //延时函数//1ms
{
int j,k;
char jd1=2,jd2=4,jd3=3; //舵机角度控制
unsigned char ftaiqi=0,fjiaqu=0; //是否已经取物,抬起夹子?
sbit RSIGN1=P2^0; //左边信号1
sbit RSIGN2=P2^1; //左边信号2
sbit LSIGN1=P2^2; //右边信号1
delay(100);
taiqi();
delay(100);
houtui();
qianjinfangxiang();
diaotou();
while(!((RSIGN1==1)&&(RSIGN2==1)&&(LSIGN1==1)&&(LSIGN2==1))) //已经到达卸货处
}
}
void diaotou() //调头函数
{
char f1=0,f2=0,f3=0,f4=0; //标志
IN1=1;/////////////
IN2=0;/////////////
IN3=0;/////////////
IN4=1;/////////////
fjiaqu=0;
}
void taiqi() //抬起货物
{
ftaiqi=1;
jd3=5;
delay(400);
}
void fangxia() //放下货物
{
jd3=3;
delay(500);
ftaiqi=0;
}
void stop()
{
zkb1=0;
zkb2=0;
}
void houtui() //后退
{
int i;
houtuifangxiang();
zkb1=30;
zkb2=30;
for(i=500;i>0;i--)
{
xunji() ;
delay(10);
}
delay(2000);//////////////////\
qianjinfangxiang();
qianjin();
}
void xunji() //循迹函数
{
if((RSIGN1==0)&&(RSIGN2==0)&&(LSIGN1==0)&&(LSIGN2==0)) //直行
{
zkb1=50;
zkb2=0;
}
void jiaqu() //夹取货物
{
fjiaqu=1;
jd1=4;
jd2=2;
delay(400);
}
void songkai() //松开货物
{
jd1=2;
jd2=4;
delay(400);
相关文档
最新文档