《基于st89c52单片机的自动往返小车(含程序)_毕业设计(论文) 经典》由会员分享,可在线阅读,更多相关《基于st89c52单片机的自动往返小车(含程序)_毕业设计(论文) 经典(16页珍藏版)》请在金锄头文库上搜索。
1、基于 ST89C52 单片机的自动往返小车(含程序)基本原理:单片机黑带检测路程和时间显示LED 显示路程, 时间L298N 电机驱动模块1.电机驱动调速模块 方案一:采用电阻网络或数字电位器调整电动机的分压,从而达到调速的目 的。但是电阻络只能实现有级调速,而数字电阻的元器件价格昂贵。更主要的问 题在于一般电动机的电阻较小,但电流很大;分压不仅会降低效率,而且很难实 现。 方案二:采用继电器对电动机的开或关进行控制,通过开关的切换对小车的速度 进行调整。方案的优点是电路较为简单,缺点是继电器的响应时间慢,机械结构 易损坏,寿命较短,可靠性不高。 方案三:采用达林顿管 TIP4 组成的 PWM
2、 电路。用单片机控制达林顿管使之工 作在占空比可调的状态,精确调整电机转速。 方案四:采用 L298N 来控制电机的正转和反转来实现小车的前进和后退。加上单 片机的程序 PWM,实现整车的加速与减速,精确小车的速度。 基于上述理论分析,拟选择方案四。 2.路面黑带检测模块 黑带检测的原理是:红外光线照射到路面并反射,由于黑带和白纸的系数不 同,可根据接的红外线的强弱判断是否到达黑带。 方案一:可见光发光二极管与光敏二极管组成的发射接收电路。这种方案的缺 点在于其他环境光源会对光敏二极管的工作产生很大的干扰,一旦外界光 亮条件改变,很可能造成误判和漏判;虽然产生超高亮发光二极管可以降 低一定的干
3、扰,但这又将增加额外的功率损耗。基于 ST89C52 单片机的自动往返小车(含程序)方案二:反射式的红外发射接收器。由于采用红外管代替普通可见光管,可以 降低环境干扰。 基于上述理论分析,拟选择方案二。 3. 电源选择 方案一:所有器件采用电源供电,这样供电电路比较简单;但是由于电动机 启动瞬时电流很大,会造成电压不稳,干扰严重,缺点十分明显。 方案二:双电源供电,将电动机驱动电源与单片机以及周边电路电源完全隔 离,这样做虽然不如单电源方便灵活,但可以将电动机驱动所造成的干扰彻 底消除,提高了系统的稳定性。 基于上述理论分析,拟选择方案二。 4. 控制单元模块 方案一:采用纯数字电路 该方案外
4、部检测采用光电转换,系统控制部分采用数字电路译码对小车电动 机两端电压调整,来控制小车的运行。时间和行程用加法器进行计数。此系 统的设计将会使电路过于复杂,调试时需要改变硬件电路,机动性差。 方案二:用单片机控制 用光电检测不同的信号,并经单片机对其处理,传送给 L298 信号,使其控 制电机的正转和反转,配合 PWM 程序控制,来实现加速减速和刹车。通过 单片机内部定数器/计数器进行定时、计数,在用单片机串行输入/输出口进 行显示控制。此方案电路成熟、工作稳定、容易实现控制。 为能更好的实现题目的各种设计要求,所以我们选用第二种方案。用单片机 进行控制。其工作框图如下:二 电路设计1. 光电
5、检测部分: 我们采用反射式光电检测电路对跑道上的黑线进行检测,并用两个遮光套管 套住发光管和接收管以一定的角度紧贴跑道,这样可以消除外界光线的干扰。 为了加强可靠性采用槽型光耦检测轮子转动的行程。用 LM358 电压比较器 输出高低电平检测信号。控制中心 STC89C52光电检测霍尔检测小车正反转行驶时间显示行驶里程显示开 始基于 ST89C52 单片机的自动往返小车(含程序)如图所示:2. STC89C52 单片机基本系统 此系统以 89C52 为核心,每检测到一个黑带由光电检测部分产生一个的脉 冲,使单片机产生一个外部中断 1,定义检测黑带数的变量加 1,同时车轮 每转一圈,霍尔元件输出一
6、个脉冲,是安单片机产生一个外部中断 0,定义 圈数的变量加 1.通过 P3.0 和 P3.1 控制 L298 来控制电机的正转与反转及刹 车。当 P3.0 输出低电平,P3.1 输出高电平时,电机正转,相反则电机反转, 当 P3.0 和 P3.1 都是低电平时,使电动机被短路,提高了刹车效率,基本杜 绝了由于制动惯性造成的小车的前冲现象。通过 P0 口进行两个数码管的位 选,P2 口进行段码输出,其中一个数码管显示行驶时间,另外一个数码管 显示行驶路程。如图所示:基于 ST89C52 单片机的自动往返小车(含程序)3. L298N 电动机驱动模块部分 该电路采用电动机驱动芯片 L298 来控制
7、电动机的正转与反转,加以第二路电机电 源保证了电动机启动时有足够的电流。在试验中控制电压为单片机输出的高低电 平直接控制。 具体电路图连接如下:基于 ST89C52 单片机的自动往返小车(含程序)4. 电源部分 由于电动机工作电流大,需要选用内阻小,供电电流强,质量轻,可反复使用的经 济型电池,我们选用镍铬可充电电池组。为使单片机工作稳定,避免电动机开关机 和其转动时对其电源的影响,在此用两个电池组和稳压块 7805 分别为 89C52 和电 动机驱动显示部分分别进行供电。保证小车工作和显示的稳定性。5.软件设计部分单片机控制电路主要由一片 STC89C52 组成,通过 P3 口控制小车正转与
8、反转,刹 车,加速减速,通过两个四联数码管控制显示时间和里程以及小车行驶的时间。其 中 P0 口进行位选,P2 口进行显示段码输出。 该系统采用上电复位加上手动复位联合复位系统进行初始化,单片机通过 P3.0,P3.1 输出脉冲控制电机正转反转以及刹车,当 P3.0,P3.1 分别输出 01 是电动机正转, 输出 10 时电动机反转,输出 00 时电动机两边短路,小车立即刹车。 流程图如下:(1)外部中断 0 车轮美转一次,霍尔元件产生一个脉冲 P3.14,通过下降沿触发外部中 断 0,并且在每进行一次外部中断记录圈数的变量加 1.基于 ST89C52 单片机的自动往返小车(含程序)外部中断
9、INT0(2)外中断 1 光电检测每检测到一条黑带就产生一个脉冲输入 P3.2 口,通过下降 沿的方式触发外中断 1,每中断一次记录黑带的变量加 1,当检测到 第五条黑带时,p1.0=1,p1.1=1,小车的电动机由于短路刹车,当检 测到第九条黑带时,小车再次刹车同时关掉所有中断 。开始车轮每转一圈 霍尔元件产生一个脉冲圈数 quanshu+基于 ST89C52 单片机的自动往返小车(含程序)开始黑带数 heidai+退出EA=0,刹车P3.0=1,P3.1=1heidai=5YY heidai=9(3)定时器中断 0 使用定时器 T0 产生 5ms 定时中断,每次执行该中断前要先给定时器 0
10、 赋初值,定时器中断每执行一次,变量加 1。当 i=200 时,即每当计时 1 秒时,时间变量 t 加 1,速度等于一秒转的圈数和小车车轮的周长相乘。基于 ST89C52 单片机的自动往返小车(含程序)(4)定时器中断 1 主要用来产生不同的占空比的波型进行高低速控制,每次执行时,定时 器 1 要赋初值(5) 主程序 主程序主要用来控制两个四联数码管的显示,通过循环语句不断的 调用显示程序,使两个四联数码管按位不断循环亮点,当小车行驶时动 态显示时间和路程,小车停止时显示小车行驶过程中的时间和路程。6.安装与调试 自动小车为玩具遥控小汽车的改装品,在改装的过程中最重要的是 考虑设计光电检测管的
11、位置,检测黑带的光电管放在车体的中央,用遮 光管将其以一定反射角度压到跑道上。路程检测用槽型光耦,放在小车 的从动轮上。轮子的周长约为 21.6 厘米,在轮子上用了一个霍尔元件, 每转一圈一个脉冲。在组装前对每一个单元电路进行测试,以保证外部 硬件电路的无误,有利于最后的统调。调整是以点到线,最后到整体调 试的方法。在调整的过程中我们发现了许多问题,如响应中断的次数的 调整等。并且为了小车碰到墙壁不至于停车,我们在小车的四角上都加 上了导向轮,导向轮用随身听的压带轮制作即可。开始产生 5ms 中断控制一秒定时,i+共转的圈数 q 路程=周长*圈数 q定时中断 0一秒定时是否到基于 ST89C5
12、2 单片机的自动往返小车(含程序)7.附录元器件及程序如下: 基本元器件列表 一个 STC89C52 单片机 2 个四位共阳数码管 一个 L298N 芯片 一个 LM358 一个霍尔元件和小磁钢片 光点接收管一对 晶振(12M)及 30pf 电容 开关 电阻 10k 100 欧姆 1k 20k 可调 附录程序: #include /包含头文件 #define uint unsigned int /宏常量定义 #define uchar unsigned char /宏常量定义 sbit dianji1=P10; /P1_0 设置为电机控制一 sbit dianji2=P11; /P1_1 设置
13、为电机控制二 sbit hdjc=P32; /P3_2 设置为黑带检测位 uchar code duma=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff;/段编码 uchar code dianduma=0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10; /带小数点段编码 uchar code wema=0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00,0xff;/位编码 uchar num,ge,shi,bai,qian; /定义几个字符型变
14、量 uint miao,lc,heidai=0; /定义几个整形变量 long int qs; /定义一个长整形变量用来记录小车所转的 圈数 void fenwei(uint); /声明一个分位函数用来把要显示的数 分位 void shuma(uchar,uchar) ; /声明一个数码上显示函数用 来在数码管上显示数据 void shumadian(uchar,uchar); /声明另一个数码显示函数 用来显示带小数点的数据 void miaoxianshi(uint); /声明一个显示时间的函数 void lcxs(uint); /声明一个显示路程的函数 void djkz(); /声明一
15、个电机控制函数 void delay(uchar); /声明一个延时函数 void delay10s(); /声明另一个延时函数用来延时十秒钟/*主函数*/void main() 基于 ST89C52 单片机的自动往返小车(含程序) EA=1; /打开总中断 ET0=1; /打开定时器中断 0 EX0=1; /打开外部中断 1 IT0=1; /外部中断 0 设置为跳变沿触发方式 EX1=1; /打开外部中断 1 IT1=1; /外部中断 1 设置为跳变沿触发方式 TMOD=0x01; /设置定时器 0 为方式 1 TH0=(65536-500)/256; /定时器 0 高八位装初值 TL0=(65536-500)%256; /定时器 0 低八位装初值 TR0=1; /打开定时器 0 while(1) /进入主循环 djkz(); /进入电机控制函数 /*显示分位*/函数功能: 把需要在数码管上显示的数据分位, / 即把数据的个、十、百、千位分别分 / 离