DIY自行车测速测距仪
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?DIY自行車(chē)測(cè)速測(cè)距儀
1、項(xiàng)目介紹
? ? ? ? ?該項(xiàng)目中,星星哥教大家制作一個(gè)自行車(chē)測(cè)速、測(cè)距儀。具有測(cè)量自行車(chē)行駛的瞬時(shí)速度和累計(jì)路程的功能。把它放在自行車(chē)的龍頭上面,霸氣十足,而且對(duì)于想要通過(guò)騎車(chē)運(yùn)動(dòng)的人來(lái)說(shuō),可以很好的把握自己騎行的速度和路程,給單調(diào)的騎車(chē)帶來(lái)趣味性。下面的幾張照片是項(xiàng)目完成后,星星哥在使用過(guò)程中拍攝的,別提有多拉風(fēng)了。吼吼!!
? ???
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖1.1??安裝好之后的自行車(chē)測(cè)速測(cè)距儀
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖1.2?自行車(chē)行駛過(guò)程中的實(shí)拍圖(速度2.388米/秒?距離:2334.52米)
2、項(xiàng)目制作教程
2.1硬件準(zhǔn)備
在制作該項(xiàng)目之前首先得準(zhǔn)備一些必要的硬件。他們分別是單片機(jī)最小系統(tǒng)板,1602液晶,霍爾傳感器、磁鋼和電池(沒(méi)有充電電池可以使用電池盒加普通5號(hào)電池)。??
??
? ? ? ? ? ? ? ? ? ? 圖2.1?單片機(jī)最小系統(tǒng) ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖2.2?1602液晶
???
? ? ? ? ? ? ? ? ? ? 圖2.3?霍爾傳感器和磁鋼 ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖2.4?電池
準(zhǔn)備好了這些東西之后,就可以非常happy的開(kāi)始制作了。當(dāng)然這里的電池,星星哥使用的是充電電池。因?yàn)閯偤貌鸬粢惠v遙控小車(chē),所以有了這塊充電電池。其實(shí)使用電池盒加電池更加便宜和實(shí)惠,更加適合入門(mén)的人。
2.2?原理講解
下面稍微講解一下測(cè)速與測(cè)距的原理。首先是霍爾傳感器的原理。如圖2.5所示當(dāng)霍爾傳感器沒(méi)有處于強(qiáng)烈的磁場(chǎng)中的時(shí)候,它的信號(hào)引腳輸出的是高電平,反之,當(dāng)有強(qiáng)烈的磁場(chǎng)時(shí),它輸出的是低電平。
??? ?
? ? ? ? ? ? ? 圖2.5?霍爾傳感器的接線圖 ? ? ? ? ? ? ? ? ? ? ? ? ?圖2.6?連接好的霍爾傳感器
從圖2.5中,大家也看出了霍爾傳感器的接法。最左邊的引腳為Vcc電源引腳,中間的引腳為GND引腳,最右邊的引腳為輸出引腳。這里解釋一下為什么輸出引腳要有一個(gè)電阻接到Vcc上面。因?yàn)榛魻杺鞲衅鞯妮敵鲆_是漏極輸出,所以當(dāng)需要輸出高電平時(shí)必須要接上拉電阻到Vcc電源。這里的上拉電阻可以使用1K--10K的電阻。星星哥使用的是10K的電阻。知道了霍爾傳感器的最用之后,具體應(yīng)該怎么用上去呢?可以這樣做,把磁鋼(其實(shí)就是產(chǎn)生磁場(chǎng)的磁鐵)固定在鋼圈上面,把霍爾傳感器固定在自行車(chē)的鋼軸上面,如圖2.7所示。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖2.7?磁鋼的安裝和霍爾傳感器的安裝
那么,當(dāng)每旋轉(zhuǎn)一圈,當(dāng)磁鋼運(yùn)動(dòng)到霍爾傳感器附近時(shí),霍爾傳感器輸出低電平,當(dāng)磁鋼遠(yuǎn)離霍爾傳感器時(shí),霍爾傳感器輸出高電平。也就是說(shuō)自行車(chē)輪胎每旋轉(zhuǎn)一圈,霍爾傳感器就輸出一次低電平。那么只要測(cè)出兩次輸出低電平之間的時(shí)間間隔,然后再結(jié)合自行車(chē)輪胎的周長(zhǎng)就可以很輕松的求出速度。而對(duì)于自行車(chē)的行駛里程,只要記錄下霍爾傳感器輸出低電平的次數(shù),再乘以周長(zhǎng)就可以求出了。
連接好了霍爾傳感器和磁鋼,接著把剩下的單片機(jī)最小系統(tǒng)板和液晶連接正確。(這里就不詳細(xì)介紹單片機(jī)如何驅(qū)動(dòng)1602液晶的了。有疑問(wèn)的朋友可以自己百度搜索一下,不難的。)如圖2.8,是連接好的單片機(jī)系統(tǒng)和液晶。
?? ??
? ? ? ? ? ? 圖2.8?連接好的電池,單片機(jī)和液晶 ? ? ? ? ? ? ? 圖2.9?已經(jīng)固定好在自行車(chē)上的所有硬件
2.3?程序編寫(xiě)
?????下面星星哥講解一下程序的編寫(xiě)。
?????這里我把1602的操作封裝在Star1602.c源程序中,在主函數(shù)中包含Star1602.h即可。(Star1602.h和Star1602.c在本教程的最后給出)
?????
#include<reg52.h>
#include<Star1602.h>
#define?CIRCLE??1.8???//宏定義?車(chē)輪的周長(zhǎng)(這個(gè)要根據(jù)實(shí)際的車(chē)輪進(jìn)行設(shè)置)
sbit?Signal?=?P1^0;???//這里的Signal表示的是霍爾傳感器的信號(hào)引腳?
int?m_second=0;?//定義變量m_second,用來(lái)記錄時(shí)間(以毫秒為單位)
float?speed=0.0?;??//定義速度變量?
float?length=0.0?;//定義路程變量
void?main()
{
????lcd_init();?//初始化液晶函數(shù)
TMOD?=?0x01;?//打開(kāi)定時(shí)器0,并設(shè)定其工作方式為16位定時(shí)模式。
TH0=(65536-10000)/?256;
TL0=(65536-10000)%?256;???//設(shè)定定時(shí)器的初值,使得沒(méi)10ms中斷一次
EA?=?1;???//允許總中斷
ET0?=?1;???//允許定時(shí)器0終端
TR0?=?1;??//啟動(dòng)定時(shí)器0
while(1)?????//大循環(huán)
{
????while(Signal);?//等待霍爾傳感器信號(hào)線拉低;
speed?=?CIRCLE?*1000?/?m_second?;?//計(jì)算速度。
m_second = 0; ? //計(jì)時(shí)清零
length?+=??CIRCLE?;?//路程加一個(gè)車(chē)輪周期
//第一行,顯示速度
lcd_pos(0x0);??//設(shè)定液晶的寫(xiě)入位置為第一行第一格
lcd_wdat(‘S’);
lcd_wdat(‘p’);
lcd_wdat(‘e’);
lcd_wdat(‘e’);
lcd_wdat(‘d’);
lcd_wdat(‘:’);
lcd_wdat(?(int)speed%10?);????????//顯示速度的整數(shù)部分
lcd_wdat(?(int)(speed*10)%10?);???//顯示速度的小數(shù)第一位
lcd_wdat(?(int)(speed*100)%10?);???//顯示速度的小數(shù)第二位
lcd_wdat(‘m’);
lcd_wdat(‘/’);
lcd_wdat(‘s’);
????????//第二行,顯示里程
lcd_pos(0x80);??//設(shè)定液晶的寫(xiě)入位置為第二行第一格
lcd_wdat(‘L’);
lcd_wdat(‘e’);
lcd_wdat(‘n’);
lcd_wdat(‘g’);
lcd_wdat(‘t’);
lcd_wdat(‘h’);
lcd_wdat(‘:’);
lcd_wdat(length?/10000+0x30);????//顯示里程的萬(wàn)位;
lcd_wdat(length?%10000/1000+0x30);????//顯示里程的千位;
lcd_wdat(length?%1000/100+0x30);????//顯示里程的百位;
lcd_wdat(length?%100/10+0x30);????//顯示里程的十位;
lcd_wdat(length?%10+0x30);????//顯示里程的個(gè)位;
lcd_wdat(‘m’);
}
}
void??timer0_intt()??interrupt?1???//
{
TH0=(65536-10000)/?256;
TL0=(65536-10000)%?256;???//設(shè)定定時(shí)器的初值,使得沒(méi)10ms中斷一次
m_second?+=?10;??//因?yàn)橹袛嗝?/span>10毫秒一次,所以這里每次加10;
}
附件1?Star1602.h?
#ifndef?__STAR1602_H__
#define?__STAR1602_H__
sbit?rs=?P2^0; ?????//
sbit?rw?=?P2^1; ?// ????
sbit?ep?=?P2^2; ?//
void??lcd_init();??????????????????//液晶初始化函數(shù)
void??lcd_pos(unsigned?char?pos);???//設(shè)定液晶的顯示位置函數(shù)
void??lcd_wdat(unsigned?char?dat);??//液晶寫(xiě)入字符
void??lcd_write_int(unsigned?int?x);?????//液晶顯示一個(gè)整形變量
#endif
附件2?Star1602.c
#include?<reg52.h>
#include?"1602.h"
/*****************************************************************************
函數(shù)功能:LCD延時(shí)子程序
入口參數(shù):ms
出口參數(shù):
*****************************************************************************/
static?void?delay(unsigned?char?ms)
{
unsigned?char?i;
while(ms--)
{
for(i?=?0;?i<?5;?i++);
}
}
/*****************************************************************************
函數(shù)功能:測(cè)試LCD忙碌狀態(tài)
入口參數(shù):
出口參數(shù):result
*****************************************************************************/
static?bit?lcd_bz()
{
bit?result;
rs?=?0;
rw?=?1;
ep?=?1;
delay(5);
result?=?(bit)(P0?&?0x80);
ep?=?0;
return?result;
}
/*****************************************************************************
函數(shù)功能:寫(xiě)指令數(shù)據(jù)到LCD子程序
入口參數(shù):cmd
出口參數(shù):
*****************************************************************************/
static?void?lcd_wcmd(unsigned?char?cmd)
{
while(lcd_bz()); //判斷LCD是否忙碌
rs?=?0;
rw?=?0;
ep?=?0;
delay(5);
P0?=?cmd;
????delay(5);
ep?=?1;
????delay(5);
ep?=?0;
}
/*****************************************************************************
函數(shù)功能:設(shè)定顯示位置子程序
入口參數(shù):pos
出口參數(shù):
*****************************************************************************/
void?lcd_pos(unsigned?char?pos)
{
lcd_wcmd(pos?|?0x80);
}
/*****************************************************************************
函數(shù)功能:寫(xiě)入顯示數(shù)據(jù)到LCD子程序
入口參數(shù):dat
出口參數(shù):
*****************************************************************************/
void?lcd_wdat(unsigned?char?dat)
{
while(lcd_bz()); //判斷LCD是否忙碌
rs?=?1;
rw?=?0;
ep?=?0;
P0?=?dat;
????delay(5);
ep?=?1;
????delay(5);
ep?=?0;
}
/*****************************************************************************
函數(shù)功能:LCD初始化子程序
入口參數(shù):
出口參數(shù):
*****************************************************************************/
void?lcd_init()
{
lcd_wcmd(0x38);
delay(100);
lcd_wcmd(0x0c);
delay(100);
lcd_wcmd(0x06);
delay(100);
lcd_wcmd(0x01);
delay(100);
}
/*****************************************************************************
函數(shù)功能:LCD寫(xiě)入一個(gè)整形數(shù)據(jù)
入口參數(shù):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);
}
寫(xiě)在最后的話:
????希望大家能夠順利的完成這個(gè)項(xiàng)目,并且能夠在制作的過(guò)程中享受到快樂(lè)和成就感?;蛟S這就是星星哥癡迷于電子的原因吧。如果還有不清楚的地方,可以聯(lián)系星星哥哦,星星哥樂(lè)于幫助每一個(gè)喜歡電子的人。星星哥郵箱:newstar111@163.com
總結(jié)
以上是生活随笔為你收集整理的DIY自行车测速测距仪的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 小米9是屏幕指纹吗(小米官方售后服务)
- 下一篇: 世界征服者4剧本攻略是什么