智能小车控制程序1

合集下载

程序控制的智能小车

程序控制的智能小车

一、设计要求:设计一辆由程序控制的智能小车,要求小车在活动场上能利用编写的程序,自动走出我们设计的路线,同时能在场地上画出相应的图形二、主控系统2.1主控系统采用单片机作为整个系统的核心,用其控制行进中的小车,以实现其既定的性能指标。

充分分析我们的系统,其关键在于实现小车的自动控制,而在这一点上,单片机就显现出来它的优势——控制简单、方便、快捷。

这样一来,单片机就可以充分发挥其资源丰富、有较为强大的控制功能及可位寻址操作功能、价格低廉等优点。

针对本设计特点——多开关量输入的复杂程序控制系统,需要擅长处理多开关量的标准单片机,而不能用精简I/O口和程序存储器的小体积单片机,D/A、A/D功能也不必选用。

根据这些分析,我选定了STC89C52RA单片机作为本设计的主控装置,51单片机具有功能强大的位操作指令,I/O口均可按位寻址,程序空间多达8K,对于本设计也绰绰有余,更可贵的是51单片机价格非常低廉。

在综合考虑了传感器、两部电机的驱动等诸多因素后,我们决定采用一片单片机,充分利用STC89C52单片机的资源。

2.2驱动系统用单片机控制使之工作在占空比可调的开关状态下,精确调整电动机转速。

是一种广泛采用的 PWM调速技术。

现市面上有很多此种芯片,我选用了L298N。

这种调速方式有调速特性优良、调整平滑、调速范围广、过载能力大,能承受频繁的负载冲击,还可以实现频繁的无级快速启动、制动和反转等优点。

2.3 机械系统本题目要求小车的机械系统稳定、灵活、简单,可选用三轮和四轮式,考虑到现在的汽车多采用四轮式我选用四轮式的设计,使设计更贴近生活需求。

驱动和转向方式和现在的汽车一样。

驱动部分:采用玩具小车原有的驱动电机,由L298N双通道马达驱动模块驱动前后两个马达,其力矩完全可以达到模拟效果。

电池的安装:将电池放置在车体的下面,降低车体重心,提高稳定性,同时可增加驱动轮的抓地力,减小轮子空转所引起的误差。

电源模块:采用11V航模电池给电机供电,再用稳压芯片对电池电压进行降压给单片机。

智能小车速度控制程序

智能小车速度控制程序
P2=dis[i];
}
/************************************************************************/
P1_2 P1_3 接IN3 IN4 当 P1_2=1,P1_3=0; 时左下电机正转左下电机接驱动板子输出端(蓝色端子OUT3 OUT4)
P1_2 P1_3 接IN3 IN4 当 P1_2=0,P1_3=1; 时左下电机反转
P1_2 P1_3 接IN3 IN4 当 P1_2=0,P1_3=0; 时左下电机停转
#define Left_moto_Stop {P1_0=0,P1_1=0,P1_2=0,P1_3=0;} //左边两个o {P1_4=1,P1_5=0,P1_6=1,P1_7=0;}//右边两个电机向前走
#define Right_moto_back {P1_4=0,P1_5=1,P1_6=0,P1_7=1;}//右边两个电机向前走
P1_6 P1_7 接IN7 IN8 当 P1_6=1,P1_7=0; 时右下电机正转右下电机接驱动板子输出端(蓝色端子OUT7 OUT8)
P1_6 P1_7 接IN7 IN8 当 P1_6=0,P1_7=1; 时右下电机反转
P1_6 P1_7 接IN7 IN8 当 P1_6=0,P1_7=0; 时右下电机停转
#define Right_2_led P3_7//P3_5接四路寻迹模块接口第四路输出信号即中控板上面标记为OUT4
#define Left_moto_go {P1_0=1,P1_1=0,P1_2=1,P1_3=0;} //左边两个电机向前走
#define Left_moto_back {P1_0=0,P1_1=1,P1_2=0,P1_3=1;}//左边两个电机向后转

智能小车控制系统设计实现

智能小车控制系统设计实现

关键词:智能小车;控制系统;设计和实现1智能小车控制系统概述智能小车控制系统是一个综合、复杂的系统,其既有多种技术,也含有嵌入式的软件设备和硬件设备、图像识别、自动控制和电力传动、机械结构等技术知识,智能小车的控制系统主要是围绕嵌入式控制系统进行的,将其作为操控的中心,并借助计算机系统,最终完成自动造作和控制的过程[1]。

智能小车的控制系统流程图见图1所示。

2智能小车的设计和实现2.1智能小车的硬件设计硬件设计是保证智能小车平稳运行的必要条件,它关系着控制系统的精度和稳定性,因此在设计时需要用在模块化设计思想,该研究是通过采取硬件系统K60芯片作为核心控制器,并通过图像采集模块和电机、舵机驱动模块、测速模块、电源模块等组成硬件设计系统图,见图2。

首先,电源电路设计,该设计时智能小车的动力来源,为小车运行提供不断的电力,一般采取7.3V、容量为2000mAh的可充电型的镍铬电池作为电源,但是其不能直接为控制器传输电力,需要在转变电路后才可以进行传输。

转变电路可以保证控制器直接对电池内的电压进行调节,保证不同模块可以正常工作和运行,智能小车主要是依靠控制电力和电机驱动进行转变的。

其次是K60最小系统板,在设计时需要将K60的管脚部分做成最小系统的单独电路板,这样可以简化电路板的设计,促使调试更加顺利,K60系统板主要由K60芯片、复位电路、时钟电路、JTAG下载电路、电源滤波电路组成。

再其次是电机驱动电路,该电路是在集成芯片的驱动下进行的,可以为控制器更其他模块提供较大的电流最终集成电机驱动芯片,但是要特别注意这部分因为在电机驱动过程中有较大的分功率,会导致小车在进行调试时因为过大的电流导致小车电路发生堵塞现象,而使小车电路被烧毁,因此需要设计者避免这种现象,可以将驱动电路做成驱动板[2]。

最后是舵机接口电路。

在智能小车设计中,舵机主要保证小车可以顺利转向,因此舵机的运行电压、转向动作、转向速度都是需要考虑的因素,一般选择舵机时主要选择Futaba3010,选择供电电压为6V。

智能小车控制程序(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();}}。

智能小车总程序(含遥控)

智能小车总程序(含遥控)
/*********完成话筒,光敏电阻,蜂鸣器.端口定义**/
sbit IRIN=P3^3; //定义红外接收端口
/*********完成红外接收端口的定义*************/
#define ShowPort P2 //定义数码管显示端口
houtui(); //M2电机反转
break;
}
case 3: //左转 //判断用户是否选择形式3
{
zuozhuan(); //M2电机正转
}
void tingzhi()
{
M1A=0; //将M1电机A端初始化为0
M1B=0; //将M1电机B端初始化为0
M2A=0; //将M2电机A端初始化为0
{
case 1: //前进 //判断用户是否选择形式1
{
qianjin();
break;
}
case 2: //后退 //判断用户是否选择形式2
{
sbit M2B=P0^3; //定义右侧电机驱动B端
sbit B1=P0^4; //定义语音识识别传感器端口
sbit SB1=P0^6; //定义蜂鸣器端口
break;
}
case 4: //右转 //判断用户是否选择形式4
{
youzhuan(); //M1电机正转
//M2电机反转
M2B=0;
}
void qianjin()
{
M1A=1;
M1B=0;
M2A=1;
uchar Iint LedFlash; //定义闪动频率计数变量
unsigned char RunFlag=0; //定义运行标志位

智能小车控制.

智能小车控制.

稳压模块
• 方案1: 采用两片7809将电压稳压至9V 后给直流电机供电,然后采用一片7805 将电压稳至5V,给单片机系统和其他芯 片供电。 • 方案2:采用两片7809将电压稳压至9V后 给直流电机供电,然后采用2576将电压 稳至5V。2576的输出电流最大可至3A。
寻迹传感器模块
• 方案1:用光敏电阻组成光敏探测器。光敏电阻的阻值 可以跟随周围环境光线的变化而变化。当光线照射到 白线上面时,光线发射强烈,光线照射到黑线上面时, 光线反射较弱。将阻值的变化经过比较器就可以输出 高低电平。 • 方案2:用红外发射管和接收管制作光电对管寻迹传感 器。红外发射管发出红外线,当发出的红外线照射到 白色的平面后反射,若红外接收管能接收到反射回的 光线则检测出白线继而输出低电平,若接收不到发射 管发出的光线则检测出黑线继而输出高电平。红外探 测器探测距离有限,一般最大不应超过3cm。 • 方案3:用RPR220型光电对管。RPR220是一种一体 化反射型光电探测器,其发射器是一个砷化镓红外发 光二极管,而接收器是一个高灵敏度,硅平面光电三 极管。当发光二极管发出的光反射回来时,三极管导 通输出低电平。
电机模块
• 方案1:采用步进电机作为该系统的驱动电机。 由于其转过的角度可以精确的定位,可以实现 小车前进路程和位置的精确定位。虽然采用步 进电机有诸多优点,步进电机的输出力矩较低, 随转速的升高而下降,且在较高转速时会急剧 下降,由于其转速较低,不适用于小车等有一 定速度要求的系统。 • 方案2:采用直流减速电机。直流减速电机转 动力矩大,体积小,重量轻,装配简单,使用 方便。由于其内部由高速电动机提供原始动力, 带动变速(减速)齿轮组,可以产生较大扭力。
中右
大右
图 11 寻迹流程图

智能小车控制程序

智能小车控制程序

#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所示。

四、评分标准。

智能小车程序(完整)

智能小车程序(完整)

智能小车程序---------超长完整版---------#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; }。

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

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

广东职业技术学院毕业综合实践报告题目:单片机智能小车类型:设计类专业:应用电子技术(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年代。

智能小车程序设计

智能小车程序设计

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、系统外形2、系统任务及指标通过红外传感器避开障碍物,完成巡墙行走。

要求中间不能人工改变小车的方位,且不能触碰到障碍物,最后按完成时间、碰到障碍物的次数及完成的难度等级来给出成绩。

3、硬件安装两个红外检测器、电阻若干、导线若干、小车本体、主控芯片、4节5号电池4、任务要求及步骤用C语言运用适当的控制算法对智能小车进行控制,用C语言软件设计出能完成避障行走的C语言程序。

组装小车,调试并用USB串口下载程序,使小车通过红外传感器避开障碍物,完成巡墙行走。

二、程序设计1、设计思路本车运用红外线(IR)发射和接收器件探测道路。

当IR检测器没有检测到物体时,输出为高电平;检测到物体时,输出为低电平。

因为左边红外接收连接到P1_2,右边红外接收连接到P3_5,左边红外发射连接到P1_3,右边红外红外发射连接到P3_6。

所以用命令{#define LeftIR P1_2}以实现用LeftIR代替P1_2,以此类推。

本程序包括检测左右距离,向前走,左、右转等功能。

需要用delay_nus或者delay_nms延时命令以确保小车运动的精确性。

设定小车与墙壁保持设定距离SetPoint=1。

选定两个灵敏度不同的频率,要求小车发射这两种不同频率的红外线,当只有其中一个频率检测到墙壁时,说明小车距离墙壁的距离等于设定值,即Sidedistance=SetPoint,小车保持方向继续前行并检测;当两个频率都检测到墙壁时,即小车与墙壁的距离小于我们的设定值,即Sidedistance<SetPoint,此时要求小车右转前行,背离墙壁方向并检测距离;当小车发射的两个频率都检测不到墙壁时,说明此时小车与墙壁的距离大于我们的设定值,即Sidedistance>SetPoint,此时要求小车左转前行,靠近墙壁方向并检测距离。

这样就实现了小车判断直线、左转和右转的运动。

2、设计流程图3、程序及说明#include<BoeBot.h>#include<uart.h>#include<intrins.h>#define LeftIR P1_2 //左边红外接收连接到P1_2#define SideIR P3_5 //右边红外接收连接到P3_5#define LeftLaunch P1_3 //左边红外发射连接到P1_3#define SideLaunch P3_6 //右边红外发射连接到P3_6#define SetPoint 1unsigned int time;int Sidedistance; //侧边的距离int leftdistance; //左边的距离int irDetectLeft;int irDetectSide;int delayCount;int m;int a,b,c;unsigned int frequency1[4]={5000,7000};unsigned int frequency[2]={4500,5000};void timer_init(void){IE=0x82; //开总中断EA,允许定时器0中断ET0 TMOD |= 0X01; //定时器0工作在模式1:16位定时器模式}void FreqOut(unsigned int Freq){time = 256 - (500000/Freq); //根据频率计算初值TH0 = 0XFF; //高八位设FFTL0 = time; //低八位根据公式计算TR0 = 1; //启动定时器delay_nus(800); //延时TR0 = 0; //停止定时器}void Timer0_Interrupt(void) interrupt 1{LeftLaunch= ~LeftLaunch; //取反SideLaunch= ~SideLaunch;TH0 = 0XFF; //重新设值TL0 = time;}void Get_lr_Distances(){unsigned int count;leftdistance=0; //初始化左边的距离for(count = 0;count<2;count++){FreqOut(frequency[count]);irDetectLeft = LeftIR; //左边接收if (irDetectLeft == 1)leftdistance++;}}void Get_lr_Distances1(){unsigned int count;int i,m;Sidedistance = 0; //初始化侧边的距离for(i=0;i<3;i++){for(count = 0;count<2;count++){FreqOut(frequency1[count]);irDetectSide=SideIR; //侧边接收if(irDetectSide == 1)Sidedistance++;}if(i==0)a=Sidedistance;if(i==1)b=Sidedistance;elsec=Sidedistance;if((a==b)||(a==c)||(b==c))m=1;elsem=0;}}void Forward(void) //向前行走子程序{int i;for( i=1;i<=26;i++){delay_nus(1700);P1_1=0;P1_0=1;delay_nus(1300);P1_0=0;delay_nms(20);}}void Forward1(void) //向前缓慢行走子程序{int i;for( i=1;i<=15;i++){ P1_1=1;delay_nus(1600);P1_1=0;P1_0=1;delay_nus(1400);P1_0=0;delay_nms(20);}}void Left_Turn(void) //左转子程序{int i;for( i=1;i<=15;i++){P1_1=1;delay_nus(1450);P1_1=0;P1_0=1;delay_nus(1450);P1_0=0;delay_nms(20);}}void Left_Turn1(void) //向左微转子程序{int i;for( i=1;i<=10;i++){P1_1=1;delay_nus(1450);P1_0=1;delay_nus(1450);P1_0=0;delay_nms(20);}}void Right_Turn(void) //右转子程序{int i;for( i=1;i<=15;i++){P1_1=1;delay_nus(1550);P1_1=0;P1_0=1;delay_nus(1550);P1_0=0;delay_nms(20);}}void Right_Turn1(void) //向右微转子程序{int i;for( i=1;i<=10;i++){P1_1=1;delay_nus(1550);P1_1=0;P1_0=1;delay_nus(1550);P1_0=0;delay_nms(20);}}void Backward(void) //向后行走子程序{int i;for( i=1;i<=8;i++){P1_1=1;delay_nus(1400);P1_1=0;P1_0=1;delay_nus(1600);P1_0=0;delay_nms(20);}}int main(void){uart_Init();timer_init();delay_nms(2000);while(1){ Get_lr_Distances1();Get_lr_Distances();if((a+b+c)<=4){ if(leftdistance>1)Forward();// if(leftdistance<=SetPoint)else{Left_Turn();Forward();}/*if(leftdistance<1){ Backward();Left_Turn();Forward1();}*/}/*if((a+b+c)==0){ if(leftdistance>1)Left_Turn1();if(leftdistance==SetPoint){Left_Turn();Forward();}if(leftdistance<1){ Backward();Left_Turn();Forward1();}} */if((a+b+c)>=5){ if(leftdistance>1){//Backward();Right_Turn1();Forward1();}if(leftdistance<=SetPoint){Left_Turn();Forward();}/*if(leftdistance<1){Backward();Left_Turn();Forward1();}*/}}}三、心得体会此次小车智能控制课程设计,是自动化专业卓越工程师实验班特别开设的,历时三周。

多功能智能小车 程序

多功能智能小车 程序
{
EX0=1;
Clock1_Init();
P31=0; //过起跑线,背光灭
}
if (Area0==1)
LowSpeedArea1StartTime=PassTime; //读取进入第一个低速区的时刻
if (Area0==2)
LowSpeedArea1EndTime=PassTime; //读取离开第一个低速区的时刻
/*---------------------------------------------------*/
void SpeedINT(void) interrupt 0 //中断INT0
{
if (SelectedAll==False) //如果模式和速度还没有选择完毕,则此中断作为Next键
Back0=0;
EX1=0;
}
}
IE1=0;
}
if (AutoDisplay==True) //自动显示
{
GoToChoosingDisplay=True;
}
if (ChoosingDisplay==True) //手动选择显示
EX1=0;
}
else //S型模式
{
Nocurve++;
Round++;
if(Roundid==1&&Round==2)
{Round++;Roundid=0;}
Back=0;
TH0=Thx0; //定时初值
TL0=Tlx0;
}
/*---------------- 定时器1初始化 ----------------------*/

智能小车控制程序1

智能小车控制程序1

/*实现前进与后退功能*//*控制智能车向前行驶10秒,然后停3秒,再向后行驶6秒,停止*//********************************************************/#include<reg52.h>#define uint unsigned int/*进行端口声明时,应与具体硬件连接相对应,如不相互对应,将影响程序功能的正常实现*/sbit S1=P1^3; //对电机端口声明sbit S2=P1^4;sbit S3=P1^5;sbit S4=P1^6;/*功能函数定义*/void delay(uint del) //延时函数,延时del毫秒{uint i,j;for(i=0; i<del; i++)for(j=0; j<148; j++);}void go() //实现前进功能{S1=1; //S1与S2控制小车右侧的两个轮子S2=0;S3=1; //S3与S4控制小车左侧的两个轮子S4=0;}void back() //实现后退功能{S1=0;S2=1;S3=0;S4=1;}void stop() //实现停止功能{S1=0;S2=0;S3=0;S4=0;}/*主函数*/void main() //主函数{go(); //前进delay(10000); //前进10秒stop(); //停止delay(3000); //停3秒back(); //后退delay(6000); //后退6秒stop(); //停止}。

智能循迹小车程序

智能循迹小车程序

智能循迹小车,小车按中字笔画行驶/************“中”字笔画轨迹*************/ #include<reg52.h>#include <intrins.h> //内部包含延时函数_nop_(); #define uchar unsigned char#define uint unsigned intunsigned char dj1=0;unsigned char dj2=0;uchar t=0;uchar num1=0,num2=0,num3=0;sbit HW1=P0^0; //红外对管位定义sbit HW2=P0^1;sbit HW3=P0^2;sbit HW4=P0^3;sbit ENA=P3^2; //PWM输入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{u int i,j;f or(i=0;i<x;i++)for(j=0;j<120;j++);}void qianjin() //小车前进{I N5=0;I N6=1;I N7=0;I N8=1;d j1=15;d j2=15;}void turnleft2() //小车前进向左微调{I N5=0;I N6=1;I N7=0;I N8=1;d j1=7;d j2=20;}void turnright2() //小车前进向右微调{I N5=0;I N6=1;I N7=0;I N8=1;d j1=20;d j2=7;}void right(){I N5=0;I N6=1;I N7=1;I N8=0;d j1=20;d j2=25;}void left(){I N5=1;I N6=0;I N7=0;I N8=1;d j1=25;d j2=20;}void stop() //小车后退{d j1=0;d j2=0;}void init() //初始化{T MOD=0x01;T H0=(65536-500)/256;T L0=(65536-500)%256;E A=1;E T0=1;T R0=1;}void timer0() interrupt 1 using 1 //定时器0中断{T H0=(65536-500)/256;T L0=(65536-500)%256;t++;i f(t<dj1) ENA=1;e lse ENA=0;i f(t<dj2) ENB=1;e lse ENB=0;i f(t>=50){t=0;}}void main(){i nit();w hile(1){if(num1==0){if(HW1==0&&HW2==1&&HW3==1&&HW4==0){qianjin();}if(HW1==0&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==1&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==1&&HW2==0&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==0){turnright2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==1){turnright2();}if(HW1==0&&HW2==0&&HW3==0&&HW4==1){turnright2();}if(HW1==0&&HW2==1&&HW3==1&&HW4==1){turnleft2();}if(HW1==1&&HW2==1&&HW3==1&&HW4==0){turnright2();}if(num2==0&&HW1==0&&HW2==0&&HW3==0&&HW4==0){delay(500);if(num2==0&&HW1==0&&HW2==0&&HW3==0&&HW4==0){stop();delay(50);num1=1;delay(50);}}}if(num1==1){if(num2==0&&HW1==0&&HW2==0&&HW3==0&&HW4==0){right();}if(HW1==0&&HW2==1&&HW3==1&&HW4==0){num2=1;delay(50);qianjin();}if(HW1==0&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==1&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==1&&HW2==0&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==0){turnright2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==1){turnright2();}if(HW1==0&&HW2==0&&HW3==0&&HW4==1){turnright2();}if(HW1==0&&HW2==1&&HW3==1&&HW4==1){turnleft2();}if(HW1==1&&HW2==1&&HW3==1&&HW4==0){turnright2();}if(num2==1&&HW1==0&&HW2==0&&HW3==0&&HW4==0){delay(500);if(num2==1&&HW1==0&&HW2==0&&HW3==0&&HW4==0) {stop();delay(50);num1=2;delay(50);}}}if(num1==2){if(num2==1&&HW1==0&&HW2==0&&HW3==0&&HW4==0) {right();}if(HW1==0&&HW2==1&&HW3==1&&HW4==0){num2=2;delay(50);qianjin();}if(HW1==1&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==1&&HW2==0&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==1){turnright2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==0){turnright2();}if(HW1==0&&HW2==0&&HW3==0&&HW4==1){turnright2();}if(num3==0&&HW1==1&&HW2==1&&HW3==1&&HW4==1)num3=1;delay(10);stop();delay(100);qianjin();}if(HW1==0&&HW2==1&&HW3==1&&HW4==1){turnleft2();}if(HW1==1&&HW2==1&&HW3==1&&HW4==0){turnright2();}if(num2==2&&HW1==0&&HW2==0&&HW3==0&&HW4==0){delay(500);if(num2==2&&HW1==0&&HW2==0&&HW3==0&&HW4==0){stop();delay(50);num1=3;delay(50);}}}if(num1==3){if(num2==2&&HW1==0&&HW2==0&&HW3==0&&HW4==0){right();}if(HW1==0&&HW2==1&&HW3==1&&HW4==0){num2=3;delay(50);qianjin();}if(HW1==1&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==1&&HW3==0&&HW4==0)turnleft2();}if(HW1==1&&HW2==0&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==1){turnright2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==0){turnright2();}if(HW1==0&&HW2==0&&HW3==0&&HW4==1){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){delay(500);if(num2==3&&HW1==0&&HW2==0&&HW3==0&&HW4==0){stop();delay(50);num1=4;delay(50);}}}if(num1==4){if(num2==3&&HW1==0&&HW2==0&&HW3==0&&HW4==0){right();if(HW1==0&&HW2==1&&HW3==1&&HW4==0){num2=4;delay(50);qianjin();}if(HW1==1&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==1&&HW2==0&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==1){turnright2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==0){turnright2();}if(HW1==0&&HW2==0&&HW3==0&&HW4==1){turnright2();}if(num3==1&&HW1==1&&HW2==1&&HW3==1&&HW4==1) {num3=2;delay(10);stop();delay(100);qianjin();}if(HW1==0&&HW2==1&&HW3==1&&HW4==1){turnleft2();}if(HW1==1&&HW2==1&&HW3==1&&HW4==0)turnright2();}if(num2==4&&HW1==0&&HW2==0&&HW3==0&&HW4==0){delay(500);if(num2==4&&HW1==0&&HW2==0&&HW3==0&&HW4==0){stop();delay(50);num1=5;delay(50);}}}if(num1==5){if(num2==4&&HW1==0&&HW2==0&&HW3==0&&HW4==0){left();}if(HW1==0&&HW2==1&&HW3==1&&HW4==0){num2=5;delay(50);qianjin();}if(HW1==1&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==1&&HW2==0&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==1){turnright2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==0)turnright2();}if(HW1==0&&HW2==0&&HW3==0&&HW4==1){turnright2();}if(HW1==0&&HW2==1&&HW3==1&&HW4==1){turnleft2();}if(HW1==1&&HW2==1&&HW3==1&&HW4==0){turnright2();}if(num2==5&&HW1==1&&HW2==1&&HW3==1&&HW4==1) {stop();delay(100);num1=6;delay(50);}}if(num1==6){if(num2==5&&HW1==1&&HW2==1&&HW3==1&&HW4==1) {left();}if(HW1==0&&HW2==1&&HW3==1&&HW4==0){num2=6;delay(50);num3=3;delay(50);qianjin();}if(HW1==1&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==1&&HW3==0&&HW4==0){turnleft2();if(HW1==1&&HW2==0&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==1){turnright2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==0){turnright2();}if(HW1==0&&HW2==0&&HW3==0&&HW4==1){turnright2();}if(HW1==0&&HW2==1&&HW3==1&&HW4==1){turnleft2();}if(HW1==1&&HW2==1&&HW3==1&&HW4==0){turnright2();}if(num3==3&&HW1==1&&HW2==1&&HW3==1&&HW4==1){num3=4;delay(10);stop();delay(100);qianjin();}if(num2==6&&HW1==0&&HW2==0&&HW3==0&&HW4==0){delay(500);if(num2==6&&HW1==0&&HW2==0&&HW3==0&&HW4==0) {stop();delay(500);num1=7;delay(50);}}}if(num1==7){if(num2==6&&HW1==0&&HW2==0&&HW3==0&&HW4==0) {right();}if(HW1==0&&HW2==1&&HW3==1&&HW4==0){num2=7;delay(50);num3=4;delay(50);qianjin();}if(HW1==1&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==1&&HW3==0&&HW4==0){turnleft2();}if(HW1==1&&HW2==0&&HW3==0&&HW4==0){turnleft2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==1){turnright2();}if(HW1==0&&HW2==0&&HW3==1&&HW4==0){turnright2();}if(HW1==0&&HW2==0&&HW3==0&&HW4==1){turnright2();}if(HW1==0&&HW2==1&&HW3==1&&HW4==1){turnleft2();}if(HW1==1&&HW2==1&&HW3==1&&HW4==0){turnright2();}if(num3==4&&HW1==1&&HW2==1&&HW3==1&&HW4==1){num3=5;delay(10);stop();delay(100);qianjin();}if(num3==5&&HW1==1&&HW2==1&&HW3==1&&HW4==1){num3=6;delay(10);stop();delay(100);qianjin();}if(num2==7&&HW1==0&&HW2==0&&HW3==0&&HW4==0){delay(100);if(num2==7&&HW1==0&&HW2==0&&HW3==0&&HW4==0){stop();delay(90000);}}}}}。

智能小车基本控制

智能小车基本控制

模块一:智能小车基本控制基本控制模块主要设计思想先应用C51单片机产生能够控制伺服电机旋转方向和转速的各种控制信号,然后利用这些控制信号去实现对伺服电机的旋转方向和转速的控制;用单片机控制伺服电机旋转方向和转速是轮式机器人实现各种导航动作的重要基础,后续模块中都要用到,因此本模块所设计的控制函数可以用作功能模块被后续模块直接调用;通过该模块的学习与实践,可以让学生达到如下学习目标:◆掌握单片机并行I/O口的基本应用方法;◆学会单片机C语言的基本编程方法;◆掌握直流伺服电机的基本工作原理和控制方法;◆利用单片机的软件延时方法产生各种伺服电机控制信号;基础控制模块任务及要求1.任务(1)基础模块功能描述;(2)电机正转控制(学生做);(3)基础控制模块的工作原理及程序设计思路(老师讲);(4)电机正转、反转、停转控制以及正转、反转、停转三种方式切换(学生练);2.要求(1)能控制伺服电机的旋转方向(2)能控制伺服电机的旋转速度任务一:基础控制模块设计方案功能模块描述基础模块如图1.1,由单片机最小系统、电机驱动芯片、直流伺服电机、程序下载端口四个部分组成。

各个组成部分功能如下:程序下载端口综上所述基础控制模块是整个智能小车的控制核心。

任务二:电机正转控制(做)操作步骤及要求(1)根据给出原理图直流伺服电机旋转工作电路,利用PROTEUS仿真软件绘制出直流伺服电机旋转原理图。

(2)根据给出的程序设计及思路,利用KEIL C ,编写调试程序。

(3)在PROTEUS仿真环境里控制直流伺服电机旋转,画出详细的程序流程框图,给出程序设计清单并加上必要的注释参考源代码。

(4)列出元件清单并选型,在万能版上焊接电路。

(5)自行装配、接线和调试,并能检查和发现问题,根据原理、现象和测量数据分析问题所在,加以解决。

任务三:基础控制模块的工作原理及程序设计思路(讲)在任务2,同学们根据老师提供的原理图和基础程序代码进行电路仿真和实际制作,看到了电机正转现象,下面针对以上现象进行分析、讲解。

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