基于STC89C52单片机的智能小车的设计与实现

上传人:仙*** 文档编号:30349994 上传时间:2021-10-10 格式:DOC 页数:32 大小:2.58MB
收藏 版权申诉 举报 下载
基于STC89C52单片机的智能小车的设计与实现_第1页
第1页 / 共32页
基于STC89C52单片机的智能小车的设计与实现_第2页
第2页 / 共32页
基于STC89C52单片机的智能小车的设计与实现_第3页
第3页 / 共32页
资源描述:

《基于STC89C52单片机的智能小车的设计与实现》由会员分享,可在线阅读,更多相关《基于STC89C52单片机的智能小车的设计与实现(32页珍藏版)》请在装配图网上搜索。

1、目录 一 目的与要求21.1 设计目的21.2 设计任务与要求21.2 设计方案论证31.2.1 单片机选择方案31.2.2 避障的选择31.2.3 显示模块的选择41.2.4 电机模块的选择41.3 设计原理41.3.1 避障原理41.3.2 循迹原理51.3.3 测速原理5二 系统硬件电路设计62.1 系统总体设计62.2 模块设计分析62.2.1 避障传感器模块62.2.2 循迹传感器模块72.2.3 控制器模块82.2.4 电机驱动模块92.2.5电机模块102.2.6 显示模块112.2.7 电源模块112.2.8 总结11三 系统的软件设计分析123.1 总程序框架图123.2 红

2、外循迹模块程序框架图13四 调试与测试144.1调试过程中遇到的问题与解决14五 小车实物图15六 心得体会16参考文献16附录一(元件清单)17附录二(程序清单)1932一 目的与要求1.1 设计目的本次设计是基于STC89C52单片机的智能小车的设计与实现,小车完成的主要功能是能够避开赛道上的两块挡板,并在之后自主识别黑色引导线且根据黑线走向实现快速稳定的寻线行驶。小车系统以STC89C52单片机为系统控制处理器;采用红外传感器获取挡板和赛道上黑线的信息,来对小车的方向和速度进行控制。此外,对整个控制软件进行设计和程序的编制以及程序的调试,并最终完成软件和硬件的融合,实现小车的预期功能。1

3、.2 设计任务与要求1) 设计并制作一个避障循迹小车,其行驶路线示意图如下:图1-1 小车行驶路线示意图2) 机器人从起点出发,在绕过两个挡板障碍物之后,自动寻找在地上的黑线,并能跟随黑线的轨迹行走顺利地到达终点。3) 能显示机器人行驶的时间,里程,速度等其他功能。4) 机器人一旦启动后,不得人为干预其行驶,机器人须在8分钟内抵达终点,机器人冲进禁区,需重新从起点开始,时间累加,每支队伍有3次机会进行避障寻轨,取最短时间计入最终成绩,机器人长不小于15cm,宽不小于10cm1.2 设计方案论证1.2.1 单片机选择方案方案一:用可编程逻辑器件(PLD)实现。这种方案与前一种相比,可靠性增加,同

4、时可以很好的完成避障的功能。但是循迹功能不能实现,而且这种方案只能选用数码管显示,显示的效果不够理想,无法很好的完成扩展功能的要求,系统的灵活性不够。 方案二:采用STC89C52单片机作为系统的控制核心。密码管理系统用I2C总线AT24C02来实现,温度感应用DS18B20来采样温度,利用PWM控制电机转速。由于使用了单片机,整个系统可编程,系统的灵活性大大增加了。另外,本方案可以方便的实现其他功能的扩展。 经过以上的比较论证,选用方案二来完成项目设计的要求。1.2.2 避障的选择 方案一:在避障模块中,选择超声波避障,优点是反应速度灵敏,距离远,受外界干扰小。但题目所要求的距离是20cm,

5、如果利用超声波传感器进行避障的话,由于空间小声波在小空间不同方向里会进行多次反射,左右前后的传感器之间互相干扰,使控制中心不能明确判断出那个方向遇到了障碍物,从而动作絮乱,不能实现要求。 方案二:使用红外接收头和发射管(反射头能反射)配合,利用38K频率解决灵敏度问题。38K调制和发射电路。使用一个定时器的快速PWM模式产生38K调制信号,通过剩余的四个施密特触发器缓冲,推动8050三极管和红外发光管发射已经调制的红外线。期中2个N148接单片机IO脚控制左右红外发光管轮流发射。后面串接的可见光LED是为了方便用户调试而设置的,让用户知道当前是否在发射红外线。通过调节PWM的占空比,调节红外发

6、光管的亮度,从而实现调节感知障碍物距离的功能。经过以上的比较论证,选用方案二:使用红外接收头和发射管(反射头能反射)配合。1.2.3 显示模块的选择 方案一:使用多个数码管显示。LED数码管是利用二极管发光显示数字和字母,具有亮度大、接口设计比较容易,价格相对较便宜等优点。但是由于它工作电流较大、不能显示汉字,显示的信息量有限,若在此题目中应用就会受到很大的限制。 方案二:采用液晶显示。液晶特别是具有字母显示功能的液晶显示器,来实现显示功能,不仅可以实现基本的显示信息,而且可以显示丰富的符号指示信息以及文字指示信息,信息量丰富且直观易懂。而且液晶显示有功耗低,体积小,重量轻,寿命长,不产生电磁

7、辐射污染等优点。经过比较论证,选用方案二:采用液晶显示。1.2.4 电机模块的选择 方案一:采用步进电机,由于其转过的角度可以精确的定位,可以实现小车前进路程和位置的精确定位。但其输出力矩低,控制复杂,质量较重。方案二:采用直流电机,其控制比较简单,可以通过调节方波占空比来实现PWM调速,缺点需外加传感器实现路程的计算。基于以上分析,我们选用了方案二:采用直流电机。1.3 设计原理1.3.1 避障原理避障传感器我们选择光电漫反射开关,是当开关发射光束时,目标产生漫反射,发射器和接收器构成单个的标准部件,当光电开关有足够的组合光返回接收器时,开关状态发生变化,从而一起输出端电平的变化,继而利用电

8、平进行障碍物判断。1.3.2 循迹原理这里的循迹是指小车在白色地板上循黑线行走,由于黑线和白色地板对光线的反射系数不同,可以根据接收到的反射光的强弱来判断“道路”。通常采取的方法是红外探测法。红外探测法,即利用红外线在不同颜色的物体表面具有不同的反射性质的特点,在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色纸质地板时发生漫反射,反射光被装在小车上的接收管接收;如果遇到黑线则红外光被吸收,小车上的接收管接收不到红外光。单片机就是否收到反射回来的红外光为依据来确定黑线的位置和小车的行走路线。红外探测器探测距离有限。1.3.3 测速原理这里我们采用光电码盘来测速,码盘圆周上有等分等宽的透光

9、条码和遮光条码,通过采到的脉冲来进行转速与电信号的转换。码盘与车轮同轴,置于光电对管之间,当车轮转动时,条码就可以交替的透光和遮光,从而产生一连串脉冲电压信号。二 系统硬件电路设计2.1 系统总体设计 图2-1 系统硬件结构框图2.2 模块设计分析2.2.1 避障传感器模块漫反射光电开关是一种集发射器和接收器于一体的传感器,当有被检测物体经过时,将光电开关发射器发射的足够量的光线反射到接收器,于是光电开关就产生了开关信号。图2-2 漫反射开关检测原理图我们所选择的漫反射关电开关的检测距离可达30cm,其抗干扰的能力强,可进行可靠的避障。2.2.2 循迹传感器模块反射式光电传感器是经常使用的传感

10、器。我们采用的红外发射接收管对价格便宜、体积小、使用方便、质量可靠、用途广泛。在黑线检测的测试中,若检测到白色区域,发射管发射的红外线没有反射到接收管,测量接收管的电压为48V ,若检测到黑色区域,接收管接受到发射管发射的红外线,所得电压也就随之发生变化,测的接收管的电压为0V,测试基本满足要求。循迹模块如图2-3所示: 图2-3 循迹模块图正确选择检测方法和传感器件是决定循迹效果的重要因素,而且正确的器件安装方法也是循迹电路好坏的一个重要因素。从简单、方便、可靠等角度出发,同时在底盘装设4个红外探测头,进行两级方向纠正控制,将大大提高其循迹的可靠性,具体位置分布如图2-4所示。 图2-4 红

11、外探头的分布图图中四个光电传感器同在一个水平线上,其中2与3光电传感器位于靠近黑色轨迹左右边,来控制微小转弯,1和4位于远离黑线,用于检测道路分支、大角度转弯等,这是考虑到如果转弯角过大,小车即使刹车,也会由于惯性过大偏离轨道,由于加入了x2和y2这两个光电传感器,可以提前预知小车即将转弯的幅度,从而更好控制小车转弯,提高了小车循迹的可靠性。2.2.3 控制器模块89C52是INTEL公司MCS-51系列单片机中基本的产品,它采用INTEL公司可靠的CHMOS工艺技术制造的高性能8位单片机,属于标准的MCS-51的HCMOS产品。它结合了HMOS的高速和高密度技术及CHMOS的低功耗特征,它基

12、于标准的MCS-51单片机体系结构和指令系统,属于80C51增强型单片机版本,集成了时钟输出和向上或向下计数器等更多的功能,适合于类似马达控制等应用场合。且具有PWM输出功能,更便于控制小车的车速及转向。其基本模块最小系统电路如图2-5所示图2-5 2.2.4 电机驱动模块驱动模块采用专用芯片L298N 作为电机驱动芯片,L298N 是一个具有高电压大电流的全桥驱动芯片,其响应频率高,一片L298N可以分别控制两个直流电机。以下为L298N的引脚图(图3-1)和输入输出关系表(表1)。其中,系统电机驱动模块电路如图2-6: 图3-1 L298N外部引脚 表1 L298N输入输出关系 图2-6

13、电机驱动模块电路图2.2.5电机模块对于电机模块,我们考虑了两种方案,一种是步进电机,另外一种是直流电机。下面对比一下两种电机的优缺点。1) 采用步进电机,由于其转过的角度可以精确的定位,可以实现小车前进路程和位置的精确定位。但其输出力矩低,控制复杂,质量较重。2) 采用直流电机,其控制比较简单,可以通过调节方波占空比来实现PWM调速,缺点需外加传感器实现路程的计算。基于以上分析,我们选用了直流电机。2.2.6 显示模块采用LCD1602作为显示器件,1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个5X7或者5X11等点阵字符位组成,每个点阵字

14、符位都可以显示一个字符,板面能够同时显示16x02即32个字符。(16列2行)。上行可用于显示小车速度,下行可用于显示小车行驶过的路程。LCD1602实物图如2-7: 图2-7 LCD1602实物图2.2.7 电源模块对于电源模块,我们采用双电源,把单片机的供电和驱动电路分开来,确保单片机控制部分和电机驱动的部分的电压不会互相影响。这样有助于消除电机干扰,提高系统的稳定性。2.2.8 总结综合利用以上各个模块可实现小车避障、循迹、显示速度、路程,记录道路信息等功能,我们采用物尽所用的原则,考虑到89c52的资源情况,基本上把mcu控制芯片的所有资源充分利用起来,资源分配如图 2-8所示: 图2

15、-8 资源分配图三 系统的软件设计分析3.1 总程序框架图 图3-1 总程序框架图3.2红外循迹模块程序框架图 图3-2 红外循迹模块程序框架图四 调试与测试4.1调试过程中遇到的问题与解决在小车调试的过程中,我们遇到了若干问题,诸如如何让小车走直线,如何让小车执行精确90度转弯,这是在避障部分所遇到的比较棘手的问题,而在循迹部分,虽能执行完任务,但却是以牺牲速度为代价的,所以在循迹部分,速度与准确性是一对矛盾,如何解决好这个矛盾,是我们所面临的最大问题。基于以上的种种问题,我们提出种种解决方案。对于避障所遇到的问题,如走直线,我们引入了反馈程序,通过两个车轮速度的差,调节占空比,来平衡两个轮

16、的速度,从而实现走直线。对于90度精确转弯,我们通过对码盘计路程,来实现比较精准的转弯,由于我们的码盘精度有限,故最后引人了2cm的误差,但在合理范围内。在循迹方面,我们同调节探头位置,增加探头,优化程序等步骤,不断地改善循迹,从而使其速度良好,精确度有保障。五 小车实物图图5-1 小车实物图1图5-2 小车实物图2六 心得体会此次单片机比赛让我们学到了很多东西,深深体会到学习的乐趣,也深刻的意思到团队合作的重要性,以及分工的重要性。我们每一个组员认真的负责属于自己的部分,互相帮助,相互提高。遇到困难,也从未气馁,而是认真分析,寻找途径,解决问题。经过此次,大家都收获了不少知识,这是对我们的极

17、大鼓励。参考文献1李建忠.单片机原理及应用.西安电子科技大学出版 2006.02 2李朝青.单片机原理及接口技术.北京航空航天大学出版 2006.033余发山.单片机原理及及应用技术.中国矿业大学出版社 2003.124杨凌霄.微型计算机原理及应用.中国矿业大学出版社 2004.085何立民.单片机应用技术选编.北京航空航天大学出版社 2000.086丁立军.基于超声波传感器与红外传感器的移动机器人感测系统研制 7周杏鹏.传感器与检测技术 清华大学出版社 2009.10附录一(元件清单)主要电子元件名称数量集成非门74ls042片超声波发射器和接收器2对电阻20K、22k、4.7k、200K、

18、10k若干电容330P、1u、23.3u若干单片机stc89c521片液晶16021片电机驱动芯片L298N1片直流电机2个红外发射接收对管4对集成运放L339N4片I2C总线芯片24c021片稳压电源芯片LM8051片稳压电源芯片lm3171片附录二(程序清单)#include#include#define uint unsigned int#define uchar unsigned char#define zhengzhuan aint0=bint0=1;aint1=bint1=0;#define fanzhuan aint0=bint0=0;aint1=bint1=1;#define

19、stop aint0=bint0=aint1=bint1=1;#define youzhuan bint1=1;aint0=1;aint1=0;bint0=1;#define zuozhuan bint1=0;aint0=1;aint1=1;bint0=1;sbit rs=P26;sbit e=P27;sbit pwma=P10;sbit pwmb=P11;sbit aint0=P12;sbit aint1=P13;sbit bint0=P14;sbit bint1=P15;sbit hw5=P24;sbit hw4=P23;sbit hw3=P22;sbit hw2=P21;sbit hw1

20、=P20;sbit guangdian1=P25;sbit guangdian2=P16;sbit guangdian3=P17;uchar code number=0123456789; /10位,包括空格uchar count,tcount,tiaojie,zkba,zkbb,bjzkb,temp,qian5,qian3,qian2,hwbl4,hwbl1,hwbl3,hwbl2,hwbl5,num,in,out;uint i,distance,path1,path2,speed;long way,way2;void delay(uint x);void init();void write

21、_com(uchar com);void write_dat(uchar dat);void lcd_display();void zhixiantiaozheng();void zhuanwantiaozheng();void zhijiaotiaozheng();void jiance();void zhixian();void zhuanwan();void zhijiao();void bizhang();void ting();void zuo_zhizhuan();void you_zhizhuan();void run();void back();void diyizuo_zhi

22、zhuan();void diyiyou_zhizhuan();void dierzuo_zhizhuan();void dieryou_zhizhuan();void jiehe();void jieherun();void xunji_zuoguai();void xunji_youguai();void main()init(); bizhang();jiehe();while(1) jiance();void diyiyou_zhizhuan() path1=0;/zuozhuan;/zhengzhuanpwma=pwmb=0;while(path1=14)pwma=0;pwmb=0;

23、pwma=1;pwmb=0;pwma=0;pwmb=0;pwma=0;pwmb=0;pwma=0;pwmb=0;pwma=0;pwmb=0;pwma=1;pwmb=0; pwma=1;pwmb=0;pwma=1;pwmb=0;pwma=1;pwmb=0; /*if(guangdian2=0)delay(1);if(guangdian2=0) break; */ path1=0; void dieryou_zhizhuan() path1=0;/zuozhuan;/zhengzhuanpwma=pwmb=0;while(path1=16)pwma=0;pwmb=0;pwma=1;pwmb=0;p

24、wma=0;pwmb=0;pwma=0;pwmb=0;pwma=0;pwmb=0;pwma=0;pwmb=0;pwma=1;pwmb=0; pwma=1;pwmb=0;pwma=1;pwmb=0;pwma=1;pwmb=0;path1=0; void dierzuo_zhizhuan() path2=0;/zuozhuan;/zhengzhuanpwma=pwmb=0;while(path2=20)pwma=0;pwmb=0;pwma=0;pwmb=1;pwma=0;pwmb=0;pwma=0;pwmb=0;pwma=0;pwmb=0;pwma=0;pwmb=0;pwma=0;pwmb=1;p

25、wma=0;pwmb=1; pwma=0;pwmb=1;pwma=0;pwmb=1; if(guangdian3=0)delay(1);if(guangdian3=0) break;path2=0; void diyizuo_zhizhuan() path2=0;/zuozhuan;/zhengzhuanpwma=pwmb=0;while(path20;a-)for(b=250;b0;b-);void init()pwma=0;pwmb=0;TMOD=0x51;TH0=(65536-50000)/256;TL0=(65536-50000)%256;ET0=1;IT0=1;IT1=1;EX0=1

26、;EX1=1;EA=1;TR0=1; e=0;delay(1);write_com(0x38);delay(1);write_com(0x38);delay(1);write_com(0x38);delay(1);write_com(0x0c); /开显示,设置光标不闪烁delay(1);write_com(0x06); /光标移动设置delay(1);write_com(0x01); /清屏delay(1);write_com(0x80);delay(1);write_dat(v);delay(1);write_dat(:);delay(1);write_com(0x80+7); /换写入位

27、置delay(1);write_dat(c);delay(1);write_dat(m);delay(1);write_dat(/);delay(1);write_dat(s);delay(1);write_com(0xc0); /换行开始显示路程delay(1);write_dat(s);delay(1);write_dat(:);delay(1);write_com(0xc0+8); /换写入位置delay(1);write_dat(c);delay(1);write_dat(m);delay(1);speed=distance=way=way2=bjzkb=num=in=out=0;lc

28、d_display();tiaojie=1;delay(500);void write_com(uchar com)rs=0;delay(1);e=1;delay(1);P0=com;delay(1);e=0;void write_dat(uchar dat)rs=1;delay(1);e=1;delay(1);P0=dat;delay(1);e=0;void lcd_display()write_com(0x80+3); /换写入位置delay(1);write_dat(numberspeed/100);delay(1);write_dat(number(speed/10)%10);dela

29、y(1);write_dat(numberspeed%10);delay(1);write_com(0xc0+3); /换行开始显示路程delay(1);write_dat(numberdistance/1000);delay(1);write_dat(number(distance/100)%10);delay(1);write_dat(number(distance%100)/10);delay(1);write_dat(numberdistance%10);delay(1);void jiance()hw1=hw2=hw3=hw4=hw5=1;temp=P2;temp&=0x1f;hwb

30、l5=(temp&0x10)4;hwbl4=(temp&0x08)3;hwbl3=(temp&0x04)2;hwbl2=(temp&0x02)1;hwbl1=temp&0x01;/if(hwbl5=0)/if(hwbl1=1|hwbl2=1)xunji_youguai();else if(hwbl4=1|hwbl3=1)xunji_zuoguai();else jieherun(); /run();/else/jieherun();/void xunji_zuoguai()pwma=pwmb=0;while(1)pwma=0;pwmb=0;pwma=0;pwmb=1;/pwma=0;pwmb=

31、0;pwma=1;pwmb=1;pwma=0;pwmb=0;pwma=0;pwmb=0;pwma=0;pwmb=0;pwma=0;pwmb=1;pwma=0;pwmb=1; pwma=0;pwmb=1;pwma=0;pwmb=1; if(hw2=1) break;void xunji_youguai() pwma=pwmb=0;while(1)pwma=0;pwmb=0;pwma=1;pwmb=0;pwma=0;pwmb=0;/pwma=0;pwmb=0;pwma=1;pwmb=1;pwma=0;pwmb=0;pwma=0;pwmb=0;pwma=1;pwmb=0; pwma=1;pwmb=0

32、;pwma=1;pwmb=0;pwma=1;pwmb=0; if(hw3=1) break; void bizhang()while(1)if(guangdian1=0)delay(5);if(guangdian1=0) break;run();ting();diyiyou_zhizhuan();ting();while(1)if(guangdian2=1)delay(5);if(guangdian2=1) break;run();ting();diyizuo_zhizhuan();ting();while(1)if(guangdian1=0)delay(5);if(guangdian1=0)

33、 break;run();ting();dierzuo_zhizhuan();ting();while(1)if(guangdian3=1)delay(5);if(guangdian3=1) break;run();ting();dieryou_zhizhuan();ting();void jiehe()while(1)if(tiaojie=1)if(hw1=1)delay(5);if(hw1=1)while(1)pwma=1;pwmb=0;pwma=0;pwmb=0;pwma=0;pwmb=0;pwma=0;pwmb=0;pwma=0;pwmb=0;pwma=0;pwmb=0;pwma=0;

34、pwmb=0;pwma=1;pwmb=0;if(hw4=1) delay(5);if(hw4=1)tiaojie=0;break;/run();if(hw4=1)delay(5);if(hw4=1)while(1)pwma=0;pwmb=1;pwma=0;pwmb=0;pwma=0;pwmb=0;pwma=0;pwmb=0;pwma=0;pwmb=0;pwma=0;pwmb=0;pwma=0;pwmb=0;pwma=0;pwmb=1;if(hw1=1) delay(5);if(hw1=1)tiaojie=0;break;/run();if(tiaojie=0)while(1)if(hw2=1)

35、delay(5);if(hw2=1)in=1;if(in=1&hw2=0)delay(5);if(hw2=0)in=0;num+;if(num=3) break; jieherun();break;jieherun();void jieherun()pwma=1;pwmb=1;pwma=0;pwmb=0;pwma=0;pwmb=0;/pwma=1;pwmb=1;pwma=0;pwmb=0;pwma=0;pwmb=0;pwma=1;pwmb=1;pwma=1;pwmb=1;pwma=1;pwmb=1;void run() / zhengzhuan; pwma=1;pwmb=1;void ting

36、()pwma=pwmb=0;stop;delay(500); void timer0() interrupt 1 TH0=(65536-50000)/256;TL0=(65536-50000)%256;pwma=0;pwmb=0;tcount+;if(tcount=40)tcount=0;EX0=0;/2秒到了,先停掉脉冲计数speed=way/2;distance+=way;EX0=1;/重新开启计数器1way=0;lcd_display();void ext0() interrupt 0 way+=2;path1+=2;void ext1() interrupt 2way2+=2;path2+=2;

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!