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单片机来控制小车的各项基本操作。

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

相关文档
最新文档