《自行车速度表设计.doc》由会员分享,可在线阅读,更多相关《自行车速度表设计.doc(34页珍藏版)》请在三一办公上搜索。
1、现在很多朋友都喜欢骑车锻炼身体,朋友们在骑行过程中可能会想到:要是也给自行车装上一个里程和速度表那该多好!一 来可以知道骑行的速度,二来可以知道骑行的路程。本人最近也刚入手了24速山地车,于是就决定给自己的车装上速度表。下面我们就进入正题。首先我们先了解速度的概念,速度就是物体在单位时间内通过的路程,通常我们以M/S为单位,相信大家从单位看出要测量自行车的速度必须要测量自行车在1S的时间内通过的路程,即车轮走过的路程。那么我们要怎么知道自行车在这1S走了多少M呢?这里涉及到车轮的转速,所谓转速就是车轮在单位时间内旋转的圈数,这里为了方便计算我们去1S钟,即车轮在1S内转过的圈数。假设1S钟内车
2、轮旋转了N圈,那么我们只要计算出在这一秒内车轮走过的米数就能知道速度,根据数学公式车轮的周长C=2x3.14XR,其中R是车轮的半径,一秒走过的米数=NxC,速度= NxC/s。理论的计算方法就是这样了,那么我们怎么测量车轮的圈数呢?这里就要涉及到传感器方面的知识了。通常会用到两种测速的硬件,一是光电测试,光电测速的优点是比较精确,但是容易受自然光线的影响。另外一种是霍尔测速,利用霍尔传感器对磁铁的感应输出低电平的原理。在这里我们采用第二种测速硬件。要处理传感器的信号,我们还需要一个中央处理器,本人选的是单片机STC89C52,另外我们还要将处理的数据显示出来,在这里采用1602液晶显示屏。下
3、面是各部分硬件: 首先是中央处理器其次是显示屏1602最后是霍尔传感器 接下来是制作和安装,这里只给出部分安装图,大家有不明白的地方再联系我1. 霍尔传感器安装碟刹上面的磁铁是220V吊扇拆出来的,一共装了5个霍尔传感器中央处理器和显示屏装在一个废旧的仪表盒里刚刚好,制作过程忘记拍照了,大家可以找合适的盒子安装。最后是车尾灯和转向灯再给出源程序供大家参考#include#include/_NOP_表示空循环一个机器周期的时间#define uint unsigned int/16位无符号整型#define uchar unsigned char/8位无符号字符型typedef bit bool
4、;/定义位变量/lcdsbit lcden=P27;/lcd使能sbit rs=P26;/寄存器选择sbit rw=P25;/读写端口/温度sbit DS=P01;/定义DS18B20接口bit l=1;/uchar code table=TEMP;/测速uint t3,count,N1,flag=1,flag1,flag2,ds;uint r=0.33;/单车轮子半径,单位Muint a,b,c,d,n,j,vm,vcm,vk;uint TH,TL,gl,gy;/刹车和转向灯sbit sha1=P20;sbit sha2=P21;sbit zuo=P22;sbit you=P23;/显示ui
5、nt A1,B1,C1,D1,E1,F1;uint y1,y2,y3,y4,y5;/时钟uchar tt;/中断毫秒自加 uchar sec,min,hour;/自动计时的时分秒 uchar ms,mg,fs,fg,ss,sg;/数码管显示的时分秒位 sfr iap=0xe7; /定义下载命令 sbit p30=P30; /串口接收引脚/EEPROM#define RdCommand 0x01 /定义ISP的操作命令#define PrgCommand 0x02#define EraseCommand 0x03 #define WaitTime 0x02 /定义CPU的等待时间sfr ISP_
6、DATA=0xe2; /寄存器申明sfr ISP_ADDRH=0xe3;sfr ISP_ADDRL=0xe4;sfr ISP_CMD=0xe5;sfr ISP_TRIG=0xe6;sfr ISP_CONTR=0xe7;bit cun=0;/存储标志/Xmsdelay(uint z) uint x,y;for(x=z;x0;x-) for(y=110;y0;y-);/温度部分void D(uint count) /延迟函数 uint x; while(count) x=200; while(x0) x-; count-; /DS18B20初始化(复位)void dsreset() uint i;
7、 DS=0; i=103; while(i0)i-; DS=1; i=4; while(i0)i-;bit tmpreadbit() /读一位 uint i; bit dat; DS=0;i+; /小延时一下 DS=1;i+;i+; dat=DS; i=8;while(i0)i-; return (dat);uchar tmpread() / 读一个字节 uchar i,j,dat; dat=0; for(i=1;i=8;i+) j=tmpreadbit(); dat=(j1); /读出的数据最低位在最前面,这样刚好 /一个字节在DAT里 return(dat);/将一个字节数据返回void
8、tmpwritebyte(uchar dat) /写一个字节到DS18B20里 uint i; uchar j; bit testb; for(j=1;j1; if(testb) /写1部分 DS=0; i+;i+; DS=1; i=8;while(i0)i-; else DS=0; /写0部分 i=8;while(i0)i-; DS=1; i+;i+; /发送温度转换命令void tmpchange() dsreset(); /初始化DS18B20 D(1); /延时 tmpwritebyte(0xcc); /跳过序列号命令 tmpwritebyte(0x44); /发送温度转换命令 /获得
9、温度uint tmp() uint temp; float tt; uchar a,b; dsreset(); D(1); tmpwritebyte(0xcc); tmpwritebyte(0xbe);/发送读取数据命令 a=tmpread(); /连续读两个字节数据 b=tmpread(); temp=b; temp 8);/* 地址赋值 */ ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff); ISP_CMD = ISP_CMD & 0xf8; /* 清除低3位 */ ISP_CMD = ISP_CMD | RdCommand; /* 写入读命
10、令 */ ISPgoon(); /* 触发执行 */ ISP_IAP_disable(); /* 关闭ISP,IAP功能 */ return (ISP_DATA); /* 返回读到的数据 */void SectorErase(unsigned int sector_addr) /* = 扇区擦除 = */ unsigned int iSectorAddr; iSectorAddr = (sector_addr & 0xfe00); /* 取扇区地址 */ ISP_ADDRH = (unsigned char)(iSectorAddr 8); ISP_ADDRL = 0x00; ISP_CMD
11、= ISP_CMD & 0xf8; /* 清空低3位 */ ISP_CMD = ISP_CMD | EraseCommand; /* 擦除命令3 */ ISPgoon(); /* 触发执行 */ ISP_IAP_disable(); /* 关闭ISP,IAP功能 */void byte_write(unsigned int byte_addr, unsigned char original_data) /* = 字节写 = */ ISP_ADDRH = (unsigned char)(byte_addr 8); /* 取地址 */ ISP_ADDRL = (unsigned char)(byt
12、e_addr & 0x00ff); ISP_CMD = ISP_CMD & 0xf8; /* 清低3位 */ ISP_CMD = ISP_CMD | PrgCommand; /* 写命令2 */ ISP_DATA = original_data; /* 写入数据准备 */ ISPgoon(); /* 触发执行 */ ISP_IAP_disable(); /* 关闭IAP功能 */void baocun()/保存里程 /擦除扇区 SectorErase(0x2006); SectorErase(0x2005); SectorErase(0x2004); SectorErase(0x2003);
13、SectorErase(0x2002); SectorErase(0x2001); SectorErase(0x2000); /重新写入数据 byte_write(0x2006,min); byte_write(0x2005,hour); byte_write(0x2004,y1); byte_write(0x2003,y2); byte_write(0x2002,y3); byte_write(0x2001,y4); byte_write(0x2000,y5); cun=0;/温度显示程序void wendu(uint shu) uchar A1,A2,A2t,A3;/i A1=shu/100;/百位 A2t=shu%100; A2=A2t/10;/个位 A3=A2t%10; /小数点后一位 /weizhi(1);/第一行第一个字符开始 /for(i=0;i1)TR1=1;/外部测速传感器第一次经过不启动计数if(gy=50000)gy=0;