毕业设计(论文)基于单片机的光电式自行车速度里程表设计_第1页
毕业设计(论文)基于单片机的光电式自行车速度里程表设计_第2页
毕业设计(论文)基于单片机的光电式自行车速度里程表设计_第3页
毕业设计(论文)基于单片机的光电式自行车速度里程表设计_第4页
毕业设计(论文)基于单片机的光电式自行车速度里程表设计_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、光电式自行车速度里程表设计 摘要 随着科技的迅速发展,单片机的应用也越来越广泛,并带动传统控制检测技术 不断更新。现在的里程表大多是电子式的,用数码管或液晶显示器即时显示,显示 更加直观。电子式里程表采用接触车速传感器代替软轴传动,可使里程表的安装位置 不受距离限制,进一步有效地克服了机械式里程表中的诸多不足。 方案采用了一种以单片机 at89c51 为主控机,使用光电传感器进行自行车里程、 速度测量的装置。传感器将不同车速产生的不同频率的脉冲信号输入到单片机进行 控制与计算,再采用 lcd 液晶显示模块进行显示,使得自行车的速度与里程数据能 直观的显示给使用者。 本设计主要包括自行车轮脉冲采

2、集、键盘输入和数据显示等部分,主程序用 c 语言编写,完成各项功能及数据的处理。本里程表的设计具有结构简单,成本低廉, 显示清晰,稳定可靠等优点。并且可以进行扩充,更方便于使用者。 关键词 光电传感器 单片机 液晶显示器 里程表 the design of photoelectric bicycle odometer abstract with the rapid development of technology, more and more widespread application of microcomputer, promote the traditional control de

3、tection technology constantly updated. most of the current electronic odometer, and with the led digital tube or lcd display real-time, display more intuitive. electronic odometer flexible shaft using the contact speed sensor instead of driving, mileage tables can be installed without distance limit

4、ations, and further to effectively overcome the mechanical disadvantages of mileage in the table. the plan adopts the system and configuration of combining the microcontroller at89c51 as the main control computer ,using the photoelectric sensor bicycle odometer, speed measuring devices. when differe

5、nt speed pulse signals of different frequencies produced by sensor are input into the microcontroller,after its calculation, liquid crystal will display the datas, making the bikes speed and distance data visually to the user. the design includes a bike wheel pulse acquisition, keyboard input and da

6、ta display section, the main program using c language, this paper first needed to milestones design of equipment in detail, on the problems existing in the design, explained and then to hardware and software design and implementation of the part made earnest analysis, then presented system modeling

7、process and the corresponding system based on this model, the control simulation, and the simulation results are compared. key words odometer photoelectric sensor mcu lcd 目目 录录 摘要摘要.i abstractabstract.ii 1 1 绪论绪论.1 1.1 问题由来.1 1.2 课题现状.1 1.3 设计任务.2 2 2 系统原理概述系统原理概述.3 2.1 系统原理总概述.3 2.2 系统硬件组成原理.3 2.3

8、软件系统工作流程.4 3 3 系统硬件设计系统硬件设计.5 3.1 采集信息部分以及传感器的选择.5 3.2 轮脉冲检测与转换电路.6 3.2.1. 轮脉冲检测.7 3.2.2. 信号预处理电路.7 3.3 单片机系统部分.9 3.3.1 at89c51 单片机介绍.9 3.3.2 定时/计数器的结构及控制.9 3.3.3 中断控制.11 3.4 单片机外围电路介绍.11 3.4.1 复位电路.11 3.4.2 晶振电路.12 3.5 显示部分.13 3.5.1 lcd 液晶显示器.13 3.5.2 显示接口电路设计.15 3.6 报警电路.17 3.7 键盘控制.17 4 4 软件设计软件设

9、计.18 4.1 测量算法概述.18 4.2 中断子程序的设计.19 4.3 数据处理子程序的设计.20 4.3.1 里程计算子程序.21 4.3.2.速度计算子程序.21 4.4 显示子程序的设计.22 5 5 设计总结设计总结.23 5.1 实现目标与特点.24 5.2 结论及不足.25 致谢致谢.26 参考文献参考文献.27 附录附录.28 附录 i 系统电路原理图.28 附录 ii 设计源程序.29 1 绪论 1.1 问题由来 我国是人口大国,也是自行车大国,随着生活节奏的不断加快,自行车已经不 仅仅是运输、代步的工具,现在则是代表着绿色、环保、节能。因此其辅助功能也 变得越来越重要。

10、而且人们希望自行车的娱乐、休闲、锻炼的功能越来越多,能带 来大家更多的健康与快乐。在这个背景下,自行车里程表作为自行车的一大辅助工 具迅速发展起来。科学、美观、合理设计自行车里程表有一定的实用价值.它能合理 计算出速度及公里数,使运动者运动适量,达到健康运动与代步的最佳效果。 并且随着人们生活水平的逐渐提高,人们对于生活质量的要求也日益增加,尤 其是对健身的要求。自行车在中国普遍作为代步工具。而在国外,自行车却是一项 十分受欢迎的健身运动。因为它无污染,价位低廉,老少皆宜。而且在运动过程中 可以充分享受到大自然,对于忙碌的现代人来说,无疑是一种较好的放松方法。在 中国这种情况也在慢慢发生变化。

11、因此爱好自行车运动的人需要一款里程表,以知 道自己的运动情况。并根据外界条件,如温度,风速等进行适当的调节,已达到最 佳运动的效果。而对于自行车运动员来说,最为关心的莫过于一段时间内的训练效 果。因为教练要根据一段时间内运动员的训练效果进行评估,从而进行适当的调整 已使运动员达到最佳的状态。因此需要一种装置进行对训练中各种参数的测定记录。 1.2 课题现状 传统的机械式车速表是由旋转磁场作用于转动盘,使转动盘连同车速表指针发 生同向的偏转。当电磁转矩与弹簧产生的阻力矩平衡时,指针偏转停留在某一角度 上。指针偏转角与车速成正比,因而可用其表示车速。 机械式车速表的缺陷是明显的。由于表盘指针偏转程

12、度正比于软轴的转动时产 生的磁力,当转速较低的时候,磁力较小,随转速变化波动较大。因此,低速时车 速表指针摆动剧烈、测量及显示精度不高。对于发动机后置的车辆,要将车速表指 针的偏转动力由变速箱经软轴等传至驾驶室,软轴必然布置的较长,如何将这种长 长的转动软轴从结构上布置妥当,肯定是一件十分困难的事情。 现在的车速表大多是电子式的,用 led 数码管或 lcd 显示,使速度显示更加 直观。采用接触车速传感器代替软轴传动,可使车速表的安装位置不受距离限制,有效 地克服了机械式车速表中的诸多不足。 电子式车速表更加智能,车速表的功能也更加人性化,如加上了里程累计、超 速提醒等功能。 本设计就是针对骑

13、自行车的人们在行进中不能很好的把握自己达到了多大的速 度,行驶了多远的距离而设计的。以往的里程表只能进行测量速度,里程,时间, 温度等数据,虽然能实现很多的功能,但是其中的一些功能不适合自行车业余爱好 者,浪费资源,而且性价比也低,而且也不能很好的把握当前运动量,从而不能很 好的实现娱乐和锻炼的效果。而本设计却能实现娱乐和锻炼的双重效果,而且相对 业余爱好者性价比更高。 1.3 设计任务 本设计要以单片机为核心,通过光电传感器来检测自行车的运转情况进而实现电 动自行车的速度的测量,最后用液晶显示器直观地将速度与里程显示出来,并且在 速度高于一定的值时可自动向用户报警,从而达到智能化的目的。 主

14、要设计内容: 1.传感器电路模块设计 2.单片机外围电路设计 3.报警电路设计 4.显示电路设计 2 系统原理概述 2.1 系统原理总概述 本系统由信号预处理电路、单片机 at89c2051、lcd 显示模块、开关按键,报警 模块和系统软件组成。其中信号预处理电路包含信号放大、波形变换和波形整形。 对待测信号进行放大的目的是降低对待测信号的幅度要求;波形变换和波形整形电 路则用来将放大的信号转换成可与单片机相连的 ttl 信号;通过单片机的设置可使 内部定时器 t1 对脉冲输入引脚 t0 进行控制,这样能精确地算出加到 t0 引脚的单位 时间内检测到的脉冲数。本设计中,计数的正确性决定了本装置

15、的精度,如何在复 杂的环境中得到正确的计数脉冲,是本设计的重点,设计中里程表显示采用 lcd1602 液晶模块,用液晶显示器显示是本设计的难点。并且在速度高于一定的值 时可自动向用户报警,从而达到智能速度里程表。 2.2 系统硬件组成原理 系统硬件由信号预处理电路、单片机 at89c2051、系统化 lcd 显示模块、开 关按键,报警模块组成,系统的硬件组成框图如下: 信号采集放大器 波形整形 波形变换 单片机体设计按键控制 lcd显示 喇叭报警 图 2-1 系统总体设计框图 由于不同速度发出不同频率的脉冲,通过光电传感器检测出不同状态的脉冲信 号,而一般的模拟信号都是微弱的,所以要把它放大,

16、这就需要一个放大器。另外 单片机能识别的都是 ttl 信号,经波形变换和波形整形电路方能将放大的信号转换 成可与单片机相连的形式。当行驶达到一定的车速时,会发出报警声。不同的按键 方式,液晶显示器会显示不同的数据。 2.3 软件系统工作流程 在硬件设计完毕之后,接下来就是设计中最核心和最为主要的软件部分设计。 所谓软件设计就是把软件需求变换成软件的具体设计方案(即模块结构)的过程。 模块化结构设计即是根据要求和硬件设计的结构,将整个系统的功能分成许多小的 功能模块,再根据这些小的功能模块进行程序编写的过程。这样的设计方法,使得 系统的整个功能和各部分的功能趋于明朗化。当系统出现问题,就可以根据

17、功能设 置找出问题的根源,从而更快地解决问题。所以说,在整个设计过程中,软件设计 必须与硬件设计紧密地结合在一起。 显示欢迎 检测按键 设置时钟 初始化 检测按键 设置直径 等待中断 控制按键 改变显示 刷新里程 速度等 刷新时间 开始 int0 t0int1 图 2-2 系统软件流程图 3 系统硬件设计 本设计采用的是以红外传感器 st1101 为传感器,以 at89c51 作为系统的主控 芯片,以 lcd1602、128*16 液晶显示器进行显示。 at89c51 单片机 按键控制 st1101 lcd1602 报警电路 图 3-1 系统硬件框图 3.1 采集信息部分以及传感器的选择 信息

18、采集部分可以选用的传感器种类一很多,例如磁感应传感器,光电感应传 感器,金属传感器等。 霍尔传感器由永久磁铁和开关型霍尔集成电路组成。霍尔集成电路由霍尔元件、 放大器、整形电路及集电极开路输出等部分组成,其功能是把磁信号转换成电信号, 霍尔元件为磁敏元件,当垂直于霍尔元件的磁场强度发生变化时,其两端的电压就 会发生变化,经放大和整形即可输出脉冲电信号。 光电编码器的工作原理与光电传感器一样,不过它已将光电传感器、电子电路、 码盘等做成一个整体,只要用连轴器将光电传感器的轴与转轴相连,就能获得多种 输出信号。它广泛应用于数控机床、回转台、伺服传动、机器人、雷达、军事目标 测定等需要检测角度的装置

19、和设备中。如图 3-2 所示,是某光电编码器的外形。 光电传感器是应用非常广泛的一种器件,各种各样的形式,如透射式、反射式 等,基本原理就是当发射管光照射到接收管时,接收管导通,反之关断。以透射式 为例,如图 3-1 所示,当不透光的物体挡住发射与接收之间的间隙时,开关管关断, 否则打开。为此可以制作一个遮光叶片如图 3-3 所示,安装在转轴上,当扇叶经过 时,产生脉冲信号。当叶片数较多时,旋转一周可以获得多个脉冲信号。而考虑到 实际可操作性以及设计要求方面,本设计选用的传感器为光电传感器。 图 3-2 光电传感器的原理图 图 3-3 遮光叶片 将光敏电阻安装在自行车前又的一侧,在同等高度的另

20、一侧安上一个高亮度的 发光二极管。在同等高度的辐条上贴上一圈黑色材料,并在黑色材料上打上等间距 的小孔,这样当小孔经过光敏电阻时,光敏电阻根据光电流的变化发出脉冲, 从而 测量里程。 红外光电传感器 st1101 采用高输出的红外光电二极管与高灵敏度光敏晶其特 点是性能可靠,体积小,结构简单,广泛应用于里程表。 表 3-1 主要参数 正向电流if50ma 反向电压vr6v输入 耗散功率p75mw 集-射电压vceo25v 射-集电压veco6v输出 集电极功耗pc50mw st1101 外围电路如图 3-4 所示,r1、r2 均为限流电阻,限制发射二极管的电 流,发射二极管的电流大则发射功率大

21、,但不能超过它的极限电流。根据主要参数 表,它的极限电流为 50ma,当两者之间有孔时,三极管导通,当两者被隔离时, 三极管截止。 470 r1 4.7m r2 传传传传传 vcc 传传 图 3-4 传感器外围电路 3.2 轮脉冲检测与转换电路 本设计采用了 st1101 红外光电传感器,进行非接触式检测。当有物体挡在红 外光电发光二极管和高灵敏度的光电晶体管之间时,传感器将会输出一个低电平, 而当没有物体挡在中间时则输出为高电平,从而形成一个脉冲。然后通过带施密特 触发器的反相器 dm74ls14 来把放大器生成的单相脉冲转换成与 coms 电平相兼 容的方波信号,再输入给单片机。 3.2.

22、1 轮脉冲检测 该系统在自行车后轮的轴处保持着与轮子旋转切面平行的方向延伸附加一个铝 盘,在这个铝盘的边沿处挖出若干个圆形过孔,把传感器的检测部分放在圆孔的圆 心位置。每当铝盘随着后轮旋转的时候,传感器将向外输出若干个脉冲。 把这些脉冲通过一系列的波形整形成单片机可以识别的 ttl 电平,即可算出轮 子即时的转速。铝盘的圆孔的个数决定了测量的精度,个数越多,精度越高。这样 就可以在单位时间内尽可能多地得到脉冲数从而避免了因为两个过孔之间的距离过 大,而车子正好在过孔之间或者是在下个过孔之前停止了,造成较大的误差。 本设计在铝盘过孔的设计上采用 9 个过孔,从而留下了 8 个同等的间距这样在 以

23、后的软件设计中能够较为方便的计算出速度里程。脉冲发生源的硬件结构图如图 3-5 所示。 图 3-5 脉冲发生源硬件结构图(左为正视图,右为侧视图) 3.2.2 信号预处理电路 如图 3-6 所示,系统的信号预处理电路由二级电路构成,第一级是由开关三极 管组成的零偏置放大器,采用开关三极管可以保证放大器具有良好的高频响应。当 输入信号为零或负电压时,三极管截止,电路输出高电平;而当输入信号为正电压 时,三极管导通,此时输出电压随着输入电压的上升而下降,这使得速度里程表既 可以测量任意方波信号的频率,也可以测量正弦波信号的频率。由于放大器的放大 功能降低了对待测信号的幅度要求,因此,系统能对任意大

24、于 0.5v 的正弦波和脉 冲信号进行测量。其中电阻 r3 为输入电阻,r4 为输出电阻。预处理电路的第二级 采用带施密特触发器的反相器 dm74ls14 来把放大器生成的单相脉冲转换成与 coms 电平相兼容的方波信号(如图 3-7 所示) ,同时将输出信号加到单片机的 p3.2 口上。 利用施密特触发器状态转换过程中的正反馈作用,可以把边沿变化缓慢的周期 性信号变换为边沿很陡的矩形脉冲信号。输入的信号只要幅度大于 vt+,即可在施 密特触发器的输出端得到同等频率的矩形脉冲信号。 从传感器得到的矩形脉冲经传输后往往发生波形畸变。当传输线上的电容较大 时,波形的上升沿将明显变坏;当传输线较长,

25、而且接受端的阻抗与传输线的阻抗 不匹配时,在波形的上升沿和下降沿将产生振荡现象;当其他脉冲信号通过导线间 的分布电容或公共电源线叠加到矩形脉冲信号时,信号上将出现附加的噪声。无论 出现上述的那一种情况,都可以通过用施密特反相触发器整形而得到比较理想的矩 形脉冲波形。只要施密特触发器的 vt+ 和 vt- 设置得合适,均能受到满意的整形 效果。 74ls14 200 r3 q1 10kr4 vcc p3.4 input 图 3-6 信号预处理电路图图 图 3-7 信号处理波形图 3.3 单片机系统部分 3.3.1 at89c51 单片机介绍 at89c51 是一种带 4k 字节闪烁可编程可擦除只

26、读存储器(fperomfalsh programmable and erasable read only memory)的低电压,高性能 cmos8 位微处理 器,俗称单片机。该器件采用 atmel 高密度非易失存储器制造技术制造,与工业 标准的 mcs-51 指令集和输出管脚相兼容。由于将多功能 8 位 cpu 和闪烁存储器组 合在单个芯片中,atmel 的 at89c51 是一种高效微控制器,为很多嵌入式控制系 统提供了一种灵活性高且价廉的方案。 p0.7 32 p0.6 33 p0.5 34 p0.4 35 p0.3 36 p0.2 37 p0.1 38 p0.0 39 vcc 40 p

27、2.0 21 p2.1 22 p2.2 23 p2.3 24 p2.4 25 p2.5 26 p2.6 27 p2.7 28 ale/prog 30 psen 29 ea/vpp 31 p1.0 1 p1.1 2 p1.2 3 p1.3 4 p1.4 5 p1.5/mosi 6 p1.6/miso 7 p1.7/sck 8 rest 9 p3.0/rxd 10 p3.1/txd 11 p3.2/int0 12 p3.3/int1 13 p3.4/t0 14 p3.5/t1 15 p3.6/wr 16 p3.7/rd 17 xtal2 18 xtal1 19 gnd 20 u5 ale psen

28、 rst a10 a11 a12 a13 a14 a15 a16 a17 d10 d11 d12 d13 d14 d15 d16 d17 vcc b10 b11 b12 b13 b14 b15 b16 b17 c10 c11 c12 c13 c14 c15 c16 c17 图 3-8 at89c51 引脚图 3.3.2 定时/计数器的结构及控制 定时/计数器的实质是加 1 计数器(16 位) ,由高 8 位和低 8 位两个寄存器组成。 tmod 是定时/计数器的工作方式寄存器,确定工作方式和功能;tcon 是控制寄存 器,控制 t0、t1 的启动和停止及设置溢出标志。定时/计数器结构如图 3-

29、9 所示: 图 3-9 定时/计数器结构图 at89s52 单片机定时/计数器的工作由两个特殊功能寄存器控制。tmod 用于设 置其工作方式;tcon 用于控制其启动和中断申请9。 1.工作方式寄存器 tmod 工作方式寄存器 tmod 用于设置定时/计数器的工作方式,低四位用于 t0,高四位 用于 t1。其格式如表 3-2: 表 3-2 位号d7d6d5d4d3d2d1d0 符号gatec/tm1m0gatec/tm1m0 gate:门控位。 gate0 时,以运行控制位 trx(x=0,1)来启动定时/计数器运行; gata1 时,要用软件使 tr0 或 tr1 为 1,同时外部中断引脚或

30、也为高电平时, 才能启动定时/计数器工作; c/t 计数器模式和定时器模式选择位 c/t=1 时,选择计数器模式,计数器对外部输入引脚 t0(p3.4)或 t1(p3.5)的外 部脉冲计数;c/t=0 时,选择定时器模式。 m1m0:工作方式设置位。定时/计数器有四种工作方式,由 m1m0 进行设置。 表 3-3 m1 m0 工作方式功能 0 0工作方式 013 位计数器 0 1工作方式 116 位计数器 1 0工作方式 2自动再装入 8 位计数器 定时器 0:分成两个 8 位计数器 1 1工作方式 3 定时器 1:停止计数 2.控制寄存器 tcon tcon 的低 4 位用于控制外部中断,已

31、在前面介绍。tcon 的高 4 位用于控制定 时/计数器的启动和中断申请。其格式如下: 表 3-4 位d7d6d5d4d3d2d1d0 字节地址: 88h tf1tr1tf0tr0ie1it1ie0it0 tf1(tcon.7): t1 溢出中断请求标志位。t1 计数溢出时由硬件自动置 tf1 为 1。cpu 响应中断后 tf1 由硬件自动清 0。t1 工作时,cpu 可随时查询 tf1 的状态。所以,tf1 可用作 查询测试的标志。tf1 也可以用软件置 1 或清 0,同硬件置 1 或清 0 的效果一样。 tr1(tcon.6): t1 运行控制位。tr1 置 1 时,t1 开始工作;tr1

32、 置 0 时,t1 停止工作。tr1 由软 件置 1 或清 0。所以,用软件可控制定时/计数器的启动与停止。 tf0(tcon.5): t0 溢出中断请求标志位,其功能与 tf1 类同。 tr0(tcon.4): t0 运行控制位,其功能与 tr1 类同。 3.3.3 中断控制 cpu 对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器 ie 控制的。 表 3-5 位76543210 字节地址: 88h eaeset1ex1et0ex0ie ex0(ie.0),外部中断 0 允许位; et0(ie.1),定时/计数器 t0 中断允许位; ex1(ie.2),外部中断 0 允许位;

33、et1(ie.3),定时/计数器 t1 中断允许位; es(ie.4),串行口中断允许位; ea (ie.7), cpu 中断允许(总允许)位。 3.4 单片机外围电路介绍 3.4.1 复位电路 at89c51 单片机的复位输入引脚 rst 为 at89c51 提供了初始化的手段。有了 它可以使程序从指定处开始执行,即从程序存储器中的 0000h 地址单元开始执行程 序。在 89c51 的时钟电路工作后,只要在 rst 引脚上出现两个机器周期以上的高电 平时,单片机内部则初始复位。只要 rst 保持高电平,则 89c51 循环复位。只有当 rst 由高电平变成低电平以后,89c51 才从 00

34、00h 地址开始执行程序。 复位电路通常采用上电自动复位和按钮复位两种方式。 本系统的复位电路是采用按键复位的电路,如图 3-10 所示,是常用复位电路之 一。单片机复位通过按动按钮产生高电平复位称手动复位。上电时,刚接通电源, 电容 c 相当于瞬间短路,+5v 立即加到 reset 端,该高电平使 89c51 全机自动复 位,这就是上电复位;若运行过程中需要程序从头执行,只需按动按钮即可。按下 按钮,则直接把+5v 加到了 reset 端从而复位称为手动复位。复位后,p0 到 p3 并 行 i/o 口全为高电平,其它寄存器全部清零 。 c 10uf s vcc resetr2 10k r1

35、10k 12 图 3-10 at89c51 复位电路 按键手动复位有电平方式和脉冲方式两种。其中电平复位是通过 rst 端经电阻 与电源 vcc 接通而实现的。时钟频率选用 6mhz 时,c 取 22uf,rs 取 200,rk取 1k。 3.4.2 晶振电路 晶振电路由晶振和两个负载电容组成。晶振电路部分电路连接如图 3-11 所示。 12 y1 12mhz c1 30pf c2 30pf 图 3-11 晶振电路 晶振是给单片机提供工作信号脉冲的,这个脉冲就是单片机的工作速度。比如 此系统所用的 12mhz 晶振,单片机工作速度就是每秒 12m。在调试时要注意将 pc 串口波特率设为 120

36、0。至于两个电容的大小,它是根据晶振厂家提供的晶振要求选 值的,换句话说,晶振的频率就是在它提供负载电容下测得,能最大限度的保证频 率值误差。两个电容取值都是相同的,大部分在 20-30pf,没有相同电容的情况下, 可以用两个相差不大电容代替,但不能相差太大,容易造成谐振不平衡,容易造成 停振或者干脆不起振。晶振电路在本系统中是并联方式,连接在 at89c51 的 xtal1 和 xtal2 引脚。 3.5 显示部分 3.5.1 lcd 液晶显示器 功能简介:其液晶模块内部的字符发生存储器(cgrom)已经存储了 160 个不同的点阵字符图形,每一个字符都有一个固定的代码。lcd1602 以其

37、 微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,在袖珍式仪表和低功耗应 用系统中得到越来越广泛的应用。 外形尺寸(lxwxh) 80.0 x36x12.0 视域尺寸(wxhxt) 64.5x13.8 驱动电压(v) 5.0v or 3.3v 工作温度:(oc) 050 or -2070 存储温度:(oc) -1060 or -3080 显示类型: stn or fstn 颜色: 蓝色(带背光) 生产工艺: smt 其主要技术参数为: 显示容量:4.55.5v; 工作电流:2.0ma(5.0v) 模块最佳工作电压:5.0v 字符尺寸:2.954.35(wxh)mm 1602 采用标准的 16

38、 脚接口,其 管脚定义如下: 图 3-12 lcd1602 实物图 第 1 脚:vss 为地电源。 第 2 脚:vdd 接 5v 正电源。 第 3 脚:v0 为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源 时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10k 的 电位器调整对比度。 第 4 脚:rs 为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄 存器。 第 5 脚:rw 为读写信号线,高电平时进行读操作,低电平时进行写操作。当 rs 和 rw 共同为低电平时可以写入指令或者显示地址,当rs 为低电平 rw 为高电平时可以读忙信号,当rs 为高电平 rw 为低

39、电平时可以写入数 据。 第 6 脚:e 端为使能端,当 e 端由高电平跳变成低电平时,液晶模块执行命 令。第 714 脚:d0d7 为 8 位双向数据线。 第 15 脚:背光电源接 5v 正电压。 第 16 脚:背光电源接地。 1602 的读写操作、屏幕和光标的操作都是通过指令编程来实现的。液晶模 块内部的控制器共有11 条控制指令,其指令具体功能介绍如下: 指令 1:清显示,指令码01h,光标复位到地址 00h 位置。 指令 2:光标复位,光标返回到地址00h。 指令 3:光标和显示模式设置 i/d:光标移动方向,高电平右移,低电平左 移 s:屏幕上所有文字是否左移或者右移。高电平表示有效,

40、低电平则无效。 指令 4:显示开关控制。 d:控制整体显示的开与关,高电平表示开显示, 低电平表示关显示 c:控制光标的开与关,高电平表示有光标,低电平表示 无光标 b:控制光标是否闪烁,高电平闪烁,低电平不闪烁。 指令 5:光标或显示移位 s/c:高电平时移动显示的文字,低电平时移动光 标。 指令 6:功能设置命令 dl:高电平时为 4 位总线,低电平时为8 位总线 n:低电平时为单行显示,高电平时双行显示 f: 低电平时显示 5x7 的点阵 字符,高电平时显示5x10 的点阵字符。 指令 7:字符发生器 ram 地址设置。 指令 8:ddram 地址设置。 指令 9:读忙信号和光标地址 b

41、f:为忙标志位,高电平表示忙,此时模块不 能接收命令或者数据,如果为低电平表示不忙。 指令 10:写数据。 指令 11:读数据。 与 led 数码管相比,液晶显示器的显示效果相对较好,液晶显示器显示不仅直 观,而且界面具有人机交互美观的特点。而且具有低功耗,容易控制,占用 cpu 资 源少这些优点,从而成为一些显示器的首选。 3.5.2 显示接口电路设计 1602 液晶模块内部的字符发生存储器(cgrom)已经存储了 160 个不同的点阵 字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假 名等,每一个字符都有一个固定的代码,比如大写的英文字母“a”的代码是 010000

42、01b(41h),显示时模块把地址 41h 中的点阵字符图形显示出来,我们就能 看到字母“a”。因为 1602 识别的是 ascii 码,试验可以用 ascii 码直接赋值,在单 片机编程中还可以用字符型常量或变量赋值,如a。 以下是 1602 的 16 进制 ascii 码表地址: 读的时候,先读左边那列,再读上面那行,如:感叹号!的 ascii 为 0 x21,字 母 b 的 ascii 为 0 x42(前面加 0 x 表示十六进制)。 指令集 1602 通过 d0d7 的 8 位数据端传输数据和指令。 显示模式设置: (初始化) 0011 0000 0 x38 设置 162 显示,57

43、点阵,8 位数据接口; 显示开关及光标设置: (初始化) 0000 1dcb d 显示(1 有效)、c 光标显示(1 有效)、b 光标闪烁(1 有效) 0000 01ns n=1(读或写一个字符后地址指针加 1 sbit p21=p21; sbit p22=p22; sbit p23=p23; sbit p32=p32; sbit rs=p37; sbit rw=p36; sbit e=p35; sbit busy=p07; /* 变量定义: i 延时变量 qsls 圈数临时变量,用于判断里程显示选用 m 还是 km 作为单位 qs 圈数 sj 总行驶时间,单位为秒 totallc 总里程 p

44、jsd 阶段平均速度 ssji 定时器 t120ms 中断次数,用于计算速度等 sji 本次速度对应的 20ms 中断次数 sjiold 上次速度对应的 20ms 中断次数 aa 加速度 sd2 瞬时速度 mxsd 用于更新最大速度 mxsd2 最大速度对应的 20ms 次数 tc 轮胎周长 *s 字符串显示子程序字符指针 line 字符串显示子程序列数 row 字符串显示子程序行数 com 写控制字 dat 显示码字 gw 总里程、瞬时速度、总时间、最大速度、平均速度、阶段个位 sw 总里程、瞬时速度、总时间、最大速度、平均速度、阶段十位 bw 总里程、瞬时速度、总时间、最大速度、平均速度、

45、阶段百位 qw 总里程、瞬时速度、总时间、最大速度、平均速度 阶段千位 ww 总里程、总时间的万位 sww 总里程、总时间的十万位 ssj 定时器 t0 50ms 中断次数,每 20 次 sj 加 1 cgw 当前时间(时钟)的个位 csw 当前时间(时钟)的十位 cbw 当前时间(时钟)的百位 cqw 当前时间(时钟)的千位 cww 当前时间(时钟)的万位 csww 当前时间(时钟)的十万位 cww2 当前时间(时钟)的辅助万位 mode 显示模式 tr1 轮胎设置变量 1(十位) tr2 轮胎设置变量 2(个位) * */ unsigned int i,qsls; unsigned lon

46、g qs,sj,totallc,pjsd,ssji,sji,sjiold,aa,sd2,mxsd,mxsd2,tc,a ,b; uchar *s,line,row,com,dat,gw,sw,bw,qw,ww,sww,ssj,cgw,csw,cbw,cqw,cww,csww,cww2,mod e,tr1,tr2; /*void wait()* 该函数的作用是对 lcd 进行检测,看 lcd 是否处于忙的状态.当 bflag=1 时表示 忙, 此时不可以向 lcd 进行读写操作.而当 busy=0 时,表示可以向它读写数据. * */ void wait() p1=0 xff; rw=1; rs

47、=0; doe=0;e=1;while(busy=1); /*void dispone()* 该函数的作用是向 lcd 写数据并显示出来. * */ void dispone(dat) p0=dat; rw=0; rs=1; e=0; e=1; wait(); /*void wrcom()* 该函数的作用是向 lcd 写入控制字. * */ void wrcom(com) p1=com; rw=0; rs=0; e=0; e=1; wait(); /*void init_lcd()* 该函数的作用是初始化 lcd. * */ void init_lcd() wrcom(0 x01); /显示清

48、零,数据指针清零 wrcom(0 x06); /写一个字符后指针加一 wrcom(0 x38); /设置 16*2 显示,5*7 点阵,8 位数据接口 wrcom(0 x0c); /设置开显示,不显示光标 /*void dispmore()* 该函数的作用是向 lcd 写入一串数据,并把数据串显示出来. * */ void dispmore(line,row,uchar dat,i) /格式为 dispmore(第几行,第几列,开始要显示 的字符地址,显示几个字符); uchar com; s=dat; if(line=1) com=0 x80+row-1; / 第一行第一列对应的 ram 的

49、地址位为 0 x80h wrcom(com); while(i-)!=0 com+; s+; else / 开始第二行 com=0 xc0+row-1; wrcom(com); while(i-)!=0 com+; s+; /*void ttimep()* 阶段时间数据处理及显示子程序 * */ void ttimep() sj=b; sww=sj/36000;/小时十位 ww=sj%36000/3600;/时个位 qw=sj%3600/600;/分十位 bw=sj%600/60;/分个位 sw=sj%60/10;/秒十位 gw=sj%10;/秒个位 wrcom(0 xc1);/第二行开始写入

50、,前已设置好指针自动加一 dispone(t); dispone(i); dispone(m); dispone(e); dispone( ); dispone( ); dispone(sww+0 x30); dispone(ww+0 x30); dispone(:); dispone(qw+0 x30); dispone(bw+0 x30); dispone(:); dispone(sw+0 x30); dispone(gw+0 x30); /*void timer1()* t1 中断服务子程序,每 20ms 中断一次,ssji 加 1,根据公式 s=tc*mc/8 和 v=tc/ssj 计

51、算累计里程和 * */ void timer1() interrupt 3 ssji+; th1=0 xb1;/(65536-20000)/256 tl1=0 xdf; /(65536-20000)%256 /*void lcp()* 阶段里程数据处理和显示子程序,若999m 则单位为 km * */ void lcp() qsls=100000/tc; if(qsqsls) a=qs; sww=qs*tc/8/10000000; ww=qs*tc/8%10000000/1000000; qw=qs*tc/8%1000000/100000; bw=qs*tc/8%10000000/10000;

52、 sw=qs*tc/8%10000/1000; wrcom(0 x81);/ 从第一行写指令 dispone(js); dispone( ); dispone( ); dispone( ); dispone( ); dispone(sww+0 x30); dispone(ww+0 x30); dispone(qw+0 x30); dispone(.); dispone(bw+0 x30); dispone(sw+0 x30); dispone( ); dispone(k); dispone(m); else a=qs; qw=qs*tc%100000/10000; bw=qs*tc%10000

53、/1000; sw=qs*tc%1000/100; gw=qs*tc%100/10; wrcom(0 x81); dispone(js); dispone( ); dispone( ); dispone( ); dispone( ); dispone( ); dispone( ); dispone(qw+0 x30); dispone(bw+0 x30); dispone(sw+0 x30); dispone(.); dispone(gw+0 x30); dispone( ); dispone(m); /*void pjsdp()* 阶段平均速度数据处理及显示子程序 * */ void pjs

54、dp() pjsd=qs*tc/8/sj; qw=pjsd%100000/10000; bw=pjsd%10000/1000; sw=pjsd%1000/100; gw=pjsd%100/10; wrcom(0 x82); dispone(v); dispone(a); dispone( ); dispone( ); dispone(qw+0 x30); dispone(bw+0 x30); dispone(.); dispone(sw+0 x30); dispone(gw+0 x30); dispone( ); dispone(m); dispone(/); dispone(s); /*vo

55、id sdp()* 瞬时速度数据处理及显示子程序 * */ void sdp() if(sji!=0) sd2=tc*50/8/sji; else sd2=0; bw=sd2%10000/1000; sw=sd2%1000/100; gw=sd2%100/10; wrcom(0 x82); dispone(v); dispone( ); dispone( ); dispone( ); dispone(bw+0 x30); dispone(sw+0 x30); dispone(.); dispone(gw+0 x30); dispone( ); dispone(m); dispone(/); d

56、ispone(s); /*void mxsdp()* 最大速度数据处理及显示子程序 * */ void mxsdp() if(mxsd!=0) mxsd2=tc*50/8/mxsd; else mxsd2=0; bw=mxsd2%10000/1000; sw=mxsd2%1000/100; gw=mxsd2%100/10; wrcom(0 xc2); dispone(v); dispone(m); dispone( ); dispone( ); dispone(bw+0 x30); dispone(sw+0 x30); dispone(.); dispone(gw+0 x30); dispon

57、e( ); dispone(m); dispone(/); dispone(s); /*void clkp()* 当前时间(时钟)数据处理及显示子程序 * */ void clkp() wrcom(0 xc4); dispone(csww+0 x30); dispone(cww+0 x30); dispone(:); dispone(cqw+0 x30); dispone(cbw+0 x30); dispone(:); dispone(csw+0 x30); dispone(cgw+0 x30); /*void apfz()* 总里程数据处理及显示子程序辅助程序 * */ void apfz(

58、) wrcom(0 xc2); dispone(zl); wrcom(0 xc6); dispone(qw+0 x30); dispone(bw+0 x30); dispone( ); dispone(sw+0 x30); dispone(gw+0 x30); dispone(m); /*void ap()* 总里程数据处理及显示子程序 * */ void zp() b=b+a; qsls=100000/tc; if(bqsls) sww=b/10000000; ww=b%10000000/1000000; qw=b%1000000/100000; bw=b/8%10000000/10000;

59、 sw=b/8%10000/1000; wrcom(0 x81);/ 从第一行写指令 dispone(zs); dispone( ); dispone( ); dispone( ); dispone( ); dispone(sww+0 x30); dispone(ww+0 x30); dispone(qw+0 x30); dispone(.); dispone(bw+0 x30); dispone(sw+0 x30); dispone( ); dispone(k); dispone(m); else qw=qs*tc%100000/10000; bw=qs*tc%10000/1000; sw=

60、qs*tc%1000/100; gw=qs*tc%100/10; wrcom(0 x81); dispone(s); dispone( ); dispone( ); dispone( ); dispone( ); dispone( ); dispone( ); dispone(qw+0 x30); dispone(bw+0 x30); dispone(sw+0 x30); dispone(.); dispone(gw+0 x30); dispone( ); dispone(m); /*void int0()* 外部中断 0(光电传感器)中断服务程序 * */ void int0() inter

温馨提示

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

评论

0/150

提交评论