当前位置:文档之家› 自行车测测速测距仪

自行车测测速测距仪

} void timer0_intt() interrupt 1 // {
TH0=(65536-10000)/ 256; TL0=(65536-10000)% 256; //设定定时器的初值,使得没 10ms 中断一次 m_second += 10; //因为中断每 10 毫秒一次,所以这里每次加 10; }
lcd_wdat(‘e’);
lcd_wdat(‘d’);
lcd_wdat(‘:’);
lcd_wdat( (int)speed%10 );
//显示速度的整数部分
lcd_wdat( (int)(speed*10)%10 ); //显示速度的小数第一位
lcd_wdat( (int)(speed*100)%10 ); //显示速度的小数第二位
下面稍微讲解一下测速与测距的原理。首先是霍尔传感器的原理。如图 2.5 所示当霍尔 传感器没有处于强烈的磁场中的时候,它的信号引脚输出的是高电平,反之,当有强烈的磁 场时,它输出的是低电平。
图 2.5 霍尔传感器的接线图
图 2.6 连接好的霍尔传感器
从图 2.5 中,大家也看出了霍尔传感器的接法。最左边的引脚为 Vcc 电源引脚,中间的 引脚为 GND 引脚,最右边的引脚为输出引脚。这里解释一下为什么输出引脚要有一个电阻 接到 Vcc 上面。因为霍尔传感器的输出引脚是漏极输出,所以当需要输出高电平时必须要 接上拉电阻到 Vcc 电源。这里的上拉电阻可以使用 1K--10K 的电阻。星星哥使用的是 10K 的电阻。知道了霍尔传感器的最用之后,具体应该怎么用上去呢?可以这样做,把磁钢(其 实就是产生磁场的磁铁)固定在钢圈上面,把霍尔传感器固定在自行车的钢轴上面,如图 2.7 所示。
下面星星哥讲解一下程序的编写。 这里我把 1602 的操作封装在 Star1602.c 源程序中,在主函数中包含 Star1602.h 即可。 (Star1602.h 和 Star1602.c 在本教程的最后给出)
#include<reg52.h>
#include<Star1602.h>
#define CIRCLE 1.8 //宏定义 车轮的周长(这个要根据实际的车轮进行设置)
lcd_wdat(‘m’);
lcd_wdat(‘/’);
lcd_wdat(‘s’);
//第二行,显示里程 lcd_pos(0x80); //设定液晶的写入位置为第二行第一格 lcd_wdat(‘L’); lcd_wdat(‘e’); lcd_wdat(‘n’); lcd_wdat(‘g’); lcd_wdat(‘t’); lcd_wdat(‘h’);
图 2.7 磁钢的安装和霍尔传感器的安装 那么,当每旋转一圈,当磁钢运动到霍尔传感器附近时,霍尔传感器输出低电平,当磁钢远 离霍尔传感器时,霍尔传感器输出高电平。也就是说自行车轮胎每旋转一圈,霍尔传感器就 输出一次低电平。那么只要测出两次输出低电平之间的时间间隔,然后再结合自行车轮胎的 周长就可以很轻松的求出速度。而对于自行车的行驶里程,只要记录下霍尔传感器输出低电 平的次数,再乘以周长就可以求出了。
入口参数:cmd
出口参数:
*****************************************************************************/
static void lcd_wcmd(unsigned char cmd)
{
while(lcd_bz());
//判断 LCD 是否忙碌
图 1.1 安装好之后的自行车测速测距仪
图 1.2 自行车行驶过程中的实拍图(速度 2.388 米/秒 距离:2334.52 米)
2、项目制作教程
2.1 硬件准备
在制作 该项目之前 首先得准备 一些必要的 硬件。他们 分别是单片 机最小系统 板, 1602 液晶,霍尔传感器、磁钢和电池(没有充电电池可以使用电池盒加普通 5 号电池)。
lcd_wcmd(0x38); delay(100); lcd_wcmd(0x0c); delay(100); lcd_wcmd(0x06);
delay(100); lcd_wcmd(0x01); delay(100); } /***************************************************************************** 函数功能:LCD 写入一个整形数据 入口参数:int x *****************************************************************************/ void lcd_write_int(unsigned int x); { unsigned char x1,x2,x3,x4,x5; x1 = x/10000; x2=x%10000/1000; x3=x%1000/100; x4=x%100/10; x5=x%10; lcd_wdat(x1+0x30); lcd_wdat(x2+0x30); lcd_wdat(x3+0x30); lcd_wdat(x4+0x30); lcd_wdat(x5+0x30); }
入口参数:ms 出口参数: *****************************************************************************/ static void delay(unsigned char ms) {
unsigned char i; while(ms--) {
图 2.1 单片机最小系统
图 2.2 1602 液晶
图 2.3 霍尔传感器和磁钢
图 2.4 电池
准备好了这些东西之后,就可以非常 happy 的开始制作了。当然这里的电池,星星哥使用的
是充电电池。因为刚好拆掉一辆遥控小车,所以有了这块充电电池。其实使用电池盒加电池
更加便宜和实惠,更加适合入门的人。
2.2 原理讲解
{
lcd_init(); //初始化液晶函数 TMOD = 0x01; //打开定时器 0,并设定其工作方式为 16 位定时模式。 TH0=(65536-10000)/ 256; TL0=(65536-10000)% 256; //设定定时器的初值,使得没 10ms 中断一次 EA = 1; //允许总中断 ET0 = 1; //允许定时器 0 终端 TR0 = 1; //启动定时器 0
void lcd_wdat(unsigned char dat); //液晶写入字符
void lcd_write_int(unsigned int x); //液晶显示一个整形变量
#endif
附件 2 Star1602.c
#include <reg52.h> #include "1602.h"
/***************************************************************************** 函数功能:LCD 延时子程序
DIY 自行车测速测距仪
—— 星星哥项目教程
1、项目介绍
该项目中,星星哥教大家制作一个自行车测速、测距仪。具有测量自行车行驶的瞬时速 度和累计路程的功能。把它放在自行车的龙头上面,霸气十足,而且对于想要通过骑车运动 的人来说,可以很好的把握自己骑行的速度和路程,给单调的骑车带来趣味性。下面的几张 照片是项目完成后,星星哥在使用过程中拍摄的,别提有多拉风了。吼吼!!
附件 1 Star1602.h
#ifndef __STAR1602_H__ #define __STAR1602_H__
sbit rs= P2^0; sbit rw = P2^1; sbit ep = P2^2;
// // //
void lcd_init();
//液晶初始化函数
void lcd_pos(unsigned char pos); //设定液晶的显示位置函数
rs = 0;
rw = 0;
ep = 0;
delay(5);
P0 = cmd;
delay(5);
ep = 1;
delay(5); ep = 0; }
/***************************************************************************** 函数功能: 设定显示位置子程序 入口参数:pos 出口参数: *****************************************************************************/ void lcd_pos(unsigned char pos) {
lcd_wcmd(pos | 0x80); }
/***************************************************************************** 函数功能:写入显示数据到 LCD 子程序
入口参数:dat
出口参数:
*****************************************************************************/
while(1) //大循环
{
while(Signal); //等待霍尔传感器信号线拉低;
speed = CIRCLE *1000 / m_second ; //计算速度。 length += CIRCLE ; //路程加一个车轮周期 //第一行,显示速度 lcd_pos(0x0); //设定液晶的写入位置为第一行第一格 lcd_wdat(‘S’); lcd_wdat(‘p’); lcd_wdat(‘e’);
bit result; rs = 0; rw = 1; ep = 1; delay(5); result = (bit)(P0 & 0x80); ep = 0; return result; }
相关主题