基于STC89C51单片机智能小车控制.docx

上传人:b****6 文档编号:6374981 上传时间:2023-01-05 格式:DOCX 页数:28 大小:390.21KB
下载 相关 举报
基于STC89C51单片机智能小车控制.docx_第1页
第1页 / 共28页
基于STC89C51单片机智能小车控制.docx_第2页
第2页 / 共28页
基于STC89C51单片机智能小车控制.docx_第3页
第3页 / 共28页
基于STC89C51单片机智能小车控制.docx_第4页
第4页 / 共28页
基于STC89C51单片机智能小车控制.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

基于STC89C51单片机智能小车控制.docx

《基于STC89C51单片机智能小车控制.docx》由会员分享,可在线阅读,更多相关《基于STC89C51单片机智能小车控制.docx(28页珍藏版)》请在冰豆网上搜索。

基于STC89C51单片机智能小车控制.docx

基于STC89C51单片机智能小车控制

 

基于STC89C51单片机智能小车控制

 

项目名称:

基于单片机STC89C51智能小车控制

小组成员:

xx

班级:

xx

指导教师:

xx

开发结束时间:

2011年7月10日星期日

1.1项目概述

随着单片机技术的不断发展和完善已经大量的运用在工业的控制、数据的采集、智能化仪表、机电一体化、家用电器等领域,极大地提高了这些领域的技术水平和自动化控制水平。

为此我们基于STC89C51这款单片机进行智能小车开发。

1.2项目要求

基于STC89C51单片机智能小车的设计要求如下:

·实现智能小车上电自动寻迹。

·实现智能小车向前行驶时避障及其避悬。

·实现智能小车红外遥控控制小车左右转弯前后行驶。

1.3系统设计

智能小车的控制主要是控制小车车轮的转向,以STC89C51单片机为核心芯片,通过控制小车车轮的电路,控制其一个轮和两个轮的正转和反转。

而红外遥控控制是通过红外发送端和接收端来驱动电机的控制。

根据设计的要求,制定总体设计思想如下:

(1)小车的正转:

两个电机按同一个方向转动。

(2)小车的反转:

两个电机按同一个方向反向转动。

(3)小车的左转和右转:

一个电机快速转动而另一个电机缓慢的转动。

1.3.1框图设计

基于STC89C51单片机智能小车的控制系统由电源电路、单片机主控电路、复位电路、晶振电路、车轮转轴驱动电路、按键电路等组成,框图组成如图1-1所示。

1.3.2知识点

本项目需要通过学习和查阅资料,了解和掌握一下知识。

•+5v电源原理及设计。

•单片机复位电路工作原理及设计。

•单片机晶振电路工作原理及设计。

•按键电路的设计。

•数码管的特性及其使用。

•STC89C51单片机的引脚图及其功能使用。

•L293D驱动器管脚及其功能使用。

•红外接收装置的使用。

•单片机C语言的及其设计。

1.4硬件设计

1.4.1电路原理图

(1)数码管显示电路原理图如图1-2所示。

图1-2数码管显示电路原理图

 

(2)智能小车车轮驱动电路原理图如图1-3所示。

L293D采用16引脚DIP封装,其内部集成了双极型H-桥电路,所有的开量都做成n型。

这种双极型脉冲调宽方式具有很多优点,如电流连续;电机可四角限运行;电机停止时有微振电流,起到“动力润滑”作用,消除正反向时的静摩擦死区:

低速平稳性好等。

L293D通过内部逻辑生成使能信号。

H-桥电路的输入量可以用来设置马达转动方向,使能信号可以用于脉宽调整(PWM)。

图1-3智能小车车轮驱动电路原理图

(3)LED指示灯原理图如图1-4所示。

图1-4LED指示灯原理图

(4)红外传感器寻线的原理图如图1-5所示。

图1-5红外传感器寻线的原理图

(5)红外传感避障原理图如图1-6所示。

图1-6红外避障原理图

综上所述,可以设计出STC89C51单片机控制智能小车的最小系统原理图如图1-7所示。

图1-7STC89C51单片机控制智能小车的最小系统原理图

1.4.2原件清单

基于STC89C51单片机智能小车控制系统的原件清单如表1-1所示。

表1-1基于STC89C51单片机智能小车控制系统的原件清单

原件名称

型号

数量

用途

原件名称

型号

数量

用途

单片机

电容

电容

电解电容

电源VCC

直流电机

三极管

集成块

STC89C51

100uF

30pF

10uF/10V

+5v/1A

 

L293D

1个

4个

2个

1个

1个

2个

若干

1个

控制核心

晶振电路

复位电路

提供电源

车轮驱动

脉宽调整

集成块

晶振

电阻

发光二极管

数码管

蜂鸣器

电位器

电阻

L293D

11.0592MHZ

1KΩ

0.7V

共阴极

 

300Ω

1个

1个

1个

1个

1个

1个

若干

若干

直流电机驱动

晶振电路

复位电路

指示灯

显示数字

 

数码管限流

1.4.3L293D驱动单片机的原理简介

如图2-6L293D采用16引脚DIP封装,其内部集成了双极型H-桥电路,所有的开量都做成n型。

这种双极型脉冲调宽方式具有很多优点,如电流连续;电机可四角限运行;电机停止时有微振电流,起到“动力润滑”作用,消除正反向时的静摩擦死区:

低速平稳性好等。

L293D通过内部逻辑生成使能信号。

H-桥电路的输入量可以用来设置马达转动方向,使能信号可以用于脉宽调整(PWM)。

另外,L293D将2个H-桥电路集成到1片芯片上,这就意味着用1片芯片可以同时控制2个电机。

每1个电机需要3个控制信号EN12、IN1、IN2,其中EN12是使能信号,IN1、IN2为电机转动方向控制信号,IN1、IN2分别为1,0时,电机正转,反之,电机反转。

选用一路PWM连接EN12引脚,通过调整PWM的占空比可以调整电机的转速。

选择一路I/O口,经反向器74HC14分别接IN1和IN2引脚,控制电机的正反转

1.4.4STC89C51单片机管脚图及其功能

(1)STC89C51管脚图如图1-8所示。

图1-8STC89C51管脚图

(2)STC89C51的管脚图功能

如图2-7为STC89C51的引脚功能图,其各个引脚功能概述如下:

VCC:

供电电压。

GND:

接地。

P0口:

P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。

当P1口的管脚第一次写1时,被定义为高阻输入。

P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。

在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。

P1口:

P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。

P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。

在FLASH编程和校验时,P1口作为第八位地址接收。

P2口:

P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。

并因此作为输入时,P2口的管脚被外部拉低,将输出电流。

这是由于内部上拉的缘故。

P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。

在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。

P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

P3口:

P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。

当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。

作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。

P3口也可作为AT89C51的一些特殊功能口,如下表所示:

口管脚备选功能

P3.0RXD(串行输入口)

P3.1TXD(串行输出口)

P3.2/INT0(外部中断0)

P3.3/INT1(外部中断1)

P3.4T0(记时器0外部输入)

P3.5T1(记时器1外部输入)

P3.6/WR(外部数据存储器写选通)

P3.7/RD(外部数据存储器读选通)

P3口同时为闪烁编程和编程校验接收一些控制信号。

RST:

复位输入。

当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。

ALE/PROG:

当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。

在FLASH编程期间,此引脚用于输入编程脉冲。

在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。

因此它可用作对外部输出的脉冲或用于定时目的。

然而要注意的是:

每当用作外部数据存储器时,将跳过一个ALE脉冲。

如想禁止ALE的输出可在SFR8EH地址上置0。

此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。

另外,该引脚被略微拉高。

如果微处理器在外部执行状态ALE禁止,置位无效。

/PSEN:

外部程序存储器的选通信号。

在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。

但在访问外部数据存储器时,这两次有效的/PSEN信号出现。

/EA/VPP:

当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。

注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。

在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。

XTAL1:

反向振荡放大器的输入及内部时钟工作电路的输入。

XTAL2:

来自反向振荡器的输出。

1.5软件设计

1.5.1程序流程图

智能小车控制流程图如图1-9所示。

1.5.2L293D驱动器管脚赋值表

L293D驱动器小车电机转动的管脚图赋值表如表1-2所示。

表1-2L293D驱动器小车电机转动的管脚图赋值表

状态

引脚

停止(K4)

左转(K0)

右转(K1)

前进(K2)

后退(K3)

Out1(P2.0)

0

0

1

1

0

Out2(P2.1)

0

0

0

0

1

Out3(P2.2)

0

1

0

1

0

Out4(P2.3)

0

0

0

0

1

1.5.3程序清单

相关软件程序清单如下:

(1)智能小车自动寻线软件清单如下:

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitK1=P1^0;

sbitK2=P1^1;

sbitK3=P1^2;

sbitK4=P1^3;

sbitK5=P1^4;

sbitKIN1=P1^5;

sbitKIN2=P1^6;

sbitout1=P2^0;

sbitout2=P2^1;

sbitout3=P2^2;

sbitout4=P2^3;

voiddelay(uintt)//延时程序1

{

ucharj;

while(t--)

{for(j=5;j>0;j--);}

}

//左转

voidcomeleft()

{uchari;

out1=0;

out2=0;

out3=1;

out4=0;

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

{

out1=!

out1;

delay

(1);

}

}

//左微转

voidsleft()

{uchari;

out1=0;

out2=0;

out3=1;

out4=0;

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

{

out1=!

out1;

delay

(1);

}

}

//右微转

voidsright()

{uchari;

out1=1;

out2=0;

out3=0;

out4=0;

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

{

out3=!

out3;

delay

(1);

}

}

//右转

voidcomeright()

{uchari;

out1=1;

out2=0;

out3=0;

out4=0;

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

{

out3=!

out3;

delay(10);

}

}

//前进加速;

voidcomeon()

{out2=0;

out4=0;

out1=1;

out3=1;

}

//避障原路返回

voidshunback()

{

if((!

KIN1)|(!

KIN2))

{

out1=0;

out2=1;

out3=1;

out4=0;

delay(4000);

comeon();

delay(4000);

out1=1;

out2=0;

out3=0;

out4=0;

delay(1000);

comeon();

delay(2000);

while(K1&&K2&&K3&&K4&&K5){comeright();};

}

else{;}

}

//循迹

voidscanline()

{

P1=0XFF;

if(K5==0){comeleft();}

elseif(!

K1){comeright();}

elseif(!

K4){sleft();comeon();}

elseif(!

K2){sright();comeon();}

elseif(!

K3){comeon();comeon();}

else{P2=P2;}

}

voidmain(void)

{

P1=0XFF;

P2=0XFF;

while

(1)

{

shunback();

scanline();

}

}

(2)智能小车避障(悬崖)软件程序清单如下:

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitK1=P1^0;

sbitK2=P1^1;

sbitK3=P1^2;

sbitK4=P1^3;

sbitK5=P1^4;

sbitKIN1=P1^5;

sbitKIN2=P1^6;

sbitout1=P2^0;

sbitout2=P2^1;

sbitout3=P2^2;

sbitout4=P2^3;

voiddelay(uintt)//延时程序1

{

ucharj;

while(t--)

{for(j=5;j>0;j--);}

}

/*voidstop()

{

out1=0;

out2=0;

out3=0;

out4=0;

delay(10);

}

//左转

voidcomeleft()

{uchari;

out1=0;

out2=0;

out3=1;

out4=0;

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

{

out1=!

out1;

delay

(1);

}

}

//左微转

voidsleft()

{uchari;

out1=0;

out2=0;

out3=1;

out4=0;

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

{

out1=!

out1;

delay

(1);

}

}

//右微转

voidsright()

{uchari;

out1=1;

out2=0;

out3=0;

out4=0;

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

{

out3=!

out3;

delay

(1);

}

}

//右转

voidcomeright()

{uchari;

out1=1;

out2=0;

out3=0;

out4=0;

for(i=0;i<10;i++

{

out3=!

out3;

delay

(1);

}

}

//前进加速;

voidcomeon()

{out2=0;

out4=0;

out1=1;

out3=1;

}

//后退

voidcomeback()

{

out1=0;

out3=0;

out2=1;

out4=1;

delay(10000);

}

//循迹

voidbxy()

{

P1=0XFF;

if(!

(K5&&K4))

{

comeback();

out2=0;

out4=1;

out1=1;

out3=0;

delay(5000);

comeon();

}

elseif(!

(K1&&2))

{

comeback();

out2=1;

out4=0;

out1=0;

out3=1;

delay(5000);

comeon();

}

elseif(!

K3)

{

out2=0;

out4=1;

out1=1;

out3=0;

delay(10000);

comeon();

}

else{comeon();}

}

voidmain(void)

{

P1=0XFF;

P2=0XFF;

while

(1)

{

bxy();

}

}

(3)遥控控制小车程序清单如下:

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitSET1=P2^4;

sbitSET2=P2^5;

sbitSET3=P2^6;

sbitout1=P2^0;

sbitout2=P2^1;

sbitout3=P2^2;

sbitout4=P2^3;

unsignedlongxdatarec_code;

unsignedlongxdatatime_us;

unsignedcharxdatarec_cnt;

unsignedcharxdatakbuf;

ucharsdata;

bitrec_b;

bitkey_save;

bitkeyp;

ucharcodeseg7code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

voiddelay(uchart)//延时程序1

{

ucharj;

while(t--)

{for(j=50;j>0;j--);}

}

voidInit()

{

TMOD=0x09;//T/C1采用16位定时器/计数器

ET1=1;//定时器1开中断

TH0=0x00;

TL0=0x00;

ET0=0;

TR0=1;//定时计数器启动计数

EX0=1;//外部中断0关中断

EX1=0;//外中断1关中断

EA=1;//CPU开中断

}

voidstop()

{

out1=0;

out2=0;

out3=0;

out4=0;

delay(10);

}

//左转

voidcomeleft()

{

out1=0;

out2=1;

out3=1;

out4=0;

delay(200);

}

//右转

voidcomeright()

{

out1=1;

out2=0;

out3=0;

out4=1;

delay(200);

}

//前进加速;

voidcomeon()

{out2=0;

out4=0;

out1=1;

out3=1

}

//后退

voidcomeback()

{

out1=0;

out3=0;

out2=1;

out4=1;

delay(200);

}

//避开障碍物

voidshunout()

{

if(sdata==157){comeon();rec_code=0;sdata=0;}

elseif(sdata==87){comeback();rec_code=0;sdata=0;}

elseif(sdata==253){stop();rec_code=0;sdata=0;}

elseif(sdata==61){comeright();rec_code=0;sdata=0;}

elseif(sdata==221){comeleft();rec_code=0;sdata=0;}

else{;}

}

voidinter_x0()interrupt0

{

TR0=0;

time_us=(unsignedlong)(TH0<<8)+TL0;

TH0=0;

TL0=0;

TR0=1;

if(time_us>3800&&time_us<4500)

{

rec_cnt=0;

rec_code=0;

}

elseif(time_us>300&&time_us<700)

{

rec_cnt++;

rec_code=rec_code<<1;

//rec_code=rec_code&0x00000000;

}

elseif(time_us>1300&&time_us<1750)

{

rec_cnt++;

rec_code=rec_code<<1;

rec_code=rec_code|0x00000001;

//IO_buzz=0;

}

elseif(time_us>1800&&time_us<2200)

{

rec_code=rec_code;

rec_cnt++;//

if(rec_cnt>1)

{

rec_cnt=0;

key_save=1;

}

}

if(rec_cnt==32)

{

rec_b=1;

key_save=0;

rec_cnt=0;

}

}

voidGetKeyValue()

{

if(rec_b)

{

unsignedcharda;

rec_b=0;

kbuf=(rec_code&0x0000ff00)>>8;

da=rec_code&0x000000ff;

if(kbuf==~da)

{

sdata=da;

}

}

}

voidmain()

{

P1=0XFF;

P2=0XFF;

P3=0XFF;

P0=0XFF;

Init();

while

(1)

{

GetKeyValue();

shunout();

}

}

(4)数码管显示软件程序如下:

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitSET1=P2^4;

sbitSET2=P2^5;

sbitSET3=P2^6;

sbitSET4=P2^7;

ucharcodeseg7code[]={0x3f,0x06,0

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1