当前位置:文档之家› 智能小车代码

智能小车代码

智能小车代码
智能小车代码

//车轮周长为x,总路程S,总时间t,速度v

//目前程序都是在理想状态考虑下编写的,还需考虑很多问题:

// 问题有:车走偏,该如何通过软件调整车向,如果车在不该停的时候停车了该怎//现在还需解决的是:如何将调速程序与显示程序结合为一个程序,单片机引脚连

#include

#include

#include

#define uchar unsigned char

#define uint unsigned int

//定义电机控制相关功能引脚

sbit ENA=P1^4;

sbit ENB=P1^5;

sbit IN1=P1^0;

sbit IN2=P1^1;

sbit IN3=P1^2;

sbit IN4=P1^3;

sbit ena=P1^6;

sbit enb=P1^7;

sbit in1=P2^4;

sbit in2=P2^5;

sbit in3=P2^6;

sbit in4=P2^7;

//0x7c,0x39,0x5e,0x79,0x71,0x76

//定义数码管位选相关引脚

sbit PIN0=P2^0;

sbit PIN1=P2^1;

sbit PIN2=P2^2;

sbit PIN3=P2^3;

uchar blackline_1,blackline_2; // 黑线数

uchar m,second,sign; //分别为路程,时间,速度,50ms变量,秒变量

uint distance,time,speed,total_time,p;

uchar loop=0;

uchar dis[4]={0x5f,0x44,0x9d,0xcd}; //数码管显示缓冲区

uchar dis_code[13]=

{0xfa,0x22,0xb9,0xab,0x63,0xcb,0xdb,0xa2,0xfb,0xeb,0xf2,0x00}; //数码管段码// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, 灭

//**************************************************//

//****************中断服务程序部分******************//

//**************************************************//

void intt0(void) interrupt 0 //外中断0服务程序

{

blackline_1++;

}

void intt1(void) interrupt 2 //外中断1服务程序

{

blackline_2++;

}

void time_intt0(void) interrupt 1 //定时器0中断服务程序

{

TR0=0; TR1=0; //关定时器和计数器

m++; p++;

if(m==20)

{

second++;m=0; //50ms定时,20次为1s,second为终点线停车10S做时钟 loop=TL1;speed=loop*21; distance+=loop*21; time++;

TH1=0;TL1=0; //每过一秒读取一次计数值,即为速度值(以转/秒计 }

TH0=0x3c;TL0=0xb0; //重装初值

TR0=1; TR1=1; //开定时器,计数器

}

void delay20ms(void) //50ms延时,作为电机控制脉宽

{

uchar i,j;

for(i=0;i<15;i++)

for(j=0;j<120;j++);

}

void delay50ms(void) //50ms延时,作为电机控制脉宽

{

uchar i,j;

for(i=0;i<50;i++)

for(j=0;j<120;j++);

}

//***********************************************//

//*******************显示程序群**********************//

//***********************************************//

void display_init()

{

P0=dis_code[0];

PIN0=0;

PIN1=0;

PIN2=0;

PIN3=1;

}

void display_countdown(uchar e) //终点线10S倒计时函数

{

P0=dis_code[e];

PIN0=1;

PIN1=0;

PIN2=0;

PIN3=0;

}

void display(uint e) //显示总路程/总时间

{

uchar i;

for(i=0;i<4;i++)

{dis[i]=e%10;

e=e/10;

}

P0=dis_code[dis[0]]; {PIN0=0;PIN1=0;PIN2=0;PIN3=1;}; delay20ms();

P0=dis_code[dis[1]]; {PIN0=0;PIN1=0;PIN2=1;PIN3=0;}; delay20ms();

P0=dis_code[dis[2]]; {PIN0=0;PIN1=1;PIN2=0;PIN3=0;}; delay20ms();

P0=dis_code[dis[3]]; {PIN0=1;PIN1=0;PIN2=0;PIN3=0;}; delay20ms();

}

void display_time(void) //显示总路程/总时间

{

dis[0]=total_time%10;

dis[1]=total_time/10;

dis[2]=11;

dis[3]=11;

P0=dis_code[dis[0]]; {PIN0=0;PIN1=0;PIN2=0;PIN3=1;}; delay20ms();

P0=dis_code[dis[1]]; {PIN0=0;PIN1=0;PIN2=1;PIN3=0;}; delay20ms();

}

void turn_left(void)

{

ENA=1; ena=1;

ENB=1; enb=1;

delay50ms();

ENA=0; ena=0;

ENB=0; enb=0;

delay50ms();

ENA=1; ena=1;

ENB=0; enb=0;

delay50ms();

ENA=0; ena=0;

ENB=0; enb=0;

delay50ms();

}

void turn_right(void)

{

ENA=1; ena=1;

ENB=1; enb=1;

delay50ms();

ENA=0; ena=0;

ENB=0; enb=0;

delay50ms();

ENA=0; ena=0;

ENB=1; enb=1;

delay50ms();

ENA=0; ena=0;

ENB=0; enb=0;

delay50ms();

}

void motor_zhengzhuan(void) //正转

{

IN1=1;IN2=0;

in1=1;in2=0;

IN3=1;IN4=0;

in3=1;in4=0;

}

void motor_fanzhuan(void) //反转

{

IN1=0;IN2=1;

in1=0;in2=1;

IN3=0;IN4=1;

in3=0;in4=1;

}

void motor_stop(void) //刹车

{

IN1=1;IN2=1;

IN3=1;IN4=1;

in1=1;in2=1;

in3=1;in4=1;

ENA=0; ENB=0;

ena=0;enb=0;

}

void motor_start(void)//启动

{

ENA=1;ENB=1;

ena=1;enb=1;

}

void motor_init(void) //电机控制引脚初始化{

IN1=0;IN2=0;

IN3=0;IN4=0;

in1=0;in2=0;

in3=0;in4=0;

ENA=0;ENB=0;

ena=0;enb=0;

}

void int0_init(void) //外中断0设置

{

EA=1;

EX0=1;

PX0=1;

IT0=1;

}

void timer_init(void) //定时器0初始化

{

EA=1;ET0=1;

TMOD=0x51;TR0=1; //TMOD=0101 0001B

}

void count_init(void) //计数器1初始化

{

ET1=1; TH1=0;

TL1=0; TR1=1;

}

void bianliang_init(void) //全局变量初始化

{

distance=0; speed=0; time=0; p=0; sign=0;

m=0; blackline_1=0; blackline_2=0; second=0;

}

void speed_display(uchar dat) //调速函数&&数码管显示函数结合体

{

uchar i,e;

e=speed;

dis[0]=e%10;

dis[1]=e/10;

dis[2]=0x00;

dis[3]=0x00;

for(i=8;i>0;i--)

{if(dat&0x80) {ENA=1;ENB=1;ena=1;enb=1;}

else {ENA=0;ENB=0;ena=0;enb=0;}

dat<<=1;

if(i%2==0)

{P0=dis_code[dis[0]]; PIN0=0;PIN1=0;PIN2=0;PIN3=1; } else {P0=dis_code[dis[1]]; PIN0=0;PIN1=0;PIN2=1;PIN3=0; } delay20ms();

if((i-1)%2==0)

{P0=dis_code[dis[0]]; PIN0=0;PIN1=0;PIN2=0;PIN3=1; }

else {P0=dis_code[dis[1]]; PIN0=0;PIN1=0;PIN2=1;PIN3=0; }

delay20ms();

}

}

void main(void)

{

//初始化模块

display_init();

bianliang_init();

int0_init();

timer_init();

count_init();

motor_init();

motor_zhengzhuan();

while(second<=4)

{ uchar i=4-second;

display_countdown(i); //倒计时显示

}

//循环控制模块

while(1){

while(blackline_1==0) //未到起跑线是加速

{ speed_display(0xff);}

while(blackline_1==1) //起跑线全速

{ speed_display(0xff); }

while(blackline_1+blackline_2<=2);

p=0;

while(p<10)

{ if(blackline_1==blackline_2) sign=0;

else if(blackline_1>blackline_2) sign=1;

else if(blackline_1

}

if(sign==1)

{ turn_left();

turn_left();

turn_left();

turn_left();}

if(sign==2)

{ turn_right();

turn_right();

turn_right();

turn_right();}

while(blackline_1==2) //到限速线有3~6M的距离,故先全速,再中速,然 // 过渡到低速,从而能在限速线上顺利减速{ speed_display(0xff);

speed_display(0xff);

speed_display(0xff);

speed_display(0xcc);

}

while(blackline_1==2&&blackline_2==2);

p=0;

while(p<10)

{ if(blackline_1==blackline_2) sign=0;

else if(blackline_1>blackline_2) sign=1;

else if(blackline_1

}

if(sign==1)

{ turn_left();

turn_left();

turn_left();

turn_left();}

if(sign==2)

{ turn_right();

turn_right();

turn_right();

turn_right();}

while(blackline_1==3) //限速线到达,低速

{ speed_display(0x88);}

while(blackline_1==3&&blackline_2==3);

p=0;

while(p<10)

{ if(blackline_1==blackline_2) sign=0;

else if(blackline_1>blackline_2) sign=1;

else if(blackline_1

}

if(sign==1)

{ turn_left();

turn_left();

turn_left();

turn_left();}

if(sign==2)

{ turn_right();

turn_right();

turn_right();

turn_right();}

while(blackline_1==4) //加速离开限速区

{ speed_display(0xff); }

while(blackline_1==5) //中低速结合,便于终点线快速刹车

{ speed_display(0xcc);

speed_display(0x88);

}

while(blackline_1!=6); //到达终点线,先刹车,再关使能ENA和ENB motor_stop();

speed_display(0x00); //关使能

second=0; //在定时器0中1s自增

while(second<=10) //10秒倒计时且数码管显示

{ uchar i=10-second;

display_countdown(i); //倒计时显示

}

motor_fanzhuan();

speed_display(0xff); //全速倒行

while(blackline_1!=7);

while(blackline_1==7)

{ speed_display(0xff);}

while(blackline_1==7&&blackline_2==7);

p=0;

while(p<10)

{ if(blackline_1==blackline_2) sign=0;

else if(blackline_1>blackline_2) sign=1;

else if(blackline_1

}

if(sign==1)

{ turn_left();

turn_left();

turn_left();

turn_left();}

if(sign==2)

{ turn_right();

turn_right();

turn_right();

turn_right();}

while(blackline_1==8)

{ speed_display(0xff);

speed_display(0xff);

speed_display(0xcc);}

while(blackline_1==8&&blackline_2==8);

p=0;

while(p<10)

{ if(blackline_1==blackline_2) sign=0;

else if(blackline_1>blackline_2) sign=1;

else if(blackline_1

}

if(sign==1)

{ turn_left();

turn_left();

turn_left();

turn_left();}

if(sign==2)

{ turn_right();

turn_right();

turn_right();

turn_right();}

while(blackline_1==9){ speed_display(0x88);}

while(blackline_1==9&&blackline_2==9);

p=0;

while(p<10)

{ if(blackline_1==blackline_2) sign=0;

else if(blackline_1>blackline_2) sign=1;

else if(blackline_1

}

if(sign==1)

{ turn_left();

turn_left();

turn_left();

turn_left();}

if(sign==2)

{ turn_right();

turn_right();

turn_right();

turn_right();}

while(blackline_1==10){ speed_display(0xff);}

while(blackline_1==11){ speed_display(0xcc); speed_display(0x88);} while(blackline_1!=12);//终点线上停车,3S间隔轮流显示总时间和总路程 motor_stop();

speed_display(0x00);

total_time=time;

while(1)

{ second=0;

while(second<=3)

{ display_time();}

second=0;

while(second<=3)

{ display(distance);}

}

} //接下来的控制同上

//倒回到起点线上时刹车,然后轮流显示总时间t和总路程s

}

智能小车单片机课程设计报告

题目: 智能小车设计 打开命令行终端的快捷方式: ctr+al+t:默认的路径在家目录 ctr+shift+n:默认的路径为上一次终端所处在的路径. linux@ubuntu:~$ linux:当前登录用户名. ubuntu:主机名 :和$之间:当前用户所处在的工作路径. windows下的工作路径如C:\Intel\Logs linux下的工作路径是:/.../..../ ~:代表的是/home/linux这个路径.(家目录). ls(list):列出当前路径下的文件名和目录名. ls -a(all):列出当前路径下的所有文件和目录名,包括了隐藏文件. .:当前路径 ..:上一级路径 ls -l:以横排的方式列出文件的详细信息 total 269464(当前这个路径总计所占空间的大小,单位是K) drwxr-xr-x 3 linux linux 4096 Dec 4 19:16 Desktop 第一个位置:代表的是文件的类型. linux系统下的文件类型有以下几种. b:块设备文件 c:字符设备文件 d:directory,目录 -:普通文件. l:连接文件. s:套接字文件. p:管道文件. rwxr-xr-x:权限 r:读权限-:没有相对应的权限 w:写权限

x:可执行权限 修改权限: chmod u-或者+r/w/x 文件名 chmod g-或者+r/w/x 文件名 chmod o-或者+r/w/x 文件名 第一组:用户权限 第二组:用户组的权限 第三组:其他用户的权限. chmod 三个数(权限) 文件名 首先根据你想要的权限生成二进制数,再根据二进制数转换成十进制的三位数 rwxr-x-wx 111101011 7 5 3 chmod 753 文件名 rwx--xr-x 第二个位置上的数字:对应目录下的子文件个数,如果是非目录,则数字是1 第三个位置:用户名(文件创造者). 第四个位置:用户组的名字(前边的用户所处在的用户组的名字). 第五个位置:对应文件所占的空间大小(单位为b) 第六~八个位置:Dec 4 19:16时间戳(最后一次修改文件的时间) 最后一个位置:文件名 操作文件: 1.创建一个普通文件:touch 文件名 2.删除一个文件:rm(remove) 文件名 3.新建一个目录:mkdir(make directory) 目录名 递归创建目录:mkdir -p 目录1/目录2/目录3 4.删除一个目录:rmdir 目录名.//仅删除一个空目录 rm -rf 目录名//删除一个非空目录 5.切换目录(change directory):cd 路径 linux下的路径分两种 相对路径:以.(当前路径)为起点. 绝对路径:以/(根目录)为起点, 用相对路径的方式进入Music:cd ./Music 用绝对路径的方式进入Desktop:cd /home/linux/Desktop 返回上一级:cd ..

智能小车控制程序1

/*实现前进与后退功能*/ /*控制智能车向前行驶10秒,然后停3秒,再向后行驶6秒,停止*/ /********************************************************/ #include #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

{ go(); //前进 delay(10000); //前进10秒 stop(); //停止 delay(3000); //停3秒 back(); //后退 delay(6000); //后退6秒 stop(); //停止 }

智能循迹小车设计与实现

智能循迹小车设计与实现 摘要本文介绍的是基于单片机STC89C52控制智能循迹小车的设计。利用红外对光管检测黑线与障碍物,并以STC89C52单片机为控制芯片控制电动小汽车的运动,从而实现自动循迹避障的功能。其中小车的电机由LG9110驱动,整个系统的电路结构简单,可靠性高。 关键词STC89C52 LG9110 红外对光管循迹小车

The manufacture of intelligent tracking car Abstract This articale introduces the design of intelligent tracking car based on the STC89C52 single chip computer.Based infrared detection of black lines and the road obstacles,and use a STC89C52 MCU as the controlling core for the movement.A electronic drived,which can automatic track and avoid obstacle,was designed and fabricated.In which,the electric machinery of car is drived by the LG9110.The electric circuit stuction of whole system is simple,and the function is dependable. Keywords STC89C52 LG9110 Infrared emitting diode Tracking car

STM32智能小车主程序

//#include "delay.h" #include "usart1.h" //#include "remote.h" #include "PWM_OUT.h" //#include "Ultrasonic.h" #include "esp8266.h" #include "usart3.h" #include "HXD.h" #include "main.h" int main(void) { u16 i=0,x; u16 k,j; SystemInit(); USART1_Init();//串口1初始化 USART3_Init();//串口3初始化用于WIFI USART1_ONOFF(1); USART3_ONOFF(1); // Remote_Init();//初始化红外接收 // ULT_Init();//超声波初始化 HXD_Init(); PWM_Init();//初始化PWM(电机) WiFi_Init(); x=0; i=300; while(1) { USART_Work(); PWM_MoTo_Work(); huxiLED(i);

for (k=0;k<720;k++) { for(j=0;j<100;j++); } if((i>0)&&(x==0)){ i++; if(i==800)//灭 x=1; } if((i<801)&&(x==1)) { i--; if(i==500)// 亮 x=0; } // if(i>10) i=10; // if(Remote_Rdy)//处理红外遥控// { // // Remote_Work(); // } // if(PWM_Rdy)//处理电机PWM // { // PWM_MoTo_Work(); // } } }

基于STC89C52单片机-红外智能循迹小车 (1)

基于STC89C52单片机红外智能循迹小车 实验报告册 学院:电气工程学院 协会:电子科技协会 班级:电气1206 班 姓名:蔡申申 学号:201223910625 联系方式:151 **** ****

摘要 本报告论述了自己参加第八届河南工业大学科技创新大赛——基于STC89C52RC单片机红外智能循迹小车的方案论证、制作过程、调试过程。设计采用STC89C52RC单片机为核心控制器件,采用TCRT5000红外反射式开关传感器作为小车的循迹模块来识别白色路面中央的黑色引导线,采集信号并将信号转换为能被单片机识别的数字信号,单片机获取路面信息后,进行分析、处理,最后控制减速电机转动实现转向。实验表明:该系统抗干扰能力强、电路结构简单、制作成本低,运行平稳、可靠性好。 关键词:STC89C52单片机、反射式光电对管、PWM调速 减速电机

目录 摘要 (2) 1 绪论 (4) 1.1 智能循迹小车概述 (4) 1.1.1 循迹小车的发展历程回顾 (4) 1.1.2 智能循迹分类 (4) 1.1.3 智能循迹小车的应用 (5) 2 智能循迹小车总体设计方案 (5) 2.1 整体设计方案 (5) 2.1.1 系统设计步骤 (5) 2.1.2 系统基本组成 (5) 2.2 整体控制方案确定 (6) 3 系统的硬件设计 (6) 3.1 单片机电路的设计 (6) 3.1.1 单片机的功能特性描述 (6) 3.1.2 晶振电路 (7) 3.1.3 复位电路 (7) 3.2 光电传感器模块 (8) 3.2.1 传感器分布 (8) 3.3 电机驱动电路 (9) 3.3.1 L298N引脚结构 (9) 3.3.2 电机驱动原理 (9) 4 系统的软件设计 (10) 4.1 软件设计的流程 (10) 4.2 本系统的编译器 (10) 5 系统的总体调试 (11) 5.1 硬件的测试 (11) 5.2 系统的软件调试 (11) 结论 (11) 致谢 (11) 参考文献 (12) 附录A 原理图与模块电路图 (12) 附录B 程序代码 (13) 附录C 硬件实物图 (15)

PWM调速+循迹__智能小车程序

//T0产生双路PWM信号,L298N为直流电机调速,接L298N时相应的管脚上最好接上10K 的上拉电阻。 /* 晶振采用12M,产生的PWM的频率约为100Hz */ #include #include #define uchar unsigned char #define uint unsigned int sbit en1=P3^4; /* L298的Enable A */ sbit en2=P3^5; /* L298的Enable B */ sbit s1=P1^0; /* L298的Input 1 */ sbit s2=P1^1; /* L298的Input 2 */ sbit s3=P1^3; /* L298的Input 3 */ sbit s4=P1^2; /* L298的Input 4 */ sbit R=P2^0; sbit C=P2^1; sbit L=P2^2; sbit key=P1^4; uchar t=0; /* 中断计数器*/ uchar m1=0; /* 电机1速度值*/ uchar m2=0; /* 电机2速度值*/ uchar tmp1,tmp2; /* 电机当前速度值*/ /* 电机控制函数index-电机号(1,2); speed-电机速度(0-100) */ void motor(uchar index, char speed) { if(speed<=100) { if(index==1) /* 电机1的处理*/ { m1=abs(speed); /* 取速度的绝对值*/ s1=1; s2=0; } if(index==2) /* 电机2的处理*/ { m2=abs(speed); /* 电机2的速度控制*/ s3=1; s4=0; } } } void Back(void) {

智能小车源代码

#include 令狐采学 #include //#include"lcd.h" sbit TX=P2^7; sbit RX=P2^6; sbit PWM=P1^4; sbit Beep=P3^7; sbit led1=P3^3; sbit led2=P3^4; sbit led3=P3^5; /***********蓝牙切换按键**********/ sbit k1=P3^6; /***自定义一些数据,注意这些数据对应“51智能车蓝牙无线遥控.exe”软件上的数据设置**/ #define leftdata 0x11 #define rightdata 0x22 #define forwarddata 0x33 #define backdata 0x44 #define stopdata 0x55 #define uchar unsigned char #define uint unsigned int

unsigned char receiveData,high_velosity,low_velosity; void UsartConfiguration(); /***********电机端口定义************************/ sbit IN1=P1^0; //为高电平时,左电机后转sbit IN2=P1^1; //为高电平时,左电机正转sbit IN3=P1^2; //为高电平时,右电机正转sbit IN4=P1^3; //为高电平时,右电机后转 /**************无线遥控模块定义****************/ sbit Key_A = P2^0; //B键信号端对应D0 sbit Key_B = P2^1; //D键信号端对应D1 sbit Key_C = P2^2; //C键信号端对应D2 sbit Key_D = P2^3; //C键信号端 void delay0(int a); void delay15us(void); void delay1ms(int z); void di(); //蜂鸣器函数声明 unsigned int time;//用于存放定时器时间值unsigned int S; //用于存放距离的值 char flag =0; //量程溢出标志位 char f1,f2,f3,f4,n0; int a; int n;//运行次数判断标志 int s_left,s_right;

基于51单片机智能小车循迹程序

#include #define uchar unsigned char #define uint unsigned int ////电机驱动模块位定义//// sbit M11=P0^0; //左轮 sbit M12=P0^1; sbit M23=P0^2; //右轮 sbit M24=P0^3; sbit ENA=P0^4; //左轮使能PWM输入改变dj1数值控制转速sbit ENB=P0^5; //右轮使能PWM输入改变dj2数值控制转速////占空比变量定义//// unsigned char dj1=0; unsigned char dj2=0; uchar t=0; ////红外对管位定义//// sbit HW1=P1^0; //左前方 sbit HW2=P1^1; //右前方 sbit HW3=P1^2; //左后方 sbit HW4=P1^3; //右后方 ////小车前进//// void qianjin() { M11=1; //左轮 M12=0; // M23=1; //右轮 M24=0; // dj1=50; dj2=50; } ////向左微调//// void turnleft2() { M11=1; M12=0; M23=1; M24=0; dj1=7; //左轮 dj2=50; //右轮 } ////向右微调//// void turnright2() { M11=1; M12=0;

M23=1; M24=0; dj1=50; dj2=7; } ////向左大调//// void left() { M11=0; M12=1; M23=1; M24=0; dj1=7; dj2=80; } ////向右大调//// void right() { M11=1; M12=0; M23=0; M24=1; dj1=80; dj2=7; } ////循迹动作子函数//// void xj() { if(HW1==0&&HW2==0&&HW3==0&&HW4==0) //前进逻辑 { qianjin(); } if(HW1==1&&HW2==0&&HW3==0&&HW4==0) //左右微调 { turnleft2(); } if(HW1==0&&HW2==1&&HW3==0&&HW4==0) { turnright2(); } if(HW1==1&&HW2==0&&HW3==1&&HW4==0) //左右大调 { left(); }

智能循迹小车程序

智能循迹小车程序 Document number:BGCG-0857-BTDO-0089-2022

#include<> #define uchar unsigned char #define uint unsigned int //D0-D7:f,b,a,e,d,h,c,g 共阴依次编码 //74LS04反相器驱动数码管 uchar code table[10] = {0x5F,0x42,0x9E,0xD6,0xC3,0xD5,0xDD,0x46,0xDF,0xD7}; uchar i = 0; //用于0-3数码管轮流显示uint j = 0; //计时的次数 uint time=0; //计时 uint pwm=16; //占空比 uint speed; //调制PWM波的当前的值 sbit R=P3^2; //右边传感器 P3^2 sbit L=P3^3; //左边传感器 P3^3 //电机驱动口定义 sbit ENB=P1^0; //前轮电机停止控制使能 sbit ENA=P1^1; //后轮控制调速控制端口 sbit IN1=P1^2; //前轮 sbit IN2=P1^3; //前轮 sbit IN3=P1^4; //后轮

sbit IN4=P1^5; //后轮 void Init() { TMOD = 0x12; //定时器0用方式2,定时器1用方式1 TH0=(256-200)/256; //pwm TL0=(256-200)/256; TH1 = 0x0F8; //定时2ms TL1 = 0x30; EA = 1; ET0 = 1; ET1 = 1; TR0 = 1; TR1 = 1; } void tim0(void) interrupt 1 //产生PWM { speed ++; if(speed <= pwm) //pwm 就相当于占100的比例{ ENA = 1; }

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

-----------------------小车运行主程序------------------- -------------------------------------------------------- 简介:@模块组成:红外对管检测模块----五组对管,五个信号采集端口 直流电机驱动模块----驱动两个直流电机,另一个轮子用万向轮 单片机最小系统------用于烧写程序,控制智能小车运动 @功能简介:在白色地面或皮质上用黑色胶带粘贴出路线路径宽度微大于相邻检测管间距。 这样小车便可在其上循迹运行。 @补充说明:该程序采取“右优先”的原则: 即右边有黑线向右转, 若无,前方有黑线,向前走, 若无,左边有黑线,向左转, 若全无,从右方向后转。 程序开头定义的变量的取值是根据我的小车所调试选择好的, 如果采用本程序,请自行调试适合自己小车的合适参数值。 编者:陈尧,黄永刚(江苏大学电气学院二年级,三年级) 1.假定:IN1=1,IN3=1时电机正向转动,必须保证本条件 2.假定:遇到白线输出0,遇到黑线输出1; 如果实际电路是:遇到白线输出1,遇到黑线输出0, 这种情况下只需要将第四,第五句改成: #define m0 1 #define m1 0 即可。 3.说明1:直行---------------速度full_speed_left,full_speed_right. 转弯,调头速度------correct_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----若先检测到左边黑线,并且左边已出黑线,判断右端是否压黑线时间拖延

智能循迹小车详细制作过程

(穿山乙工作室)三天三十元做出智能车 基本设计思路: 1.基本车架(两个电机一体轮子+一 个万向轮) 2.单片机主控模块 3.电机驱动模块(内置5V电源输出) 4.黑白线循迹模块 0.准备所需基本元器件 1).基本二驱车体一台。(本课以穿山乙推出的基本车体为 例讲解) 2).5x7cm洞洞板、单片机卡槽、51单片机、石英晶体、红 色LED、1K电阻、10K排阻各一个;2个瓷片电容、排针40 个。 3).5x7cm洞洞板、7805稳压芯片、红色LED、1K电阻各一 个;双孔接线柱三个、10u电解电容2个、排针12个、9110 驱动芯片2个。 4).5x7cm洞洞板、LM324比较器芯片各一个;红外对管三 对、4.7K电阻3个、330电阻三个、红色3mmLED三个。 一、组装车体

(图中显示的很清晰吧,照着上螺丝就行了) 二、制作单片机控制模块 材料:5x7cm洞洞板、单片机卡槽、51单片机、石英晶体、红色LED、1K电阻、10K排阻各一个;2个瓷片电容、排针40个。 电路图如下,主要目的是把单片机的各个引脚用排针引出来,便于使用。我们也有焊接好的实物图供你参考。(如果你选用的是STC98系列的单片机在这里可以省掉复位电路不焊,仍能正常工作。我实物图中就没焊复位)

三、制作电机驱动模块 材料:5x7cm洞洞板、7805稳压芯片、红色LED、1K电阻各一个;双孔接线柱三个、10u电解电容2个、排针12个、9110驱动芯片2个。 电路图如下,这里我们把电源模块与驱动模块含在了同一个电路板上。因为电机驱动模块所需的电压是+9V左右(6—15V 均可),而单片机主控和循迹模块所需电压均为+5V。 这里用了一个7805稳压芯片将+9V电压稳出+5V电压。

51红外循迹小车报告(舵机版)最终版

简易教程

前言 往届全国大学生电子设计竞赛曾多次出现了集光、机、电于一体的简易智能小车题目,此次,笔者在通过多次论证、比较与实验之后,制作出了简易小车的寻迹电路系统。 整个系统基于普通玩具小车的机械结构,利用小车的底盘、前后轮电机及其自动复原装置,能够平稳跟踪路面黑色轨迹运行。系统分为检测、控制、驱动三个模块。首先利用光电对接收管和路面信号进行检测,然后经过比较器处理,对软件控制模块进行实时控制,输出相应的信号给驱动芯片驱动电机转动,从而控制整个小车的运动。 智能小车能在画有黑线的白纸“路面”上行驶,这是由于黑线和白纸对光线的反射系数不同,小车可根据接收到的反射光的强弱来判断“道路”---黑线,最终实现简单的循迹运动。 个人水平有限,有错误不足之处,还望各位前辈同学多多包含,指出修正,完善。谢谢! 李学云王维 2016年7月27号

目录 前言 (1) 第一部分硬件设计 (1) 1.1 车模选择 (1) 1.2传感器选择 (1) 1.3 控制模块选择 (2) 第二部分软件设计及调试 (3) 2.1 开发环境 (3) 2.2总体框架 (3) 2.3 舵机程序设计与调试 (3) 2.3.1 程序设计 (3) 2.3.2 调试 (3) 2.3.3 程序代码 (4) 2.4 传感器调试 (5) 2.4.1 传感器好坏的检测 (5) 2.4.2 单片机能否识别信号并输出信号 (5) 2.5 综合调试 (7) 附录1 (9) 第一篇舵机(舵机及转向控制原理) (9) 1.1概述 (9) 1.2舵机的组成 (10) 1.3舵机工作原理 (11) 1.4舵机使用中应注意的事项 (12) 1.5如何利用程序实现转向 (12) 1.6舵机测试程序 (13) 附录2 (14) 第二篇光电红外传感器 (14) 2.1传感器的原理 (14) 2.2红外光电传感器ST188 结构图 (15) 2.3传感器的选择 (15) 2.4传感器的安装 (16) 2.5使用方法 (16) 2.7红外传感器输入输出调试程序 (17)

Arduino智能避障小车避障程序

Arduino智能避障小车避障程序 首先建立一个名为modulecar.ino的主程序。 // modulecar.ino,玩转智能小车主程序 #include //导入舵机库 #include //导入NwePing库 // 对照系统配线方案依次指定各I/O const int ENA = 3 ; //左电机PWM const int IN1 = 4 ; //左电机正 const int IN2 = 5 ; //左电机负 const int ENB = 6 ; //右电机PWM const int IN3 = 7 ; //右电机正 const int IN4 = 8 ; //右电机负 const int trigger = 9 ; //定义超声波传感器发射脚为D9 const int echo = 10 ; //定义传感器接收脚为D10 const int max_read = 300; //设定传感器最大探测距离。 int no_good = 35; //*设定35cm警戒距离。 int read_ahead; //实际距离读数。 Servo sensorStation; //设定传感器平台。 NewPing sensor(trigger, echo, max_read); //设定传感器引脚和最大读数//系统初始化 void setup() { Serial.begin(9600); //启用串行监视器可以给调试带来极大便利 sensorStation.attach(11); //把D11分配给舵机

pinMode(ENA, OUTPUT); //依次设定各I/O属性 pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(ENB, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); pinMode(trigger, OUTPUT); pinMode(echo, INPUT); sensorStation.write(90); //舵机复位至90? delay(6000); //上电等待6s后进入主循环 } //主程序 void loop() { read_ahead = readDistance(); //调用readDistance()函数读出前方距离Serial.println("AHEAD:"); Serial.println(read_ahead); //串行监视器显示机器人前方距离 if (read_ahead < no_good) //如果前方距离小于警戒值 { fastStop(); //就令机器人紧急刹车 waTch(); //然后左右查看,分析得出最佳路线 goForward(); //*此处调用看似多余,但可以确保机器人高速运转下动作的连贯性 }

智能循迹小车分析方案

智能循迹小车设计 专业:自动化 班级:0804班 姓名: 指导老师: 2018年8月——2018年10月 摘要:

本课题是基于AT89C52单片机的智能小车的设计与实现,小车完成的主要功能是能够自主识别黑色引导线并根据黑线走向实现快速稳定的寻线行驶。小车系统以 AT89S52 单片机为系统控制处理器;采用红外传感获取赛道的信息,来对小车的方向和速度进行控制。此外,对整个控制软件进行设计和程序的编制以及程序的调试,并最终完成软件和硬件的融合,实现小车的预期功能。 引言

当今世界,传感器技术和自动控制技术正在飞速发展,机械、电气和电子信息已经不再明显分家,自动控制在工业领域中的地位已经越来越重要,“智能”这个词也已经成为了热门词汇。现在国外的自动控制和传感器技术已经达到了很高的水平,特别是日本,比如日本本田制作的机器人,其仿人双足行走已经做得十分逼真,而且具有一定的学习能力,还据说其智商已达到6岁儿童的水平。 作为机械行业的代表产品—汽车,其与电子信息产业的融合速度也显著提高,呈现出两个明显的特点:一是电子装置占汽车整车<特别是轿车)的价值量比例逐步提高,汽车将由以机械产品为主向高级的机电一体化方向发展,汽车电子产业也很有可能成为依托整车制造业和用车提升配置而快速成为新的增长点;二是汽车开始向电子化、多媒体化和智能化方向发展,使其不仅作为一种代步工具、同时能具有交通、娱乐、办公和通讯等多种功能。 无容置疑,机电一体化人才的培养不论是在国外还是国内,都开始重视起来,主要表现在大学生的各种大型的创新比赛,比如:亚洲广播电视联盟亚太地区机器人大赛

智能小车源代码

#include #include //#include"lcd.h" sbit TX=P2^7; sbit RX=P2^6; sbit PWM=P1^4; sbit Beep=P3^7; sbit led1=P3^3; sbit led2=P3^4; sbit led3=P3^5; /***********蓝牙切换按键**********/ sbit k1=P3^6; /***自定义一些数据,注意这些数据对应“51智能车蓝牙无线遥控.exe”软件上的数据设置**/ #define leftdata 0x11 #define rightdata 0x22 #define forwarddata 0x33 #define backdata 0x44 #define stopdata 0x55 #define uchar unsigned char #define uint unsigned int unsigned char receiveData,high_velosity,low_velosity; void UsartConfiguration(); /***********电机端口定义************************/ sbit IN1=P1^0; //为高电平时,左电机后转 sbit IN2=P1^1; //为高电平时,左电机正转 sbit IN3=P1^2; //为高电平时,右电机正转 sbit IN4=P1^3; //为高电平时,右电机后转 /**************无线遥控模块定义****************/ sbit Key_A = P2^0; //B键信号端对应D0 sbit Key_B = P2^1; //D键信号端对应D1 sbit Key_C = P2^2; //C键信号端对应D2 sbit Key_D = P2^3; //C键信号端 void delay0(int a); void delay15us(void); void delay1ms(int z); void di(); //蜂鸣器函数声明

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

/*------------------------------------------------------ -----------------------小车运行主程序------------------- -------------------------------------------------------- 简介:@模块组成:红外对管检测模块----五组对管,五个信号采集端口 直流电机驱动模块----驱动两个直流电机,另一个轮子用万向轮 单片机最小系统------用于烧写程序,控制智能小车运动 @功能简介:在白色地面或皮质上用黑色胶带粘贴出路线路径宽度微大于相邻检测管间距。 这样小车便可在其上循迹运行。 @补充说明:该程序采取“右优先”的原则: 即右边有黑线向右转, 若无,前方有黑线,向前走, 若无,左边有黑线,向左转, 若全无,从右方向后转。 程序开头定义的变量的取值是根据我的小车所调试选择好的, 如果采用本程序,请自行调试适合自己小车的合适参数值。 编者:陈尧,黄永刚(江苏大学电气学院二年级,三年级) 1.假定:IN1=1,IN3=1时电机正向转动,必须保证本条件 2.假定:遇到白线输出0,遇到黑线输出1; 如果实际电路是:遇到白线输出1,遇到黑线输出0, 这种情况下只需要将第四,第五句改成: #define m0 1 #define m1 0 即可。 3.说明1:直行---------------速度full_speed_left,full_speed_right. 转弯,调头速度------correct_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----若先检测到左边黑线,并且左边已出黑线,判断右端是否压黑线时间拖延

智能寻迹小车以及程序

寻迹小车 在历届全国大学生电子设计竞赛中多次出现了集光、机、电于一体的简易智能小车题目。笔者通过论证、比较、实验之后,制作出了简易小车的寻迹电路系统。整个系统基于普通玩具小车的机械结构,并利用了小车的底盘、前后轮电机及其自动复原装置,能够平稳跟踪路面黑色轨迹运行。 总体方案 整个电路系统分为检测、控制、驱动三个模块。首先利用光电对管对路面信号进行检测,经过比较器处理之后,送给软件控制模块进行实时控制,输出相应的信号给驱动芯片驱动电机转动,从而控制整个小车的运动。系统方案方框图如图1所示。 图1 智能小车寻迹系统框图 传感检测单元 小车循迹原理 该智能小车在画有黑线的白纸“路面”上行驶,由于黑线和白纸对光线的反射系数不同,可根据接收到的反射光的强弱来判断“道路”—黑线。笔者在该模块中利用了简单、应用也比较普遍的检测方法——红外探测法。 红外探测法,即利用红外线在不同颜色的物理表面具有不同的反射性质的特点。在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色地面时发生漫发射,反射光被装在小车上的接收管接收;如果遇到黑线则红外光被吸收,则小车上的接收管接收不到信号。 传感器的选择 市场上用于红外探测法的器件较多,可以利用反射式传感器外接简单电路自制探头,也可以使用结构简单、工作性能可靠的集成式红外探头。ST系列集成红外探头价格便宜、体积小、使用方便、性能可靠、用途广泛,所以该系统中最终选择了ST168反射传感器作为红外光的发射和接收器件,其内部结构和外接电路均较为简单,如图2所示:

图2 ST168检测电路 ST168采用高发射功率红外光、电二极管和高灵敏光电晶体管组成,采用非接触式检测方式。ST168的检测距离很小,一般为8~15毫米,因为8毫米以下是它的检测盲区,而大于15毫米则很容易受干扰。笔者经过多次测试、比较,发现把传感器安装在距离检测物表面10毫米时,检测效果最好。 R1限制发射二极管的电流,发射管的电流和发射功率成正比,但受其极限输入正向电流50mA的影响,用R1=150的电阻作为限流电阻,Vcc=5V作为电源电压,测试发现发射功率完全能满足检测需要;可变电阻R2可限制接收电路的电流,一方面保护接收红外管;另一方面可调节检测电路的灵敏度。因为传感器输出端得到的是模拟电压信号,所以在输出端增加了比较器,先将ST168输出电压与2.5V进行比较,再送给单片机处理和控制。 传感器的安装 正确选择检测方法和传感器件是决定循迹效果的重要因素,而且正确的器件安装方法也是循迹电路好坏的一个重要因素。从简单、方便、可靠等角度出发,同时在底盘装设4个红外探测头,进行两级方向纠正控制,将大大提高其循迹的可靠性,具体位置分布如图3所示。

智能循迹小车程序代码

/**************************************************************** ************ 硬件连接 P1_4接驱动模块ENA使能端,输入PWM信号调节速度 P1_5接驱动模块ENB使能端,输入PWM信号调节速度 P1_0 P1_1接IN1 IN2 当P1_0=1,P1_1=0; 时左电机正转驱动蓝色输出 端OUT1 OUT2接左电机 P1_0 P1_1接IN1 IN2 当P1_0=0,P1_1=1; 时左电机反转 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_0接四路寻迹模块接口第一路输出信号即中控板上面标记为OUT1 P1_1接四路寻迹模块接口第二路输出信号即中控板上面标记为OUT2 P1_2接四路寻迹模块接口第三路输出信号即中控板上面标记为OUT3 P1_3接四路寻迹模块接口第四路输出信号即中控板上面标记为OUT4 八路寻迹传感器有信号(白线)为0 没有信号(黑线)为1 ***************************************************************** ***********/ #include #define Right_moto_pwm P1_4 //接驱动模块ENA使能端,输入PWM 信号调节速度 #define Left_moto_pwm P1_5 //接驱动模块ENB使能端,输入PWM 信号调节速度 #define Left_1_led P2_0 //四路寻迹模块接口第一路 #define Left_2_led P2_1 //四路寻迹模块接口第二路 #define Right_1_led P2_2 //四路寻迹模块接口第三路 #define Right_2_led P2_3 //四路寻迹模块接口第四路 #define Left_moto_go {P1_0=0,P1_1=1;} //左电机前进 #define Left_moto_back {P1_0=1,P1_1=0;} //左电机后退 #define Left_moto_stop {P1_0=1,P1_1=1;} //左电机停转 #define Right_moto_go {P1_2=0,P1_3=1;} //右电机前转

简易智能小车_源程序

简易智能小车——2003年全国大学生电子设计竞赛, c51源程序系统的单片机程序 #include "" #define det_Dist */ 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) 0为A仓库,1为B仓库,2为停车场*/ void fndIorn(void) interrupt 0 { unsigned char i; P10=1; P2=((P2&240)|15); //停车 P07=1; delay(1000);//刹车制动 P07=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(); //判断铁片黑白,设置bkAim for(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; }

相关主题
文本预览
相关文档 最新文档