欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOC文档下载  

    自行车速度表设计.doc

    • 资源ID:2961592       资源大小:4.64MB        全文页数:34页
    • 资源格式: DOC        下载积分:8金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要8金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    自行车速度表设计.doc

    现在很多朋友都喜欢骑车锻炼身体,朋友们在骑行过程中可能会想到:要是也给自行车装上一个里程和速度表那该多好!一 来可以知道骑行的速度,二来可以知道骑行的路程。本人最近也刚入手了24速山地车,于是就决定给自己的车装上速度表。下面我们就进入正题。首先我们先了解速度的概念,速度就是物体在单位时间内通过的路程,通常我们以M/S为单位,相信大家从单位看出要测量自行车的速度必须要测量自行车在1S的时间内通过的路程,即车轮走过的路程。那么我们要怎么知道自行车在这1S走了多少M呢?这里涉及到车轮的转速,所谓转速就是车轮在单位时间内旋转的圈数,这里为了方便计算我们去1S钟,即车轮在1S内转过的圈数。假设1S钟内车轮旋转了N圈,那么我们只要计算出在这一秒内车轮走过的米数就能知道速度,根据数学公式车轮的周长C=2x3.14XR,其中R是车轮的半径,一秒走过的米数=NxC,速度= NxC/s。理论的计算方法就是这样了,那么我们怎么测量车轮的圈数呢?这里就要涉及到传感器方面的知识了。通常会用到两种测速的硬件,一是光电测试,光电测速的优点是比较精确,但是容易受自然光线的影响。另外一种是霍尔测速,利用霍尔传感器对磁铁的感应输出低电平的原理。在这里我们采用第二种测速硬件。要处理传感器的信号,我们还需要一个中央处理器,本人选的是单片机STC89C52,另外我们还要将处理的数据显示出来,在这里采用1602液晶显示屏。下面是各部分硬件: 首先是中央处理器其次是显示屏1602最后是霍尔传感器 接下来是制作和安装,这里只给出部分安装图,大家有不明白的地方再联系我1. 霍尔传感器安装碟刹上面的磁铁是220V吊扇拆出来的,一共装了5个霍尔传感器中央处理器和显示屏装在一个废旧的仪表盒里刚刚好,制作过程忘记拍照了,大家可以找合适的盒子安装。最后是车尾灯和转向灯再给出源程序供大家参考#include<reg52.h>#include<intrins.h>/_NOP_表示空循环一个机器周期的时间#define uint unsigned int/16位无符号整型#define uchar unsigned char/8位无符号字符型typedef bit bool;/定义位变量/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;/显示uint 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_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;x>0;x-) for(y=110;y>0;y-);/温度部分void D(uint count) /延迟函数 uint x; while(count) x=200; while(x>0) x-; count-; /DS18B20初始化(复位)void dsreset() uint i; DS=0; i=103; while(i>0)i-; DS=1; i=4; while(i>0)i-;bit tmpreadbit() /读一位 uint i; bit dat; DS=0;i+; /小延时一下 DS=1;i+;i+; dat=DS; i=8;while(i>0)i-; return (dat);uchar tmpread() / 读一个字节 uchar i,j,dat; dat=0; for(i=1;i<=8;i+) j=tmpreadbit(); dat=(j<<7)|(dat>>1); /读出的数据最低位在最前面,这样刚好 /一个字节在DAT里 return(dat);/将一个字节数据返回void tmpwritebyte(uchar dat) /写一个字节到DS18B20里 uint i; uchar j; bit testb; for(j=1;j<=8;j+)/一个字节8位 testb=dat&0x01; dat=dat>>1; if(testb) /写1部分 DS=0; i+;i+; DS=1; i=8;while(i>0)i-; else DS=0; /写0部分 i=8;while(i>0)i-; DS=1; i+;i+; /发送温度转换命令void tmpchange() dsreset(); /初始化DS18B20 D(1); /延时 tmpwritebyte(0xcc); /跳过序列号命令 tmpwritebyte(0x44); /发送温度转换命令 /获得温度uint tmp() uint temp; float tt; uchar a,b; dsreset(); D(1); tmpwritebyte(0xcc); tmpwritebyte(0xbe);/发送读取数据命令 a=tmpread(); /连续读两个字节数据 b=tmpread(); temp=b; temp<<=8; /两字节合成一个整型变量。 temp=temp|a; tt=temp*0.0625;/得到真实十进制温度值,因为DS18B20可以精确到0.0625度, /所以读回数据的最低位代表的是0.0625度。 temp=tt*10+0.5;/放大十倍,这样做的目的将小数点后第一位 /也转换为可显示数字,同时进行一个四舍五入操作。 return temp;/返回温度值/温度部分结束/lcd部分bool mang()/测试LCD忙碌状态bool result; rs=0;/写指令 rw=1;/写模式 lcden=1;/打开使能 _nop_();_nop_();_nop_();_nop_(); /延迟 3微秒 result = (bool)(P1 & 0x80);/测试P0口的第7位是1还是0,并强制转换为bool lcden=0;/关闭使能return result;xiezhiling(uchar od) while(mang();/lcd忙碌时程序停在这里 rs=0;/指令模式 rw=0;/写 lcden=0;/先关闭使能_nop_();_nop_();/延迟1微秒 P1=od;/指令赋予p0,等待送出 lcden=1;/使能打开,数据送出 _nop_();_nop_();_nop_();_nop_(); lcden=0;/关闭使能xieshuju(uchar dat) while(mang();/lcd忙碌时程序停在这里 rs=1;/数据模式 rw=0;/写 lcden=0;/先关闭使能 P1=dat;/指令赋予p0,等待送出 lcden=1;/使能打开,数据送出 _nop_(); _nop_(); _nop_(); _nop_(); lcden=0;/关闭使能weizhi(uchar pos)/设定显示位置xiezhiling(pos | 0x80);/lcd结束/EEPROMvoid ISP_IAP_enable(void) /* = 打开 ISP,IAP 功能 = */ EA = 0; /* 关中断 */ ISP_CONTR = ISP_CONTR & 0x18; /* 0001,1000 */ ISP_CONTR = ISP_CONTR | WaitTime; /* 写入硬件延时 */ ISP_CONTR = ISP_CONTR | 0x80; /* ISPEN=1 */void ISP_IAP_disable(void) /* = 关闭 ISP,IAP 功能 = */ ISP_CONTR = ISP_CONTR & 0x7f; /* ISPEN = 0 */ ISP_TRIG = 0x00; EA = 1; /* 开中断 */void ISPgoon(void) /* = 公用的触发代码 = */ ISP_IAP_enable(); /* 打开 ISP,IAP 功能 */ ISP_TRIG = 0x46; /* 触发ISP_IAP命令字节1 */ ISP_TRIG = 0xb9; /* 触发ISP_IAP命令字节2 */ _nop_();unsigned char byte_read(unsigned int byte_addr) /* = 字节读 = */ ISP_ADDRH = (unsigned char)(byte_addr >> 8);/* 地址赋值 */ ISP_ADDRL = (unsigned char)(byte_addr & 0x00ff); ISP_CMD = ISP_CMD & 0xf8; /* 清除低3位 */ ISP_CMD = ISP_CMD | RdCommand; /* 写入读命令 */ 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 = 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)(byte_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); 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;i<4;i+) xieshuju(tablei); /temp weizhi(10); /+0x30是为了让十进制变成字符xieshuju(A1+0x30);/温度第一位weizhi(11);xieshuju(A2+0x30);/第二位weizhi(12);xieshuju(0x2e);/小数点weizhi(13);xieshuju(A3+0x30);weizhi(14);xieshuju(0xdf);/度weizhi(15);xieshuju(0x43);/C/速度显示void speed()/*/厘米显示vcm=(628*0.05)*(SD);a=vcm/1000;/千cmb=vcm%1000/100;/百cmc=vcm%1000%100/10;/十cmd=vcm%1000%100%10;/cmweizhi(0x40);xieshuju( a+0x30);/weizhi(0x41);xieshuju( b+0x30);/weizhi(0x42);xieshuju( c+0x30);/weizhi(0x43);xieshuju( d+0x30);/weizhi(0x44);xieshuju(0x43);/Cweizhi(0x45);xieshuju(0x4d);/ Mweizhi(0x46);xieshuju(0x2f);/ /weizhi(0x47);xieshuju(0x53);/ S*/*/转速a=SD/1000;b=SD%1000/100;/百位c=SD%1000%100/10;d=SD%1000%100%10;weizhi(0x40);xieshuju(a+0X30);/千米weizhi(0x41);xieshuju(b+0X30);/百米weizhi(0x42);xieshuju(c+0X30);/十米weizhi(0x43);xieshuju(d+0X30);/米weizhi(0x44);xieshuju(0x52);/ rweizhi(0x45);xieshuju(0x2f);/ /weizhi(0x46);xieshuju(0x53);/ s*/米显示/*a=vm/1000;/千kmb=vm%1000/100;/百kmc=vm%1000%100/10;/十kmd=vm%1000%100%10;/kmweizhi(1);xieshuju(a+0x30);/千kmweizhi(2);xieshuju(b+0x30);/百kmweizhi(3);xieshuju(c+0x30);/十kmweizhi(4);xieshuju( d+0x30);/kmweizhi(5);xieshuju(0x4d);/ Mweizhi(6);xieshuju(0x2f);/ /weizhi(7);xieshuju(0x53);/ S*/*vm=(6.28*0.33*N1)/5;vm=0.414*N1;/vk=3.6*(6.28*0.33)*(N/5);/0.33为车轮的半径,N为脉冲总数,除以5是一周内安装5个脉冲感应点/vk=1.492*N1*10;/放大10倍vk=36*vm;a=vk/100;/千kmb=vk%100/10;/百kmc=vk%100%10;/十km/d=vk%1000%100%10;/kmweizhi(0x40);xieshuju(a+0x30);/十kmweizhi(0x41);xieshuju(b+0x30);/kmweizhi(0x42);xieshuju(0x2e);/小数点weizhi(0x43);xieshuju(c+0x30);/.km/weizhi(0x43);/xieshuju( d+0x30);/kmxieshuju(0x4b);/ Kweizhi(0x45);xieshuju(0x4d);/Mweizhi(0x46);xieshuju(0x48);/ S/*/里程显示void licheng() /gl=gy*2.07/5 /2.07为车轮外圆周长,一周有5个传感器gl=gy*0.414;/gl=N1*0.414;A1=gl/100000;B1=gl%100000/10000;C1=gl%100000%10000/1000;D1=gl%100000%10000%1000/100;E1=gl%100000%10000%1000%100/10;F1=gl%100000%10000%1000%100%10;weizhi(0x40+9);xieshuju(A1+0x30);/十万weizhi(0x40+10);xieshuju(B1+0x30);/万weizhi(0x40+11);xieshuju(C1+0x30);/千weizhi(0x40+12);xieshuju(D1+0x30);/百weizhi(0x40+13);xieshuju(E1+0x30);/十weizhi(0x40+14);xieshuju(F1+0x30);/个weizhi(0x40+15);xieshuju(0x4d);/My1=gy/10000;y2=gy%10000/1000;y3=gy%10000%1000/100;y4=gy%10000%1000%100/10;y5=gy%10000%1000%100%10;/自动计时void jishi()if(tt=20) tt=0;sec+; if(sec=60) sec=0;min+; cun=1;/存储标志置1,一分存一次 if(min=60) min=0;hour+; if(hour=24) hour=0; /骑行时间void shijian() ms=sec/10;/秒十位 mg=sec%10;/秒个位 fs=min/10;/分十位 fg=min%10;/分个位 ss=hour/10;/时十位 sg=hour%10;/时个位weizhi(0);xieshuju(ss+0x30);/时十位weizhi(1);xieshuju(sg+0x30);/时个位weizhi(2);xieshuju(0x3a);/:weizhi(3);xieshuju(fs+0x30);/分十位weizhi(4);xieshuju(fg+0x30);/分个位weizhi(5);xieshuju(0x3a);/:weizhi(6);xieshuju(ms+0x30);/秒十位weizhi(7);xieshuju(mg+0x30);/秒个位ini() /LCD初始化设定xiezhiling(0x38);/8位数据,双行显示(数据和显示行数)delay(1);xiezhiling(0x0c);/显示开,光标关,闪烁关(数据显示与否,光标显示与否和delay(1); /光标闪烁与否/xiezhiling(0x07);/光标,画面移动方式/delay(1); xiezhiling(0x01);/清除LCD的显示内容 delay(1);/定时器初始化 EA=0;/总中断 EX0=1;/外部中断0 IT0=1;/下降沿触发,来一次脉冲记一次 TMOD=0X51;/定时器0方式1,16位,定时器1方式2,自动重装 TH0=(65535-50000)/256; TL0=(65535-50000)%256; ET0=1; TR0=1; TH1=0;TL1=0; /TR1=1;/读EEPROM/byte_write(0x2006,0);/byte_write(0x2005,0);/byte_write(0x2004,0);/byte_write(0x2003,0);/byte_write(0x2002,0);/byte_write(0x2001,0);/byte_write(0x2000,0);min=byte_read(0x2006);hour=byte_read(0x2005); gy=byte_read(0x2004)*10000+ byte_read(0x2003)*1000+ byte_read(0x2002)*100+ byte_read(0x2001)*10+ byte_read(0x2000) ; delay(1000);/延长时间才能从EEPROM读出里程值 EA=1; void main() ini(); delay(10); while(1) if(cun=1)baocun(); if(!p30)iap=0x60;/执行自动下载的命令 wendu(tmp();/温度显示 tmpchange();/温度转换 speed();/速度显示 licheng();/里程显示 shijian(); jishi(); /while(1);void t0() interrupt 1 uint t4; TH0=(65535-50000)/256; TL0=(65535-50000)%256; t3+;t4+;tt+;/转向灯/if(t4=10)/sha1=sha1;t4=0;/sha2=sha2;/zuo=zuo;/you=you;/测速程序 TH=TH1;TL=TL1;/进入一次中断,读取计数值 if(t3=20)/1s TR1=0;/关闭计数定时器,等待下一轮触发 N1=TH*256+TL;/计算一秒内的计数值 t3=0; TH1=0;TL1=0; /里程计算void INt0() interrupt 0gy+;/每来一次中断计数一次if(gy>1)TR1=1;/外部测速传感器第一次经过不启动计数if(gy=50000)gy=0;

    注意事项

    本文(自行车速度表设计.doc)为本站会员(文库蛋蛋多)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开