日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DIY自行车测速测距仪

發(fā)布時間:2023/12/15 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DIY自行车测速测距仪 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?DIY自行車測速測距儀

1、項目介紹

? ? ? ? ?該項目中,星星哥教大家制作一個自行車測速、測距儀。具有測量自行車行駛的瞬時速度和累計路程的功能。把它放在自行車的龍頭上面,霸氣十足,而且對于想要通過騎車運動的人來說,可以很好的把握自己騎行的速度和路程,給單調(diào)的騎車帶來趣味性。下面的幾張照片是項目完成后,星星哥在使用過程中拍攝的,別提有多拉風了。吼吼!!

? ???

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖1.1??安裝好之后的自行車測速測距儀


? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖1.2?自行車行駛過程中的實拍圖(速度2.388/秒?距離:2334.52米)

2、項目制作教程

2.1硬件準備

在制作該項目之前首先得準備一些必要的硬件。他們分別是單片機最小系統(tǒng)板,1602液晶,霍爾傳感器、磁鋼和電池(沒有充電電池可以使用電池盒加普通5號電池)。??

??

? ? ? ? ? ? ? ? ? ? 圖2.1?單片機最小系統(tǒng) ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖2.2?1602液晶

???

? ? ? ? ? ? ? ? ? ? 圖2.3?霍爾傳感器和磁鋼 ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖2.4?電池

準備好了這些東西之后,就可以非常happy的開始制作了。當然這里的電池,星星哥使用的是充電電池。因為剛好拆掉一輛遙控小車,所以有了這塊充電電池。其實使用電池盒加電池更加便宜和實惠,更加適合入門的人。

2.2?原理講解

下面稍微講解一下測速與測距的原理。首先是霍爾傳感器的原理。如圖2.5所示當霍爾傳感器沒有處于強烈的磁場中的時候,它的信號引腳輸出的是高電平,反之,當有強烈的磁場時,它輸出的是低電平。

??? ?

? ? ? ? ? ? ? 圖2.5?霍爾傳感器的接線圖 ? ? ? ? ? ? ? ? ? ? ? ? ?圖2.6?連接好的霍爾傳感器

從圖2.5中,大家也看出了霍爾傳感器的接法。最左邊的引腳為Vcc電源引腳,中間的引腳為GND引腳,最右邊的引腳為輸出引腳。這里解釋一下為什么輸出引腳要有一個電阻接到Vcc上面。因為霍爾傳感器的輸出引腳是漏極輸出,所以當需要輸出高電平時必須要接上拉電阻到Vcc電源。這里的上拉電阻可以使用1K--10K的電阻。星星哥使用的是10K的電阻。知道了霍爾傳感器的最用之后,具體應(yīng)該怎么用上去呢?可以這樣做,把磁鋼(其實就是產(chǎn)生磁場的磁鐵)固定在鋼圈上面,把霍爾傳感器固定在自行車的鋼軸上面,如圖2.7所示。 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖2.7?磁鋼的安裝和霍爾傳感器的安裝

那么,當每旋轉(zhuǎn)一圈,當磁鋼運動到霍爾傳感器附近時,霍爾傳感器輸出低電平,當磁鋼遠離霍爾傳感器時,霍爾傳感器輸出高電平。也就是說自行車輪胎每旋轉(zhuǎn)一圈,霍爾傳感器就輸出一次低電平。那么只要測出兩次輸出低電平之間的時間間隔,然后再結(jié)合自行車輪胎的周長就可以很輕松的求出速度。而對于自行車的行駛里程,只要記錄下霍爾傳感器輸出低電平的次數(shù),再乘以周長就可以求出了。

連接好了霍爾傳感器和磁鋼,接著把剩下的單片機最小系統(tǒng)板和液晶連接正確。(這里就不詳細介紹單片機如何驅(qū)動1602液晶的了。有疑問的朋友可以自己百度搜索一下,不難的。)如圖2.8,是連接好的單片機系統(tǒng)和液晶。

?? ??

? ? ? ? ? ? 圖2.8?連接好的電池,單片機和液晶 ? ? ? ? ? ? ? 圖2.9?已經(jīng)固定好在自行車上的所有硬件

2.3?程序編寫

?????下面星星哥講解一下程序的編寫。

?????這里我把1602的操作封裝在Star1602.c源程序中,在主函數(shù)中包含Star1602.h即可。(Star1602.hStar1602.c在本教程的最后給出)

?????

#include<reg52.h>

#include<Star1602.h>

#define?CIRCLE??1.8???//宏定義?車輪的周長(這個要根據(jù)實際的車輪進行設(shè)置)

sbit?Signal?=?P1^0;???//這里的Signal表示的是霍爾傳感器的信號引腳?

int?m_second=0;?//定義變量m_second,用來記錄時間(以毫秒為單位)

float?speed=0.0?;??//定義速度變量?

float?length=0.0?//定義路程變量

void?main()

{

????lcd_init();?//初始化液晶函數(shù)

TMOD?=?0x01;?//打開定時器0,并設(shè)定其工作方式為16位定時模式。

TH0=65536-10000/?256;

TL0=65536-10000%?256;???//設(shè)定定時器的初值,使得沒10ms中斷一次

EA?=?1;???//允許總中斷

ET0?=?1;???//允許定時器0終端

TR0?=?1;??//啟動定時器0

while(1)?????//大循環(huán)

{

????whileSignal);?//等待霍爾傳感器信號線拉低;

speed?=?CIRCLE?*1000?/?m_second?;?//計算速度。

m_second = 0; ? //計時清零

length?+=??CIRCLE?;?//路程加一個車輪周期

//第一行,顯示速度

lcd_pos(0x0);??//設(shè)定液晶的寫入位置為第一行第一格

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è)定液晶的寫入位置為第二行第一格

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);????//顯示里程的萬位;

lcd_wdat(length?%10000/1000+0x30);????//顯示里程的千位;

lcd_wdat(length?%1000/100+0x30);????//顯示里程的百位;

lcd_wdat(length?%100/10+0x30);????//顯示里程的十位;

lcd_wdat(length?%10+0x30);????//顯示里程的個位;

lcd_wdat(m);

}

}

void??timer0_intt()??interrupt?1???//

{

TH0=65536-10000/?256;

TL0=65536-10000%?256;???//設(shè)定定時器的初值,使得沒10ms中斷一次

m_second?+=?10;??//因為中斷每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);??//液晶寫入字符

void??lcd_write_int(unsigned?int?x);?????//液晶顯示一個整形變量

#endif

附件2?Star1602.c

#include?<reg52.h>

#include?"1602.h"

/*****************************************************************************

函數(shù)功能:LCD延時子程序

入口參數(shù):ms

出口參數(shù):

*****************************************************************************/

static?void?delay(unsigned?char?ms)

{

unsigned?char?i;

while(ms--)

{

for(i?=?0;?i<?5;?i++);

}

}

/*****************************************************************************

函數(shù)功能:測試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ù)功能:寫指令數(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ù)功能:寫入顯示數(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寫入一個整形數(shù)據(jù)

入口參數(shù):int?x

*****************************************************************************/

void??lcd_write_int(unsigned?int?x);???

{

unsigned?char?x1x2x3x4x5

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);

}

寫在最后的話:

????希望大家能夠順利的完成這個項目,并且能夠在制作的過程中享受到快樂和成就感。或許這就是星星哥癡迷于電子的原因吧。如果還有不清楚的地方,可以聯(lián)系星星哥哦,星星哥樂于幫助每一個喜歡電子的人。星星哥郵箱:newstar111@163.com

總結(jié)

以上是生活随笔為你收集整理的DIY自行车测速测距仪的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。