智能小车控制程序1
程序控制的智能小车

一、设计要求:设计一辆由程序控制的智能小车,要求小车在活动场上能利用编写的程序,自动走出我们设计的路线,同时能在场地上画出相应的图形二、主控系统2.1主控系统采用单片机作为整个系统的核心,用其控制行进中的小车,以实现其既定的性能指标。
充分分析我们的系统,其关键在于实现小车的自动控制,而在这一点上,单片机就显现出来它的优势——控制简单、方便、快捷。
这样一来,单片机就可以充分发挥其资源丰富、有较为强大的控制功能及可位寻址操作功能、价格低廉等优点。
针对本设计特点——多开关量输入的复杂程序控制系统,需要擅长处理多开关量的标准单片机,而不能用精简I/O口和程序存储器的小体积单片机,D/A、A/D功能也不必选用。
根据这些分析,我选定了STC89C52RA单片机作为本设计的主控装置,51单片机具有功能强大的位操作指令,I/O口均可按位寻址,程序空间多达8K,对于本设计也绰绰有余,更可贵的是51单片机价格非常低廉。
在综合考虑了传感器、两部电机的驱动等诸多因素后,我们决定采用一片单片机,充分利用STC89C52单片机的资源。
2.2驱动系统用单片机控制使之工作在占空比可调的开关状态下,精确调整电动机转速。
是一种广泛采用的 PWM调速技术。
现市面上有很多此种芯片,我选用了L298N。
这种调速方式有调速特性优良、调整平滑、调速范围广、过载能力大,能承受频繁的负载冲击,还可以实现频繁的无级快速启动、制动和反转等优点。
2.3 机械系统本题目要求小车的机械系统稳定、灵活、简单,可选用三轮和四轮式,考虑到现在的汽车多采用四轮式我选用四轮式的设计,使设计更贴近生活需求。
驱动和转向方式和现在的汽车一样。
驱动部分:采用玩具小车原有的驱动电机,由L298N双通道马达驱动模块驱动前后两个马达,其力矩完全可以达到模拟效果。
电池的安装:将电池放置在车体的下面,降低车体重心,提高稳定性,同时可增加驱动轮的抓地力,减小轮子空转所引起的误差。
电源模块:采用11V航模电池给电机供电,再用稳压芯片对电池电压进行降压给单片机。
智能小车速度控制程序

}
/************************************************************************/
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)

智能小车控制程序(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、智能小车控制系统一、任务:设计一个智能小车控制系统,小车行车路线图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; }。