发个刚做的自行车测速、里程计!
我比较喜欢骑自行车出去走走,以前也做了个自行车测速(里程)计,用4位数码管输出数据的,它的优点是驱动简单,电压范围广,可用3.7V的锂电池直接供电,整个电路结构简单,耗能低,但它的缺点也是显而易见的,数码管在阳光下,无法看清楚,而且只有一组4位数据,不能同时查看速度及里程,不方便。由于购得更小的液晶模块,所以近期用液晶做输出显示器件,做了一个新的里程(速度)计。在阳光下清晰,晚上可用背光,2行共16个字符,并带存储器。有系统运行时间显示,外中断信号与写数据信号、电池低指示。整体尺寸为65X35X12。加上电池(880mah),厚度要增加3mm,电池接上码表正在测试,已运行14个小时,理论可运行40多小时。
http://cache.amobbs.com/bbs_upload782111/files_27/ourdev_537434.jpg
(原文件名:http_imgload.jpg)
// 1602 2*16字符第一行0x80 第二行0xc0
// 模式(km/h) 12.5kmh | 999.99km
// 24C02存储 0x00-0x03: 99 99 99 99 cm
// 0x2e,0x6b,0x6d,0x06,0x07,0x20,0x3d 0x30-0x39开始是数字0-9
// . ,k ,m , ┗ ,/h ,black, =
//------头--------------------------------------------------------
//申明
#include "REG2051.H"
#include "INTRINS.H"
#define uchar unsigned char
#define uintunsigned int
//轮周长1.98m及各位值 0.5ms取 1.98*(1/0.5)*1000*10
#define girth 39600
#define girth_h 1
#define girth_l 98
//单片机IO连接
#define LCM0802B_IO P1
sbit LCM0802B_RS = P3^7;
sbit LCM0802B_RW = P3^5;
sbit LCM0802B_EN = P3^4;
sbit KEY = P3^3;
sbit SIGN = P3^2;
sbit AT24C02_SDA = P3^1;
sbit AT24C02_SCL = P3^0;
//液晶驱动函数定义
void LCM_RD_BUSY(void); //读忙信号
void LCM_WR_CMD(uchar); //写操作命令
void LCM_WR_DAT(uchar); //写数据
void LCM_WR(uchar,uchar); //输出一个字符
//存储IC驱动函数定义
voidAT24C02_START(void); //开启
voidAT24C02_STOP(void); //停止
voidAT24C02_CK(void); //时钟
voidAT24C02_WR_byte(uchar);//写入单字节
uchar AT24C02_RD_byte(void); //读入单字节
uchar AT24C02_RD(uchar); //从24c02的地址address中读取一个字节数据
voidAT24C02_WR(uchar,uchar); //向24c02的address地址中写入一字节数据info
//函数定义
void _init(void); //软硬件初始化
void AT24C02_WRAMD(void); //24c02写入RAM数据
void _nus(uchar); //us延时
void _nms(uchar); //ms延时
void dis_dis(void);//距离数据输出
//变量定义
uchar d_var={0,0,0,0}; //距离的cm值0x00-0x03双数计算
uinttimej; //时间周期个数
uintint_tp; //周期个数传递
bit flg_cal;//允许计算
bit sf; //s指示标志
uintsj; //s指示计数
bit sen; //有更新数据
//---- 中断 -----------------------------------------------------
//500us周期定时函数
void T0_SEV(void) interrupt 1 using 1
{
TR0 = 0; ET0 = 0;
TH0 = 0xff; TL0 = 0x5a;//计时初值
timej++; //超过3.5S无中断相应,即判断速度为0,则最低速度2.04km/h
if(timej == 7000){
int_tp = timej; timej = 0;
flg_cal = 1;
}
if(sj>0){ sj--; }//s计数递减
ET0 = 1; TR0 = 1;
}
//外部中断函数
void Int0_SEV(void) interrupt 0 using 0
{
EX0 = 0;
int_tp = timej; timej = 0;
flg_cal = 1;//读取计数周期数
EX0 = 1;
}
//------主体--------------------------------------------------------
//主函数
void main()
{
_init(); //初始化
while(1){
if(!KEY){
_nms(2); //去抖延时
if(!KEY){
uchar key_tp = 200;
EA = 0; timej = 0;
do{ key_tp--; _nms(3); }while(!KEY&&key_tp>0); //长短按计时循环
EA = 1;
if(key_tp==0){
d_var = 0; d_var = 0; d_var = 0; d_var = 0; //清零
_nus(20); dis_dis(); //输出距离
}//长按
//短按长按都要写入数据
sj = 3000; sf = 1;
LCM_WR(0x80,0x06); //0x06
AT24C02_WRAMD(); //24c02写入RAM数据
//等待释放按键
while(!KEY){ while(!KEY); _nms(2); }
}
}//按键功能,长按清除历程信息,短按切换ms与kmh
if(flg_cal){ //清零 输出十分位" 0.0"
if(int_tp == 7000){
LCM_WR(0x81,0x20); LCM_WR(0x82,0x30); LCM_WR(0x84,0x30);
}
else{//正常计算输出
sen = 1;
//速度
if(int_tp>143){
int_tp = girth/int_tp;
int_tp = (int_tp*18)/5; // kmh=3.6*ms
LCM_WR(0x84,(int_tp%10)+0x30); //输出十分位
int_tp = int_tp/10;
LCM_WR(0x82,(int_tp%10)+0x30); //输出个位
if(int_tp<10) LCM_WR(0x81,0x20); //输出十位0时清除
else LCM_WR(0x81,(int_tp/10)+0x30);//输出十位
}//在99.9km/h范围内
//距离 步长1.98m
d_var += girth_l;
if(d_var>99){
d_var-=100; d_var++;
}
d_var += girth_h;
if(d_var>99){
d_var-=100;
if(d_var==99){
d_var=0;
if(d_var==99) d_var=0;
else d_var++;
}
else d_var++;
}
dis_dis(); //输出距离
}
int_tp = 0; flg_cal = 0;//复位
}//输出计算的主要数据
if(sj == 0){
sj = 3000;
if(sen){ //有更新数据才写入
sen = 0;
LCM_WR(0x80,0x06); //0x06
sf = 1;
AT24C02_WRAMD();//写入存储器
}
}
if(sf && sj<2000){
sf = 0; LCM_WR(0x80,0x20);
} //写存储器闪更新
}//主循环
}
void _init(void)
{
EA = 0; _nus(255);//等待外围设备完成加电
//初始化液晶,显示"?"
LCM_WR_CMD(0x01); //清屏幕0x01
LCM_WR_CMD(0x38); //设置数据线模式0x38 8位 两行 5X7
LCM_WR_CMD(0x0C); //设置显示状态0x0C 整体显示开 光标关 光标闪烁关
LCM_WR_CMD(0x06); //设置输入方式0x06 增量方式 不移位
LCM_WR_CMD(0x80); //设置光标初始位
//LCM_WR(0x80,0x3f);//屏幕初始化输出"?"
//输出 bike mile
LCM_WR(0x80,0x3d); LCM_WR(0x81,0x62); LCM_WR(0x82,0x69); LCM_WR(0x83,0x6b);
LCM_WR(0x84,0x65); LCM_WR(0x85,0x3d); LCM_WR(0x86,0x3d); LCM_WR(0x87,0x3d);//=bike===
LCM_WR(0xc0,0x3d) ;LCM_WR(0xc1,0x3d); LCM_WR(0xc2,0x3d); LCM_WR(0xc3,0x6d);
LCM_WR(0xc4,0x69); LCM_WR(0xc5,0x6c); LCM_WR(0xc6,0x65); LCM_WR(0xc7,0x3d);//===mile=
//初始化液晶自定义字符库
LCM_WR_CMD(0x70); //自定义字符'┗' 在0x06
LCM_WR_DAT(0x00); LCM_WR_DAT(0x00); LCM_WR_DAT(0x00); LCM_WR_DAT(0x10);
LCM_WR_DAT(0x18); LCM_WR_DAT(0x1C); LCM_WR_DAT(0x1E); LCM_WR_DAT(0x00);
LCM_WR_CMD(0x78); //自定义字符'/h' 在0x07
LCM_WR_DAT(0x04); LCM_WR_DAT(0x14); LCM_WR_DAT(0x14); LCM_WR_DAT(0x16);
LCM_WR_DAT(0x15); LCM_WR_DAT(0x15); LCM_WR_DAT(0x15); LCM_WR_DAT(0x00);
//初始化24c02
AT24C02_SCL = 1; _nop_(); AT24C02_SDA = 1; _nop_(); _nms(4);
//读24c02到RAM 初始化 d_var[]
d_var = AT24C02_RD(0x00); d_var = AT24C02_RD(0x01);
d_var = AT24C02_RD(0x02); d_var = AT24C02_RD(0x03);
if(d_var>99 || d_var>99 || d_var>99 || d_var>99){
d_var = 0; d_var = 0; d_var = 0; d_var = 0;//清零
AT24C02_WRAMD();
}//错误数据判断 读取24c02中的距离数据,如果有数据>99,则出错,复位0
KEY = 1; SIGN = 1;
//串口初始化
TMOD = 0x01; //定时中断0允许 方式0 使能off
TH0 = 0xff; TL0 = 0x5a; //500us (65536-166) /256=255 %256=90
ET0 = 1; TR0 = 0;
PX0 = 1; IT0 = 1; EX0 = 0; //外中断0 跳变触 使能off
//变量初始化
timej = 0; int_tp = 0; flg_cal = 0;
sf = 0; sj = 3000; sen = 0;
_nms(255);
//界面初始化
LCM_WR_CMD(0x01); //清屏幕0x01
LCM_WR(0x82,0x30); LCM_WR(0x83,0x2e); LCM_WR(0x84,0x30); //输出" 0.0"
LCM_WR(0x85,0x6b); LCM_WR(0x86,0x6d); LCM_WR(0x87,0x07); //输出"kmh"
LCM_WR(0xc3,0x2e); LCM_WR(0xc6,0x6b); LCM_WR(0xc7,0x6d); //输出" . km"
dis_dis(); _nms(56);
EX0 = 1; TR0 = 1;EA = 1; //开启各种中断 CPU中断使能 TR1 = 1;
}
//---- 硬件应用层驱动 ------------------------------------------------
//距离数据显示
void dis_dis(void)
{
//高位3有数据,并且有两位
if(d_var>9){
LCM_WR(0xc0,(d_var/10)+0x30); LCM_WR(0xc1,(d_var%10)+0x30);
}
else{//高位3只有低位有数据,或没有数据
LCM_WR(0xc0,0x20);//高位3高位没有数据
if(d_var>0) LCM_WR(0xc1,d_var+0x30);//高位3低位有数据
else LCM_WR(0xc1,0x20);//高位3没有数据
}
LCM_WR(0xc2,(d_var/10)+0x30);
LCM_WR(0xc4,(d_var%10)+0x30);
LCM_WR(0xc5,(d_var/10)+0x30);
}
//24c02写入RAM数据
void AT24C02_WRAMD(void)
{
uchar mem_wram;
for(mem_wram=0;mem_wram<4;mem_wram++)
AT24C02_WR(mem_wram,d_var);
}
//短延时
void _nus(uchar us)
{
for(;us>0;us--)
;
}
//长延时4.6ms
void _nms(uchar ms)
{
for(;ms>0;ms--)
_nus(255);
}
/*----液晶驱动函数定义------------------------------------------------------------
void LCM_WR_CMD(uchar); //写操作命令
void LCM_WR_DAT(uchar); //写数据
void LCM_WR(uchar,uchar);//输出一个字符
void LCM_RD_BUSY(void); //读忙信号
--------------------------------------------------------------------------------*/
//读忙信号
void LCM_RD_BUSY(void)
{
uchar lcm_rdby = 0x00;
LCM0802B_RS = 0; //RS 0
LCM0802B_RW = 1; //RW 1
LCM0802B_EN = 1; //EN 1 读忙信号
LCM0802B_IO = 0xff;
do{ lcm_rdby = LCM0802B_IO; }while(lcm_rdby&0x80); //MSB=0x80
_nop_();
}
//写操作命令
void LCM_WR_CMD(uchar lcm_cmd)
{
LCM_RD_BUSY();
LCM0802B_RS = 0; //RS 0
LCM0802B_RW = 0; //RW 0
LCM0802B_EN = 1; //跳跃,写入数据
LCM0802B_IO = lcm_cmd; _nop_();
LCM0802B_EN = 0; _nop_();
}
//写数据
void LCM_WR_DAT(uchar lcm_wrdat)
{
LCM_RD_BUSY();
LCM0802B_RS = 1; //RS 1
LCM0802B_RW = 0; //RW 0
LCM0802B_EN = 1; //跳跃,写入数据
LCM0802B_IO = lcm_wrdat; _nop_();
LCM0802B_EN = 0; _nop_();
}
//输出一个字符
void LCM_WR(uchar lcm_xy,uchar lcm_dat)
{
EA = 0;
//设置光标位置
LCM_WR_CMD(lcm_xy); //第一行0x80,第二行0xc0
LCM_WR_DAT(lcm_dat);
EA = 1;
}
/*---------------- 24C02驱动 --------------------------------------
voidAT24C02_START(void); //开启
voidAT24C02_STOP(void); //停止
voidAT24C02_CK(void); //时钟
voidAT24C02_WR_byte(uchar);//写入单字节
uchar AT24C02_RD_byte(void); //读入单字节
uchar AT24C02_RD(uchar); //从24c02的地址中读取一个字节数据
voidAT24C02_WR(uchar,uchar); //向24c02的地址中写入一字节数据
-----------------------------------------------------------------*/
//24c02启动
void AT24C02_START()
{
AT24C02_SDA = 1; _nop_(); AT24C02_SCL = 1; _nop_();
AT24C02_SDA = 0; _nop_(); AT24C02_SCL = 0; _nop_();
}
//24c02停止
void AT24C02_STOP()
{
AT24C02_SDA = 0; _nop_(); AT24C02_SCL = 1; _nop_(); AT24C02_SDA = 1; _nop_();
}
//24c02写入单字节
void AT24C02_WR_byte(uchar mem_wrbt)
{
uchar mem_wrtp,mem_wrbtp;
mem_wrbtp = mem_wrbt;
for (mem_wrtp=8;mem_wrtp>0;mem_wrtp--){
mem_wrbtp = mem_wrbtp<<1;
AT24C02_SCL = 0; _nop_();
AT24C02_SDA = CY; _nop_(); //(bit)(mem_wrbtp&0x80)
AT24C02_SCL = 1; _nop_();
}
AT24C02_SCL = 0; _nop_(); AT24C02_SDA = 1; _nop_();
}
//24c02读入单字节
uchar AT24C02_RD_byte()
{
uchar mem_rdtp,mem_rdbit,mem_rdbt=0;
AT24C02_SCL = 0; _nop_(); AT24C02_SDA = 1;
for(mem_rdtp=8;mem_rdtp>0;mem_rdtp--){
_nop_(); AT24C02_SCL = 1; _nop_();
if (AT24C02_SDA) mem_rdbit = 1;
else mem_rdbit = 0;
mem_rdbt=(mem_rdbt<<1)|mem_rdbit;
AT24C02_SCL = 0;
}
_nop_();
return mem_rdbt;
}
//24c02时钟等待
void AT24C02_CK()
{
uchar mem_ck = 255;
AT24C02_SCL = 1; _nop_();
while((AT24C02_SDA)&&(mem_ck>0)) mem_ck--;
AT24C02_SCL = 0; _nop_();
}
//24c02读入
uchar AT24C02_RD(uchar mem_rdaddr)
{
uchar mem_rd; //在刚启动时使用,故EA不需复位
AT24C02_START();
AT24C02_WR_byte(0xa0); AT24C02_CK();
AT24C02_WR_byte(mem_rdaddr); AT24C02_CK();
AT24C02_START();
AT24C02_WR_byte(0xa1); AT24C02_CK();
mem_rd = AT24C02_RD_byte();
AT24C02_STOP(); _nms(4);
return mem_rd;
}
//24c02写入
void AT24C02_WR(uchar mem_wraddr,uchar mem_wrinfo)
{
EA = 0; AT24C02_START();
AT24C02_WR_byte(0xa0); AT24C02_CK();
AT24C02_WR_byte(mem_wraddr); AT24C02_CK();
AT24C02_WR_byte(mem_wrinfo); AT24C02_CK();
AT24C02_STOP(); EA=1;
_nms(3);
}
//----END--------------------------------------------------------------- 强 顶一个 楼主怎样采样轮子速度的?如果每转一圈采样一个点的信号,就不能实时显示速度。 一般是每转一圈 采一个点
也可以一圈采2个点
估计lz用的是干簧管+磁铁吧?
如果是 那么采样的频率就取决于干簧管的动作时间 楼主的1602可以用锂电池啊…我的都不行。寒假做了个带rtc和温度计的,就是电源问题没解决: ( mark 上个电路图看看? 回复【2楼】dd123
楼主怎样采样轮子速度的?如果每转一圈采样一个点的信号,就不能实时显示速度。
-----------------------------------------------------------------------
我用 普通的开关型霍尔元件 + 一块小的磁钢 采样数据,程序中默认3.5S无反应,即认为速度为0,而一般骑起来后,速度更新还是很快的,要实时速度就不能用这种一圈采样几个信号的方法了,而且市场上的成品也是一圈采样一个点的方法。
回复【4楼】kinoko
楼主的1602可以用锂电池啊…我的都不行。寒假做了个带rtc和温度计的,就是电源问题没解决: (
-----------------------------------------------------------------------
我用的1602也是5V的,锂电池3-4.2V不稳定,也不好驱动1602,所以我用34063升压到5V供系统工作,效率在72%的样子,不过34063便宜,还是很实用的。
回复【6楼】liusoldier 大圣
上个电路图看看?
-----------------------------------------------------------------------
电路很简单,没有多大用处,2051与1602八线制连接,与24C02加10K的上拉电阻直连,霍尔元件的信号给INT0,34063升压用的基本接法,本来液晶也是按键输入通过2051控制的,不过那又多耗电了,所以直接改成自锁按钮了。 LZ你好!前几年我也做过里程表,没速度。我的设想是没必要实时速度 ,只要行走1 分钟或30秒,用距离除以时间 就是速度了。不知对不对。 回复【8楼】47okey
LZ你好!前几年我也做过里程表,没速度。我的设想是没必要实时速度 ,只要行走1 分钟或30秒,用距离除以时间 就是速度了。不知对不对。
-----------------------------------------------------------------------
30s太大了 3-4s 就可以了
算圈数 然后算距离 除时间 顶一个,LZ能不能把4位数码管的里程计的软件帖出来一下,我比较喜欢数码管的。 回复【9楼】litteworm
-----------------------------------------------------------------------
谢谢了。什么 时候加上速度的玩一下。 回复【9楼】litteworm
回复【8楼】47okey
LZ你好!前几年我也做过里程表,没速度。我的设想是没必要实时速度 ,只要行走1 分钟或30秒,用距离除以时间 就是速度了。不知对不对。
-----------------------------------------------------------------------
30s太大了 3-4s 就可以了
算圈数 然后算距离 除时间
-----------------------------------------------------------------------
单单计算固定时间里的圈数的长度的平均速度不是正真的平均速度,因为此时可能即将完成下一圈,则上一次计算少一圈,下一次计算多一圈,误差太大了,可以用MT算法,先在固定N秒读转的圈数P,而后计时到下一圈的时间T,则 V平均=轮周长*(P+1)/(N+T). 回复【10楼】tonyone
顶一个,LZ能不能把4位数码管的里程计的软件帖出来一下,我比较喜欢数码管的。
-----------------------------------------------------------------------
http://cache.amobbs.com/bbs_upload782111/files_27/ourdev_537685.JPG
(原文件名:SL371046.JPG)
/*===========================================================================
* 千位P3.7 百位P3.5 十位P3.4 个位P3.2
* --P1.2--
*| |
* P1.3 P1.6
*| |
* --P1.7--
*| |
* P1.0 P1.5
*| |
* --P1.1-- []P1.4
* P3.3AH02霍尔元件反馈,12M M计数法
* P3.0LED指示 速度与里程切换
* P3.1按键 切换显示
===========================================================================*/
//头文件、宏定义
#include<AT892051.H>
#define uchar unsigned char
#define uintunsigned int
//IO口定义
#define LED_DATA P1 //段码
sbit LED_CS0 = P3^2;//0位
sbit LED_CS1 = P3^4;//1位
sbit LED_CS2 = P3^5;//2位
sbit LED_CS3 = P3^7;//3位
sbit AH02 = P3^3; //传感器
sbit LED = P3^0; //LED
sbit KEY = P3^1; //按键
//常量
//#define girth 19800 //轮周长0.01cm
#define gvar 63818 //存放轮计算常量
unsigned char led_code={0x90,0x9f,0x38,0x19,0x17,0x51,0x50,0x9b,0x10,0x11,0x7f,0x32,0xff};
// 0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,- ,P ,black
//变量
bit mode; //0速度里程,1计数
uint js;//0.25ms计数
uchar led_var = {10,10,10,10};//输出段码变量
uchar led_flg; //输出位码循环变量
uchar dip_flg; //小数点位,0无,1在1位 2在2位 3在3位
uint js_all; //总圈数
bit mode_sd; //模式 0速度 1里程
bit error_flg; //超时标志 1超时
//函数
void init(void); //初始化
void nus(uchar); //6us延时
void nms(uchar); //1ms延时
//===========================================================================
void Timer1_service(void) interrupt 3 using 3 //显示定时中断 4ms
{
TR1 = 0; ET1 = 0;
TH1 = 0xf0; TL1 = 0x60; //(65536-4000) /256=240 %256=96
LED_CS0 = 1; LED_CS1 = 1; LED_CS2 = 1; LED_CS3 = 1;
LED_DATA = led_code];
switch(led_flg){
case 0: LED_CS0 = 0; break;
case 1: if(dip_flg==1) LED_DATA&=0xef; LED_CS1 = 0; break;
case 2: if(dip_flg==2) LED_DATA&=0xef; LED_CS2 = 0; break;
case 3: if(dip_flg==3) LED_DATA&=0xef; LED_CS3 = 0; break;
}
if(led_flg == 0) led_flg = 3;
else led_flg--;
ET1 = 1; TR1 = 1;
}
void Timer0_service(void) interrupt 1 using 1//1.1ms
{
TR0 = 0; ET0 = 0;
TH0 = 0xfb; TL0 = 0xb4; //1.1ms 251 180
js = js + 1;
if(js > 3181){ //超过3.5s限时
js = 0;
error_flg = 1;
if(!mode_sd){
led_var = 12; led_var = 12; led_var =0; led_var = 0;
dip_flg = 1;
}
}
ET0 = 1; TR0 = 1;
}
void Int1_service(void) interrupt 2 using 2//外中断1
{
uchar tm; uint tp;
EX1 = 0;
js_all = js_all + 1;//记录总圈数
if(!mode){ //速度里程模式
if(!mode_sd){ //速度 00.0km/h
if(error_flg || js_all == 1){
error_flg = 0; js = 0; tp = 0;
dip_flg = 1;
}
else{
tp = js; js = 0;//读取时间,复位
if(tp > 100 && tp < 3181) tp = gvar/tp;
}
}
else{//里程 0000m~60.00km
if(js_all<30001){
uint te; uint tvar;
te = js_all-1;
tp = 0; tvar = 198;
if(te<=5050){
dip_flg = 0;
for(tm=0;tm<3;tm++){
tp += (tvar%10)*te;
if(tm<2){
if(tp%10>4) tp = tp/10+1;
else tp = tp/10;
tvar = tvar/10;
}
}
}
else{
dip_flg = 2;
tp = te/5;
}
}
else{
js_all =0;
dip_flg = 0;
tp = 11;
}
}
}
else{ //计数模式 9999
if(js_all>9999) js_all = 0;
tp = js_all;
}
tm = tp/100;
led_var = tm/10;
led_var = tm%10;
tm = tp%100;
led_var = tm/10;
led_var = tm%10;
if(led_var==0){
led_var=12;
if(led_var==0){
led_var=12;
if(mode){
if(led_var==0)led_var=12;
}
}
}
EX1 = 1;
}
void init(void){
//端口初始化
LED_DATA = led_code; //off
LED_CS0 = 1; LED_CS1 = 1; LED_CS2 = 1; LED_CS3 = 1; //off
AH02 = 1; KEY = 1;
LED = 0; //LED on
//变量初始化
js = 0; //1.1ms计数
led_flg = 3; dip_flg = 0;//第三位开始 无小数点
js_all = 0; //0转
mode_sd = 0; //速度模式
error_flg = 0; //未超时
//模式选择
mode = 0; //速度里程模式
if(!KEY){
nms(5);
if(!KEY) mode = 1; //计数模式
}
//中断初始化
IT1 = 1; EX1 = 0;//置位时为跳变触 外中断使能off
if(!mode){
TMOD = 0x11; //定时器0方式1 定时器1方式1
TH0 = 0xfb; TL0 = 0xb4; //1.1ms
ET0 = 0; TR0 = 0; //计时off
}
else{
TMOD = 0x10; //定时器1方式1
}
TH1 = 0xf0; TL1 = 0x60; //4ms
ET1 = 1; TR1 = 1; //显示on
EA = 1; //开CPU中断
//硬件初始化延时
nms(200); nms(200); nms(200);
LED = 1; //off
EX1 = 1; //外中断使能on
TR0 = 1; ET0 = 1;//计时on
nms(6);
}
void main(void){
init(); //硬件初始化
if(!mode){
while(1){
if(!KEY){
nms(5);
if(!KEY){
EX1 = 0; TR0 = 0; ET0 = 0; dip_flg = 0;
LED = 0;
js = 0; error_flg = 1;
mode_sd = ~mode_sd;
led_var = 10; led_var = 10; led_var =10; led_var = 10;
do{
while(!KEY);
nms(3);
}while(!KEY);
if(!mode_sd){
TH0 = 0xfb; TL0 = 0xb4; ET0 = 1; TR0 = 1;
dip_flg = 1;
}
EX1 = 1;
LED = 1;
}
}
nms(3);
}
}
else{
while(1){
if(!KEY){
nms(5);
if(!KEY){
EX1 = 0;
js_all = 0;
LED = 0;
led_var = 10; led_var = 10; led_var =10; led_var = 10;
do{
while(!KEY);
nms(3);
}while(!KEY);
LED = 1;
EX1 = 1;
}
}
nms(3);
}
}
}
/*---------------- 延时子函数 -----------------------
void nus(uchar us);:6us延时
void nms(uchar ms);:1ms延时
--------------------------------------------------*/
//6us延时
void nus(uchar us)
{
for(;us>0;us--)
;
}
//1ms延时
void nms(uchar ms)
{
for(;ms>0;ms--)
nus(167);
}
/*-------------------END---------------------*/ 顶一个 lz是用万用板做的,够小,够强!简称:小强!
哈哈。不过建议还是画下原理图,可让大家更清晰一点了。 回复【12楼】chchg
-----------------------------------------------------------------------
单单计算固定时间里的圈数的长度的平均速度不是正真的平均速度,因为此时可能即将完成下一圈,则上一次计算少一圈,下一次计算多一圈,误差太大了,可以用MT算法,先在固定N秒读转的圈数P,而后计时到下一圈的时间T,则 V平均=轮周长*(......
-----------------------------------------------------------------------
好方法,学习了!准备就按你说的给我的里程表加上速度 。
焊接时没安排好元件,做得大了。
http://cache.amobbs.com/bbs_upload782111/files_27/ourdev_537846.jpg
(原文件名:6aDSC03677-里程表.jpg)
第一次做的传感器,自行车被偷了。去年,拆一个旧的电压表,杀鸡取卵,用它的磁铁
http://cache.amobbs.com/bbs_upload782111/files_27/ourdev_537847.jpg
(原文件名:6aDSC03679-里程表.jpg)
打磨一下,又做了一套
http://cache.amobbs.com/bbs_upload782111/files_27/ourdev_537848.jpg
(原文件名:6aDSC03686-磁铁干簧管.jpg) mark 回复【16楼】47okey
-----------------------------------------------------------------------
以前没注意霍尔元件的功耗,觉得好就用了,刚单独测了下,在5V时,电流3.1ma,有磁吸的时候3.25ma左右,看来霍尔还是有些耗电的,我刚才写程序还觉得TINY13的电流在500uA太大了!!! 刚又试了下吸力,同一块磁铁,干黄管在4mm左右才反应,霍尔在1cm左右反应,看来这电不能省! 够强! http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3653443&bbs_page_no=1&search_mode=3&search_text=oufuqiang&bbs_id=9999 以前我也做过,用的屏与楼主的差不多,乍一看还以为是我的呢呵呵。我当时用的霍尔元件固定在车架上,轮辐上固定一个磁铁,即可检测车轮转动
刚来这里就看到这么熟悉的东西 咦,不是说要审核的吗,怎么这么快就出来了 哦,原来只有我自己能看。
问一下,楼主骑车最快速度多少?我记得当时接近25km/h。可惜我的屏后来烧坏了 mark 回复【24楼】whitecloud588
哦,原来只有我自己能看。
问一下,楼主骑车最快速度多少?我记得当时接近25km/h。可惜我的屏后来烧坏了
-----------------------------------------------------------------------
我不是运动型的自行车阿!普通的那种,我记得最高速度好像是21.4km/h,再快怕那破车要散架了! //下面是整理过,简化过的程序!
// LCM16 2*16字符 第一行0x80 第二行0xc0
// 模式(km/h) 0 0 47:59:59
// 99.9kh999.99km
// 24C02存储 0x00-0x03: 99 99 99 99 cm
// 0x2e,0x6b,0x6d,0x05,0x06,0x07,0x20,0x3d 0x30-0x39开始是数字0-9
// . ,k ,m , ,/h ,black, =
//------头--------------------------------------------------------
//申明
#include "REG2051.H"
#include "INTRINS.H"
#define uchar unsigned char
#define uintunsigned int
//轮周长1.98m及各位值 0.5ms取 1.98*(1/0.5)*1000*10
#define girth 39600
#define girth_h 1
#define girth_l 98
//单片机IO连接
#define LCM16_IO P1
sbit LCM16_RS = P3^0;
sbit LCM16_RW = P3^1;
sbit LCM16_EN = P3^7;
sbit AT24_SDA = P3^4;
sbit AT24_SCL = P3^5;
sbit KEY= P3^3;
sbit SIGN = P3^2;
//液晶驱动函数定义
void LCM_WR_CMD(uchar); //写操作命令
void LCM_WR_DAT(uchar); //写数据
void LCM_WR(uchar,uchar); //输出一个字符
void LCM_WR_STR(uchar,uchar*);//输出字符串
void LCM_CUSTOM_CHAR(uchar,uchar,uchar,uchar,uchar,uchar,uchar,uchar);//自定义字符
//存储IC驱动函数定义
uchar AT24_RD(uchar); //从24c02的地址address中读取一个字节数据
voidAT24_WR(uchar,uchar); //向24c02的address地址中写入一字节数据info
//函数定义
void _init(void); //软硬件初始化
void _nus(uchar); //us延时
void _nms(uchar); //ms延时
void mile_show(void); //距离数据输出
void AT24_WRAMD(void);//24c02写入RAM数据
//变量定义
uchar d_var={0,0,0,0};//距离的cm值0x00-0x03双数计算
uinttimej;//时间周期个数
uintint_tp; //周期个数传递
bit flg_cal;//允许计算
uchar sj; //s指示计数
uchar svj; //save
uchar timei;//外中断次数
uchar t_var={0,0,0};//时间变量
uchar times;//1s循环计数
bit flg_s;//s标志位
//---- 中断 -----------------------------------------------------
//500us周期定时函数
void T0_SEV(void) interrupt 1 using 1
{
TR0 = 0; ET0 = 0; TH0 = 0xff; TL0 = 0x5a;//计时初值
timej++; //超过3.5S无中断相应,即判断速度为0,则最低速度2.04km/h
if(timej == 7000){ int_tp = 7000; timej = 0; flg_cal = 1;}
ET0 = 1; TR0 = 1;
}
//外部中断函数
void Int0_SEV(void) interrupt 0 using 0
{
EX0 = 0;
int_tp = timej; timej = 0; flg_cal = 1;//读取计数周期数
EX0 = 1;
}
//100ms周期定时函数
void T1_SEV(void) interrupt 3 using 3
{
TR1 = 0; ET1 = 0; TH1 = 0x7d; TL1 = 0xcb;//计时初值
if(times>0) times--;//s计时 1s
else{
times=9; flg_s = 1;
t_var++;
if(t_var==60){
t_var=0; t_var++;
if(t_var==60){
t_var=0; t_var++;
if(t_var==48)t_var=0;
}
}
}
if(sj>0) sj--;//s计数递减 800ms
if(svj>0) svj--;
ET1 = 1; TR1 = 1;
}
//------主体--------------------------------------------------------
//主函数
void main()
{
_init(); //初始化
while(1){
if(flg_cal){ //清零 输出十分位" 0.0"
if(int_tp == 7000){
LCM_WR(0xc0,0x20); LCM_WR(0xc1,0x30); LCM_WR(0xc3,0x30);
if(timei>0) timei = 5; //写入数据
}
else{//正常计算输出
timei++; LCM_WR(0x82,0x05); sj=4;//外中断信号
//速度
if(int_tp>143){
int_tp = girth/int_tp; int_tp = (int_tp*18)/5; //kmh=3.6*ms
LCM_WR(0xc3,int_tp%10+0x30); //输出十分位
int_tp = int_tp/10;
LCM_WR(0xc1,int_tp%10+0x30);//输出个位
if(int_tp<10) LCM_WR(0xc0,0x20);//输出十位0时清除
else LCM_WR(0xc0,int_tp/10+0x30); //输出十位
}//在99.9km/h范围内
//距离
d_var += girth_l;
if(d_var>99){ d_var-=100; d_var++; }
d_var += girth_h;
if(d_var>99){
d_var-=100;
if(d_var==99){
d_var=0;
if(d_var==99) d_var=0;
else d_var++;
}
else d_var++;
}//步长1.98m
mile_show(); //输出距离
}
int_tp = 0; flg_cal = 0;//复位
}//输出计算的主要数据
if(timei==5){
timei=0;
LCM_WR(0x84,0x06); svj=7;//0x06
AT24_WRAMD();//写入存储器
}//每6个外中断信号写入数据一次
if(flg_s){
flg_s = 0;
if(t_var>9) LCM_WR(0x88,t_var/10+0x30);
LCM_WR(0x89,t_var%10+0x30);
LCM_WR(0x8b,t_var/10+0x30); LCM_WR(0x8c,t_var%10+0x30);
LCM_WR(0x8e,t_var/10+0x30); LCM_WR(0x8f,t_var%10+0x30);
}//时间
if(!KEY){
_nms(2); //去抖延时
if(!KEY){
uchar key_tp = 136;
EA = 0; timej = 0;
do{ key_tp--; _nms(3); }while(!KEY&&key_tp>0); //长短按计时循环
EA = 1;
if(key_tp==0){
d_var = 0; d_var = 0; d_var = 0; d_var = 0; //清零
_nus(20); mile_show(); //输出距离
}//长按
//短按长按都要写入数据
LCM_WR(0x84,0x06); svj = 7;//0x06
AT24_WRAMD(); //24c02写入RAM数据
//等待释放按键
while(!KEY){ while(!KEY); _nms(2); }
}
}//按键功能,长按清除历程信息,短按储存历程信息
if(sj==1){ sj=0; LCM_WR(0x82,0x20);}//外中断信号闪更新
if(svj==1){ svj=0; LCM_WR(0x84,0x20);}//写存储器闪更新
}//主循环
}
//初始化
void _init(void)
{
_nus(255); //等待外围设备完成加电
//初始化液晶
LCM_WR_CMD(0x01); //清屏幕0x01
LCM_WR_CMD(0x38); //设置数据线模式0x38 8位 两行 5X7
LCM_WR_CMD(0x0C); //设置显示状态0x0C 整体显示开 光标关 光标闪烁关
LCM_WR_CMD(0x06); //设置输入方式0x06 增量方式 不移位
LCM_WR_CMD(0x80); //设置光标初始位
//输出 "CC Speedometer"
LCM_WR_STR(0x80,"(^_^)Speedometer"); LCM_WR_STR(0xc0,">>>>>>>>>>>>>>>>");
//初始化液晶自定义字符库
LCM_CUSTOM_CHAR(0x68,0x00,0x1E,0x1E,0x1F,0x1F,0x0F,0x0F); //自定义字符'信' 在0x05
LCM_CUSTOM_CHAR(0x70,0x00,0x1F,0x0E,0x04,0x04,0x0E,0x1F); //自定义字符'存' 在0x06
LCM_CUSTOM_CHAR(0x78,0x04,0x14,0x14,0x16,0x15,0x15,0x15); //自定义字符'/h' 在0x07
//初始化24c02
AT24_SCL = 1; _nop_(); AT24_SDA = 1; _nop_(); _nms(4);
d_var = AT24_RD(0x10); d_var = AT24_RD(0x11);
d_var = AT24_RD(0x12); d_var = 0; //读24c02 初始化d_var[]
//输入口初始化
KEY = 1; SIGN = 1;
//串口初始化
EA = 0; TMOD = 0x11; //定时中断0允许 方式0 使能off
TH0 = 0xff; TL0 = 0x5a; ET0 = 1; TR0 = 1;//500us (65536-166) /256=255 %256=90
TH1 = 0x7d; TL1 = 0xcb; ET1 = 1; TR1 = 1;
PX0 = 1; IT0 = 1; EX0 = 0; //外中断0 跳变触 使能off
//变量初始化
timej = 0; int_tp = 0; flg_cal = 0;
sj = 0; svj = 0; timei = 0; times = 0; flg_s = 0;
_nms(200); _nms(200);
//界面初始化
LCM_WR_CMD(0x01); //清屏幕0x01
LCM_WR_STR(0x80,"["); LCM_WR_STR(0x86,"]"); LCM_WR_STR(0x89,"0:00:00");//
LCM_WR_STR(0xc1,"0.0km"); LCM_WR_STR(0xca,"0.00km"); //[ 0.0km 0.00km]
LCM_WR(0xc6,0x07); //[ /h ]
mile_show(); _nms(56);
EX0 = 1; EA = 1; //开启各种中断 CPU中断使能
}
//24c02写入RAM数据
void AT24_WRAMD(void)
{
uchar mem_wram;
for(mem_wram=0;mem_wram<3;mem_wram++)
AT24_WR(0x10+mem_wram,d_var);
}
//距离数据显示
void mile_show(void)
{
if(d_var>9){ //高位3有数据,并且有两位
LCM_WR(0xc8,d_var/10+0x30); LCM_WR(0xc9,d_var%10+0x30);
}
else{//高位3只有低位有数据,或没有数据
LCM_WR(0xc8,0x20);//高位3高位没有数据
if(d_var>0) LCM_WR(0xc9,d_var+0x30);//高位3低位有数据
else LCM_WR(0xc9,0x20);//高位3没有数据
}
LCM_WR(0xca,d_var/10+0x30); LCM_WR(0xcc,d_var%10+0x30);
LCM_WR(0xcd,d_var/10+0x30);
}
//---- 硬件应用层驱动 ------------------------------------------------
void _nus(uchar us)
{
for(;us>0;us--)
;
}//短延时
void _nms(uchar ms)
{
for(;ms>0;ms--)
_nus(255);
}//长延时4.6ms
/*----液晶驱动函数定义------------------------------------------------------------
void LCM_WR_CMD(uchar); //写操作命令
void LCM_WR_DAT(uchar); //写数据
void LCM_WR(uchar,uchar);//输出一个字符
void LCM_RD_BUSY(void); //读忙信号
void LCM_WR_STR(uchar,uchar*);//输出字符串
void LCM_CUSTOM_CHAR(uchar,uchar,uchar,uchar,uchar,uchar,uchar,uchar);//自定义字符
--------------------------------------------------------------------------------*/
void LCM_RD_BUSY(void)
{
uchar lcm_rdby = 0x00;
LCM16_RS = 0; //RS 0
LCM16_RW = 1; //RW 1
LCM16_EN = 1; //EN 1 读忙信号
LCM16_IO = 0xff;
do{ lcm_rdby = LCM16_IO; }while(lcm_rdby&0x80); //MSB=0x80
_nop_();
}//读忙信号
void LCM_WR_CMD(uchar lcm_cmd)
{
LCM_RD_BUSY();
LCM16_RS = 0; //RS 0
LCM16_RW = 0; //RW 0
LCM16_EN = 1; //跳跃,写入数据
LCM16_IO = lcm_cmd; _nop_();
LCM16_EN = 0; _nop_();
}//写操作命令
void LCM_WR_DAT(uchar lcm_wrdat)
{
LCM_RD_BUSY();
LCM16_RS = 1; //RS 1
LCM16_RW = 0; //RW 0
LCM16_EN = 1; //跳跃,写入数据
LCM16_IO = lcm_wrdat; _nop_();
LCM16_EN = 0; _nop_();
}//写数据
void LCM_WR(uchar lcm_xy,uchar lcm_dat)
{
EA = 0;
//设置光标位置第一行0x80,第二行0xc0
LCM_WR_CMD(lcm_xy); LCM_WR_DAT(lcm_dat);
EA = 1;
}//输出一个字符
void LCM_WR_STR(uchar lcm_xys,uchar *str)
{
EA = 0;
LCM_WR_CMD(lcm_xys);
while(*str){ LCM_WR_DAT(*str); str++;}
EA = 1;
}//输出字符串
void LCM_CUSTOM_CHAR(uchar gram_num,uchar d0,uchar d1,uchar d2,uchar d3,uchar d4,uchar d5,uchar d6)
{
LCM_WR_CMD(gram_num);
LCM_WR_DAT(d0); LCM_WR_DAT(d1); LCM_WR_DAT(d2); LCM_WR_DAT(d3);
LCM_WR_DAT(d4); LCM_WR_DAT(d5); LCM_WR_DAT(d6); LCM_WR_DAT(0x00);
}//自定义字符
/*---------------- 24C02驱动 --------------------------------------
voidAT24_START(void); //开启
voidAT24_STOP(void); //停止
voidAT24_CK(void); //时钟
voidAT24_WR_byte(uchar);//写入单字节
uchar AT24_RD_byte(void); //读入单字节
uchar AT24_RD(uchar); //从24c02的地址中读取一个字节数据
voidAT24_WR(uchar,uchar); //向24c02的地址中写入一字节数据
-----------------------------------------------------------------*/
void AT24_START()
{
AT24_SDA = 1; _nop_(); AT24_SCL = 1; _nop_();
AT24_SDA = 0; _nop_(); AT24_SCL = 0; _nop_();
}//24c02启动
void AT24_STOP()
{
AT24_SDA = 0; _nop_(); AT24_SCL = 1; _nop_(); AT24_SDA = 1; _nop_();
}//24c02停止
void AT24_WR_byte(uchar mem_wrbt)
{
uchar mem_wrtp,mem_wrbtp;
mem_wrbtp = mem_wrbt;
for (mem_wrtp=8;mem_wrtp>0;mem_wrtp--){
mem_wrbtp = mem_wrbtp<<1;
AT24_SCL = 0; _nop_();
AT24_SDA = CY; _nop_(); //(bit)(mem_wrbtp&0x80)
AT24_SCL = 1; _nop_();
}
AT24_SCL = 0; _nop_(); AT24_SDA = 1; _nop_();
}//24c02写入单字节
uchar AT24_RD_byte()
{
uchar mem_rdtp,mem_rdbit,mem_rdbt=0;
AT24_SCL = 0; _nop_(); AT24_SDA = 1;
for(mem_rdtp=8;mem_rdtp>0;mem_rdtp--){
_nop_(); AT24_SCL = 1; _nop_();
if (AT24_SDA) mem_rdbit = 1;
else mem_rdbit = 0;
mem_rdbt=(mem_rdbt<<1)|mem_rdbit;
AT24_SCL = 0;
}
_nop_();
return mem_rdbt;
}//24c02读入单字节
void AT24_CK()
{
uchar mem_ck = 255;
AT24_SCL = 1; _nop_();
while((AT24_SDA)&&(mem_ck>0)) mem_ck--;
AT24_SCL = 0; _nop_();
}//24c02时钟等待
uchar AT24_RD(uchar mem_rdaddr)
{
uchar mem_rd; //在刚启动时使用,故EA不需复位
AT24_START();
AT24_WR_byte(0xa0); AT24_CK();
AT24_WR_byte(mem_rdaddr); AT24_CK();
AT24_START();
AT24_WR_byte(0xa1); AT24_CK();
mem_rd = AT24_RD_byte();
AT24_STOP(); _nms(4);
return mem_rd;
}//24c02读入
void AT24_WR(uchar mem_wraddr,uchar mem_wrinfo)
{
EA = 0; AT24_START();
AT24_WR_byte(0xa0); AT24_CK();
AT24_WR_byte(mem_wraddr); AT24_CK();
AT24_WR_byte(mem_wrinfo); AT24_CK();
AT24_STOP(); EA=1;
_nms(3);
}//24c02写入
//----END--------------------------------------------------------------- 电路图很简单,如下
http://cache.amobbs.com/bbs_upload782111/files_27/ourdev_538065.JPG
(原文件名:原理图.JPG)
我那个1602与别人有点不一样,1是VCC,2才是GND
http://cache.amobbs.com/bbs_upload782111/files_27/ourdev_538066.jpg
(原文件名:升压电路.jpg)
升压就是MC34063常用的! 利害! 回复【18楼】chchg
以前没注意霍尔元件的功耗,觉得好就用了,刚单独测了下,在5V时,电流3.1ma,有磁吸的时候3.25ma左右,看来霍尔还是有些耗电的,我刚才写程序还觉得TINY13的电流在500uA太大了!!!
-----------------------------------------------------------------------
线性霍尔很费电的
你应该选用开关型霍尔就很省电了
比如A3212E稳态电流就只有10个uA不到 正想问问楼主用的什么型号的霍尔呢. 好帖,不知楼主在不?传授一些经验,本人刚入行! 顶一下 I服了you,猛人呀 做的很好. 学习拉. 做个记号,家里有很多89c2051,如果哪天想起来要骑自行车,可以参考做个码表 回复【30楼】ccstc
-----------------------------------------------------------------------
回复【31楼】killin
-----------------------------------------------------------------------
是开关型霍尔元件AH02
http://cache.amobbs.com/bbs_upload782111/files_27/ourdev_539177.JPG
(原文件名:未命名.JPG) 不错!看来我真是懒人了。呵呵。我也想给我的电动车加个速度表,准备用5110屏。一直没有动手。看到LZ的作品正好参考一下。感谢。
霍尔的话我建议用电脑主机风扇上的霍尔。如果可以能还可以测量出正反向(起始没什么用)。 ddddddddddddddddddddddd 谢了 我也准备做个,用M48! 一直没有找到2教的霍尔原件,要不我也做了。
市场上都是3脚的,工业用的,当然不用考虑省电了,
我有一个成品的自行车码表,用的是2脚的霍尔原件,有磁场时是短路,离开磁场为断路,极省电,用2节纽扣电池,可以用1~2年,
谁有门路,找一批来。 mark 楼主的1602可以用锂电池啊…我的都不行。寒假做了个带rtc和温度计的,就是电源问题没解决: (
-----------------------------------------------------------------------
我用的1602也是5V的,锂电池3-4.2V不稳定,也不好驱动1602,所以我用34063升压到5V供系统工作,效率在72%的样子,不过34063便宜,还是很实用的。
-----------------------------------------------------------------------
1602有3.3v 和5v通用的 很稳定的~ 回复【44楼】lee_avr
楼主的1602可以用锂电池啊…我的都不行。寒假做了个带rtc和温度计的,就是电源问题没解决: (
-----------------------------------------------------------------------
我用的1602也是5V的,锂电池3-4.2V不稳定,也不好驱动1602,所以我用34063升压到5V供系统工作,效率在72%的样子,不过34063便宜,还是很实用的。
-----------------------------------------------------------------------
1602有3.3v 和5v通用的 很稳定的~
-----------------------------------------------------------------------
3.3v的不好买,5v的也可以改成3.3v的,不过需要负压! 今天特地测量了一下,升压后5V电路的电流,共6.6ma左右,霍尔元件就占了2.3ma!
周末去电子城看看有没有低功耗的霍尔元件,就如30L说的A3212E试试! MARK下 楼主是否可以蒋干簧管在自行车上和磁铁对应(干簧管吸合时)的照片上传一下?我发现干簧管吸合时,干簧管和磁铁需要靠很近,这样,车轮歪一下,就很容易撞在一起.谢谢! 如何装到轮子? 引用图片【楼主位】chchg
-----------------------------------------------------------------------
http://cache.amobbs.com/bbs_upload782111/files_27/ourdev_537434.jpg
(原文件名:http_imgload.jpg)
飘过
帅 回复【48楼】yangyi
-----------------------------------------------------------------------
我用的是霍尔元件和磁钢,距离在1.5cm左右都有反应! http://cache.amobbs.com/bbs_upload782111/files_27/ourdev_540103.JPG
(原文件名:电路板1.JPG)
这是今天才改的,原来的电源监控是在电池上的,换了一个容量更大的锂电池后,需要监视电池电量,要AD,本来想用STC12C2052AD的,电路板都不要改多少了,可惜没买到!所以换上AVR的单片机,想买M8也没有,最后买到了M48。
http://cache.amobbs.com/bbs_upload782111/files_27/ourdev_540104.JPG
(原文件名:全.JPG)
中间右边的是磁钢,安装在车轮毂上。左下的是用来固定传感器的。
http://cache.amobbs.com/bbs_upload782111/files_27/ourdev_540105.JPG
(原文件名:运行中界面.JPG)
LCM上的图标说明:第一行左起,第一个是电池电量,第二个是信号输入提示,并表示速度提高或降低,第三个里程值存取标志,最后是里程值。第二行是运行时间和速度值。原本还准备加温度测量的,不过试过DS18B20的电流后就没上了。 这个酷 真好,不过我每天走路上班 建议楼主在自行车上加一个小发电机,板子上加一个超级电容,就不用考虑功耗和电源的问题了 有空自己做一个 楼主,呼唤楼主啊! 小弟做测速的遇到困难了,求救咯! 很久以前见人用mc14553做的类似测速器。他的方法是用红外,通过车轮的辐条的遮挡实现计数。由于一圈下来有多个点,基本上可以实现实时测速。 mark. 回复【58楼】zhuanzhuan
----------------------------------------------------------------
光电传感的不好用可能,收发元件很快就被尘土遮掉了。 回复【58楼】zhuanzhuan
-----------------------------------------------------------------------
光电的与磁感应的比缺点较多阿,那些商用的码表不都是用的磁感应的吗! 大龙潭。龙泉医院 强人啊 标记 强人啊 我是骑自行车上学的,有空也做个来测试自己的最高时速 再发个最近改小的板子,IC都直接焊在洞洞板上。 50X40X12
http://cache.amobbs.com/bbs_upload782111/files_28/ourdev_547810.JPG
(原文件名:电路板3.JPG)
http://cache.amobbs.com/bbs_upload782111/files_28/ourdev_547811.JPG
(原文件名:轮周长设置界面.JPG)
http://cache.amobbs.com/bbs_upload782111/files_28/ourdev_547812.JPG
(原文件名:运行界面1.JPG) wonderful 卖一个表10多块钱,做一个成本非常高吧!
嘎嘎,玩的就是这种乐趣啊! 我手上有几个自行车码表,都被我拆了! 记号,我2005年做过个类似的码表实验,用的是Atmega8和诺基亚3310屏,只完成了即时速度显示、总里程、时钟功能。资料存在单位内部网站上,由于染毒,破坏了access数据库,打不开了。我记得在磁动力上我发过。 强人,顶 mark 楼主,请问你的传感器是如何安装的?磁钢和霍尔距离多少?如何可以的话上个照片那是最好不过了。。。
你的霍尔传感器哪里买的,多少钱一个 引用图片【52楼】chchg
-----------------------------------------------------------------------
http://cache.amobbs.com/bbs_upload782111/files_27/ourdev_540104.JPG
(原文件名:全.JPG)
请问你上面那层膜是啥东东啊,怎么弄上去的,可以防雨的样子。。 回复【73楼】zpyws
楼主,请问你的传感器是如何安装的?磁钢和霍尔距离多少?如何可以的话上个照片那是最好不过了。。。
你的霍尔传感器哪里买的,多少钱一个
-----------------------------------------------------------------------
下面是以前用数码管做里程计时用的传感器安装,磁铁和霍尔在1cm以内,最好在5mm左右,如果是磁钢,距离可远一点。
http://cache.amobbs.com/bbs_upload782111/files_28/ourdev_548855.JPG
(原文件名:SL371591.JPG)
这是才做的液晶显示的里程计的传感器部分,没有拍安装的照片,下面是安装在轮毂上的磁钢的连接。
http://cache.amobbs.com/bbs_upload782111/files_28/ourdev_548856.JPG
(原文件名:安装在轮毂上的磁钢.JPG)
下面是固定最下方传感器的固定圈。传感器可穿过固定圈。
http://cache.amobbs.com/bbs_upload782111/files_28/ourdev_548857.JPG
(原文件名:传感器安装固定圈.JPG)
下面是传感器
http://cache.amobbs.com/bbs_upload782111/files_28/ourdev_548858.JPG
(原文件名:全套.JPG)
我的霍尔在电子城买的,买的有点贵¥2。 回复【74楼】zpyws
-----------------------------------------------------------------------
就是一块塑料板,画好相应的尺寸,再折成那个形状的,用火烤一下,形状就固定下来了。 太强大了 呵呵··· 厉害,厉害,啥时间学会了也整个玩下! 1602液晶需要5V供电,而且背光耗电也大,如果直接用电子表的液晶就好了,功耗可以做的更低,直接用干电池就可以工作很长时间。 回复【2楼】dd123
-----------------------------------------------------------------------
这个简单 高中物理 定义转点覆盖弧度 角速度=转过的角度/时间 线速度=角速度*半径 这样实时的速度就出来了! 我照着做了一个,非常不错,就是发现时钟大概每小时块15分钟,如何在程序里面改啊?怎样改? mark 标记下有空自己也弄个 好东西 强悍!!!!!!!!!!!! mark mark 记号 楼主,能否将用AVR做的也公布一下程序. mark 牛! 学习了,谢谢! mark mark mark 牛 做的不错! LZ,问下你那个2051液晶版用的晶振是4M的 吗??顶楼出现的程序跟后面的简化版程序IO定义不一样啊,我按28楼的电路,用27楼跟1楼程序,液晶都没显示,好奇怪 这个1602看其来感觉特别小啊,请问下是不是缩小版的1602啊 回复【8楼】47okey
-----------------------------------------------------------------------
可以用激光或者红外的对管采集钢丝过的一瞬间电压变化。这样就比较精确了。