目录
1.1项目概述…………………………………………………………………………………… 1
1.2项目要求…………………………………………………………………………………… 1
1.3实训目的…………………………………………………………………………………… 1
1.4系统设计…………………………………………………………………………………… 1
1.4.1框图设计……………………………………………………………………………… 1
1.4.2知识点………………………………………………………………………………… 1
1.5硬件设计……………………………………………………………………………………
1.5.1总体设计……………………………………………………………………………
1.5.2原件清单……………………………………………………………………………
1.5.3元器件介绍…………………………………………………………………………
1.6软件设计……………………………………………………………………………………
1.6.1程序流程图…………………………………………………………………………
1.6.2程序清单……………………………………………………………………………
1.6.3程序下载调试………………………………………………………………………
1.7智能小车运行效果图………………………………………………………………………
1.8总结…………………………………………………………………………………………
1.9参考文献……………………………………………………………………………………
1.1项目概述 TOC \o "1-3" \h \z \u
本次实训是基于单片机(STC89C51)智能小车的设计与开发,开发中涉及控制、程序设计、模式识别、传感技术、电子、计算机、机械等。开发智能小车的学习与发展,对促进学习综合运用所学的嵌入式知识以及电子技术的知识提高,具有良好的推动作用。
1.2项目要求
(1)理解程序、硬件电路图,查阅相关资料;
(2)焊接电路板;
(3)软硬件调试;
(4)完成循迹,避障,遥控等功能。
1.3实训目的(1)理解并掌握单片机控制小车的循迹,遥控、避障的原理;
(2)了解电子路的布局、PCB板的设计;
(3)掌握电路板焊接技术,如何用万用表线判断元器件的好坏;
(4)掌握单片机C语言的编程及软硬件调试。
1.4系统设计
1.4.1框图设计
基于STC89C52单片机智能小车系统设计由STC89C52单片机、电机驱动、晶振电路、按键电路、数码管显示电路、红外感应电路几部分组成,系统框图如图1-1所示。
图1-1 基于STC89C52单片机智能小车系统框图
1.4.2知识点
该项目需要了解以下知识点。
(1)+5V电源原理及设计。
(2)单片机复位电路工作原理及设计。
(3)单片机晶振电路工作原理及设计。
(4)案件电路的设计。
(5)数码管的特性及应用。
(6)电路板焊接技术。
(7)STC89C52单片机引脚。
(8)单片机C语言程序设计
(9)红外线感应原理。
1.5硬件设计
1.5.1总体设计
智能小车采用前轮驱动,前轮左右两边各用一个电机驱动,调制前面两个轮子的转速起停从而达到控制转向的目的,后轮是万象轮,起支撑的作用。
循迹光电对管分别装在车体下的左右。当车身下左边的传感器检测到黑线为主控芯片控制左轮电机停止,车向左修正,当车身下右边传感器检测到黑线时,主控芯片控制右轮电机停止,车向右修正。如图1-2所示
图1-2 智能小车循迹光电对管图
避障的原理和循线一样,在车身右边装一个光电对管,当其检测到障碍物时,主控芯片给出信号报警并控制车子倒退,转向,从而避开障碍物。如图1-3所示。
图1-3 智能小车避障光电对管图
1.5.2原件清单:
基于单片机STC89C51元器件如表1-4所示。
表1-4 基于STC89C51智能小车原件清单
1.5.3元器件介绍
1)STC89C52单片机管脚图及功能
如图1-5为STC89C51的引脚功能图,其各个引脚功能概述如下:
VCC:供电电压。
GND:接地
图1-5 STC89C52引脚功能图
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.0 RXD(串行输入口)
P3.1 TXD(串行输出口)
P3.2 /INT0(外部中断0)
P3.3 /INT1(外部中断1)
P3.4 T0(记时器0外部输入)
P3.5 T1(记时器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:来自反向振荡器的输出。
2)L293D驱动引脚原理图
图1-6 L293D驱动与电机相连原理图
图1-6为L293D采用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引脚,控制电机的正反转。
L293D驱动器管脚赋值表
表1-7为L293D驱动器小车电机转动的管脚图赋值表:
表1-7 L293D驱动管脚赋值表
行进
引脚
停止
左转
右转
前进
后退
原路返回
Out1(P2.0)
0
0
1
1
0
0
1
Out2(P2.1)
0
0
0
0
1
1
0
Out3(P2.2)
0
1
0
1
0
1
0
Out4(P2.3)
0
0
0
0
1
0
1
电机驱动一般采用H桥式驱动电路,L293N内部集成了H桥式驱动电路,从而可以采用L293N电路来驱动电机。通过单片机给予L293N电路PWM信号来控制小车的速度,起停。驱动原理图如图1-8所示。
图1-8 L298N引脚图
1.6软件设计
1.6.1程序流程图
智能循迹避障小车程序流程图如图1-9所示。
1.6.2程序清单
智能小车程序清单如下所示:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit K1=P1^0; //P1.0到P1.4为寻线检测端
sbit K2=P1^1;
sbit K3=P1^2;
sbit K4=P1^3;
sbit K5=P1^4;
sbit KIN1=P1^5; //P1.5 P1.6是避障检测端
sbit KIN2=P1^6;
sbit out1 = P2^0 ; //P2.0到P2.3是电机驱动输出控制端
sbit out2 = P2^1 ;
sbit out3 = P2^2 ;
sbit out4 = P2^3 ;
sbit beem= P3^7; //蜂鸣器控制引脚
unsigned long xdata rec_code;
unsigned long xdata time_us;
unsigned char xdata rec_cnt;
unsigned char xdata kbuf;
uchar sdata,flag; //sdata是红外遥控接收键值变量 flag是启动小车 或停止小车变量
bit rec_b;
bit key_save;
bit keyp;
uchar counter=0;
sbit SET1=P2^4 ;
sbit SET2 =P2^5;
sbit SET3 =P2^6;
sbit SET4 =P2^7;
uchar code seg7code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay1(uchar t) //延时程序1
{
uchar j;
while(t--)
{for(j=50;j>0;j--);}
}
void display (uchar i)
{
P2=P2|0XF0;
P0=~seg7code[i/100];
SET1=0;
delay1(10);
P2=P2|0XF0;
P0=~seg7code[(i/10)%10];
SET2=0;
delay1(10);
P2=P2|0XF0;
P0=~seg7code[i%10];
SET3=0;
delay1(10);
P2=P2|0XF0;
P0=~seg7code[(i+3)%10];
SET4=0;
delay1(10);
P2=P2|0XF0;
}
void delay(uint t) //延时程序1
{
uchar j;
while(t--)
{for(j=5;j>0;j--);}
}
void beep() //蜂鸣器 提示音
{
beem=0;
delay(1000);
beem=1;
delay(1000);
beem=0;
delay(1000);
beem=1;
delay(1000);
}
void Init() //初始化
{
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开中断
}
//左转
void comeleft()
{ uchar i;
out1=0;
out2=0;
out3=1;
out4=0;
for(i=0;i<10;i++)
{
out1=!out1;
delay(1);
}
}
//左微转
void sleft()
{ uchar i;
out1=0;
out2=0;
out3=1;
out4=0;
for(i=0;i<5;i++)
{
out1=!out1;
delay(1);
}
}
//右微转
void sright()
{ uchar i;
out1=1;
out2=0;
out3=0;
out4=0;
for(i=0;i<5;i++)
{
out3=!out3;
delay(1);
}
}
//右转
void comeright ()
{ uchar i;
out1=1;
out2=0;
out3=0;
out4=0;
for(i=0;i<10;i++)
{
out3=!out3;
delay(1);
}
}
//前进加速;
void comeon()
{ out2=0;
out4=0;
out1=1;
out3=1;
}
void stop() //停止
{
out1=0;
out2=0;
out3=0;
out4=0;
}
void inter_x0() interrupt 0
{
TR0 = 0;
time_us = (unsigned long)(TH0<<8) + TL0;
TH0 = 0;
TL0 = 0;
TR0 = 1;
if(time_us>3800&&time_us<4500)
{
rec_cnt = 0;
rec_code = 0;
}
else if(time_us>300&&time_us<700)
{
rec_cnt ++;
rec_code = rec_code<<1;
//rec_code = rec_code &0
}
else if(time_us>1300&&time_us<1750)
{
rec_cnt ++;
rec_code = rec_code<<1;
rec_code = rec_code|0
//IO_buzz = 0;
}
else if(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;
}
}
void GetKeyValue() //红外遥控键值取值
{
if(rec_b)
{
unsigned char da;
rec_b = 0;
kbuf = (rec_code&0x0000ff00)>>8;
da = rec_code&0x000000ff;
if(kbuf==~da)
{
sdata=da;
}
}
}
//避障原路返回
void shunback()
{
if(!KIN1)
{
out1=0;
out2=1;
out3=1;
out4=0;
delay(1000);
while(K1&&K2&&K3&&K4&&K5);
}
else if(!KIN2)
{
out1=1;
out2=0;
out3=0;
out4=1;
delay(1000);
while(K1&&K2&&K3&&K4&&K5);
}
else{;}
}
//循迹
void scanline()
{
P1=0XFF;
if(!(K1||K2||K3||K4||K5))
{ counter++;
if (counter==5) stop();
}
if(K5==0){comeleft();}
else if(!K1) { comeright ();}
else if(!K4) { sleft();comeon(); }
else if(!K2) { sright();comeon(); }
else if(!K3) { comeon();comeon(); }
else {P2=P2;}
}
void main(void)
{
P1=0XFF;
P2=0XFF;
P3=0XFF;
P0=0XFF;
Init();
while(1)
{
display(counter);
GetKeyValue();//红外遥控键值取值
if(sdata==221) //按221键 则小车停止运行
{
flag=0; //小车停止变量
beep(); //蜂鸣器 叫两声
stop(); //小车停止
sdata=0; //红外遥控键变量归零
}
else if(sdata==93) //按93键 则小车启动
{
flag=1; //小车启动变量
beep(); //蜂鸣器 叫两声
comeon() ; //小车启动
sdata=0; //红外遥控键变量归零
}
else{;}
if(flag==1) // //小车启动,则进行 寻线 避障操作
{
shunback(); //避障
scanline(); // 寻线
}
}
}
1.6.3程序下载调试
图1-10程序下载软件界面
如图1-10是STC89C51单片机程序下载软件STC-ISP.exe。下载方式步骤如下:
(1)首先像2-5连接串口,安装硬件驱动。右击“我的电脑”,点击“属性”,选择“硬件/设备管理器”单击“端口”查看串口是否被连接。连接成功则显示com端口号。
(2)首先点击STC-ISP.exe快捷方式进入图2-4界面。点击“Open File”按钮选择要下载的程序确定,在选择下载点串口COM,下一步点击“Download/下载”,按“Download/下载”之前小车处于断电状态,按下瞬间必须给小车供电。
1.7智能小车运行效果图
1.8总结
经过为期两周的实训让我有如下几点的感想和收获,首先让我们将教材上所学的知识运用到实践中,从而解决实际中的问题。首先在组装小车前应该用万用表检测元器件的好坏,不然到调试的时候才知道那就晚了。其次是从小车的组装到电路板的焊接让我懂得了,做一件事一定要胆大心细。比如说焊接电路板的时候要懂得先焊接矮的在焊接高的,在焊接时一定要注意不要虚焊,以免导致断路现象、在焊接时不要开风扇、不要将器件的正负极接反了,这些都是焊接过程中应注意的问题。最后在调试的时候应注意所接的电原要保持在5V左右,以免烧坏单片机。
我觉得这次智能小车的设计我们充分的发挥了我们的动手能力,经过自己的努力我们能初步的完成小车的组装和简单的调试,在老师的知道下我们懂得了小车控制的原理,从而懂得怎么去发挥自己的想象,让小车按自己的想法运动。这次让我懂得团队的力量是巨大的,每个人的思想都不相同我们要充分的将每个好的想法集中起来就会有不同的效果。
这次智能小车设计会使我终身受益,我感受到做这次智能小车是真真正正用心去做的一件事情,是真正的自己学习的过程和研究的过程,没有学习就不可能有研究的能力,没有自己的研究,就不会有所突破。希望这次的实训能让我在以后学习中激励我继续进步。
1.9参考文献
[1] 周润景,张丽娜. 基于PROTEUS的电路极单片机系统设计与仿真[M].北京:北京航空航天大学出版社,2006
[2]高有堂,朱清慧,电子技术基础[M].西安:西安地图出版社,2003
[3]杨居易,马宁,靳光明,王益斌编著.单片机原理与工程应用.北京:清华大学出版社,2009
[4]马忠梅.单片机的C语言程序设计.第四版.北京:北京航空航天大学出版社,2007
[5]李群芳,肖看编著。单片机原理、接口及应用.北京:清华大学出版社,2005
[6]刘守义.单片机应用技术.西安电子科技大学出版社,2002
[7]何希才.集成电路应用实例.北京:电子工业出版社,2007
[8]江力.单片机原理及其接口技术.北京:清华大学出版社,2006
[9]王效华.单片机原理及应用.北京:北京交通大学出版社,2007
[10]张道德.单片机接口技术(C51版).北京:中国水利水电出版社,2007