基于STC89C51单片机智能小车控制.docx
- 文档编号:8311914
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:25
- 大小:72.23KB
基于STC89C51单片机智能小车控制.docx
《基于STC89C51单片机智能小车控制.docx》由会员分享,可在线阅读,更多相关《基于STC89C51单片机智能小车控制.docx(25页珍藏版)》请在冰豆网上搜索。
基于STC89C51单片机智能小车控制
基于STC89C51单片机智能小车控制
项目名称:
基于单片机STC89C51智能小车控制
小组成员:
xx
班级:
xx
指导教师:
xx
开发结束时间:
2011年7月10日星期日
1.1项目概述3
1.2项目要求3
1.3系统设计3
3
4
1.4硬件设计4
4
1.4.2原件清单6
1.4.3L293D驱动单片机的原理简介7
1.4.4STC89C51单片机管脚图及其功能7
1.5软件设计9
1.5.1程序流程图9
1.5.2L293D驱动器管脚赋值表10
1.5.3程序清单10
1.6软件仿真及硬件调试21
1.6.2硬件调试21
1.6.1软件仿真22
1.7总结23
1.8文献参考23
1.1项目概述
随着单片机技术的不断发展和完善已经大量的运用在工业的控制、数据的采集、智能化仪表、机电一体化、家用电器等领域,极大地提高了这些领域的技术水平和自动化控制水平。
为此我们基于STC89C51这款单片机进行智能小车开发。
1.2项目要求
基于STC89C51单片机智能小车的设计要求如下:
·实现智能小车上电自动寻迹。
·实现智能小车向前行驶时避障及其避悬。
·实现智能小车红外遥控控制小车左右转弯前后行驶。
1.3系统设计
智能小车的控制主要是控制小车车轮的转向,以STC89C51单片机为核心芯片,通过控制小车车轮的电路,控制其一个轮和两个轮的正转和反转。
而红外遥控控制是通过红外发送端和接收端来驱动电机的控制。
根据设计的要求,制定总体设计思想如下:
(1)小车的正转:
两个电机按同一个方向转动。
(2)小车的反转:
两个电机按同一个方向反向转动。
(3)小车的左转和右转:
一个电机快速转动而另一个电机缓慢的转动。
基于STC89C51单片机智能小车的控制系统由电源电路、单片机主控电路、复位电路、晶振电路、车轮转轴驱动电路、按键电路等组成,框图组成如图1-1所示。
本项目需要通过学习和查阅资料,了解和掌握一下知识。
•+5v电源原理及设计。
•单片机复位电路工作原理及设计。
•单片机晶振电路工作原理及设计。
•按键电路的设计。
•数码管的特性及其使用。
•STC89C51单片机的引脚图及其功能使用。
•L293D驱动器管脚及其功能使用。
•红外接收装置的使用。
•单片机C语言的及其设计。
1.4硬件设计
(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所示。
综上所述,可以设计出STC89C51单片机控制智能小车的最小系统原理图如图1-7所示。
基于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
#defineuintunsigned
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 STC89C51 单片机 智能 小车 控制