2003简易智能小车程序

合集下载

人工智能小车课程设计

人工智能小车课程设计

人工智能小车课程设计一、课程目标知识目标:1. 学生能理解人工智能基础概念,掌握人工智能小车的基本工作原理。

2. 学生能描述编程控制人工智能小车的基本步骤和方法。

3. 学生能了解人工智能在现实生活中的应用,认识到科技发展的意义。

技能目标:1. 学生能通过动手实践,组装并调试人工智能小车。

2. 学生能运用所学的编程知识,编写简单的程序来控制人工智能小车。

3. 学生能通过小组合作,解决人工智能小车在实际运行中遇到的问题。

情感态度价值观目标:1. 学生对人工智能产生浓厚的兴趣,培养主动探究科学技术的热情。

2. 学生在团队合作中,学会互相尊重、沟通与协作,培养团队精神。

3. 学生通过了解人工智能的广泛应用,增强创新意识,认识到科技对生活的改变。

课程性质:本课程为实践性强的科技课程,注重理论知识与实践操作相结合。

学生特点:六年级学生具备一定的逻辑思维能力和动手操作能力,对新鲜事物充满好奇。

教学要求:教师应注重引导学生主动探究,关注学生的个体差异,鼓励团队合作,提高学生的实践和创新能力。

在教学过程中,将课程目标分解为具体的学习成果,便于教学设计和评估。

1. 人工智能基础概念:介绍人工智能的定义、发展历程及分类,结合课本相关章节,使学生了解人工智能的基本知识。

2. 人工智能小车结构:讲解人工智能小车的硬件组成,如传感器、电机、控制器等,以及各部分功能,让学生了解小车的工作原理。

3. 编程控制方法:教授编程语言基础,如Scratch或Python,指导学生编写简单的程序,实现对人工智能小车的控制。

4. 实践操作:安排学生动手组装和调试人工智能小车,学会使用相关工具和仪器,培养实际操作能力。

5. 团队合作与问题解决:分组进行实践活动,让学生在团队合作中解决实际问题,提高沟通与协作能力。

6. 人工智能应用案例:介绍人工智能在现实生活中的应用实例,如自动驾驶、智能家居等,拓宽学生的视野。

教学大纲安排:第一课时:人工智能基础概念,介绍课本相关章节内容;第二课时:人工智能小车结构,分析小车各部分功能;第三课时:编程控制方法,学习编程语言基础;第四课时:实践操作,分组组装和调试人工智能小车;第五课时:团队合作与问题解决,解决实际操作中遇到的问题;第六课时:人工智能应用案例,了解科技发展的前沿动态。

简易智能小车_源程序

简易智能小车_源程序

简易智能小车——2003年全国大学生电子设计竞赛,c51源程序系统的单片机程序#include "reg52.h"#define det_Dist 2.55 //单个脉冲对应的小车行走距离,其值为车轮周长/4 #define RD 9 //小车对角轴长度#define PI 3.1415926#define ANG_90 90#define ANG_90_T 102#define ANG_180 189/*============================全局变量定义区============================*/sbit P10=P1^0; //控制继电器的开闭sbit P11=P1^1; //控制金属接近开关sbit P12=P1^2; //控制颜色传感器的开闭sbit P07=P0^7; //控制声光信号的开启sbit P26=P2^6; //接收颜色传感器的信号,白为0,黑为1sbit P24=P2^4; //左sbit P25=P2^5; //右接收左右光传感器的信号,有光为0unsigned char mType=0; //设置运动的方式,0 向前1 向左2 向后3 向右unsigned char Direction=0; //小车的即时朝向0 朝上1 朝左2 朝下3 朝右unsigned sX=50; unsigned char sY=0; //小车的相对右下角的坐标CM(sX,sY)unsigned char StartTask=0; //获得铁片后开始执行返回卸货任务,StartTask置一unsigned char Inter_EX0=0; // 完成一个完整的任务期间只能有一次外部中断// Inter_EX0记录外部中断0的中断状态// 0 动作最近的前一次未中断过,// 1 动作最近的前一次中断过unsigned char cntIorn=0; //铁片数unsigned char bkAim=2; //回程目的地,0为A仓库,1为B仓库,2为停车场,//(在MAIN中接受铁片颜色判断传感器的信号来赋值)unsigned char Light_Flag=0;//进入光引导区的标志(1)unsigned int cntTime_5Min=0;//时间周期数,用于T0 精确定时unsigned int cntTime_Plues=0; //霍尔开关产生的脉冲数/*============================全局变量定义区============================*//*------------------------------------------------*//*-----------------通用延迟程序-------------------*//*------------------------------------------------*/void delay(unsigned int time) // time*0.5ms延时{unsigned int i,j;for(j=0;j<time;j++){for(i=0;i<60;i++){;}}}/*-----------------------------------------------*//*-------------------显示控制模块----------------*//*-----------------------------------------------*//*数码管显示,显示铁片的数目(设接在P0,共阴)*/void Display(unsigned char n){charNumb[12]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x37,0x7 7};P0=Numb[n];}/*-----------------------------------------------*//*-------------------传感器模块------------------*//*-----------------------------------------------*//*光源检测程序: *//*用于纠正小车运行路线的正确性*/unsigned char LightSeek(){ void Display(unsigned char);bit l,r;l=P24;r=P25;if(l==0&&r==1){//Display(1);return (3); //偏左,向右开}if(r==0&&l==1){//Display(3);return(1); //偏右,向左开}if((l==1&&r==1)||(l==0&&r==0)){//Display(9);return(0); //没有偏离,前进}}/*铁片检测程序: *//*判断铁片的颜色,设定bkAim,0为A仓库,1为B仓库,2为停车场*/ void IornColor(){delay(4000);bkAim=(int)(P26);Display((int)(P26)+2);}/*-----------------------------------------------*//*------------------运动控制模块-----------------*//*-----------------------------------------------*//*====基本动作层:完成基本运动动作的程序集====*//*运动调整程序: *//*对小车的运动进行微调*/void ctrMotor_Adjust(unsigned char t){if(t==0){P2=P2&240|11; //用来解决两电机不对称的问题delay(6);}if(t==3){P2=P2&250; //向左走delay(1);}if(t==1){P2=(P2&245);delay(1); //向右走}P2=((P2&240)|15);delay(10);}/*直走程序: *//*控制小车运动距离,dist为运动距离(cm),type为运动方式(0 2)*/ /*只改变小车sX 和sY的值而不改变Direction的值. */ void ctrMotor_Dist(float dist,unsigned char type){unsigned char t=0;mType=type;P2=((P2&240)|15);cntTime_Plues=(int)(dist/det_Dist);while(cntTime_Plues){if(Inter_EX0==1&&StartTask==0){cntTime_Plues=0;break;}if(Light_Flag==1) t=LightSeek();if(type==0) //向前走{P2=P2&249;delay(40);ctrMotor_Adjust(t);}if(type==2) //向后退{P2=P2&246;delay(50);ctrMotor_Adjust(t);}P2=((P2&240)|15);if(mType==2) delay(60);//刹车制动0.5mselse delay(75);}}/*拐弯程序: *//*控制小车运动角度,type为运动方式(1 3)*//*只改变小车Direction的值而不改变sX 和sY的值*/void ctrMotor_Ang(unsigned char ang,unsigned char type,unsigned char dir) {unsigned char i=0;mType=type;P2=((P2&240)|15);cntTime_Plues=(int)((PI*RD*90/(180*det_Dist)*1.2)*ang/90);while(cntTime_Plues){if(Inter_EX0==1&&StartTask==0){cntTime_Plues=0;break;}if(type==1) //向左走{P2=P2&250;delay(100);ctrMotor_Adjust(0);}if(type==3) //向右走{P2=P2&245;delay(100);ctrMotor_Adjust(0);}P2=((P2&240)|15);delay(50);//刹车制动0.5ms}if(!(Inter_EX0==1&&StartTask==0)){Direction=dir;}}/*====基本路线层:描述小车基本运动路线的程序集====*//*当小车到达仓库或停车场时,放下铁片或停车(0,1为仓库,2为停车场)*/ void rchPlace(){unsigned int time,b,s,g;time=(int)(cntTime_5Min*0.065535);//只有一个数码管时,轮流显示全过程秒数个十百b=time%100;s=(time-b*100)%100;g=(time-b*100-s*10)%10;if(bkAim==2){//到达停车场了,停车EA=0;P2=((P2&240)|15);while(1){Display(10); //Ndelay(2000);Display(cntIorn);delay(2000);Display(11);//Adelay(2000);Display(b);delay(2000);Display(s);delay(2000);Display(g);delay(2000);}}else{if(Inter_EX0==1&&StartTask==1)P10=0; //到达仓库,卸下铁片}}/*无任务模式: *//*设置小车的固定运动路线,未发现铁片时的运动路线*/void BasicRoute(){ //Light_Flag=1;ctrMotor_Dist(153,0);//Light_Flag=0;ctrMotor_Ang(ANG_90,1,1);ctrMotor_Dist(100-sX,0);ctrMotor_Dist(125,2);ctrMotor_Dist(73,0);ctrMotor_Ang(ANG_90,1,2);//Light_Flag=1;ctrMotor_Dist(153,0);//Light_Flag=0;ctrMotor_Ang(ANG_180,1,0);rchPlace();}/*任务模式: *//*设置小车的发现铁片后的运动路线*/void TaskRoute(){//基本运行路线表,记载拐弯0 向前1 左拐2 向后3 右拐,正读去A区;反读去B区StartTask=1;ctrMotor_Ang(ANG_90_T,1,2);if(bkAim==1) //仓库A{ctrMotor_Dist(10,0);P2=((P2&240)|15);delay(60);ctrMotor_Ang(ANG_90_T,1,3);ctrMotor_Dist(100-sX,2);ctrMotor_Ang(ANG_90_T,1,2);Light_Flag=1;ctrMotor_Dist(153,2);Light_Flag=0;// ctrMotor_Ang(208,1,0);}else if(bkAim==0) //仓库B{ctrMotor_Dist(10,0);P2=((P2&240)|15);delay(60);ctrMotor_Ang(ANG_90_T,1,3);ctrMotor_Dist(100-sX,0);ctrMotor_Ang(ANG_90_T,1,0);Light_Flag=1;ctrMotor_Dist(153,2);Light_Flag=0;//ctrMotor_Ang(208,1,0);}delay(5000);rchPlace();}/*---------------------------------------------*//*-------------------主程序段------------------*/ /*---------------------------------------------*/void main(){delay(4000);P2=0xff; //初始化端口P07=0;P1=0;TMOD=0x01; //初始化定时器0/1 及其中断TL0=0;TH0=0;TR0=1;ET0=1;ET1=1;IT0=1; //初始化外部中断EX0=1;IT1=1;EX1=1;EA=1;P11=1;while(1){Display(cntIorn);bkAim=2;BasicRoute();if(Inter_EX0==1){TaskRoute();//按获得铁片后的路线运动IE0=0;EX0=1;}Inter_EX0=0;}}/*----------------------------------------------------*//*----------------------中断程序段--------------------*//*----------------------------------------------------*//*定时器0中断程序: *//*当时间过了5分钟,则就地停车并进入休眠状态*/void tmOver(void) interrupt 1{cntTime_5Min++;TL0=0;TH0=0;if(cntTime_5Min>=4520){Display(5);P2=((P2&240)|15);EA=0; //停车程序P07=1;delay(4000);PCON=0X00;while(1);}}/*外部中断0中断程序: *//*发现铁片,发出声光信号并将铁片吸起,发光二极管和蜂鸣器*//*并联在一起(设接在P07). 0为A仓库,1为B仓库,2为停车场*/ void fndIorn(void) interrupt 0{unsigned char i;P10=1;P2=((P2&240)|15); //停车P07=1;delay(1000);//刹车制动0.5msP07=0;Inter_EX0=1;cntIorn++;Display(cntIorn);for(i=0;i<40;i++){P2=P2&249;delay(2);P2=((P2&240)|15);delay(2);}P2=P2&249;delay(100);P2=((P2&240)|15); //停车IornColor(); //判断铁片黑白,设置bkAimfor(i=0;i<95;i++){P2=P2&249;delay(3);P2=((P2&240)|15);delay(2);}P2=((P2&240)|15); //停车delay(4000); //把铁片吸起来EX0=0;}/*外部中断1中断程序: *//*对霍尔开关的脉冲记数,对小车的位置进行记录,以便对小车进行定位*/ void stpMove(void) interrupt 2{cntTime_Plues--;if(Direction==0) //向上{if(mType==0) sY+=det_Dist;else if(mType==2)sY-=det_Dist;}else if(Direction==1) //向左{if(mType==0) sX+=det_Dist;else if(mType==2)sX-=det_Dist;}else if(Direction==2) //向下{if(mType==0) sY-=det_Dist;else if(mType==2)sY+=det_Dist;}else if(Direction==3) //向右{if(mType==0) sX-=det_Dist;else if(mType==2)sX+=det_Dist;}}。

机器人智能小车制作与编程

机器人智能小车制作与编程

机器人智能小车制作与编程
一、智能小车的制作
1、准备材料:电机、智能小车及其相关的板、轮子、电池、杜邦线、螺丝刀、钳子、电钻、活动榫头、把手以及其他相关材料。

2、连接电机与电池:将电机与电池连接起来,用杜邦线将正极引脚
连接到电机的正极,负极引脚连接到电机的负极,确保电池与电机之间的
稳定连接和电路的正确性。

3、安装电机:将电机安装在智能小车的底盘上,使用螺丝刀将电机
固定在底盘上,确保电机的稳定性和牢固性。

4、连接轮子:将轮子连接到电机上,将活动榫头连接到轮子上,再
将把手连接到活动榫头上,以保证轮子与电机之间的稳定连接。

5、安装智能小车板:将智能小车板安装在轮子上,使用螺丝刀将其
固定在轮子上,以保证智能小车板的稳定性和牢固性。

二、智能小车的编程
2、配置参数:将智能小车的电机、电池、摄像头等硬件连接到计算
机上,打开Arduino IDE软件,根据硬件的设置进行参数配置,确保硬件
参数的正确性。

3、编写代码:根据智能小车的功能,利用Arduino IDE进行软件编写,编写完成后,将代码上传到智能小车板上。

智能小车速度控制程序

智能小车速度控制程序
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; 时右上电机停转

从零开始,学做智能小车【4-程序初级篇】

从零开始,学做智能小车【4-程序初级篇】

电子科技大学
CXY-STUDIO
Write By cpholr
电机,用手轻轻一捏住,就停下来了,不管转的多块多牛逼。但是带了减速箱的直流电机,在负重情况下 还是可以轻松的爬坡,吊起重物等等。 所以相比于普通不带减速的直流电机, 减速直流电机的线性度非常好, 相同周期下不同占空比的 PWM, 可以得到不同的转速,受负载的影响相比普通电机而言小了很多。
--黑线在 2-3 正上方,与中心偏差 -8.5*8 mm --黑线在 3-4 正上方,与中心偏差 -8.5*6 mm --黑线在 4-5 正上方,与中心偏差 -8.5*4 mm --黑线在 5-6 正上方,与中心偏差 -8.5*2 mm
0 --黑线在 6-7 正上方,与中心偏差 0 1 --黑线在 3 --黑线在
电子科技大学
CXY-STUDIO
Write By cpholr
最简单的做法就是,偏差越大,就大的越多,偏差越小,就超过的小。偏差为零,左右轮子就给出一 样的占空比,让他们转速一样。 如果读者已经理解到了这个地方, 那么, 只要你硬件弄正确了, 小车是不是已经可以沿着黑线跑了呢? 答案是当然可以,但是,这样子小车的速度只能像蜗牛一样的爬,并不能飙车。这是为什么呢? 欲知原因,请听下回讲解。
2 --黑线在 7-8 正上方,与中心偏差 8.5*2 mm 4 --黑线在 8-9 正上方,与中心偏差 8.5*4 mm 5 --黑线在 7 --黑线在 9 --黑线在 11 --黑线在 6 --黑线在 9-10 正上方,与中心偏差 8.5*6 mm 8 --黑线在 10-11 正上方,与中心偏差 8.5*8 mm 10 --黑线在 11-12 正上方,与中心偏差 8.5*10 mm 这样的话,巡线的精度就锁定在 8.5 毫米了,这样的精度对于巡线小车是足够的。 我们再继续验算一下上面的偏差编码:

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

智能小车总程序(含遥控)
/*********完成话筒,光敏电阻,蜂鸣器.端口定义**/
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; //定义运行标志位

智能小车控制程序

智能小车控制程序

#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);}}。

智能小车说明书

智能小车说明书

基于STC12C5A60S2 单片机智能轮式小车设计摘要:以STC12C5A60S2 单片机为核心,由主控模块、传感器模块、电机驱动模块等组成,完成路面信息检测、循迹,寻找火源,直流电机控制等功能。

路面信息检测、循迹采用红外光电寻迹传感器判断接收地面反射光线的方式反馈,通过高低电平来进行路面检测、路径判断;寻找火源采用火焰传感器判断火源所在方位;电机直流驱动则用来保证小车以最快的速度行驶。

关键词:智能小车、STC12C5A60S2 单片机、红外传感器、循迹传感器、碰撞传感器、直流电机目录引言 (2)一.总体设计方案 (3)1.1 设计方案论证 (3)1.2 方案的总体设计框图 (3)二.硬件模块设计 (3)2.1 硬件模块组成 (3)2.2 中央处理器模块 (3)2.3传感器模块 (4)三.功能介绍 (6)四.软件设计 (6)五.参考文献............ 错误!未定义书签。

引言只能作为现代社会的新产物是以后的发展方向。

它可以按照预先设定的模块在一个特定的环境里自动的运作,无需人为管理,便可以完成预期所要达到的或更高的目标。

本次设计一智能小车,小车能够沿着特定轨迹行驶,躲避障碍物并能准确寻找到火源,发出警告功能。

在此过程中要通过单片机和各种传感器实现小车的前进、后退、左转和右转等基本操作。

通过这些基本功能再加上相关的传感器实现具有特定功能的智能小车。

这里在履带式小车上加装红外反射、循迹、火焰传感器,在STC12C5A60S2 单片机的管理和相关程序的控制下,能完成自动循迹及在复杂地形的迷宫中寻找出路的功能。

作品可以作为高级智能玩具,也可以作为大学生学习嵌入式控制的强有力的应用实例,该系统将会有更广阔的开发前景。

一.总体设计方案1.1 设计方案论证本次设计采用红外传感器来判定前方障碍的有无,使小车遇到障碍物时能即使的避免的功能;采用火焰传感器来实现寻找火源的功能;采用红外寻迹传感器来实现小车沿黑线前进的寻迹功能;采用STC12C5A60S2单片机来控制小车的各项基本操作。

手把手教你做智能小车

手把手教你做智能小车

3. 模块介绍...................................................................................................................7
3.1
主控模块 ................................................................................................................... 7
4.1
硬件设计 ................................................................................................................. 16
4.2
软件设计 ................................................................................................................. 16
5.6
红外遥控驱动文件(remote.c) ...........................................................................23
5.7
舞蹈模式驱动(dance.c) ..................................................................................... 25
5.2
红外循线(IR.c) .......................................................................................................21

0203 小车自动往复运行控制程序设计

0203 小车自动往复运行控制程序设计

任务分析
任务分析
说明 PLC软元件
X0
输入
X1
X2
X3
Y0 输出
Y1
元件文字符号 SB1 SB2 SQ1 SQ2
元件名称 启动按钮 停止按钮 行程开关 行程开关
KM1
右行接触器
KM2
左行接触器
控制功能 启动控制 停止控制 A点位置检测 B点位置检测 正转接通或分
断电源 反转接通或分
断电源
知识储备
《PLC应用技术》
电动机控制程序设计
小车自动往复运行控制程序设计
布置任务
小车自动往复运行控制 程序设计
当按下启动按钮时,小车从A点出发向B点运行。 当小车运行到B点,小车立即从B点向A点运行。 依照此过程,小车在A、B两点之间往复运行。当 按下停止按钮时,小车停止运行。当再次按下启 动按钮时,小车能按照停止前的原方向重新运行。
当小车行驶到B限位点时, 由于B点行程开关动作,使 得X3常闭触点断开,M0线 圈和Y0线圈相继失电,小车 右行停止。同时,M1线圈 得电并自锁,M1常开触点 闭合,M1触点驱动Y1线圈 得电,小车开始向左行驶。
当小车行驶到A限位点时,由于B点行程 开关动作,使得X2常闭触点断开,M1线 圈和Y1线圈相继失电,小车右行停止。 同时,M0线圈得电并自锁,M0常开触点 闭合,M0触点驱动Y0线圈得电,小车再 次向右行驶。
任务实施
› (2)用触点比较指令编写的控制程序
当小车行驶到A限位点时,由于A点行 程开关动作,使得X2常闭触点断开, M1线圈和Y1线圈相继失电,小车右 行停止。同时,M0线圈得电并自锁, M0常开触点闭合,M0触点驱动Y0线 圈得电,小车再次向右行驶。 按下停止按钮,小车停止运行。当再 次按下启动按钮时, PLC执行[= C0 K1]指令,如果(C0)=1,则小车再 次向右行驶;PLC执行[= C1 K1]指 令,如果(C1)=1,则小车再次向左 行驶。

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

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

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

智能循迹小车C程序(完美_详尽)

智能循迹小车C程序(完美_详尽)

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

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

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

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

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

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

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

智能小车程序设计

智能小车程序设计

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简易自动控制小车(D题)摘要本系统以AT89C51单片机作为自动小车的检测和控制核心,对小车的整个行驶过程进行实时监控。

采用一体化反射接近开关LTH-1650-01为数据采集部件,用马达控制驱动芯片LG9110驱动小车的前进与停车,小车可以在行进的同时计算里程,并在到达预设终点停车时交替显示路程与速度,这样就组成了一个比较完整的自动测控系统。

该系统基于可靠的硬件设计和软件的浮点运算,实现了小车在行进和检测过程中的精确控制,整个系统的电路结构简单,可靠性高。

实验测试结果满足要求。

本系统的创新点是用声控方法控制小车的启动并在停车后能显示平均时速。

2一、方案论证与比较:根据题目要求,该系统可以由几个基本模块构成,如图1所示。

图1对该系统各个模块的实现,分别有以下一些不同的设计方案。

1、电动机驱动模块方案一:采用继电器对电动机的启动或停止进行控制,通过开关的切换对电机的转向进行控制。

这个方案是电路简单,但是继电器的响应时间慢、机械结构易损坏、寿命短、可靠性不高。

方案二:在小车电机的控制部分利用8050、8550、等不同三极管的组合,构造一个"桥路",实现对电机转向的控制。

实现了对驱动电机的控制,电机驱动电路如图2所示,其控制过程如下(P1.1为正反转控制端,P1.2为启动停止控制端):3图2方案三:用马达控制驱动芯片LG9110来驱动电机,电机驱动电路如图3所示:图3通过比较以上三种方案的比较并且结合实际情况,选择方案二与方案三,方案二的“桥路”的优点是原理简单、易控制、带载能力强,在单片机的配合下,使该系统完成基本要求的过程变得简单易行,因而采用方案二来驱动前轮电机;方案三使用LG9110既电路简单价格低廉,并且输出电流大,只须控制LG9110芯片的第6和第7管脚的电平就可控制电机的正转、反转及停止,所以我们利用方案三来驱动后轮电机的转动。

2、引导黑线检测模块引导黑线的原理:光线照射到路面并反射,由于黑线跟白线的反射系数不同,可根据接收到的反射光强弱判断小车是否沿引导线行走。

智能小车程序设计

智能小车程序设计

目录1、任务及要求 (4)2、整体方案设计 (4)2.1 各器件模块说明 (4)2.2 系统控制框图 (5)3、程序编写与设计 (6)3.1 主控芯片模块程序设计及仿真波形 (6)3.2 PWM模块程序设计及仿真波形 (7)3.3 系统总的设计图 (8)4、最终成果 (9)5、心得体会 (9)6、参考文献 (10)7、附录 (10)1.任务及要求任务:(1)小车可完成启动、停止控制;(2)小车可完成前进、后退、转向等行驶方向;(3)可通过遥控器控制小车的运行。

要求:(1)课题要求用可编程逻辑器件(CPLD/FPGA)设计实现;(2)在试验箱上或印刷电路板上安装、调试出所设计的电路;(3)在EDA编程实验系统上完成硬件系统的功能仿真;(4)写出设计、调试、总结报告。

2.整体方案设计2.1各器件模块说明1.电源模块采用输出7.2V的可充电电池组,便于重复利用。

2.控制模块采用CPLD EPM7128S模块2.电机驱动模块采用L298N驱动模块号信L298N 驱动 CPLD 遥控器 入输4.遥控模块采用四建无线遥控器5.小车车型选择采用双层透明的小车地盘,既美观大方,而且易于检查线路问题。

2.2系统控制框图3、程序编写与设计3.1 主控芯片模块程序设计(1)通过编程实现控制(程序如下)LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY YAOKONG ISPORT (D3,D2,D1,D0:IN STD_LOGIC;A,B:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);IN1,IN2,IN3,IN4:OUT STD_LOGIC);END YAOKONG;ARCHITECTURE XMAN OF YAOKONG ISSIGNAL SAJI:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINSAJI<=D3&D2&D1&D0;PROCESS(SAJI)BEGINCASE(SAJI) ISWHEN"1000"=>A<="1000";B<="1000";IN1<='1';IN2<='0';IN3<='1';IN4<='0';WHEN"0100"=>A<="1000";B<="1000";IN1<='0';IN2<='1';IN3<='0';IN4<='1';WHEN"0010"=>A<="0011";B<="1000";IN1<='1';IN2<='0';IN3<='1';IN4<='0';WHEN"0001"=>A<="1000";B<="0011";IN1<='1';IN2<='0';IN3<='1';IN4<='0';WHEN OTHERS=>A<="0000";B<="0000";IN1<='0';IN2<='0';IN3<='0';IN4<='0';END CASE;END PROCESS;END XMAN;其中A,B输出分别是改变PWM来改变小车左右轮速度来实现左右转动。

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

简易智能小车——2003年全国大学生电子设计竞赛系统的单片机程序#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 189sbit 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++){;}}}void Display(unsigned char n){charNumb[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); //没有偏离,前进}void IornColor(){delay(4000);bkAim=(int)(P26);Display((int)(P26)+2);}void ctrMotor_Adjust(unsigned char t){if(t==0){P2=P2&240|11; //用来解决两电机不对称的问题 delay(6);}if(t==3){P2=P2&250; //向左走delay(1);}if(t==1){P2=(P2&245);delay(1); //向右走}P2=((P2&240)|15);delay(10);}void ctrMotor_Dist(float dist,unsigned char type) {unsigned char t=0;mType=type;P2=((P2&240)|15);cntTime_Plues=(int)(dist/det_Dist);while(cntTime_Plues){if(Inter_EX0==1&&StartTask==0)cntTime_Plues=0;break;}if(Light_Flag==1) t=LightSeek();if(type==0) //向前走{P2=P2&249;delay(40);ctrMotor_Adjust(t);}if(type==2) //向后退{P2=P2&246;delay(50);ctrMotor_Adjust(t);}P2=((P2&240)|15);if(mType==2) delay(60);//刹车制动0.5mselse delay(75);}}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;}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;}}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);{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;}}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);}}void fndIorn(void) interrupt 0{unsigned char i;P10=1;P2=((P2&240)|15); //停车P07=1;delay(1000);//刹车制动0.5msInter_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;}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;}。

相关文档
最新文档