简易自行车数字里程表设计

本 科 毕 业 论 文

题 目: 简易自行车数字里程表设计

摘 要

本文对自行车里程表的结构、设计原理进行了介绍,并应用芯片LM339和AT89S51设计、制作了自行车里程表。文章介绍了所用芯片的存储结构、各管脚的功能,对各个模块的工作原理进行了分析。并对自行车里程表进行了展望。

本文先对里程表设计当中所需设备作了详细介绍,对设计中存在的问题进行了说明;而后对硬件和软件部分的设计和实现作了认真的分析;然后给出了系统的建模过程及相应的系统模型,在此基础上进行了控制仿真,并对仿真效果进行了比较。

本里程表的设计具有结构简单,成本低廉,显示清晰,稳定可靠等优点。并且可进行扩充,加入时速表的功能,更加方便的了解你现在所处的情况。

【关键词】光电对管;单片机AT89S51 ; LM339;键盘;

Abstract

In this paper, the structure and principle of traditional bicycle odometer are introduced, and applying LM339 and ATS89S51 has designed and made a bicycle odometer .The article has introduced what be memory structure of used chip , every function of pin ,and has carried out analysis on operating principle of each modules, and has been in progress to design of bicycle odometer to look into the distance.

This article first right Odometer designs required equipment, details of the design issues of; Later on hardware and software design and implementation carefully analyzed; Then the system modeling process and the corresponding model, based on the control simulation, Simulation results also were compared.

Odometer the design of the structure is simple, low cost, showing clear, stable and reliable results. And can be expanded to speed the function table and more convenient understand you are now stand.

Keywords: photoelectric cell; AT89S51;LM339; keys;

摘 要 ...................................................................... I ABSTRACT ................................................................... II

1绪论 ...................................................................... 1

1.1.课题的背景与意义 ...................................................... 1

1.2 课题所要解决的主要问题 ................................................ 1

2系统设计 .................................................................. 2

2.1.系统功能分析 .......................................................... 2

2.2.系统功能模块设计 ...................................................... 2

2.2.1硬件电路设计 ....................................................... 2

2.2.2软件设计 ........................................................... 8

3程序代码 ................................................................. 10

3.1.数据采集程序 ......................................................... 10

3.2键盘扫描程序 ......................................................... 10

3.3.中断程序 ............................................................. 11

4系统调试与结果分析 ....................................................... 13

4.1.电路调试 ............................................................ 13

4.1.1硬件调试 .......................................................... 13

4.1.2软件调试 .......................................................... 13

4.2.结果分析 ............................................................ 13

5总结与展望 ............................................................... 15

致谢 ....................................................................... 16

参考文献 ................................................................... 17

附录1程序原代码 .......................................................... 18

附录2系统电路图 ........................................................... 25 附录3系统实拍图 ........................................... 错误!未定义书签。

1绪论

1.1.课题的背景与意义

中国的轻型电动车产业在2000年进入产业化发展阶段,目前正处于产业生命周期快速增长阶段的初期。尽管处于处处封杀的重压下,消费者对这一新兴交通工具的青睐,推动轻型电动车产业近年来保持了80%以上的增长速度。2005年,在整体经济需求增长放慢、工业增速回落的背景下,轻型电动车行业却出现令人瞩目的“井喷”行情,成为耐用消费品市场不多的“亮点”之一。2006产销量达到1500万辆。据此估算,2010年,中国轻型电动车的产销量将可能达到3000万辆,出口量将可能达到500~600万辆。实现工业产值700亿元,包括上下游带动产值的产业总体规模将达到1300亿。

我国是自行车大国,随着人们生活水平的不断提高,自行车已经不仅仅是运输、代步的工具,其辅助功能也变得越来越重要。因此,人们希望自行车的娱乐、休 闲、锻炼的功能越来越多,能带来大家更多的健康与快乐。在这个背景下,自行车里程表作为自行车的一大辅助工具迅速发展起来.科学、美观、合理设计自行车里程表有一定的实用价值.它能合理计算出速度及公里数,使运动者运动适量,达到健康运动与代步的最佳效果。

随着自行车里程表的发展,其功能也逐渐从单一的里程显示发展到速度、时间显示,甚至有的还具有测量骑车人的心跳、显示骑车人热量消耗等功能,让人能清楚地知道当前的速度、时间、里程等物理量。

1.2 课题所要解决的主要问题

(1).设计一个轻便、省电、全天候野外使用的自行车里程表;

(2).可显示里程、速度、加速度,行驶时间等信息;

(3).适用于各种车型(不同尺寸),车型信息可通过键盘设置

2系统设计

2.1.系统功能分析

本系统可以实现自行车或电动车在行驶过程中速度,里程数的显示功能。系统元件简单,实用性强。通过光电对管进行信号的采集,每来一次信号,计数器加一,每五秒钟计算一次平均速度。本系统的核心在于单片机,把采集到的数据送入单片机后进行处理,再通过单片机把处理好的数据通过液晶显示出来,从而实现速度和里程的显示。

本系统是由数据采集,单片机控制系统,键盘显示,液晶显示4部分构成。其中数据的采集是由光电对管来完成的,它的输出是矩形脉冲,其中关键的处理由单片机系统来完成,单片机将对P3.0脚的信号进行计数,输出的信号由液晶进行显示,显示当前的行驶里程情况。键盘的作用是输入自行车的车型等信息,以上所诉就是整个系统的总体设计思想。[6]

该设计能实时地将所测的累计里程数显示出来,主要是将传感器输入到单片机的脉冲信号的频率(传感器将不同车速转变成不同频率的脉冲信号)实时地测量出来,通过单片机计算出里程,并由液晶显示模块显示所测里程。本设计的里程数的算法是一种大概的算法(假设在一定时间内自行车是匀速行进,平均速度与时间的乘积即为里程数)。 设计时,应综合考虑测速精度和系统反应时间。本设计用测量脉冲频率来计算速度,因而具有较高的测速精度。在计算里程时取了自行车的理想状态。实际中,误差控制在几米之内,相对于整个里程来说不是很大。另外,还应尽量保证其他子模块在编程时的通用性和高效性。

2.2.系统功能模块设计

2.2.1硬件电路设计

1.系统数据采集电路

信号采集单元采用一对光电管[15],光电管信号采集是通过光强弱的变化从而得到电信号的。如图2-1所示随着铝盘的转动,发射管光线也随之通过或不通过过孔。接收管感应到光线的强弱发生变化以电信号的形式输出,这样就实现了信号的采集。为了避免外界光线的干扰和保证定位探测的精度,首先要将光电管在一定距离内对准固定住,同时在光电管上套上紫铜管[9]。

图2-1 数据采集电路图

2.信号预处理单元硬件设计

信号预处理单元要对信号进行放大,本系统设计通过LM339比较器使得信号预处理电路变得简单。LM339在使用时要接上拉电阻,通过正负端输入电压的大小比较(正端输入电压>负端输入电压,输出+5V电压;正端输入电压

用于频率测量的方法有很多,频率测量的准确度主要取决于所测的频率范围以及被测对象的特点.而测量所能达到的精度,不仅仅取决于作为标准器使用的频率源的精度,也取决于所使用的测量设备和测量方法。待测信号经预处理电路后加至单片机的P3.0引脚可为单片机测量信号频率提供有效的输入信号。单片机通过检测P3.0引脚电平来决定是否使计数器加一。当该引脚电平不变时,系统处于等待状态,要一直到该引脚出现电平跳转时才开始计数[9]。

该设计能实时地将所测的速度与里程数显示出来,主要是将传感器输入到单片机的脉冲信号的频率(传感器将不同车速转变成不同频率的脉冲信号)实时地测量出来,然后通过单片机计算出速度和里程,并由液晶显示模块交替显示所测速度与里程。本设计的里程数的算法是一种大概的算法(假设在一定时间内自行车是匀速行进,平均速度与时间的乘积即为里程数)。

设计时,应综合考虑测速精度和系统反应时间。本设计用测量脉冲频率来计算速度,因而具有较高的测速精度。在计算里程时取了自行车的理想状态。实际中,误差控制在几米之内,相对于整个里程来说不是很大。另外,还应尽量保证其他子模块在编程时的通用性和高效性。本设计的速度和里程值采用液晶显示。

图2-2 信号预处理硬件电路

3.单片机系统

AT89S51[11]是一个低功耗,高性能CMOS 8位单片机,片内含4k Bytes ISP(In-systemprogrammable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89S51可为许多嵌入式控制应用系统提供高性价比的解决方案。下面简单介绍下AT89S51单片机:

美国MEL公司的AT89S系列51单片机支持ISP功能,给单片机应用开发带来了极大方便。现介绍一款简易型开发板的使用方法。将该板插入DIP40封装的8051单片机插座处,通过廉价的ISP即可编程AT89S51,支持在线擦写,速度更快,非常方便。

AT89S51芯片内有两个独立的16位定时/计数器,两个外中断接口,一个串行通讯口,4k字节快闪擦写存储器(FLASH MEMORY),低功耗的闲置和掉电模式,内带有看门狗电路,在不附加任何外围电路的情况下,能实现大部分比较复杂的逻辑控制功能,对存储容量要求不高的实际应用,AT89S51确实是一种不可多得的高效能单片机。

(1)主要特性:

与MCS-51 兼容

4K字节可编程闪烁存储器

寿命:1000写/擦循环

数据保留时间:10年

全静态工作:0Hz-24Hz

三级程序存储器锁定

128*8位内部RAM

32可编程I/O线

两个16位定时器/计数器

5个中断源

可编程串行通道

低功耗的闲置和掉电模式

片内振荡器和时钟电路

(2)AT89S51增加的新功能包括:

ISP在线编程功能,这个功能的优势在于改写单片机存储器内的程序不需要把芯片从工作环境中剥离,是一个强大易用的功能。

工作频率为33MHz,大家都知道AT89C51的极限工作频率只有24MHz,就是说S51具有更高工作频率,从而具有了更快的计算速度。

具有双工UART串行通道。

内部集成看门狗计时器,不再需要像AT89C51那样外接看门狗计时器单元电路。 双数据指示器。

电源关闭标识。

全新的加密算法,这使得对于AT89S51的解密变为不可能,程序的保密性大大加强,这样就可以有效的保护知识产权不被侵犯。

兼容性方面:向下完全兼容51全部字系列产品。比如8051、AT89C51等等早期MCS-51兼容产品。也就是说所有教科书、网络教程上的程序(不论教科书上采用的单片机是8051还是AT89C51还是MCS-51等等),在AT89S51上一样可以照常运行,这就是所谓的向下兼容。[3]

本系统的核心部分就在于单片机,通过单片机从LM339读数据,然后处理,再通过单片机送到液晶显示。

LM339是个比较器,每次输出非0即1,所以单片机读到的信号要么是0要么是1。其中单片机的P3.0口接LM339的输出端,P3.0每跳变一次,单片机里的计数器加一。

单片机的P0口接8个上拉电阻,再接键盘,通过读P0口实现键盘扫描.系统一开始会出现”Width:”字样,要求用户输入自行车的轮胎宽度,在本系统中可以通过测量前面模仿轮胎的纸片的半径值来设置宽度。通过键盘把轮胎宽度传给单片机。之后单片机根据采集到的数据来计算自行车行驶的速度,和里程数,速度精确到0.1m,里程数精确到0.1km。最后把速度和里程数的值通过液晶显示模块显示出来。

图2-3 单片机系统电路图

4.显示系统

本系统采用的是1602的液晶显示,其中RS接P2.0,RW接P2.1,E接P2.2,D0-D7接单片机的P1口,通过程序即可实现显示速度和里程数。

1602介绍:

管脚功能:

1602采用标准的16脚接口,其中:第1脚:VSS为电源地;第2脚:VDD接5V电源正极第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。第6脚:E(或EN)端为使能(enable)端。第7~14脚:D0~D7为8位双向数据端。第15~16脚:空脚或背灯电源。15脚背光正极,16脚背光负极。 操作控制:

表2-1 1602操作控制表

1602内部的字符发生存储器一共存储了160多个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地41H中的点阵字符图形显示出来,我们就能看到字母“A”。因为1602识别的是ASCII码,试验可以用ASCII码直接赋值,在单片机编程中还可以用字符型常量或变量赋值,如'A’。读的时候,先读左边那列,再读上面那行,如:感叹号!的ASCII为0x21,字母B的ASCII为0x42(前面加0x表示十六进制)。 指令集:

1602通过D0~D7的8位数据端传输数据和指令。显示模式设置: (初始化)0011 0000 [0x38] 设置16×2显示,5×7点阵,8位数据接口;显示开关及光标设置: (初始化),0000 1DCB D显示(1有效)、C光标显示(1有效)、B光标闪烁(1有效)0000 01NS N=1(读或写一个字符后地址指针加1 &光标加1),N=0(读或写一个字符后地址指针减1 &光标减1),S=1 且 N=1 (当写一个字符后,整屏显示左移)S=0 当写一个字符后,整屏显示不移动数据指针设置:数据首地址为80H,所以数据地址为80H+地址码(0-27H,40-67H)其他设置:01H(显示清屏,数据指针=0,所有显示=0);02H(显示回车,数据指针=0)。 5.键盘系统

本系统采用4*4键盘,其中使用到的只有其中10个,另外六个保留,键盘的作用就是设置轮胎的宽度,和另外的一些参数值,也可以通过键盘来控制程序的运行(本系统未使用)。4*4的键盘引出的8个引脚接单片机的P0口。键盘扫描原理是按键部分由16个轻触按键按照4行4列排列,连接到P0端口。将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。这样,当按键没有按下时,所有的输出端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。本系统采用的扫描法,具体如下: 判断键盘中有无键按下: 将全部行线置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。 判断闭合键所在的位置: 在确认有键按下

后,即可进入确定具体闭合键的过程。方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。[3]

图2-4 键盘扫描电路图

2.2.2软件设计 (1)系统介绍

本系统主要通过C语言进行单片机编程,从而实现信号的读取与显示,通过51单片机的内部中断来实现实时的显示速度和里程数。键盘扫描,液晶显示等部分都是通过软件来控制。 (2)系统流程图

程序设本系统的核心部分,系统的各个方面都是通过程序来控制和协调。程序的核心部分就是中断时间到了之后进中断的各个数据的计算。程序开始的时候先初始化1602的液晶,然后液晶模块上会提示用户输入自行车的轮胎宽度:width(0-99cm),当用户输入完后,这个数值将被作为自行车的轮胎半径参加计算。之后程序就初始化中断模式,之后就进入一个while循环,在循环中接收信号和显示数据,如果中断时间到了,那么进入中断,从新计算速度跟里程数。退出中断后又继续显示新的速度跟里程数。流程图如下:

图2-5 系统流程图

3程序代码

3.1.数据采集程序

void recv() {if(q!=p) {q=p; count++;} }

上面程序是数据的采集,其中sbit p=P3^0;sbit q;因为p是接收脉冲的,时刻都在改变,所以用q来保存p的值,每次当P3.0口发生跳变的时候,计数器加一,此处为什么不用高电平或低电平的时候计数器加一呢?因为光电对管传过来的电平在高电平或低电平的时间可能不一样,如果高电平时间过长,那么P3.0检测到的将一直是高电平或低电平,这样计数器就可能一直加一,这样就导致采集的数据不准确。

3.2键盘扫描程序

unsigned char Scan_Key(void)

{ char a1,i; unsigned char ptr=0,m,m_ptr; bit FLAG0; FLAG0=0; while(!FLAG0) { //FLAG0=0; a1=0xf7;

for(i=0;i

}

break; case 0xd0: ptr=i*4+2; FLAG0=1; break; case 0xe0: ptr=i*4+3; FLAG0=1; break; default: break; }

if(FLAG0==1) {

break; }

a1=a1>>1 | 0x80; } if(ptr

if(ptr>10)return 'a'; }

return m_ptr;

这里的FLAG是标记键盘有没有按下的,ptr是记录按下键盘的键值所对应的数值。在

程序的最后为什么添加个m_ptr呢?这是为了满足,width能够在0-100内取值,因为如果width10的话,就必须输两次。在这里,程序中每次都要求用户输入两个数据,如果第一次输入是在0-9内的,第二次输入也在0-9的,那么width就是一个两位数;如果第一次输入在0-9内的,第二次输入大于10的,那么程序就认为width是0-10的数,数值就等于第一次输入的值,在程序中也就是if(ptr>10)return 'a';在下面的程序中就会对键盘扫描得到的值进行分析,判断是不是’a’.这样就实现了键盘输入的width可以控制在0-99了。[3]

3.3.中断程序

void Timer() interrupt 1 { TR0=0;

TH0=0x0fe;//重新设定定时时间 TL0=0x0c;

if(m_usetime==5000)//每五秒算一次速度 {

speed=(6.28*wheel_width*count)/5.0;//计算速度 m_usetime=0; count=0; distance_n+=5*speed; if(distance_n>=100) { distance=(distance+distance_n/1000.0); distance_n=0; } } else m_usetime++; TR0=1; }

在中断里的任务主要是实时的计算自行车在行驶中的速度和里程数,在本程序中,采用每五秒计算一次速度,因为自行车的速度比较慢,可能在1秒内光电对管收不到信号,所以这里显示的速度就是每5秒自行车速度的平均值,精确到0.1m;而里程数是精确到0.1km,程序中以distance_n来提示里程增值是否到达100,如果到达一百那么里程数就加0.1;但是由于晶振可能有问题,所以这里的定时器总是不是很准确。 源程序详见附录1。

4系统调试与结果分析

4.1.电路调试

4.1.1硬件调试

本电路的硬件部分比较简单,在调试过程中,主要是信号采集电路与1602液晶模块的调试。

信号采集电路采用的光电对管在电路焊接中,两个对管一定要对得很准否则就可能影响信号的采集,本人在调试光电对管的时候就发生这样的情况,由于两个对管都是直接焊接在开发板上的,但是在对齐上面有偏差,就导致了信号不能采集。最后用了光电对管的最小模块系统,成功的采集到信号。而1602液晶显示则必须注意调节它的背光,否则不能正常显示。如果电路连接正常,上电后,看到液晶有正常的亮度,但是不能显示实验的数据时,首先应该考虑到液晶的背光没有调节好,之后才考虑到硬件或软件的问题。 4.1.2软件调试

本系统的核心部分是软件,因此在前期的工作中主要的工作就是调试软件,在proteus仿真中正常执行。下面讲下本人在软件调试中遇到的各个问题

首先是变量的定义问题,大家都知道,在C语言中我们习惯的使用int型的数据,但是在单片机软件的设计中,如果变量很多,就应该避免使用int型的,尽量使用unsigned char型的,因为单片机的内部存储器有限,用unsigned char可以节省空间。本人开始由于都使用int型,导致最后生成的hex文件过大。但是,当我们使用的数据的值大过256时,我们就不能使用unsigned char类型,否则就会导致数据溢出,这时我们就要使用unsigned int型或short型,本人在调试的时候,当速度小的时候都能够正常显示,当速度很大的时候,1602显示的数据就不对,经过对程序的检查才知道是数据类型的定义问题。之后就是程序的流程必须先画好,程序各个模块的代码先写好,之后再根据程序的流程图整合各个模块的小程序,同时要注意程序的时序问题。[13]

4.2.结果分析

本系统使用的是光电对管来进行数据采集,光电对管产生的信号非0即1,也就是方波,因为实验条件有限,因此,本人使用信号发生器来模拟自行车行驶过程中,光电对管所采集到的信号。1HZ就表示自行车每秒钟转一圈。本系统软件中计算速度的公式是:speed=3.14*width*count/2;width是通过键盘输入的,count就是计数器,因为程序是根据跳变来计数的,所以最后除以2。下表就是不同的width,不同的频率所显示的速度值,以及理论值。测试结果见表5-1。

表5-1 测试数据表

5总结与展望

本文对自行车里程表作了细致、全面、规范的分析;对总体相应的软、硬件进行了设计、制作及调试,并贯穿至设计的全过程。对文中所提到的各种算法都进行了处理,并得出结论。所做工作如下:

(1)对设计中所需要的元件分析其原理和性能,极其应用和发展。 (2)详细介绍本自行车里程表硬件设计的方案,电路图,并附上说明。 (3)详细介绍软件设计方法,并给出个部分的程序清单。 (4)给出对本设计进行仿真调试的过程。 系统设计中有待改进的方面有一下几点:

(1) 显示的速度和里程值有误差:在速度值不大的时候误差比较小,但是当速度值大的时候误差就比较大,而里程数也只有精确到0.1km。

(2) 里程的值不能够保存:本系统测量的里程数只能是本次行驶的里程,不能测量一共的里程数,因此可以加个外部程序存储器来储存里程数,使掉电后仍有效。

(3)只测量了速度跟里程:为了更多的需要,里程表可以增加温度显示,人体消耗的热量等等。[11]

本次设计时间从开始选题算起,已经花费近五个月的时间去分析论证、设计制作和调试功能,已具有可实用性,基本达到了设计任务目标要求。系统的设计涵盖了软件和硬件两个方面,虽然遇到了不少的困难,但是还是在自己的努力和老师的指导下完成了整个系统的基本功能。

致谢

本论文是在导师吴平老师的悉心指导下完成的,在此我首先对吴老师表示最诚挚的谢意!

在此,我要感谢物理与电子信息学院的每位教导过我的老师和同学们,感谢他们在我的工作和课题研究中给予了我很多的关心、支持和帮助,使得我能顺利地工作和完成课题 最后,向所有关心、支持、帮助过我的各位老师、领导、同学和朋友们再次表示诚挚的感谢!

参考文献

[1] 何立民. 单片机高级教程—应用与设计[M].北京:北京航空航天大学出版社,2000年:100-150.

[2] 潘栋. 单片机在自行车里程表中的应用[J].电子与自动化,1998,3:42-43. [3] 高锋.单片微型计算机原理与接口技术[M].北京:科学出版社,2003:140-150. [4] 童诗白.华成英.模拟电子技术基础[M].北京:高等教育出版社,2001:434- 438. [5] 郑农发.电子式车速里程表[M].芜湖:安徽机电学院,1999-10:18-27.

[6] 刘清波,菜淑珍,孙业歧,史楠.基于单片机的汽车里程表设计[N].河北:《河北

大学学报(自然科学版)》,2002,3:277-278.

[7] 王锁弘.电子车速里程表的单片机实现方案[J].国外电子元器件,2004,5:7-10. [8] 刁文兴.自行车电子里程表的初步设计[N].南京:《南京工业职业技术学院学报》,

2004,2:31-33.

[9] 张怀强,周通,陆坤,何为民.基于单片机与光电传感器的电动自行车速度与里程

表的设计[J].《今日电子》,2006 ,7:49-52.

[10] 卢结成.电子电路实验及应用课题设计[J].北京:中国科学技术大学出版社,

2002,2:130-140.

[11] 诸德宏,潘天红,朱湘临.数字式汽车里程表的的设计[J].江苏:江苏大学电气信

息工程学院,2002-10,12:830-832.

[12] 周航慈.单片机应用程序设计技术[M].北京:北京航空航天大学出版社,1991,3:

266-286. [13] 汤向恒,袁端才.用单片机实现的电子式里程表[J].湖南:电子世界,2003,2:

37. [14] 王义方.周伟航.微型计算机原理及应用[M].北京:机械工业出版社,1997:20-25. [15] 王煜东. 传感器及应用[M].北京:机械工业出版社. 2004:125-128.

附录1程序原代码

#include #include #include sbit RS = P2^0; sbit RW = P2^1; sbit EN = P2^2; sbit p=P3^0; sbit q=0;

unsigned int m_usetime=0; float distance=0, speed=0; float wheel_width=0; unsigned char count=0; unsigned char distance_n=0; unsigned char k[32] ; ////////////////////////////// /////////////软件延时///////// ////////////////////////////// void delay(unsigned int n) {

unsigned int cc; while(n-->0) {

for(cc=10;cc>0;cc--); } }

////////////////////////////// ////////////读lcd状态指令///// ////////////////////////////// void recom( ) { EN=0; RS=0; RW=1;

EN=1; }

////////////////////////////// //////////测试是否忙////////// ////////////////////////////// void busytest() { P1=0xff; RS=0; RW=1; EN=1;

while((P1&0x80)==0x80) {

EN=0; //这两句protues仿真必须加 EN=1; // };

EN=0; }

//////////////////////////////

////写lcd指令不判断是否忙///// ////////////////////////////// void wrcom(unsigned char n) { RS=0; RW=0; P1=n; EN=1; _nop_(); EN=0; }

//////////////////////////////

/////写lcd指令判断是否忙//////

//////////////////////////////

void wrcomn (unsigned char n) { busytest(); wrcom(n); }

///////////////////////////// ///////////清屏////////////// ///////////////////////////// void clrscr() {

wrcomn(0x01); //清屏 }

///////////////////////////// ///////////初始化lcd///////// ///////////////////////////// void initlcd() {

delay(150); wrcom(0x38); delay(50); wrcom(0x38); delay(50); wrcom(0x38);

wrcomn(0x38);

wrcomn(0x08); //关显示 不显示光标 wrcomn(0x01); //清屏 wrcomn(0x06); //光标模式 wrcomn(0x0c); //开显示 }

//////////////////////////// //////////设置光标位置////// ////////////////////////////

void setpos(unsigned char x,unsigned char y) {

busytest(); x&=0x0f; y&=0x03; if(y==0x00) wrcomn(x|0x80); else if(y==0x01)

wrcomn((x+0x40)|0x80); }

//////////////////////////// ////////////写数据////////// ////////////////////////////

void wrightdata(unsigned char n) {

busytest(); RS=1; RW=0; P1=n; EN=1; _nop_(); EN=0; }

//////////////////////////// ///////////写字符串数据///// ////////////////////////////

void wrightstrdata(unsigned char *s,unsigned int length)

{ int x,y;

int YMAX,XMAX[2]; if(length>16) {

YMAX=2;

XMAX[0]=16; XMAX[1]=length-16; } else {

YMAX=1; XMAX[0]=length; XMAX[1]=0; }

for(y=0;y

////初始化/////// void Init() {

TMOD=0x01;

TH0=0xfc;//设定定时时间,1.00043362

TL0=0x18; ET0=1; EA=1;

TR0=1;

}

//////接收脉冲/////// void recv() {

if(q!=p) { q=p; count++; }

}

////中断///////////// void Timer() interrupt 1 { TR0=0;

TH0=0x0fc;//重新设定定时时间

TL0=0x18; //printf("%d",count); if(m_usetime==1000)//每五秒算一次

速度

{

//k[7]=count/100+48; //k[8]=(count%100)/10+48;

//k[9]=count%10+48;

约为

speed=(6.28*wheel_width*0.5*count)/1.0;//计

算速度

m_usetime=0; count=0;

distance_n+=5*speed; if(distance_n>=100) {

distance=(distance+distance_n/1000.0);//为什么全局变量没起作用

distance_n=0; }

}

else m_usetime++; TR0=1;

{

P0=a1; delay(10); m=P0;

switch( m & 0xf0 ) { }

case 0x70:

ptr=i*4; FLAG0=1; break;

}

//----------------------------------------------------------------------------------

//键盘码数组 /*unsigned {0x01,0x02,0x03,0x04,

0x05,0x06,0x07,0x08,

char

tab[16]=

case 0xb0:

ptr=i*4+1;

FLAG0=1; break;

case 0xd0:

ptr=i*4+2;

FLAG0=1; break;

0x09,0x0a,0x0b,0x0c,

case 0xe0:

ptr=i*4+3;

FLAG0=1; break;

0x0d,0x0e,0x0f,0x10

unsigned char Scan_Key(void) {

char a1,i;

unsigned char m_i=0; unsigned ptr1=3;

unsigned char ptr=0,m,m_ptr,m_ptr1;

};*/

default: break;

if(FLAG0==1) {

break; //有按键,则退出扫描 }

a1=a1>>1 | 0x80;

//高位补1,

bit FLAG0;

FLAG0=0;

while(!FLAG0)

{

//FLAG0=0; a1=0xf7;

由于P1.7~4末接+5V,而是由指令加载高电平

}

if(ptr

m_ptr=ptr; if(ptr>10)return 'a';

for(i=0;i

}

return m_ptr;

}

//////////////////////////// ///////////主程序/////////// //////////////////////////// void main() {

unsigned char i; unsigned char na; unsigned int s; unsigned int d=0; unsigned char w,w1,w2; EN=0; initlcd(); clrscr(); q=p;

//////程序初始读轮胎的宽度/////

k[0]=160; k[1]=87; k[2]=105; k[3]=100; k[4]=116; k[5]=104; k[6]=58;

for(i=7;i

wrightstrdata(k,32); w1=Scan_Key(); delay(1500); w2=Scan_Key();

if(w2=='a') w=w1; else

w=w1*10+w2; wheel_width=w/100.0; if(w

k[7]=w+48; } if(w>=10) {

k[7]=w/10+48; k[8]=w%10+48; }

while(d++

//k="speed: 20 m/s distance: 20 m " //////////////////////////////////

//k[8],k[10]两位显示速度 // //k[26],k[27],k[29]三位显示路程 // //////////////////////////////////

k[0]=160; k[1]=83; k[2]=112; k[3]=101; k[4]=101; k[5]=100; k[6]=58; k[7]=160; k[9]=46; k[11]=160;

k[12]=109; k[13]=47; k[14]=115; k[15]=160;

///////第一行

k[16]=68; k[17]=105; k[18]=115; k[19]=116; k[20]=97; k[21]=110; k[22]=99; k[23]=101; k[24]=58; //k[25]=160; k[28]=160; k[30]=107; k[31]=109; ///////第二行 /*

for(i=0;i

/////////////////////////////////////////////////

//s为速度,d为路程,计算结果要×10后再放入s和d///

///////////////////////////////////////////////// recv(); s=speed*10; d=distance*10; if(s

{

k[7]=160; k[8]=48; k[9]=46; k[10]=s+48; }

if(s>=10&&s

na=s/10; k[8]=na+48; k[9]=46; na=s%10; k[10]=na+48; } if(s>100) {

na=s/100; k[7]=na+48; na=(s%100)/10;

k[8]=na+48; k[9]=46; na=s%10; k[10]=na+48; } if(d

k[25]=k[26]=160; k[27]=48; k[28]=46; k[29]=d+48; }

if(d>=10&&d

{

k[25]=160; k[26]=160;

na=d/10; k[27]=na+48; k[28]=46; na=d%10; k[29]=na+48; }

if(d>=100&&d

k[25]=160; k[28]=46; na=d/100; k[26]=na+48; na=(d%100)/10; k[27]=na+48; na=d%10; k[29]=na+48;

}

if(d>=1000) {

na=d/1000; k[25]=na+48; na=(d%1000)/100; k[26]=na+48; na=(d%100)/10; k[27]=na+48; k[28]=46; na=d%10; k[29]=na+48; }

wrightstrdata(k,32); } }

附录2系统电路图

27

本 科 毕 业 论 文

题 目: 简易自行车数字里程表设计

摘 要

本文对自行车里程表的结构、设计原理进行了介绍,并应用芯片LM339和AT89S51设计、制作了自行车里程表。文章介绍了所用芯片的存储结构、各管脚的功能,对各个模块的工作原理进行了分析。并对自行车里程表进行了展望。

本文先对里程表设计当中所需设备作了详细介绍,对设计中存在的问题进行了说明;而后对硬件和软件部分的设计和实现作了认真的分析;然后给出了系统的建模过程及相应的系统模型,在此基础上进行了控制仿真,并对仿真效果进行了比较。

本里程表的设计具有结构简单,成本低廉,显示清晰,稳定可靠等优点。并且可进行扩充,加入时速表的功能,更加方便的了解你现在所处的情况。

【关键词】光电对管;单片机AT89S51 ; LM339;键盘;

Abstract

In this paper, the structure and principle of traditional bicycle odometer are introduced, and applying LM339 and ATS89S51 has designed and made a bicycle odometer .The article has introduced what be memory structure of used chip , every function of pin ,and has carried out analysis on operating principle of each modules, and has been in progress to design of bicycle odometer to look into the distance.

This article first right Odometer designs required equipment, details of the design issues of; Later on hardware and software design and implementation carefully analyzed; Then the system modeling process and the corresponding model, based on the control simulation, Simulation results also were compared.

Odometer the design of the structure is simple, low cost, showing clear, stable and reliable results. And can be expanded to speed the function table and more convenient understand you are now stand.

Keywords: photoelectric cell; AT89S51;LM339; keys;

摘 要 ...................................................................... I ABSTRACT ................................................................... II

1绪论 ...................................................................... 1

1.1.课题的背景与意义 ...................................................... 1

1.2 课题所要解决的主要问题 ................................................ 1

2系统设计 .................................................................. 2

2.1.系统功能分析 .......................................................... 2

2.2.系统功能模块设计 ...................................................... 2

2.2.1硬件电路设计 ....................................................... 2

2.2.2软件设计 ........................................................... 8

3程序代码 ................................................................. 10

3.1.数据采集程序 ......................................................... 10

3.2键盘扫描程序 ......................................................... 10

3.3.中断程序 ............................................................. 11

4系统调试与结果分析 ....................................................... 13

4.1.电路调试 ............................................................ 13

4.1.1硬件调试 .......................................................... 13

4.1.2软件调试 .......................................................... 13

4.2.结果分析 ............................................................ 13

5总结与展望 ............................................................... 15

致谢 ....................................................................... 16

参考文献 ................................................................... 17

附录1程序原代码 .......................................................... 18

附录2系统电路图 ........................................................... 25 附录3系统实拍图 ........................................... 错误!未定义书签。

1绪论

1.1.课题的背景与意义

中国的轻型电动车产业在2000年进入产业化发展阶段,目前正处于产业生命周期快速增长阶段的初期。尽管处于处处封杀的重压下,消费者对这一新兴交通工具的青睐,推动轻型电动车产业近年来保持了80%以上的增长速度。2005年,在整体经济需求增长放慢、工业增速回落的背景下,轻型电动车行业却出现令人瞩目的“井喷”行情,成为耐用消费品市场不多的“亮点”之一。2006产销量达到1500万辆。据此估算,2010年,中国轻型电动车的产销量将可能达到3000万辆,出口量将可能达到500~600万辆。实现工业产值700亿元,包括上下游带动产值的产业总体规模将达到1300亿。

我国是自行车大国,随着人们生活水平的不断提高,自行车已经不仅仅是运输、代步的工具,其辅助功能也变得越来越重要。因此,人们希望自行车的娱乐、休 闲、锻炼的功能越来越多,能带来大家更多的健康与快乐。在这个背景下,自行车里程表作为自行车的一大辅助工具迅速发展起来.科学、美观、合理设计自行车里程表有一定的实用价值.它能合理计算出速度及公里数,使运动者运动适量,达到健康运动与代步的最佳效果。

随着自行车里程表的发展,其功能也逐渐从单一的里程显示发展到速度、时间显示,甚至有的还具有测量骑车人的心跳、显示骑车人热量消耗等功能,让人能清楚地知道当前的速度、时间、里程等物理量。

1.2 课题所要解决的主要问题

(1).设计一个轻便、省电、全天候野外使用的自行车里程表;

(2).可显示里程、速度、加速度,行驶时间等信息;

(3).适用于各种车型(不同尺寸),车型信息可通过键盘设置

2系统设计

2.1.系统功能分析

本系统可以实现自行车或电动车在行驶过程中速度,里程数的显示功能。系统元件简单,实用性强。通过光电对管进行信号的采集,每来一次信号,计数器加一,每五秒钟计算一次平均速度。本系统的核心在于单片机,把采集到的数据送入单片机后进行处理,再通过单片机把处理好的数据通过液晶显示出来,从而实现速度和里程的显示。

本系统是由数据采集,单片机控制系统,键盘显示,液晶显示4部分构成。其中数据的采集是由光电对管来完成的,它的输出是矩形脉冲,其中关键的处理由单片机系统来完成,单片机将对P3.0脚的信号进行计数,输出的信号由液晶进行显示,显示当前的行驶里程情况。键盘的作用是输入自行车的车型等信息,以上所诉就是整个系统的总体设计思想。[6]

该设计能实时地将所测的累计里程数显示出来,主要是将传感器输入到单片机的脉冲信号的频率(传感器将不同车速转变成不同频率的脉冲信号)实时地测量出来,通过单片机计算出里程,并由液晶显示模块显示所测里程。本设计的里程数的算法是一种大概的算法(假设在一定时间内自行车是匀速行进,平均速度与时间的乘积即为里程数)。 设计时,应综合考虑测速精度和系统反应时间。本设计用测量脉冲频率来计算速度,因而具有较高的测速精度。在计算里程时取了自行车的理想状态。实际中,误差控制在几米之内,相对于整个里程来说不是很大。另外,还应尽量保证其他子模块在编程时的通用性和高效性。

2.2.系统功能模块设计

2.2.1硬件电路设计

1.系统数据采集电路

信号采集单元采用一对光电管[15],光电管信号采集是通过光强弱的变化从而得到电信号的。如图2-1所示随着铝盘的转动,发射管光线也随之通过或不通过过孔。接收管感应到光线的强弱发生变化以电信号的形式输出,这样就实现了信号的采集。为了避免外界光线的干扰和保证定位探测的精度,首先要将光电管在一定距离内对准固定住,同时在光电管上套上紫铜管[9]。

图2-1 数据采集电路图

2.信号预处理单元硬件设计

信号预处理单元要对信号进行放大,本系统设计通过LM339比较器使得信号预处理电路变得简单。LM339在使用时要接上拉电阻,通过正负端输入电压的大小比较(正端输入电压>负端输入电压,输出+5V电压;正端输入电压

用于频率测量的方法有很多,频率测量的准确度主要取决于所测的频率范围以及被测对象的特点.而测量所能达到的精度,不仅仅取决于作为标准器使用的频率源的精度,也取决于所使用的测量设备和测量方法。待测信号经预处理电路后加至单片机的P3.0引脚可为单片机测量信号频率提供有效的输入信号。单片机通过检测P3.0引脚电平来决定是否使计数器加一。当该引脚电平不变时,系统处于等待状态,要一直到该引脚出现电平跳转时才开始计数[9]。

该设计能实时地将所测的速度与里程数显示出来,主要是将传感器输入到单片机的脉冲信号的频率(传感器将不同车速转变成不同频率的脉冲信号)实时地测量出来,然后通过单片机计算出速度和里程,并由液晶显示模块交替显示所测速度与里程。本设计的里程数的算法是一种大概的算法(假设在一定时间内自行车是匀速行进,平均速度与时间的乘积即为里程数)。

设计时,应综合考虑测速精度和系统反应时间。本设计用测量脉冲频率来计算速度,因而具有较高的测速精度。在计算里程时取了自行车的理想状态。实际中,误差控制在几米之内,相对于整个里程来说不是很大。另外,还应尽量保证其他子模块在编程时的通用性和高效性。本设计的速度和里程值采用液晶显示。

图2-2 信号预处理硬件电路

3.单片机系统

AT89S51[11]是一个低功耗,高性能CMOS 8位单片机,片内含4k Bytes ISP(In-systemprogrammable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89S51可为许多嵌入式控制应用系统提供高性价比的解决方案。下面简单介绍下AT89S51单片机:

美国MEL公司的AT89S系列51单片机支持ISP功能,给单片机应用开发带来了极大方便。现介绍一款简易型开发板的使用方法。将该板插入DIP40封装的8051单片机插座处,通过廉价的ISP即可编程AT89S51,支持在线擦写,速度更快,非常方便。

AT89S51芯片内有两个独立的16位定时/计数器,两个外中断接口,一个串行通讯口,4k字节快闪擦写存储器(FLASH MEMORY),低功耗的闲置和掉电模式,内带有看门狗电路,在不附加任何外围电路的情况下,能实现大部分比较复杂的逻辑控制功能,对存储容量要求不高的实际应用,AT89S51确实是一种不可多得的高效能单片机。

(1)主要特性:

与MCS-51 兼容

4K字节可编程闪烁存储器

寿命:1000写/擦循环

数据保留时间:10年

全静态工作:0Hz-24Hz

三级程序存储器锁定

128*8位内部RAM

32可编程I/O线

两个16位定时器/计数器

5个中断源

可编程串行通道

低功耗的闲置和掉电模式

片内振荡器和时钟电路

(2)AT89S51增加的新功能包括:

ISP在线编程功能,这个功能的优势在于改写单片机存储器内的程序不需要把芯片从工作环境中剥离,是一个强大易用的功能。

工作频率为33MHz,大家都知道AT89C51的极限工作频率只有24MHz,就是说S51具有更高工作频率,从而具有了更快的计算速度。

具有双工UART串行通道。

内部集成看门狗计时器,不再需要像AT89C51那样外接看门狗计时器单元电路。 双数据指示器。

电源关闭标识。

全新的加密算法,这使得对于AT89S51的解密变为不可能,程序的保密性大大加强,这样就可以有效的保护知识产权不被侵犯。

兼容性方面:向下完全兼容51全部字系列产品。比如8051、AT89C51等等早期MCS-51兼容产品。也就是说所有教科书、网络教程上的程序(不论教科书上采用的单片机是8051还是AT89C51还是MCS-51等等),在AT89S51上一样可以照常运行,这就是所谓的向下兼容。[3]

本系统的核心部分就在于单片机,通过单片机从LM339读数据,然后处理,再通过单片机送到液晶显示。

LM339是个比较器,每次输出非0即1,所以单片机读到的信号要么是0要么是1。其中单片机的P3.0口接LM339的输出端,P3.0每跳变一次,单片机里的计数器加一。

单片机的P0口接8个上拉电阻,再接键盘,通过读P0口实现键盘扫描.系统一开始会出现”Width:”字样,要求用户输入自行车的轮胎宽度,在本系统中可以通过测量前面模仿轮胎的纸片的半径值来设置宽度。通过键盘把轮胎宽度传给单片机。之后单片机根据采集到的数据来计算自行车行驶的速度,和里程数,速度精确到0.1m,里程数精确到0.1km。最后把速度和里程数的值通过液晶显示模块显示出来。

图2-3 单片机系统电路图

4.显示系统

本系统采用的是1602的液晶显示,其中RS接P2.0,RW接P2.1,E接P2.2,D0-D7接单片机的P1口,通过程序即可实现显示速度和里程数。

1602介绍:

管脚功能:

1602采用标准的16脚接口,其中:第1脚:VSS为电源地;第2脚:VDD接5V电源正极第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。第6脚:E(或EN)端为使能(enable)端。第7~14脚:D0~D7为8位双向数据端。第15~16脚:空脚或背灯电源。15脚背光正极,16脚背光负极。 操作控制:

表2-1 1602操作控制表

1602内部的字符发生存储器一共存储了160多个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地41H中的点阵字符图形显示出来,我们就能看到字母“A”。因为1602识别的是ASCII码,试验可以用ASCII码直接赋值,在单片机编程中还可以用字符型常量或变量赋值,如'A’。读的时候,先读左边那列,再读上面那行,如:感叹号!的ASCII为0x21,字母B的ASCII为0x42(前面加0x表示十六进制)。 指令集:

1602通过D0~D7的8位数据端传输数据和指令。显示模式设置: (初始化)0011 0000 [0x38] 设置16×2显示,5×7点阵,8位数据接口;显示开关及光标设置: (初始化),0000 1DCB D显示(1有效)、C光标显示(1有效)、B光标闪烁(1有效)0000 01NS N=1(读或写一个字符后地址指针加1 &光标加1),N=0(读或写一个字符后地址指针减1 &光标减1),S=1 且 N=1 (当写一个字符后,整屏显示左移)S=0 当写一个字符后,整屏显示不移动数据指针设置:数据首地址为80H,所以数据地址为80H+地址码(0-27H,40-67H)其他设置:01H(显示清屏,数据指针=0,所有显示=0);02H(显示回车,数据指针=0)。 5.键盘系统

本系统采用4*4键盘,其中使用到的只有其中10个,另外六个保留,键盘的作用就是设置轮胎的宽度,和另外的一些参数值,也可以通过键盘来控制程序的运行(本系统未使用)。4*4的键盘引出的8个引脚接单片机的P0口。键盘扫描原理是按键部分由16个轻触按键按照4行4列排列,连接到P0端口。将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。这样,当按键没有按下时,所有的输出端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。本系统采用的扫描法,具体如下: 判断键盘中有无键按下: 将全部行线置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。 判断闭合键所在的位置: 在确认有键按下

后,即可进入确定具体闭合键的过程。方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。[3]

图2-4 键盘扫描电路图

2.2.2软件设计 (1)系统介绍

本系统主要通过C语言进行单片机编程,从而实现信号的读取与显示,通过51单片机的内部中断来实现实时的显示速度和里程数。键盘扫描,液晶显示等部分都是通过软件来控制。 (2)系统流程图

程序设本系统的核心部分,系统的各个方面都是通过程序来控制和协调。程序的核心部分就是中断时间到了之后进中断的各个数据的计算。程序开始的时候先初始化1602的液晶,然后液晶模块上会提示用户输入自行车的轮胎宽度:width(0-99cm),当用户输入完后,这个数值将被作为自行车的轮胎半径参加计算。之后程序就初始化中断模式,之后就进入一个while循环,在循环中接收信号和显示数据,如果中断时间到了,那么进入中断,从新计算速度跟里程数。退出中断后又继续显示新的速度跟里程数。流程图如下:

图2-5 系统流程图

3程序代码

3.1.数据采集程序

void recv() {if(q!=p) {q=p; count++;} }

上面程序是数据的采集,其中sbit p=P3^0;sbit q;因为p是接收脉冲的,时刻都在改变,所以用q来保存p的值,每次当P3.0口发生跳变的时候,计数器加一,此处为什么不用高电平或低电平的时候计数器加一呢?因为光电对管传过来的电平在高电平或低电平的时间可能不一样,如果高电平时间过长,那么P3.0检测到的将一直是高电平或低电平,这样计数器就可能一直加一,这样就导致采集的数据不准确。

3.2键盘扫描程序

unsigned char Scan_Key(void)

{ char a1,i; unsigned char ptr=0,m,m_ptr; bit FLAG0; FLAG0=0; while(!FLAG0) { //FLAG0=0; a1=0xf7;

for(i=0;i

}

break; case 0xd0: ptr=i*4+2; FLAG0=1; break; case 0xe0: ptr=i*4+3; FLAG0=1; break; default: break; }

if(FLAG0==1) {

break; }

a1=a1>>1 | 0x80; } if(ptr

if(ptr>10)return 'a'; }

return m_ptr;

这里的FLAG是标记键盘有没有按下的,ptr是记录按下键盘的键值所对应的数值。在

程序的最后为什么添加个m_ptr呢?这是为了满足,width能够在0-100内取值,因为如果width10的话,就必须输两次。在这里,程序中每次都要求用户输入两个数据,如果第一次输入是在0-9内的,第二次输入也在0-9的,那么width就是一个两位数;如果第一次输入在0-9内的,第二次输入大于10的,那么程序就认为width是0-10的数,数值就等于第一次输入的值,在程序中也就是if(ptr>10)return 'a';在下面的程序中就会对键盘扫描得到的值进行分析,判断是不是’a’.这样就实现了键盘输入的width可以控制在0-99了。[3]

3.3.中断程序

void Timer() interrupt 1 { TR0=0;

TH0=0x0fe;//重新设定定时时间 TL0=0x0c;

if(m_usetime==5000)//每五秒算一次速度 {

speed=(6.28*wheel_width*count)/5.0;//计算速度 m_usetime=0; count=0; distance_n+=5*speed; if(distance_n>=100) { distance=(distance+distance_n/1000.0); distance_n=0; } } else m_usetime++; TR0=1; }

在中断里的任务主要是实时的计算自行车在行驶中的速度和里程数,在本程序中,采用每五秒计算一次速度,因为自行车的速度比较慢,可能在1秒内光电对管收不到信号,所以这里显示的速度就是每5秒自行车速度的平均值,精确到0.1m;而里程数是精确到0.1km,程序中以distance_n来提示里程增值是否到达100,如果到达一百那么里程数就加0.1;但是由于晶振可能有问题,所以这里的定时器总是不是很准确。 源程序详见附录1。

4系统调试与结果分析

4.1.电路调试

4.1.1硬件调试

本电路的硬件部分比较简单,在调试过程中,主要是信号采集电路与1602液晶模块的调试。

信号采集电路采用的光电对管在电路焊接中,两个对管一定要对得很准否则就可能影响信号的采集,本人在调试光电对管的时候就发生这样的情况,由于两个对管都是直接焊接在开发板上的,但是在对齐上面有偏差,就导致了信号不能采集。最后用了光电对管的最小模块系统,成功的采集到信号。而1602液晶显示则必须注意调节它的背光,否则不能正常显示。如果电路连接正常,上电后,看到液晶有正常的亮度,但是不能显示实验的数据时,首先应该考虑到液晶的背光没有调节好,之后才考虑到硬件或软件的问题。 4.1.2软件调试

本系统的核心部分是软件,因此在前期的工作中主要的工作就是调试软件,在proteus仿真中正常执行。下面讲下本人在软件调试中遇到的各个问题

首先是变量的定义问题,大家都知道,在C语言中我们习惯的使用int型的数据,但是在单片机软件的设计中,如果变量很多,就应该避免使用int型的,尽量使用unsigned char型的,因为单片机的内部存储器有限,用unsigned char可以节省空间。本人开始由于都使用int型,导致最后生成的hex文件过大。但是,当我们使用的数据的值大过256时,我们就不能使用unsigned char类型,否则就会导致数据溢出,这时我们就要使用unsigned int型或short型,本人在调试的时候,当速度小的时候都能够正常显示,当速度很大的时候,1602显示的数据就不对,经过对程序的检查才知道是数据类型的定义问题。之后就是程序的流程必须先画好,程序各个模块的代码先写好,之后再根据程序的流程图整合各个模块的小程序,同时要注意程序的时序问题。[13]

4.2.结果分析

本系统使用的是光电对管来进行数据采集,光电对管产生的信号非0即1,也就是方波,因为实验条件有限,因此,本人使用信号发生器来模拟自行车行驶过程中,光电对管所采集到的信号。1HZ就表示自行车每秒钟转一圈。本系统软件中计算速度的公式是:speed=3.14*width*count/2;width是通过键盘输入的,count就是计数器,因为程序是根据跳变来计数的,所以最后除以2。下表就是不同的width,不同的频率所显示的速度值,以及理论值。测试结果见表5-1。

表5-1 测试数据表

5总结与展望

本文对自行车里程表作了细致、全面、规范的分析;对总体相应的软、硬件进行了设计、制作及调试,并贯穿至设计的全过程。对文中所提到的各种算法都进行了处理,并得出结论。所做工作如下:

(1)对设计中所需要的元件分析其原理和性能,极其应用和发展。 (2)详细介绍本自行车里程表硬件设计的方案,电路图,并附上说明。 (3)详细介绍软件设计方法,并给出个部分的程序清单。 (4)给出对本设计进行仿真调试的过程。 系统设计中有待改进的方面有一下几点:

(1) 显示的速度和里程值有误差:在速度值不大的时候误差比较小,但是当速度值大的时候误差就比较大,而里程数也只有精确到0.1km。

(2) 里程的值不能够保存:本系统测量的里程数只能是本次行驶的里程,不能测量一共的里程数,因此可以加个外部程序存储器来储存里程数,使掉电后仍有效。

(3)只测量了速度跟里程:为了更多的需要,里程表可以增加温度显示,人体消耗的热量等等。[11]

本次设计时间从开始选题算起,已经花费近五个月的时间去分析论证、设计制作和调试功能,已具有可实用性,基本达到了设计任务目标要求。系统的设计涵盖了软件和硬件两个方面,虽然遇到了不少的困难,但是还是在自己的努力和老师的指导下完成了整个系统的基本功能。

致谢

本论文是在导师吴平老师的悉心指导下完成的,在此我首先对吴老师表示最诚挚的谢意!

在此,我要感谢物理与电子信息学院的每位教导过我的老师和同学们,感谢他们在我的工作和课题研究中给予了我很多的关心、支持和帮助,使得我能顺利地工作和完成课题 最后,向所有关心、支持、帮助过我的各位老师、领导、同学和朋友们再次表示诚挚的感谢!

参考文献

[1] 何立民. 单片机高级教程—应用与设计[M].北京:北京航空航天大学出版社,2000年:100-150.

[2] 潘栋. 单片机在自行车里程表中的应用[J].电子与自动化,1998,3:42-43. [3] 高锋.单片微型计算机原理与接口技术[M].北京:科学出版社,2003:140-150. [4] 童诗白.华成英.模拟电子技术基础[M].北京:高等教育出版社,2001:434- 438. [5] 郑农发.电子式车速里程表[M].芜湖:安徽机电学院,1999-10:18-27.

[6] 刘清波,菜淑珍,孙业歧,史楠.基于单片机的汽车里程表设计[N].河北:《河北

大学学报(自然科学版)》,2002,3:277-278.

[7] 王锁弘.电子车速里程表的单片机实现方案[J].国外电子元器件,2004,5:7-10. [8] 刁文兴.自行车电子里程表的初步设计[N].南京:《南京工业职业技术学院学报》,

2004,2:31-33.

[9] 张怀强,周通,陆坤,何为民.基于单片机与光电传感器的电动自行车速度与里程

表的设计[J].《今日电子》,2006 ,7:49-52.

[10] 卢结成.电子电路实验及应用课题设计[J].北京:中国科学技术大学出版社,

2002,2:130-140.

[11] 诸德宏,潘天红,朱湘临.数字式汽车里程表的的设计[J].江苏:江苏大学电气信

息工程学院,2002-10,12:830-832.

[12] 周航慈.单片机应用程序设计技术[M].北京:北京航空航天大学出版社,1991,3:

266-286. [13] 汤向恒,袁端才.用单片机实现的电子式里程表[J].湖南:电子世界,2003,2:

37. [14] 王义方.周伟航.微型计算机原理及应用[M].北京:机械工业出版社,1997:20-25. [15] 王煜东. 传感器及应用[M].北京:机械工业出版社. 2004:125-128.

附录1程序原代码

#include #include #include sbit RS = P2^0; sbit RW = P2^1; sbit EN = P2^2; sbit p=P3^0; sbit q=0;

unsigned int m_usetime=0; float distance=0, speed=0; float wheel_width=0; unsigned char count=0; unsigned char distance_n=0; unsigned char k[32] ; ////////////////////////////// /////////////软件延时///////// ////////////////////////////// void delay(unsigned int n) {

unsigned int cc; while(n-->0) {

for(cc=10;cc>0;cc--); } }

////////////////////////////// ////////////读lcd状态指令///// ////////////////////////////// void recom( ) { EN=0; RS=0; RW=1;

EN=1; }

////////////////////////////// //////////测试是否忙////////// ////////////////////////////// void busytest() { P1=0xff; RS=0; RW=1; EN=1;

while((P1&0x80)==0x80) {

EN=0; //这两句protues仿真必须加 EN=1; // };

EN=0; }

//////////////////////////////

////写lcd指令不判断是否忙///// ////////////////////////////// void wrcom(unsigned char n) { RS=0; RW=0; P1=n; EN=1; _nop_(); EN=0; }

//////////////////////////////

/////写lcd指令判断是否忙//////

//////////////////////////////

void wrcomn (unsigned char n) { busytest(); wrcom(n); }

///////////////////////////// ///////////清屏////////////// ///////////////////////////// void clrscr() {

wrcomn(0x01); //清屏 }

///////////////////////////// ///////////初始化lcd///////// ///////////////////////////// void initlcd() {

delay(150); wrcom(0x38); delay(50); wrcom(0x38); delay(50); wrcom(0x38);

wrcomn(0x38);

wrcomn(0x08); //关显示 不显示光标 wrcomn(0x01); //清屏 wrcomn(0x06); //光标模式 wrcomn(0x0c); //开显示 }

//////////////////////////// //////////设置光标位置////// ////////////////////////////

void setpos(unsigned char x,unsigned char y) {

busytest(); x&=0x0f; y&=0x03; if(y==0x00) wrcomn(x|0x80); else if(y==0x01)

wrcomn((x+0x40)|0x80); }

//////////////////////////// ////////////写数据////////// ////////////////////////////

void wrightdata(unsigned char n) {

busytest(); RS=1; RW=0; P1=n; EN=1; _nop_(); EN=0; }

//////////////////////////// ///////////写字符串数据///// ////////////////////////////

void wrightstrdata(unsigned char *s,unsigned int length)

{ int x,y;

int YMAX,XMAX[2]; if(length>16) {

YMAX=2;

XMAX[0]=16; XMAX[1]=length-16; } else {

YMAX=1; XMAX[0]=length; XMAX[1]=0; }

for(y=0;y

////初始化/////// void Init() {

TMOD=0x01;

TH0=0xfc;//设定定时时间,1.00043362

TL0=0x18; ET0=1; EA=1;

TR0=1;

}

//////接收脉冲/////// void recv() {

if(q!=p) { q=p; count++; }

}

////中断///////////// void Timer() interrupt 1 { TR0=0;

TH0=0x0fc;//重新设定定时时间

TL0=0x18; //printf("%d",count); if(m_usetime==1000)//每五秒算一次

速度

{

//k[7]=count/100+48; //k[8]=(count%100)/10+48;

//k[9]=count%10+48;

约为

speed=(6.28*wheel_width*0.5*count)/1.0;//计

算速度

m_usetime=0; count=0;

distance_n+=5*speed; if(distance_n>=100) {

distance=(distance+distance_n/1000.0);//为什么全局变量没起作用

distance_n=0; }

}

else m_usetime++; TR0=1;

{

P0=a1; delay(10); m=P0;

switch( m & 0xf0 ) { }

case 0x70:

ptr=i*4; FLAG0=1; break;

}

//----------------------------------------------------------------------------------

//键盘码数组 /*unsigned {0x01,0x02,0x03,0x04,

0x05,0x06,0x07,0x08,

char

tab[16]=

case 0xb0:

ptr=i*4+1;

FLAG0=1; break;

case 0xd0:

ptr=i*4+2;

FLAG0=1; break;

0x09,0x0a,0x0b,0x0c,

case 0xe0:

ptr=i*4+3;

FLAG0=1; break;

0x0d,0x0e,0x0f,0x10

unsigned char Scan_Key(void) {

char a1,i;

unsigned char m_i=0; unsigned ptr1=3;

unsigned char ptr=0,m,m_ptr,m_ptr1;

};*/

default: break;

if(FLAG0==1) {

break; //有按键,则退出扫描 }

a1=a1>>1 | 0x80;

//高位补1,

bit FLAG0;

FLAG0=0;

while(!FLAG0)

{

//FLAG0=0; a1=0xf7;

由于P1.7~4末接+5V,而是由指令加载高电平

}

if(ptr

m_ptr=ptr; if(ptr>10)return 'a';

for(i=0;i

}

return m_ptr;

}

//////////////////////////// ///////////主程序/////////// //////////////////////////// void main() {

unsigned char i; unsigned char na; unsigned int s; unsigned int d=0; unsigned char w,w1,w2; EN=0; initlcd(); clrscr(); q=p;

//////程序初始读轮胎的宽度/////

k[0]=160; k[1]=87; k[2]=105; k[3]=100; k[4]=116; k[5]=104; k[6]=58;

for(i=7;i

wrightstrdata(k,32); w1=Scan_Key(); delay(1500); w2=Scan_Key();

if(w2=='a') w=w1; else

w=w1*10+w2; wheel_width=w/100.0; if(w

k[7]=w+48; } if(w>=10) {

k[7]=w/10+48; k[8]=w%10+48; }

while(d++

//k="speed: 20 m/s distance: 20 m " //////////////////////////////////

//k[8],k[10]两位显示速度 // //k[26],k[27],k[29]三位显示路程 // //////////////////////////////////

k[0]=160; k[1]=83; k[2]=112; k[3]=101; k[4]=101; k[5]=100; k[6]=58; k[7]=160; k[9]=46; k[11]=160;

k[12]=109; k[13]=47; k[14]=115; k[15]=160;

///////第一行

k[16]=68; k[17]=105; k[18]=115; k[19]=116; k[20]=97; k[21]=110; k[22]=99; k[23]=101; k[24]=58; //k[25]=160; k[28]=160; k[30]=107; k[31]=109; ///////第二行 /*

for(i=0;i

/////////////////////////////////////////////////

//s为速度,d为路程,计算结果要×10后再放入s和d///

///////////////////////////////////////////////// recv(); s=speed*10; d=distance*10; if(s

{

k[7]=160; k[8]=48; k[9]=46; k[10]=s+48; }

if(s>=10&&s

na=s/10; k[8]=na+48; k[9]=46; na=s%10; k[10]=na+48; } if(s>100) {

na=s/100; k[7]=na+48; na=(s%100)/10;

k[8]=na+48; k[9]=46; na=s%10; k[10]=na+48; } if(d

k[25]=k[26]=160; k[27]=48; k[28]=46; k[29]=d+48; }

if(d>=10&&d

{

k[25]=160; k[26]=160;

na=d/10; k[27]=na+48; k[28]=46; na=d%10; k[29]=na+48; }

if(d>=100&&d

k[25]=160; k[28]=46; na=d/100; k[26]=na+48; na=(d%100)/10; k[27]=na+48; na=d%10; k[29]=na+48;

}

if(d>=1000) {

na=d/1000; k[25]=na+48; na=(d%1000)/100; k[26]=na+48; na=(d%100)/10; k[27]=na+48; k[28]=46; na=d%10; k[29]=na+48; }

wrightstrdata(k,32); } }

附录2系统电路图

27


相关文章

  • 自行车简易数字里程表设计毕业设计论文
  • 毕业设计论文 摘 要 随着居民生活水平的不断提高,自行车已经不仅仅是普通的代步.运输工具,而是成为人们娱乐.休闲.锻炼的首选.自行车简易数字里程表能够满足人们最基本的需求,让人们能清楚地知道当前的速度.里程等物理量.本论文主要阐述一种基于霍 ...查看


  • 电子信息工程毕业设计题目大全
  • 1 压力容器液位测量 2 多功能遥控小车 3基于RS232的仓库多点温度.湿度.气 4压检测系统 5自动控制升降旗系统 6基于RS485的温度报警系统 7基于模糊算法的水温控制系统的设计 8多分机电话交换机 9简易火灾自动报警系统 10基于 ...查看


  • 自行车里程表设计
  • 专业综合课程设计 题 目 自行车数字里程表设计 学 院 管理科学与工程学院 专 业 电子信息工程 班 级 08信工(3)班 学 号 200883053 姓 名 钟素娟 摘 要 自行车里程表是用于远距离连续测量自行车行驶速度和距离的仪表.它分 ...查看


  • 教你如何选择电动车
  • 教你如何选择电动车 发布时间: 2007-5-09 07:29 | 发布作者: 平庄信息- &nbs | 信息来源: 本站原创 | 随着人们生活水平的提高,生活节奏的日益加快,电动自行车因其方便.快捷.无污染.价格低廉的特点,正在成 ...查看


  • 铁路线路大修毕业设计
  • 摘 要 本设计是运用所学轨道基本理论,知识和技能,进行工程设计的综合训练,是综合素质和工程实践能力的重要体现,是每个学生都必须经过的作为一个铁道工程技术人员所必须的训练,有助于到工作岗位的过渡. 线路设备大修的基本任务是:根据运输需要及线路 ...查看


  • 中间站课程设计
  • 中间站课程作业 (此部分为<选线设计Ⅱ>课程作业) 一.线路设计资料 利用新线课程设计资料 二.中间站布置 1.选择车站的布置图形并确定到发线数量 (1)选择车站的布置图形 中间站一般采用横列式,其图形基本上已定型化,本作业可参 ...查看


  • 基于单片机自行车速度里程表的设计
  • 毕业设计(论文) (成教) 题目: 基于单片机的自行车速度里程表的设计 院 (系) : 机电工程学院 专 业: 应用电子ZK331101 姓 名: 李 大 学 号: 指导教师: 田 丰 二〇一三年一月二十日 毕业设计(论文)任务书 2 毕业 ...查看


  • 电子信息类毕业设计参考题目
  • 毕业设计 第一题 点阵电子显示屏制作 一.任务 设计并制作一台简易LED电子显示屏,16行*32列点阵显示,原理示意图如下: 显示器 PC机 二.要求 控制器 LED电子显示屏原理框图 1.基本要求:设计并制作LED电子显示屏和控制器. 1 ...查看


  • 全国电子设计大赛题目分析
  • 第6章 全国大学生电子设计竞赛题目与 分析 6.1 全国大学生电子设计竞赛简介 6.1.1 总则 1.指导思想与目的 全国大学生电子设计竞赛是教育部倡导的大学生学科竞赛之一,是面向大学生的群众性科技活动,目的在于推动高等学校促进信息与电子类 ...查看


热门内容