自行车里程表设计论文.docx
- 文档编号:11285081
- 上传时间:2023-02-26
- 格式:DOCX
- 页数:29
- 大小:89.84KB
自行车里程表设计论文.docx
《自行车里程表设计论文.docx》由会员分享,可在线阅读,更多相关《自行车里程表设计论文.docx(29页珍藏版)》请在冰豆网上搜索。
自行车里程表设计论文
自行车里程表
设计论文
【摘要】以AT89S52型单片机为核心,实时测量并显示自行车行驶过程中的各项参数。
【关键词】单片机 LCD 干簧管 累计里程 速度
【作品要求】
设计一个可以适用自行车的轻便、省电、全天候野外使用的自行车里程表。
(1)基计要求
总里程〈999.99km;
可以轮流显示或选择显示(用十进制数):
里程——当前行驶里程;
速度——当前平均速度km/h;
最大速度——本次行驶中的最大速度;
时间——当前行驶累计时间,时、分、秒;
电源不高于5V,体积小、结构可靠,便于安装及使用。
(2)发挥部分
可以显示最大加速度;用可编程器件实现;用单片机实现
【方案设计与讨论】
1.速度测量原理
测量自行车的速度的原理有两种:
1)测量一定时间间隔t1里自行车车轮转过的圈数qs。
假设车轮周长为tc,则速度V=tc*qs/t1
2)测量自行车车轮转过一圈的时间t2,则速度V=tc/t2
本里程表是根据原理2计算速度的。
2.传感器的选择
1)红外对管。
把红外对管分别安装在自行车车轮的两侧,当车轮转动时,辐条会阻挡红外对管的光路,接收管输出低电平,单片机根据此信号可计算里程、速度等。
红外对管的优点是测量精度高,缺点是安装比较复杂和容易受外来光线、灰尘等的影响。
2)开关型霍尔传感器。
霍尔传感器是利用霍尔效应把磁输入信号转换成电信号的器件。
把开关型霍尔传感器安装在自行车贴近车轮的支架上,磁钢安装在辐条上,当磁钢靠近霍尔传感器的时候,传感器输出一个无抖动的低电平,单片机根据此信号可计算里程、速度等。
霍尔传感器的优点是稳定和安装简易,缺点是成本较高。
3)干簧管。
干簧管是一种磁敏的有触点无源电子开关元件,应用在里程表上的原理与开关型霍尔传感器类似,把干簧管安装在自行车贴近车轮的支架上,磁钢安装在辐条上,当磁钢靠近霍尔传感器的时候,干簧管闭合,单片机根据此信号可计算里程、速度等。
干簧管的优点是成本低廉和安装简易,缺点是比较脆弱和不够稳定。
本里程表选用干簧管作为传感器。
给干簧管套上废弃笔杆,可克服其脆弱的缺点;软件防抖可克服其不够稳定的缺点。
3.显示模块的选择
1)动态扫描LED数码管显示。
里程表的显示内容以数字为主,利用LED数码管可基本满足使用要求,且成本较低。
但是用动态扫描的方式驱动数码管,亮度太低,在阳光下几乎看不见显示内容,失去使用价值。
2)串行静态LED数码管显示。
把单片机的串行口设置为方式0(同步移位寄存器),输出显示信息,可实现LED数码管的静态显示,其亮度令人满意。
但由于要使用74HC164/74LS164串并转换芯片驱动LED数码管,因此会带来体积大、成本高、功耗高等的缺点。
3)LCD液晶显示模块。
液晶显示模块具有体积小、功耗低、显示内容丰富等特点,现在字符型液晶显示模块已经是单片机应用设计中最常用的信息显示器件了。
本里程表使用1602LCD作为显示模块。
【功能描述】
以AT89S52型单片机为核心,实时测量并显示自行车行驶过程中的各项参数,包括当前行驶累计时间、当前行驶累计里程(m/km自动调整)、当前速度(km/h)、最大速度(km/h)、平均速度(km/h)、加速度(m/s2)、当前时间等,各参数分屏显示。
可更改自行车轮胎直径,适应不同的自行车,通用性好。
本里程表具有时钟功能,不安装在自行车上时也可作为时钟使用,实用性高。
【操作说明】
里程表板面如上图所示,包括电源2pin排针、干簧管3pin排针、液晶显示器、液晶背光开关、电源开关、电源LED指示灯、功能按钮SW1-SW5、Reset按钮。
接通电源或按Reset后,显示欢迎画面:
DigitalBikeMeter
Welcome….
2秒后进入时钟设置画面:
SetTime
00:
00:
00
按SW1-SW3调整时钟后,按SW4确认。
接着进入自行车轮胎半径设置画面:
SetBikeTireL=
55cm
默认设置为55cm,对应22英寸自行车轮胎半径。
附:
轮胎直径大小英寸与厘米对照表
英寸
16”
18”
20”
22”
24”
26”
28”
28.5”
厘米
40cm
45cm
50cm
55cm
61cm
66cm
71cm
72cm
按SW1、SW2调整轮胎直径后,按SW4确认,里程表开始工作。
各项参数分成四屏选择显示,按动SW5(Disp)按以下次序进行切换:
【结构框图】
系统由干簧管、设置选择模块、显示模块、蜂鸣器模块、供电模块和单片机小系统构成。
由设置选择模块选择显示模式后,单片机实时采集、处理后显示。
【具体硬件电路及工作原理】
里程、速度、加速度等都是由干簧管测量。
已知自行车轮胎的直径tl,轮子每转动一圈,安装在车轮辐条上的磁钢接近干簧管一次,干簧管闭合,送一个下降沿信号给单片机的外部中断0,产生一次中断,圈数qs加1。
两个相邻的下降沿信号的时间由单片机定时器1计时(设为ssj),那么计算累计里程S和当前速度V的公式为:
S=tl*3.14*qsV=tl*3.14/ssj
若速度大于28.8km/h(8m/s)则P2.4输出低电平,蜂鸣器报警,提示速度过大。
处理速度数据时同时刷新最大速度及计算Vm、平均速度Va、加速度a。
单片机定时器0定时时间为50ms,每20次刷新系统时钟及计算累计行驶时间。
【相关元器件及其简介】
(1)AT89S52单片机简介
AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash 存储器。
使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
AT89S52具有以下标准功能:
8k字节Flash,256字节RAM,32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,AT89S52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
(2)1602LCD液晶显示模块
液晶显示模块具有体积小、功耗低、显示内容丰富等特点,现在字符型液晶显示模块已经是单片机应用设计中最常用的信息显示器件了。
本里程表使用常见的1602字符型LCD模块。
1602可以显示2行16个字符,有8位数据总线D0-D7,和RS、R/W、E三个控制端口,工作电压为5V,并且带有字符对比度调节和背光。
(3)干簧管
干式舌簧管简称干簧管,是利用磁场信号来控制的一种线路开关元件。
干式舌簧管以其结构固有的特点,目前已被广泛应用到各种自动化和微型化的自动控制零件及通讯检测设备中,作为灵敏而快速的开闭及转换电路的执行工件。
在本里程表中,干簧管安装在自行车贴近辐条的支架上,磁钢安装在辐条上。
当磁钢远离干簧管时,干簧管断开,单片机外部中断0(P3.2)保持高电平。
当磁钢靠近干簧管时,干簧管闭合,送一个下降沿信号给单片机的外部中断0,产生一次中断。
【系统调试过程简述】
自行车里程表的原理比较简单,我编好一个比较简单但是核心的程序(只计算里程和速度)在KeilC上仿真,经过短暂的调试就成功了,这证明我关于里程表的最核心的想法是正确的,这给了我后面的制作和调试很大的信心。
紧接着是在单片机上搭建硬件,重点是按键防抖动。
我的模式选择按钮是接到单片机的外部中断的,一开始我按照普通按钮的防抖动的方法测试,没有成功。
于是在中断服务程序的开始关闭中断,末尾再开中断,还是不行。
后来在中断服务程序的末尾加了这样一句:
IE1=0;
其作用就是清除中断标志。
因为即使单片机的外部中断是关闭的,但只要在中断服务程序执行期间按键抖动,中断标志又会置1,若没有清除中断标志,退出中断服务程序后又会执行一次服务程序,这样按一次按键就会执行两次中断服务程序。
我的里程表的最初版本是利用串行LED数码管显示作为显示模块的(简介请参阅附录二)。
但制成后发现体积太大,而且功耗比较高,不适合用于要求小巧、坚固、耐用的自行车里程表上。
后来改用1602LCD,里程表体积大幅度减小,经测试,背光开启时电流为45mA左右,背光关闭时为25mA左右,2500mahAA×4的电池组供电最多可达100小时,可以满足使用要求。
附录 程序流程图及程序代码
程序代码
#include
#defineucharunsignedchar
/****************************************************************
引脚定义:
P20=SW1 时钟设置时更改“时”,直径设置时更改十位
P21=SW2时钟设置时更改“分”的十位,直径设置时更改个位
P22=SW3时钟设置时更改“分”的个位
P23=Enter 确认更改设置
P32=Disp 正常工作时更改显示模式
****************************************************************************/
sbitP20=P2^0;
sbitP21=P2^1;
sbitP22=P2^2;
sbitP23=P2^3;
sbitP32=P3^2;
sbitRS=P3^7;
sbitRW=P3^6;
sbitE=P3^5;
sbitbusy=P1^7;
/****************************************************************
变量定义:
i 延时变量
qsls圈数临时变量,用于判断里程显示选用m还是km作为单位
qs 圈数
sj 累计行驶时间,单位为秒
totallc累计里程
pjsd 平均速度
ssji 定时器T1 20ms中断次数,用于计算速度等
sji 本次速度对应的20ms中断次数
sjiold上次速度对应的20ms中断次数
aa加速度
sd2 当前速度
mxsd 用于更新最大速度
mxsd2 最大速度对应的20ms次数
tc 轮胎周长
*s字符串显示子程序字符指针
line字符串显示子程序列数
row字符串显示子程序行数
com写控制字
dat显示码字
gw累计里程、当前速度、累计时间、最大速度、平均速度、加速度的个位
sw累计里程、当前速度、累计时间、最大速度、平均速度、加速度的十位
bw累计里程、当前速度、累计时间、最大速度、平均速度、加速度的百位
qw累计里程、当前速度、累计时间、最大速度、平均速度、加速度的千位
ww累计里程、累计时间的万位
sww累计里程、累计时间的十万位
ssj 定时器T050ms中断次数,每20次sj加1
cgw当前时间(时钟)的个位
csw当前时间(时钟)的十位
cbw当前时间(时钟)的百位
cqw当前时间(时钟)的千位
cww当前时间(时钟)的万位
csww当前时间(时钟)的十万位
cww2当前时间(时钟)的辅助万位
MODE显示模式
tr1轮胎设置变量1(十位)
tr2轮胎设置变量2(个位)
****************************************************************************/
unsignedinti,qsls;
unsignedlongqs,sj,totallc,pjsd,ssji,sji,sjiold,aa,sd2,mxsd,mxsd2,tc;
uchar*s,line,row,com,dat,gw,sw,bw,qw,ww,sww,ssj,cgw,csw,cbw,cqw,cww,csww,cww2,MODE,tr1,tr2;
/***********************************voidwait()*****************************
该函数的作用是对LCD进行检测,看LCD是否处于忙的状态.当bflag=1时表示忙,
此时不可以向LCD进行读写操作.而当busy=0时,表示可以向它读写数据.
****************************************************************************/
voidwait()
{P1=0xff;
RW=1;RS=0;
do{E=0;E=1;}while(busy==1);
}
/**************************************voiddispone()*******************************
该函数的作用是向LCD写入数据并显示出来.
***********************************************************************************/
voiddispone(dat)
{P1=dat;
RW=0;RS=1;
E=0;E=1;
wait();
}
/**********************************voidwrcom()*******************************
该函数的作用是向LCD写入控制字.
******************************************************************************/
voidwrcom(com)
{P1=com;
RW=0;RS=0;
E=0;E=1;
wait();
}
/***************************************voidinit_LCD()*******************************
该函数的作用是初始化LCD.
*****************************************************************************************/
voidinit_LCD()
{wrcom(0x01);
wrcom(0x06);
wrcom(0x38);
wrcom(0x0c);
}
/****************************************voiddispmore()********************************
该函数的作用是向LCD写入一串数据,并把数据串显示出来.
******************************************************************************************/
voiddispmore(line,row,uchardat[],i)//格式为dispmore(第几行,第几列,开始要显示的字符地址,显示几个字符);
{ucharcom;
s=dat;
if(line==1)
{com=0x80+row-1;
wrcom(com);
while((i--)!
=0&&com<=0x8f)
{dispone(*s);
com++;
s++;
}
}
else
{com=0xc0+row-1;
wrcom(com);
while((i--)!
=0&&com<=0xcf)
{dispone(*s);
com++;
s++;
}
}
}
/****************************************voidttimep()********************************
累计行驶时间数据处理及显示子程序
******************************************************************************************/
voidttimep()
{
sww=sj/36000;
ww=sj%36000/3600;
qw=sj%3600/600;
bw=sj%600/60;
sw=sj%60/10;
gw=sj%10;
wrcom(0xc1);
dispone('T');
dispone('i');
dispone('m');
dispone('e');
dispone('');
dispone('');
dispone(sww+0x30);
dispone(ww+0x30);
dispone(':
');
dispone(qw+0x30);
dispone(bw+0x30);
dispone(':
');
dispone(sw+0x30);
dispone(gw+0x30);
}
/****************************************voidtimer1()********************************
T1中断服务子程序,每20ms中断一次,ssji加1,根据公式S=tc*qs和V=tc/ssj计算累计里程和
******************************************************************************************/
voidtimer1()interrupt3
{
ssji++;
TH1=0xb1;
TL1=0xdf;
}
/****************************************voidlcp()********************************
累计里程数据处理和显示子程序,若<999m则单位为m,若>999m则单位为km
******************************************************************************************/
voidlcp()
{
qsls=100000/tc;
if(qs>qsls){
sww=qs*tc/10000000;
ww=qs*tc%10000000/1000000;
qw=qs*tc%1000000/100000;
bw=qs*tc%10000000/10000;
sw=qs*tc%10000/1000;
wrcom(0x81);
dispone('S');
dispone('');
dispone('');
dispone('');
dispone('');
dispone(sww+0x30);
dispone(ww+0x30);
dispone(qw+0x30);
dispone('.');
dispone(bw+0x30);
dispone(sw+0x30);
dispone('');
dispone('k');
dispone('m');
}
else{
qw=qs*tc%100000/10000;
bw=qs*tc%10000/1000;
sw=qs*tc%1000/100;
gw=qs*tc%100/10;
wrcom(0x81);
dispone('S');
dispone('');
dispone('');
dispone('');
dispone('');
dispone('');
dispone('');
dispone(qw+0x30);
dispone(bw+0x30);
dispone(sw+0x30);
dispone('.');
dispone(gw+0x30);
dispone('');
dispone('m');
}
}
/****************************************voidpjsdp()********************************
平均速度数据处理及显示子程序
******************************************************************************************/
voidpjsdp()
{
pjsd=qs*tc*36/sj;
qw=pjsd%100000/10000;
bw=pjsd%10000/1000;
sw=pjsd%1000/100;
gw=pjsd%100/10;
wrcom(0x82);
dispone('V');
dispone('a');
dispone('');
dispone('');
dispone(qw+0x30);
dispone(bw+0x30);
dispone('.');
dispone(sw+0x30);
dispone(gw+0x30);
dispone('');
dispone('k');
dispone('m');
dispone('/');
dispone('h');
}
/****************************************voidsdp()********************************
当前速度数据处理及显示子程序
******************************************************************************************/
voidsdp()
{
if(sji!
=0)
sd2=tc*1800/sji;
elsesd2=0;
qw=sd2%100000/10000;
bw=sd2%10000/1000;
sw=sd2%1000/100;
gw=sd2%100/10;
wrcom(0x82);
dispone('V');
dispone('');
dispone('');
dispone('');
dispone(qw+0x30);
dispone(bw+0x30);
dispone('.');
dispone(sw+0x30);
dispone(gw+0x30);
dispone('');
dispone('k');
dispone('m');
dispone('/');
dispone('h');
}
/************************************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 自行车 里程表 设计 论文
![提示](https://static.bdocx.com/images/bang_tan.gif)