智能小车控制程序

合集下载

智能小车程序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;

智能小车速度控制程序

智能小车速度控制程序
Right_moto_go ; //右电机往前走
}
//右转
void rightrun(void)
{
Left_moto_go ; //左电机往前走
Right_moto_back ; //右电机往前走
}
//停转
void stoprun(void)
{
Left_moto_Stop ; //左电机往前走
Right_moto_Stop ; //右电机往前走
//外部0中断用于计算左轮的脉冲
void intersvr1(void) interrupt 0 using 1
{
count1++;
}
/************************************************************************/
//前速前进
void run(void)
#include<AT89x51.H>
#define Left_1_led P3_4//P3_2接四路寻迹模块接口第一路输出信号即中控板上面标记为OUT1
#define Left_2_led P3_5//P3_3接四路寻迹模块接口第二路输出信号即中控板上面标记为OUT2
#define Right_1_led P3_6//P3_4接四路寻迹模块接口第三路输出信号即中控板上面标记为OUT3
P1_4 P1_5 接IN5 IN6 当 P1_4=1,P1_5=0; 时右上电机正转右上电机接驱动板子输出端(蓝色端子OUT5 OUT6)
P1_4 P1_5 接IN5 IN6 当 P1_4=0,P1_5=1; 时右上电机反转
P1_4 P1_5 接IN5 IN6 当 P1_4=0,P1_5=0; 时右上电机停转

单片机智能小车 (带完整程序)

单片机智能小车 (带完整程序)

广东职业技术学院毕业综合实践报告题目:单片机智能小车类型:设计类专业:应用电子技术(LED新型电光源)班级:xxx学生姓名:xxx指导教师:xxx完成时间:2016年6月摘要智能作为现代的新技术,是以后的发展方向,它可以按照预先设定的模式在一个环境里自动的运作,不需要人为的管理,可应用于科学勘探等等的用途。

智能小车就是其中的一个体现。

智能小车,也称为轮式机器人,是一种以汽车电子为背景,涵盖智能控制、模式识别、传感技术、计算机、机械等多学科的科技创意性设计。

一般主要由路径识别、速度采集以及车速控制等模块组成。

本次设计的简易智能小车,采用STC89C51单片机作为小车的检测和主控芯片,充分利用了自动检测技术、单片机最小系统、液晶显示模块电路、串口无线通信,以及声光信号的控制、电机的驱动电路。

通过keil C软件编程,不断调试,最终实现小车的无线控制,壁障等功能。

关键词:智能小车,单片机,无线控制,壁障目录一引言 (3)1.1国外智能车辆研究现状 (3)1.2单片机智能小车发张前景 (3)二主控系统及驱动系统 (5)2.1系统架构 (5)2.2主控芯片的选择 (5)2.3驱动系统设计分析 (6)2.3.1电机及驱动芯片的选择 (6)2.3.2电机驱动模块 (7)2.4小结 (8)三无线控制系统 (8)3.1无线模块设计 (8)3.2通讯模块设计 (9)3.2.1蓝牙模块 (9)3.2.2接受发送数据子程序 (10)四壁障系统 (11)4.1壁障模块 (11)4.1.1超声波模块 (11)4.1.2红外传感器 (12)4.1.3壁障实现过程 (12)五温度传感系统 (14)5.1温度传感器简介 (14)5.2读温度子程序 (15)六液晶显示系统 (17)6.1LCD1602液晶显示屏简介 (17)6.1.1LCD1602引脚说明 (17)6.2LCD1602操作 (18)6.3LCD1602显示子程序 (19)七小车速度控制系统分析与设计 (21)7.1车速控制原理 (21)7.2车速控制子程序 (21)八智能小车流程图 (1923)8.1流程图 (23)九调试与总结 (24)致谢 (25)参考文献 (26)附录 (267)一引言1.1国外智能车辆研究现状国外智能车辆的研究历史较长,始于上世纪50年代。

(完整版)基于51单片机的智能小车控制源代码(毕业设计)

(完整版)基于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;}}。

智能小车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;}}。

智能小车控制程序(Smartcarcontrolprogram)

智能小车控制程序(Smartcarcontrolprogram)

智能小车控制程序(Smart car control program)#包括<< reg52。

”#包括<<信息。

h> //_nop_();#定义unsigned char函数# unsigned int定义单元#定义full_speed_left 40 //,?????:(30,35,6,25,306800027000500);#定义full_speed_right 45 / /(40,45,6,25,306800027000500);#定义correct_speed 6 / /#定义turn_speed_left 25#定义turn_speed_right 30unsigned char duty1 = 0;unsigned char duty2 = 0;函数T1 = 0,T2 = 0;UCHAR num1 = 0,0 = 0 = num2,小键盘数字3;公司^ HW1 = P0 0;/ /公司^ HW2 = P0 1;公司hw3 = P0 ^ 2;公司hw4 = P0 ^ 3;公司^ HW5 = P0 4;P3 ^了ENA = 2;// PWM??公司^ eNB = P3 3;公司5 = P2 ^ 4;/ /??公司6 = P2 ^ 5;公司在^ = P2 6;公司8 = P2 ^ 7;/ / -------------------------------------- 延时(个x)/??1ms{单元I、J;对于(i = 0;i < x;+ +)对于(j=0;j<120;j + +);}无效straight() /{P2 = 0xA0;duty1 = full_speed_left;duty2 = full_speed_right;}无效turn_left2() /{/ * 5 = 0;6 = 1;在= 0;8 = 1;* /P2 = 0xA0;duty1 = correct_speed;duty2 = full_speed_right;}无效turn_right2() /{/ * 5 = 0;6 = 1;在= 0;8 = 1;* /P2 = 0xA0;duty1 = full_speed_left;duty2 = correct_speed;}无效right() /??{/ * 5 = 0;6 = 1;在= 0;8 = 1;* /P2 = 0xA0;duty1 = turn_speed_left;duty2 = turn_speed_right;}无效left() /??{/ * 5 = 0;6 = 1;在= 0;8 = 1;* /P2 = 0xA0;duty1 = turn_speed_left;duty2 = turn_speed_right;无效stop() /{duty1 = 0;duty2 = 0;}/ /-------------------------------------------------------------无效()/{TMOD = 0x01;TH0 =(65536-500)/ 256;TL0 =(65536-500)% 256;EA = 1;ET0 = 1;tr0 = 1;}/ /--------------------------------------------------------------无效timer0()中断使用1 / 10??{TH0 =(65536-500)/ 256;TL0 =(65536-500)% 256;t1+;T2 +;如果(T1<duty1)ENA = 1;其他的ENA = 0;如果(t1>100){ ENA = 1,T1 = 0;}如果(T2<duty2 eNB = 1);其他的eNB = 0;如果(= 100){ ENA = 1,T1 = 0;}}/ /-------------------------------------------------------------无效detect_infrared() /??,{如果(HW1 = = 1和HW2 = = 1和hw3 = = 1和hw4 = = = = 0 & HW5 0);{straight();}如果(HW1 = = 1和HW2 = = 1和hw3 = = 1和hw4 = = = = 0 & HW5 1);{turn_left2();延迟(50);turn_right2();延迟(50);}如果(HW1 = = 1和HW2 = = 1和hw3 = = 1和hw4 = = = = 1 & HW5 0);{turn_right2();延迟(50);turn_left2();延迟(50);}如果(HW1 = = 0和HW2 = = 1和hw3 = = 1和hw4 = = = = 0 & HW5 0);{turn_right2();延迟(50);turn_left2();延迟(50);}如果(HW1 = = 0和HW2 = = 0和hw3 = = 1和hw4 = = = = 0 & HW5 0);{turn_right2();延迟(50);turn_left2();延迟(50);}如果(HW1 = = 1和HW2 = = 1和hw3 = = 0和hw4 = = = = 0 & HW5 0);{turn_left2();延迟(50);turn_right2();延迟(50);}如果(HW1 = = 1和HW2 = = 0和hw3 = = 0和hw4 = = = = 0 & HW5 0);{turn_left2();延迟(50);turn_right2();延迟(50);}如果(HW1 = = 1和HW2 = = 1和hw3 = = 1);{left();延迟(50);}}/ / ------------------------------------------------------ 无效main() /{();虽然(1)/{ detect_infrared();}}。

智能小车控制程序

智能小车控制程序

#include<stc.h>#include<absacc.h>#include <math.h>#define uchar unsigned char#define uint unsigned int#define ulong unsigned longsbit In1 =P1^2; // 左轮控制端sbit In2 =P1^5; // 左轮控制端(0,1 倒转)(1,0 前进)(1,1 0,0 停止)sbit In3 =P1^6; // 右轮控制端sbit In4 =P1^7; // 右轮控制端(0,1 倒转)(1,0 前进)(1,1 0,0 停止)sbit ENL =P1^3; //PWM 0 控制左车轮sbit ENR =P1^4; //PWM 1 控制右车轮sbit SCL =P2^7; //IIC总线时钟信号sbit SDA =P2^3; //IIC总线数据信号sbit clk =P0^4; //数码管时钟线,数据线sbit dat =P0^3;uchar BUF[8],tab[]={0x88,0xeb,0x4c,0x49,0x2b,0x19,0x18,0xcb,0x08,0x09};uchar left0=0x50,right0=0x50,left,right;uint direct0=0,direct=0;uint sumd;float down;//初始化角度存储/* -----延时500us-----*/void delay(uint c) //误差-0.018084490741us{uchar a,b;for(;c>0;c--)for(b=197;b>0;b--)for(a=8;a>0;a--);}/*-----delay1-----*/void delay1(void) //误差-0.0535********us{uchar a,b;for(b=1;b>0;b--)for(a=26;a>0;a--);}/*-----Delay5us------*/void Delay5us(void) //误差-0.026765046296us {uchar a;for(a=26;a>0;a--);}/* -----延时5ms------*/void Delay5ms(void) //误差-0.000000000001us{unsigned char a,b,c;for(c=7;c>0;c--)for(b=168;b>0;b--)for(a=22;a>0;a--);}/*-------IIC读角度值--------*//*-----start-----*/void IIC_Start(){SDA = 1; //拉高数据线SCL = 1; //拉高时钟线Delay5us(); //延时SDA = 0; //产生下降沿Delay5us(); //延时SCL = 0; //拉低时钟线}/*-----stop-----*/void IIC_Stop(){SDA = 0; //拉低数据线SCL = 1; //拉高时钟线Delay5us(); //延时SDA = 1; //产生上升沿Delay5us(); //延时}/*-----发送应答信号-----*/void IIC_SendACK(bit ack){SDA = ack; //写应答信号SCL = 1; //拉高时钟线Delay5us(); //延时SCL = 0; //拉低时钟线Delay5us(); //延时}/*-----接收应答信号-----*/bit IIC_RecvACK(){SCL = 1; //拉高时钟线Delay5us(); //延时CY = SDA; //读应答信号SCL = 0; //拉低时钟线Delay5us(); //延时return CY;}/* -----发送一字节数据-----*/void IIC_SendByte(uchar dat){uchar i;for (i=0; i<8; i++) //8位计数器{dat <<= 1; //移出数据的最高位SDA = CY; //送数据口SCL = 1; //拉高时钟线Delay5us(); //延时SCL = 0; //拉低时钟线Delay5us(); //延时}IIC_RecvACK();}/* -----从IIC总线接收一字节数据-----*/uchar IIC_RecvByte(){uchar i;uchar dat = 0;SDA = 1; //使能内部上拉,准备读取数据,for (i=0; i<8; i++) //8位计数器{dat <<= 1;SCL = 1; //拉高时钟线Delay5us(); //延时dat |= SDA; //读数据SCL = 0; //拉低时钟线Delay5us(); //延时}return dat;}/*-----校准角位移度数-----*/ //旋转一周,大约一分钟void cal_on(void){ //校准IIC_Start(); //起始信号IIC_SendByte(0xe0); //发送设备地址+写信号IIC_SendByte(0x00); //0表示命令IIC_SendByte(0xC0); //发送校准命令IIC_Stop(); //发送停止信号}//*********************************************************void cal_off(void) //关闭校准{IIC_Start(); //起始信号IIC_SendByte(0xe0); //发送设备地址+写信号IIC_SendByte(0x00); //0表示命令IIC_SendByte(0xC1); //发送停止校准命令IIC_Stop(); //发送停止信号}/*-----修改磁偏角-----*/void CMP_OFFS(void) //磁偏角{IIC_Start(); //起始信号IIC_SendByte(0xe0); //发送设备地址+写信号IIC_SendByte(0x03); //0表示命令IIC_SendByte(0x00); //磁偏角高8位,写入0IIC_Stop(); //发送停止信号IIC_Start(); //起始信号IIC_SendByte(0xe0); //发送设备地址+写信号IIC_SendByte(0x04); //0表示命令IIC_SendByte(0x64); //磁偏角低8位,写入100(实际是10.0度)IIC_Stop(); //发送停止信号}/* -----读测量角度-----*/void read_cmp(void){ uchar i;IIC_Start(); //起始信号IIC_SendByte(0xe0); //发送设备地址+写信号IIC_SendByte(0x00); //0表示命令IIC_SendByte(0x31); //发送一次测量角度IIC_Stop(); //停止信号Delay5ms();Delay5ms(); //延时,实际应用中可以执行其他程序Delay5ms();Delay5ms();Delay5ms();Delay5ms();Delay5ms();Delay5ms();Delay5ms();Delay5ms();Delay5ms();Delay5ms();IIC_Start(); //起始信号IIC_SendByte(0xe0); //发送设备地址+写信号IIC_SendByte(0x00); //发送存储单元地址,从0开始IIC_Start(); //起始信号IIC_SendByte(0xe1); //发送设备地址+读信号for (i=0; i<8; i++){BUF[i] = IIC_RecvByte();if (i == 7){IIC_SendACK(1); //最后一个数据需要回NOACK }else{IIC_SendACK(0); //回应ACK }}IIC_Stop(); //停止信号direct=BUF[1];direct<<=8;direct+=BUF[2];}/*------显示------*/void sendB(uchar e){unsigned char c;for(c=0;c<8;c++){ clk=0;if(e&0x80)dat=1;elsedat=0;e<<=1;clk=1;}}void play(uint c){uchar b,a[4];a[3]=c%10;c/=10;a[2]=c%10;c/=10;a[1]=c%10;c/=10;a[0]=c%10;for(b=0;b<4;b++){sendB(tab[a[b]]);}}/* pwm初始化*/void initpwm(){CCAPM0=0x42; //使能比较器,启动脉宽调节模式CCAP0L=0x50; //控制输出占空比(与CL比较,当CL<CCAP0L时输出低电平,反之高电平)CCAP0H=0x50;//CL溢出时,CCAP0H自动装入CCAP0LCCAPM1=0x42; //PWM1同上CCAP1L=0x50;CCAP1H=0x50;CR=1; //PCA计数启动}/* -------- 调速--------- */void format(uchar a,uchar b){CCAP0L=a; //控制输出占空比(与CL比较,当CL<CCAP0L时输出低电平,反之高电平)CCAP0H=a;//CL溢出时,CCAP0H自动装入CCAP0L CCAP1L=b;CCAP1H=b;}/* -------- 后退--------- */void turnback(uchar a,uchar b){format(a,b);In1=0;In2=1;In3=0;In4=1;}/* -------- 前进--------- */void run(uchar a,uchar b){format(a,b);In1=1;In2=0;In3=1;In4=0;}/* -------- 停止--------- */void stop(){In1=1;In2=1;In3=1;In4=1;}/*-----初始化角度-----*/void initdirect(){uchar a;sumd=0;for(a=0;a<2;a++){read_cmp();sumd+=direct;delay(50);}sumd=0;for(a=0;a<5;a++){read_cmp();sumd+=direct;delay(50);}direct0=sumd/5;play(direct0);sumd=0;}/* -----判断转向----- */void turn(){read_cmp();down=direct0-direct; //大于零,向左偏,左加速if(down<0)left=0xf0;elseleft=left0-down*0.02;run(left,right0);}/* main */void main(){stop();initpwm();initdirect();run(0x50,0x50);while(1){turn();read_cmp();play(direct);delay(1000);}}。

5、智能小车控制系统

5、智能小车控制系统

5、智能小车控制系统一、任务:设计一个智能小车控制系统,小车行车路线图1(见后图)所示,要求控制一辆玩具模型小车能够按要求指定的路线行驶。

二、要求:(1)基本要求:小车行车路线图1所示,要求控制一辆玩具模型小车从起点1前进,通过一进一退的方式,将小车停入甲库中,完成侧方停车。

然后从甲库驶出前进至终点1。

具体要求如下:1、小车能够从起点1前进,完成要求中的“一进”;2、小车能够从后退,完成要求中的“一退”;3、小车能够在车轮不轧碰车道边线、库位边线的情况下将车停正于甲库中;4、小车能够在车轮不轧碰车道边线、库位边线的情况下将车前进至终点1。

5、小车能够在2分钟内完成要求。

(2)发挥要求:小车从终点1直线行驶到起点2,然后按图1路线所示,倒入乙库停正,再经过二进二退移位到丙库停正,前进穿过乙库至路上,倒入丙库停正,前进返回起点2。

具体要求如下:1、小车能够从终点1直线行驶到起点2;2、小车能够在车轮不轧碰车道边线、库位边线的情况下将倒入乙库停正;3、小车能够在车轮不轧车库的外边线情况下经过二进二退移位到丙库停正;4、小车能够在车轮不轧车库的外边线情况下前进穿过乙库至路上;5、小车能够在车轮不轧碰车道边线、库位边线的情况下将倒入丙库停正;6、小车能够在车轮不轧车库的外边线情况下前进至起点2;7、小车能够在3分钟内完成要求。

三、说明:1、小车的长度不得小于15cm,宽度不得小于10cm,必须是4轮小车。

不得采用遥控或者线控的方式操作小车。

2、图1中实线箭头为小车前进线,虚线箭头为小车倒车线。

场地为白底黑线,黑线宽度为1cm。

3、各线长度,线距标示如图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;}。

遥控智能小车程序

遥控智能小车程序

遥控智能⼩车程序遥控智能⼩车控制程序:#include#define uint unsigned int#define uchar unsigned charuchar flag_la=0,flag_lb=0;uchar flag_ra=0,flag_rb=0;sbit left_a=P0^0;sbit left_b=P0^1;sbit right_a=P0^2;sbit right_b=P0^3;//sbit P2_0= P2^3;uchar rcvdata; //⽤来存放从串⼝接收到的数据uchar flag=0; //表⽰有没有接收到数据//uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80}; void delay(uchar x){uint i;while(x--)for(i=0;i<120;i++);}void Timer0_Init(void){TMOD |= 0x01; //定时器⼯作在⽅式1(16⾃加定时器)TH0 = (65535-10000)/256; //重新装填定时器数据,10ms后触发中断TL0 = (65535-10000)%256; //TH0 = (65536 - x)%256EA = 1; //打开总中断ET0 = 1; //打开定时器0中断TR0 = 1; //定时器0中断标志位,设置为1即马上进⼊中断函数//Timer0Interrupt(void)}void jin(){ // 第1种left_a= 1;right_b=0;flag_la=0;flag_ra=0;flag_lb=0;flag_rb=0;}void tui() //第2种{left_a= 0;left_b= 1;right_a=0;right_b=1;flag_la=0;flag_ra=0;flag_lb=0;flag_rb=0;}void zuoqian(){ //第5种// left_a=1; left_b=0;right_a=1;right_b=0;flag_la=1;flag_ra=0;flag_lb=0;flag_rb=0;}void youqian(){ //第6种left_a=1;left_b=0;//right_a=1;right_b=0;flag_la=0;flag_ra=1;}void ting(){ //第0种left_a=0; left_b=0;right_a=0;right_b=0;flag_la=0;flag_ra=0;flag_lb=0;flag_rb=0;}void zuotui(){ //第7种left_a=0; // left_b=1;right_a=0;right_b=1;flag_la=0;flag_ra=0;flag_lb=1;flag_rb=0;}void youtui(){ //第8种left_a=0; left_b=1;right_a=0;// right_b=1;flag_la=0;flag_ra=0;flag_lb=0;flag_rb=1;}void zuo(){ //第3种left_a=0; left_b=1;right_a=1;right_b=0;flag_lb=0;flag_ra=0;}void you(){ //第4种left_a=1;left_b=0;right_a=0;right_b=1;flag_la=0;flag_ra=0;flag_lb=0;flag_rb=0;}void main(){SM0=0;SM1=1;REN=1;TMOD=0x20;TH1=0xfd;TL1=0xfd;EA=1;ES=1;TR1=1;Timer0_Init();left_a=0;left_b= 0;right_a=0;right_b=0;while(1){if(flag==1){switch(rcvdata) {case '0': {ting();/*P0=table[0];P2_0 = 0;delay(200);P2_0 = 1;*/};break; case '1': {jin();/*P0=table[1];P2_0 = 0;delay(200);P2_0 = 1;*/};break;case '4': {you();/*P0=table[4];P2_0 = 0;delay(200);P2_0 = 1;*/};break; case '5': {zuoqian();/*P0=table[5];P2_0 = 0;delay(200);P2_0 = 1;*/};break; case '6': {youqian();/*P0=table[6];P2_0 = 0;delay(200);P2_0 = 1;*/};break; case '7': {zuotui();/*P0=table[7];P2_0 = 0;delay(200);P2_0 = 1;*/};break; case '8': {youtui();/*P0=table[8];P2_0 = 0;delay(200);P2_0 = 1;*/};break; }}}}void Timer0Interrupt(void) interrupt 1{TH0 = (65535-10000)/256;TL0 = (65535-10000)%256;if(flag_la==1){left_a=~left_a;}if(flag_lb==1){left_b=~left_b;}if(flag_ra==1){right_a=~right_a;}if(flag_rb==1){right_b=~right_b;}}void comint() interrupt 4{RI=0;flag=1;rcvdata=SBUF; }。

智能寻迹小车调试程序

智能寻迹小车调试程序
hyou1 = 1;
hyou2 = 0;
}
void TurnRight()//右转
{Leabharlann qzuo1 = 1;qzuo2 = 0;
hzuo1 = 1;
hzuo2 = 0;
qyou1 = 0;
qyou2 = 0;
hyou1 = 0;
hyou2 = 0;
}
void Xiaoying()
{
qzuo1=qzuo2=qyou1=qyou2=hzuo1=hzuo2=hyou1=hyou2=0 ;
if(LED1==1&&LED2==1&&LED3==0&&LED4==0&&LED5==1)//直行超出范围后速度变化不明显
{ RUN(); delay(30) ;Xiaoying() ;}
if(LED1==1&&LED2==0&&LED3==0&&LED4==1&&LED5==1)//直行
{ RUN(); delay(30) ;Xiaoying() ;}
void delay(int i)
{
while(i--);
}
void RUN()//向前
{
qzuo1 = 1;
qzuo2 = 0;
hzuo1 = 1;
hzuo2 = 0;
qyou1 = 1;
qyou2 = 0;
hyou1 = 1;
hyou2 = 0;
}
void STOP()//停车
{
qzuo1 = 0;
voiddelayintvoidrun向前voidstop停车voidturnleft左转voidturnright右转voidxiaoyingvoidmainvoidifled11led21led30led41led51直行delay值越小速度越小范围在10120为最佳控制范围run

wifi智能小车控制程序

wifi智能小车控制程序

#include<reg52.h>#include<math.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar Buffer =0; //从串口接收的数据uint URTAReceivedCount=0,n=1;uchar data Tempdatatable[5],CommandDatatable[5];//数据包uchar serVal[2];uint pwm[]={1120,1190,1382,1382,1382,1382,1382,1382}; //初始90度,(实际是1382.4,取整得1382)uchar pwm_flag=0;uint code ms0_5Con=461; //0.5ms计数(实际是460.8,取整得461)uint code ms2_5Con=2304; //2.5ms计数bit key_stime_ok;sbit StatusLight=P2^0; //状态灯sbit MainLight=P2^1; //主大灯sbit servo0=P0^0; //舵机控制sbit servo1=P0^1;sbit servo2=P0^2;sbit servo3=P0^3;sbit servo4=P0^4;sbit servo5=P0^5;sbit servo6=P0^6;sbit servo7=P0^7;//定义智能小车驱动模块输入IOsbit IN1 = P1^0; // 高电平1 后退(反转)sbit IN2 = P1^1; // 高电平1 前进(正转)sbit IN3 = P1^2; // 高电平1 前进(正转)sbit IN4 = P1^3; // 高电平1 后退(反转)sbit EN1 = P1^4; // 高电平使能sbit EN2 = P1^5; // 高电平使能/********************************************************************* 名称: Delay_1ms()* 功能: 延时子程序,延时时间为1ms * x* 输入: x (延时一毫秒的个数)* 输出: 无***********************************************************************/void Delay_1ms(uint i)//1ms延时{uchar x,j;for(j=0;j<i;j++)for(x=0;x<=148;x++);}void TurnOnStatusLight(){StatusLight=0;}/********************************************************************* 名称: Send_Data()* 功能: 向上位机传送字符* 输入: 无* 输出: 无***********************************************************************/void Send_Data(uchar type,uchar cmd,uchar dat){uchar data Buffer[5];//构建数据包uchar *p;uint Send_Count=0;p = Buffer;Buffer[0]=0XFF;Buffer[1]=type;Buffer[2]=cmd;Buffer[3]=dat;Buffer[4]=0XFF;while(1){if(*p==0XFF){Send_Count++; //0XFF标志统计位}SBUF = *p; //发送while(!TI) //如果发送完毕,硬件会置位TI,等待发送完毕{_nop_();}p++;TI = 0;if(Send_Count == 2) //当统计到两次出现0XFF,则认为一个数据包发送完毕,跳出循环{TI = 0;break;}}}/********************************************************************协议规定:包头类型位数据位数据位结束位0XFF 0X** OX** 0X** 0XFF各命令说明:类型位数据位数据位功能0X00 0X02 0X00 前进0X00 0X01 0X00 后退0X00 0X03 0X00 左转0X00 0X04 0X00 右转0X00 0X00 0X00 停止0X01 0X01 角度舵机10X01 0X02 . 舵机20X01 0X01 . 舵机30X01 0X02 . 舵机40X01 0X01 . 舵机50X01 0X02 . 舵机60X01 0X01 . 舵机70X01 0X02 数据舵机80X02 0X01 车灯亮0X02 0X02 车灯灭0X03 雷达数据发送雷达数据***********************************************************************/ /********************************************************************* 名称: Com_Int()* 功能: 串口中断子函数***********************************************************************/ void Com_Int(void) interrupt 4{uchar temp;ES=0; //关串口中断RI=0; //软件清除接收中断temp=SBUF;if(temp==0XFF && URTAReceivedCount<3){Tempdatatable[0]==0XFF; //包头URTAReceivedCount++;}else{Tempdatatable[n]=temp;n++;if(URTAReceivedCount==0&&n==2)n=1;}if(URTAReceivedCount==2)//包尾{Tempdatatable[0]=0XFF;Tempdatatable[4]=0XFF;n=1;URTAReceivedCount=0; //组包完毕temp="";// Send_Data(Tempdatatable[1],Tempdatatable[2],Tempdatatable[3]); //发送组成的数据包回去}CommandDatatable[0]=Tempdatatable[0];CommandDatatable[1]=Tempdatatable[1];CommandDatatable[2]=Tempdatatable[2];CommandDatatable[3]=Tempdatatable[3];CommandDatatable[4]=Tempdatatable[4];ES=1;//开串口中断}/********************************************************************* 名称: Com_Init()* 功能: 串口初始化,晶振11.0592,波特率9600,使能了串口中断***********************************************************************/void Com_Init(void){TMOD = 0x21;PCON = 0x00;SCON = 0x50;TH1 = 0xFd; //设置波特率9600TL1 = 0xFd;TR1 = 1; //启动定时器1ES = 1; //开串口中断EA = 1; //开总中断IT0=0;EX0=1;}/********************************************************************* 名称:Moto_Forward()* 功能: 电机1、2启动,都是前进,整车表现为前进。

智能循迹小车程序

智能循迹小车程序
{
IN5=0;
IN6=1;
IN7=0;
IN8=1;
dj1=15;
dj2=15;
}
void turnleft2()//小车前进向左微调
{
IN5=0;
IN6=1;
IN7=0;
IN8=1;
dj1=7;
dj2=20;
}
void turnright2()//小车前进向右微调
{
IN5=0;
IN6=1;
IN7=0;
{
turnright2();
}
if(HW1==0&&HW2==1&&HW3==1&&HW4==1)
{
turnleft2();
}
if(HW1==1&&HW2==1&&HW3==1&&HW4==0)
{
turnright2();
}
if(num2==3&&HW1==0&&HW2==0&&HW3==0&&HW4==0)
sbit ENB=P3^3;
sbit IN5=P2^4;//电机
sbit IN6=P2^5;
sbit IN7=P2^6;
sbit IN8=P2^7;
void delay(uint x)//延时1ms
{
uint i,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);
}
void qianjin()//小车前进
{
turnright2();
}

智能小车程序设计

智能小车程序设计

c51智能小车一.模块控制1.电源管理2.电机控制3.路径识别控制4.中断模块二.端口说明1.电机端口P1.0-P1.5M1 ENA IN1 IN2 OUT1 OUT2M2 ENB IN3 IN4 OUT3 OUT42.光电管端口D0-D7 利用中断循环采集数据sbit P0.0-P0.5宏定义ccd1-63.电源端口电压输出5V 单片机供电24V 电机驱动三控制模块1.电机控制PWM波调速改变电压接通与断开的时间,通过改变平均电压实现2.路径识别ccd的状态光电管的距离《30 20 25 初始低电平的时候探测到白线可能的状态0 0 1 1 0 0 直线0 1 0 1 0 0 左偏,右转0 0 1 0 1 0 右偏,左转1 1 0 0 0 0 大左偏,右转0 0 0 0 1 1 大右偏,左转转弯的控制???赛道的走法A区启动红方左,右--中右路,中路,倒车,前进B区启动蓝方中--左,右中路,前进,倒车,右路根据光电管的状态调整小车(读入状态没有A/D转换,普通I/O读入)在启动区,停止区光电管悬空,计算时间控制转向到正确路径投送任务路径找到后小车后退,利用惯性卸载物资,要求准确计算时间初始化程序PWM调速程序光电管数据采集,处理程序特殊情况处理程序右路根据提示线降低编程难度,作为小车运动的一个标志主程序#include <reg52.h>#define TMOD_V ALUE 0X20#define TH1_V ALUE 0XE6#define TL1_V ALUE 0XE6#define uchar unsigned char#define uint unsigned int#define ccd1 P00 //宏定义6个红外传感器I/O口#define ccd2 P01#define ccd3 P02#define ccd4 P03#define ccd5 P04#define ccd6 P05sbit P00=P0^0; //红外传感器端口sbit P01=P0^1;sbit P02=P0^2;sbit P03=P0^3;sbit P04=P0^4;sbit P05=P0^5; //红外端口,ccd3,4中间位置,间隔<30mm,外移到2,5,间隔20mm,外围1,6间隔25mmsbit P10=P1^0; //定义电机端口sbit P11=P1^1;sbit P12=P1^2;sbit P13=P1^3;sbit P14=P1^4;sbit P15=P1^5; //电机控制motorctrl状态:前进0,左转1,右转2.反转3,停转4uchar num; //传感器采样数量uchar flag; //数据采样结束标志uchar step; //跑道提示线计数uchar status; //小车状态uchar task; //完成任务标志uchar weight; //小车负重,task的标志//uchar tflag; //对应step判断任务路线void Init() //小车程序初始化{}void iniTimer1(void) //定时器1{TMOD=TMOD_V ALUE;TH1=TH1_V ALUE;TL1=TL1_V ALUE;TR1=1;}void delay(uchar dlay) //延时程序,小于采样周期,计算dlay{uchar i;for(i=255;i>=0;i--){while(dlay--);}}void turn(uchar x) //小车方向控制,转向控制只有全速和半速{if(x==0) //前进{P13=1;P10=1; //L298的ENA=1,ENB=1P11=1;P12=0;//左轮前进P14=0;P15=1;//右轮前进return;}if(x==1) //左转{P13=1;P10=1;P14=0;P15=1; //右轮全速while(1){P11=1;P12=0; //左轮半速delay();P11=~P11;P12=~P12;delay();}}if(x==2) //右转{P13=1;P10=1;P11=0;P12=1; //左轮全速while(1){P14=1;P15=0; //右轮半速delay();P14=~P14;P15=~P15;delay();}if(x==3) //减速{P13=1;P10=1;P11=1;P12=0;P14=1;P15=0;return;}if(x==4) //停转{P13=0;P10=1;P14=0;P15=0;P11=0;P12=0;return;}}void motorctrl(uchar x){switch(x){case 0:turn(0);break; //前进case 1:turn(1);break; //左转case 2:turn(2):break; //右转case 3:turn(3);break; //反转case 4:turn(4);break; //停转}}void judge(void){if(ccd1=0&&ccd2=0&&ccd3=0&&ccd4=0&&ccd5=0&&ccd6=0) status=0;if(ccd1=0&&ccd2=0&&ccd1=0&&ccd4=1&&ccd5=0&&ccd6=0) status=1;if(ccd1=0&&ccd2=1&&ccd3=0&&ccd4=1&&ccd5=0&&ccd6=0 ||ccd1=1&&ccd2=1&&ccd3=0&&ccd4=0&&ccd5=0&&ccd6=0||ccd1=0&&ccd2=0&&ccd3=1&&ccd4=1&&ccd5=1&&ccd6=0) status=2;if(ccd1=0&&ccd2=0&&ccd3=1&&ccd4=0&&ccd5=1&&ccd6=0 ||ccd1=0&&ccd2=0&&ccd3=0&&ccd4=0&&ccd5=1&&ccd6=1||ccd1=0&&ccd2=1&&ccd3=1&&ccd4=1&&ccd5=0&&ccd6=0) status=3;if(ccd1=1&&ccd2=1&&ccd3=1&&ccd4=1&&ccd5=1&&ccd6=1) status=4;if(ccd1=0&&ccd2=0&&ccd3=0&&ccd4=0&&ccd5=0&&ccd6=0) {delay();if(ccd1=0&&ccd2=0&&ccd3=0&&ccd4=0&&ccd5=0&&ccd6=0) status=5;}}void judgetask(){if(weight==0)task=1;elsetask=0;}void main(){Init(); //硬件程序初始化iniTimer1(); //定时器1初始化step=0; //提示线数值flag=0; //采样标志weight=1; //起始状态负重为TRUEINT1=1; //设置外中断INT0边沿触发EA=1; //CPU开中断EX1=1; //允许外中断INT1ET1=1;//允许定时器1中断while(1){flag=0;step=0;judge();switch(status){case 0:motorctrl(2);break; //红外传感器探测到盲区,即000000case 1:motorctrl(0);break; //前进,001100case 2:motorctrl(1);break; //左转,010100,110000,001110case 3:motorctrl(2);break; //右转,001010,000011,011100case 4:{motorctrl(3);step++;}break; //反转(或者半速==减速),111111,检测到提示线减速case 5:motorctrl(4);break; //停转,game overdefault:motorctrl(4);break; //调试使用,考虑其他情况}if(step>=5){step=0;judgetask(); //如果到了第五条提示线,根据启动次序,选择相应反应动作,先考虑红方,减速后右转,到了001100状态后,if(task==1) //停车,倒//车,投送物品后前进,此处若探到盲区,忽略……蓝方step==5后,停车,over{motorctrl(3); //减速if(ccd1=0&&ccd2=0&&ccd3=0&&ccd4=0&&ccd5=0&&ccd6=0) //到达终点停车motorctrl(4);}else{motorctrl(3); //减速if(ccd1=0&&ccd2=0&&ccd3=0&&ccd4=0&&ccd5=0&&ccd6=0) //传感器悬空,右转motorctrl(2);if(ccd1=0&&ccd2=0&&ccd3=1&&ccd4=1&&ccd5=0&&ccd6=0) //车身转正,停车,延时,倒车,延时,前进motorctrl(4);delay();motorctrl(3);delay();motorctrl(0);weight=0;} //task==1,任务完成,蓝方启动方式,停车,over task==0,红方启动方式,完成任务}}//程序问题1.硬件初始化,待补充2.分别处理红方或者蓝方启动方式3.传感器数据采集(电平比较)4.任务完成程序及判断5.电机的反转6.程序的可读性。

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