自行车测速仪设计报告
多功能自行车码表设计

多功能自行车测速仪目录一、产品设计背景 (2)二、产品功能简介 (2)三、系统硬件设计 (3)四、MCU软件设计 (8)五、上位机软件bike V1.0设计 (8)六、产品实物及测试 (10)6.1<测速模式> (13)6.2<数据传输> (14)6.3<其它功能> (15)6.4<退出系统> (16)七、结语 (16)附录1 电路图 (17)附录2 源程序 (18)多功能自行车测速仪使用说明书一、产品设计背景随着人们生活水平的逐渐提高,人们对于生活质量的要求也日益增加,尤其是对健身的要求。
自行车在中国普遍作为代步工具。
而在国外,自行车却是一项十分受欢迎的健身运动。
因为它无污染,价位低廉,老少皆宜。
而且在运动过程中可以充分享受到大自然,对于忙碌的现代人来说,无疑是一种较好的放松方法。
在中国这种情况也在慢慢发生变化。
因此爱好自行车运动的人十分学要一款能测速的装置,以知道自己的运动情况。
并根据外界条件,如温度,风速等进行适当的调节,已达到最佳运动的效果。
而对于自行车运动员来说,最为关心的莫过于一段时间内的训练效果。
因为教练要根据一段时间内运动员的训练效果进行评估,从而进行适当的调整已使运动员达到最佳的状态。
因此需要一种装置进行对训练中各种参数的测定记录。
本作品就是针对此而设计的。
二、产品功能简介⒈对自行车进行实时速度的测量。
显示出速度值。
⒉能针对不同的车型进行选择。
从而采用不同的模块进行测量。
⒊能测量出当前环境的温度,以供使用者决定是否适宜进行运动。
⒋显示当前日期时间,可以任意设定当前工作时间。
⒌显示行车里程,运动时间。
⒍可以自行设定采样频率⒎记录一段时间内的定时采样速度,存入制定单元。
通过与PC 机进行通讯,将数据传送到PC 机中用如见进行处理,分析。
得出运动或训练的情况。
⒏配套软件bike v1.0可以将本次运动的速度绘制成速度曲线,以供参考。
并可以将数据转存入数据库保存以备日后查询使用⒐配套软件bike v1.0 充分考虑到广大自行车爱好者对于自行车运动的热衷,因此加入了对自行车运动的介绍,当今流行车型的简介以及进行自行车运动的注意事项和自行车旅行的相关知识。
自行车里程速度计的设计

1 、引言 ................................ 错误!未定义书签。
2 、AT89C52单片机 (2)2.1 AT89C52单片机简介 (2)2.2 AT89C52的管脚及其含义 (3)3 、TC4024 (8)4、 24C01芯片 (9)4.124C01简介 (9)4.224C01的特性: (10)5 、硬件电路的设计 (11)5.1系统硬件电路 (11)5.2系统的工作原理 (12)6、软件设计 (13)6.1系统内存的规划 (13)6.2系统的主要程序设计 (13)7 、系统调试 (16)7.1硬件调试 (16)7.2软件调试 (16)参考文献 (18)1 引言传感器,英文名字为Sensor或Transducer,亦称换能器、变换器。
在科技迅速发展的今天,传感器越来倍受重视。
在日常生活、航天、航空,常规武器、交通运输,机械制造、化工、生物医学工程、自动化检测工程及计量等各项领域都被广泛应用。
目前,传感器已向新材料开发,集成化、智能化、数字化、新工艺,高精度化及高稳定、高可靠化等技术发展。
特别是霍尔传感器,鉴于它的价廉、易于使用,使它广泛运用于里程计、速度计等。
单片微型计算机简称单片机,又称微控制器,特别适用于控制领域。
通常单片机由单块集成电路构成,内部包含有计算机的基本部件:CPU(中央处理器),存储器和I/O接口电路等。
因此,单片机只需要与适当的软件及外部设备相结合,便可以成为一个单片机控制系统。
目前,场上销售的单片机有4位、8、16位、32位,并且单片机朝着高性能多种方向发展,尤其是8位单片机以经成为当前单片机的主流,主要体现在CPU功能增强、内部资源增多、引脚的功能化、低电压和低功好耗化上。
单片机因为其体积小、功能强,可靠性高,灵活方便等优点,所以可以用于各个领域,对各行各业的技术改造和产品更新换代起到重要的推动作用。
本人经过学习,用AT89C52设计了一个自行车里程/速度计。
自行车测速系统设计

2.2.1单片机介绍
单片机是一种集成在电路芯片,是在一块硅片上集成了中央处理器(CPU)、只读存储器(ROM)、随机存储器(RAM)以及定时器/计数器,各种输入/输出(I/O)接口。由于这样的一块芯片具有一台计算机的功能,因而也被称为单片微型计算机。系统所使用的是51系列单片机,它可以把可开发资源全部提供给使用者。
STC89C54RD+单片机为40 脚双列直插封装的8 位通用微处理器。片内程序存储器内含16KB的Flash程序存储器。片内数据存储器内含1280字节的RAM。具有3个可编程定时器,具有32根可编程I/O口线。 中断系统是具有8个中断源、4个级优先权的中断结构。
STC89C54RD+按其引脚功能分为四部分,即主电源引脚VCC和VSS、外接晶体引脚XTAL1和XTAL2、输入/输出(I/O)引脚P0、P1、P2、P3(共32根)、控制或与其它电源复用引脚RST、ALE、PSEN和EA/VPP。
国内外现在已经有生产销售类似的自行车测速仪里程表,有些简单的产品功能比较单一,就是单单只有测速或里程的功能,然而一些复杂的产品除了测速和里程功能外,还集成了GPS全球定位、单次行车里程、平均速度、时钟、行车时间、车轮转数。未来的发展趋势可能还将加入MP3和短信收发、新闻播报、通讯功能等,使得自行车测速仪更加的人性化、现代化、生活化。相信未来的测速仪会受到更多人的青睐,也将成为人类社会生活中的必需品。
关键词:里程/速度,时间,温度,霍尔元件,单片机,LCD
Abstract
This designmainly expounds thedesign of ameasuringinstrument based on single chip ing single chip as the core,the use ofthe Holzer sensor,DS18B20 temperature sensor\/DS1302 clock chip,realize the measurement of thebicycle mileage,speed,temperature,time and other parameters,and caneasily bespeed andmileagefor real-timedisplayof liquid crystal display,andwhenpower is offcan save themileage information.Design ofvelocimeteris mainly composed ofdesign and program designof the hardware circuitsof two parts.The design of hardwareis mainlycollectedthe number of pulsesper secondinto single chip microcomputer systemusing the Holzersensor,then bycomputingSCM systemand processing resultto theLCDdisplay.The software designuses the modularstructure,make thelogicprogram moresuccinct.Thehardware to coordinate the operationunder the software control.The simulation and experimental results show,the design of hardware circuit andsoftware programis correct,the actual hardware circuitcanmeet the design requirements.
自行车测速仪毕业设计开题报告

为了完成本课题,首先要将相关的资料仔细审查并整理一遍,在资料文献阅读之后,再结合本次设计的具体要求做个人需求分析,初步做个大致的流程图,在程序设计时尽量按照流程图设计,让思路保持清晰,同时考虑到实际需求可能有出入,所以要预留相应的接口为后期的扩展带来可能。自行车的速度里程表的设计思想、电路原理、方案论证以及元件的选择等内容都要考虑,整体上分为硬件部分设计和软件部分设计。
国内研究现状由于设计需要采用霍尔传感器国内这方面技术水平还有欠缺虽然现在已经有生产销售类似的自行车测速仪里程表但是产品功能比较单一就是单单只有测速或里程的功能国外研究现状国外除了上述功能还集成了gps全球定位单次行车里程平均速度时钟行车时车轮转数
毕业设计(论文)开题报告
题 目
自行车测速仪
学院
电气与信息工程学院
五、研究计划及预期成果:
第五周第六周 查阅相关资料,了解自行车测速仪的主要功能,进行总体方案设计,进行芯片选型,撰写开题报告。
第七周第八周第九周 完成各个模块设计,编写编程语言,并进行总体电路图的仿真调试
第十周 根据仿真结果对实物进行焊接,,完成调试。
第十一周第十二周第十三周 完成毕业设计的论文撰写,修改部分存在的问题,准备答辩材料。
三、课题研究内容及Байду номын сангаас新
本课题主要是利用霍尔元件、单片机等部件设计一个可用LCD液晶显示器实时显示里程和速度的自行车的速度里程表。本文主要介绍了自行车的速度里程表的设计思想、电路原理、方案论证以及元件的选择等内容,整体上分为硬件部分设计和软件部分设计。
本文首先扼要对该课题的任务进行方案论证,包括硬件方案和软件方案的设计;继而具体介绍了自行车的速度里程表的硬件设计,包括传感器的选择、单片机的选择、显示电路的设计;然后阐述了该自行车的速度里程表的软件设计,包括数据处理子程序的设计、显示子程序的设计;最后针对仿真过程遇到的问题进行了具体说明与分析,对本次设计进行了系统的总结。
毕业设计(论文)任务书格式--自行车速度计的设计

毕业设计(论文)任务书
学生姓名
专业班级:
设计(论文)题目自行车速度计的设计
一.设计要求
1.分析题目需完成的功能,问题描述准确.规范;
2.拟定实施方案,描述设计思路(框图);
3.详尽规划内容;
4.体现完整设计过程及交付最终作品。
二.主要内容(提纲式的内容要求)
1.利用霍尔传感器产生里程数的脉冲信号。
2.对脉冲信号进行计数。
实现:利用单片机自带的计数器T1对霍尔传感器脉冲信号进行计数。
3.对数据进行处理,要求用LCD显示里程总数和即时速度。
实现:利用软件编程,对数据进行处理得到需要的数值。
最终实现目标:自行车的速度/行程测试仪里具有速度、里程测试与显示功能,采用单片机作控制,显示电路可同时显示速度和里程。
三.完成任务
1.设计思路与内容文档。
2.设计过程参考资料清单及资料文档。
3.最终作品。
指导老师(签名):
教研室主任(签名):
2014 年 4 月 28 日
1。
自行车里程速度计设计

毕业设计(论文)题目:自行车里程速度计设计学院:电子信息学院专业班级:自动化2011级4班指导教师:王敏职称:讲师学生姓名:杨龙飞学号:41103010414摘要随着自行车行业和电子技术的发展,自行车速度里程计技术也在不断进步和提高,不仅可以显示速度里程,还可以显示热量消耗、心跳等参数,在大家注重环境保护和运动健康的今天,速度里程计不仅可以使运动者运动适量,还可以达到健康运动和代步的最佳效果,因此设计了以单片机为基础的自行车速度里程计,让人们能清楚地知道当前的速度、里程等物理量,而且单片机体积小、可靠性高、价格便宜。
该设计重点阐述了系统的工作原理、硬件构成、各部分的主要功能以及软件的结构和实现。
硬件包括主控模块、数据采集模块、数据处理模块、显示模块等组成,采用STC89C52单片机为主要控制芯片,运用自行车车轮上的传感器进行计数,通过一定时间间隔对信号的采集,结合自行车本身车轮参数,送入单片机并由单片机对采集信号进行分析计算,最终在液晶显示器LCD上显示车辆行驶的里程和速度;软件部分用C语言编程,采用模块化设计思想,并在keil和proteus 中进行调试和仿真。
自行车里程速度计的设计本着安全、方便、性价比高、人性化的原则进行,可使现代生活显著提高。
关键词:单片机,LCD1602,霍尔传感器,里程计ABSTRACTAs the bicycle industry and the development of electronic technology, bicycle speed odometer technology is also in constant progress and improve, not only can display speed range, can also display parameters such as heat consumption, heart rate, in everybody pays attention to environmental protection and health/fitness today, speed odometer can not only make people exercise right amount motion, also can to achieve the desired effect of the health sports and walking, thus designed on the basis of the single chip microcomputer bike speed odometer, let people can clearly know the current speed, mileage and other physical quantities, in addition, SCM has small size, high reliability and cheaper price.The design expounds the working principle, hardware composition, main functions of each part and the software structure and implementation. Hardware includes main control module, data acquisition module, data processing module, display module and so on, Using the STC89C52 single-chip microcomputer as main control chip, using sensors on bicycle wheels to count, sending the signals collected by a certain time interval and the bike itself parameters to the single chip microcompute. Finally Using single chip microcomputer to collect signal analysis and display.Software part in C language programming Adopting the idea of modular design, and debugging and simulation in the keil and proteus. Bicycle mileage speedometer design in line with safe, convenient and cost-effective, humanized principle, can make modern life improved significantly.KEYWORDS:singlechip, LCD1602, Hall sensor, odometer目录第1章绪论 (1)1.1 课题背景 (1)1.2 系统要求 (1)1.3 课题实现方法 (2)第2章系统框图及方案介绍 (3)2.1 总体方案比较 (3)2.2 总体方案选择 (3)2.2.1 系统总体框图 (3)2.2.2 系统总体设计 (3)2.3 各模块设计与选择 (4)2.3.1 单片机的选择 (4)2.3.2 显示模块的选择 (5)2.3.3 传感器的选择 (5)2.3.4 时钟芯片的选择 (6)2.3.5 按键模块的选择 (6)第3章硬件设计 (7)3.1 单片机最小系统 (7)3.1.1 最小系统接线图 (7)3.1.2 时钟电路 (7)3.1.3 复位电路 (8)3.2 显示模块 (8)3.2.1 液晶显示电路 (8)3.2.2 显示器LCD1602的介绍 (9)3.3 传感器模块 (11)3.3.1 霍尔传感器工作原理 (11)3.3.2 霍尔传感器的特性 (12)3.3.3 测速方法 (13)3.4 时钟模块 (13)3.4.1 时钟电路 (13)3.4.2 时钟芯片介绍 (14)3.4.3 DS1302的工作原理 (14)3.4.4 DS1302的控制字节 (14)3.4.5 数据输入输出(I/O) (15)3.5 按键模块 (15)3.6 系统总设计图 (15)第4章系统软件设计与实现 (17)4.1 C语言介绍 (17)4.2 软件实现的功能 (18)4.3 主流程图 (18)4.5 显示子程序设计 (19)4.6 速度、里程处理流程设计 (20)4.6.1 处理流程图 (20)4.6.2 算法流程 (21)4.7 按键处理流程设计 (22)第5章系统调试与仿真 (23)5.1 软件调试 (23)5.1.1 Keil简介 (23)5.1.2 程序调试 (23)5.1.3调试中的问题 (23)5.2 硬件仿真 (24)5.2.1 Proteus简介 (24)5.2.2 Proteus与Keil联调 (25)5.2.3硬件仿真中的问题 (26)5.3实物实现 (27)第6章总结 (29)参考文献 (31)附录.....................................................................................错误!未定义书签。
基于单片机自行车测速仪的设计毕业设计

基于单片机自行车测速仪的设计摘要本设计主要阐述一种基于单片机与霍尔传感器等元件的测速仪设计。
以AT89C51单片机为核心,实现对自行车里程、速度、时间、温度等参数的测量,并能简单的将里程及速度用LCD实时显示。
在本文中详细介绍了测速仪的硬件电路和软件设计。
硬件部分利用霍尔传感器将每秒内的脉冲数传入单片机系统,然后经单片机系统计算处理并将过处理结果送LCD显示。
软件的设计采用模块化结构,使程序的逻辑关系更加简洁。
使硬件在软件的控制下协调运作。
仿真,所设计的硬件电路及软件程序是正确的,实际的硬件电路中也基本上能够满足设计要求。
关键词:里程/速度,时间,温度,霍尔元件,单片机,LCDAbstractThis design mainly elaborated based on MCU and Hall element of speed instrument design. Take STC MCU as the core, Hall element speed, realizes to the bicycle mileage, speed, time, temperature measurement, and a simple bicycle mileage and speed with the LCD real time display. The hardware part using the Hall element will bike per second pulse number of incoming MCU system, and then by the single chip microcomputer system calculation processing and processing result to the LCD display. Program design in order to facilitate the expansion and the change, the software design uses the modular structure, make the logic relations more concise. Make hardware tocoordinatethe operation under the software control. Simulation experiments show that the designed hardware circuit and software program are correct, practical hardware circuit also basically can satisfy the design requirement, but due to the knowledge, in practice there are still some problems in the hardware circuit.Keywords: Mileage / speed,time, temperature, Hall element, MCU,LCD毕业设计(论文)原创性声明和使用授权说明原创性声明本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。
多功能自行车测速仪

多功能自行车测速仪目录单片机自行车测速仪设计.............. 错误!未定义书签。
目录 (1)产品设计背景 (2)中英文摘要 (3)总体设计思想 (5)硬件设计部分 (6)AT89C52 单片机 (7)温度传感器DS1820 (9)AH3503线性霍尔 (10)HC-SR04超声波 (11)太阳能 (13)软件设计部分 (14)总结 (30)参考文献 (30)产品设计背景低碳环境更美好: 一个智慧城市,除了会运用科技改善市民生活,更懂得运用科技保护现有的资源,使市民的生活环境更美好。
PM2.5的数据、绿色公交的推行、污染企业排放量、各水道水质变化监控、道路交通电子眼……以科技控制、数据交换为主的系统,正是智慧城市的基石。
不仅精细到市民的衣食住行,也可以大到环境气象的预警、区域碳排放的监测,用科技的手段让市民生活、城市环境都变得更美好。
自行车不仅有利于人们出行,也有利于缓解城市交通压力,减少环境污染,既对公众个人有利,也对社会有利。
自行车并不会给现代化进程添堵,相反,我们的道路现代化却给骑车的人和开车的人都添了堵。
让自行车道消失,从现在来看,这不是现代化,这是对现代化的误解。
而在国外,自行车却是一项十分受欢迎的健身运动。
因为它无污染,价位低廉,老少皆宜。
而且在运动过程中可以充分享受到大自然,对于忙碌的现代人来说,无疑是一种较好的放松方法。
在中国这种情况也在慢慢发生变化。
AbstractThe system consists of AT89C52 SCM, LCD liquid crystal display, Holzer element, small magnet. The system includes a bicycle speed, mileage, and is equipped with a small keyboard on the total mileage cleared, the wheel circumference setting.In 1, the bicycle speed measurement, showing speed value.2, which can measure the environment temperature, for users to decide whether or not suitable for sports.3, display mileage.In 4, after the car has no display vehicle or vehicle and the workshop of the distance.In 5, a solar charging battery, sharing the burden.Through the sensor external physical quantity to be measured, the physical signal into an electrical signal, input AT89C52 chip, AT89C52 chip on the input signal processing, the final output display, and a certain degree of alarm function, if the temperature is high will remind you,The car has a car and will alert you too close. The design used in the main part comprises a singlechip AT89C52, HC-SR04, DS18B20 temperature sensor, ultrasonic sensor, 12864 LCD AH3503 Holzer.摘要本系统由AT89C52单片机、LCD液晶显示、霍尔元件、小磁铁等组成。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
嵌入式系统设计自行车车速报警系统摘要本课题实验主要是利用STC89C52RC、12864液晶、24C02E^2PROM、霍尔传感器和加速度倾角传感器来实现自行车测速功能。
通过霍尔传感器来采集信号,经过单片机处理后,由12864液晶显示其总里程,分里程,速度,加速度;信号经过加速度倾角传感器读出坡度值,并在12864液晶中显示出来;然后由数学公式计算出消耗的卡路里值。
12864显示页面一共有三面。
按键具有调控展现的页面,清除分里程数据,保存总里程数据的功能,利用24C02实现断电不消失的功能。
发光二极管模块,利用MOS管的特性可以实现在暗处自动点亮。
关键词:自行车测速仪;霍尔传感器A3144;加速度倾角传感器MMA7455;12864LCD目录1设计要求................................2设计方案................................2.1 芯片的选择...............................2.2 霍尔传感器与单片机的通信..............2.3 12864液晶屏与单片机..................2.4 单片机与24C02 ........................2.5 单片机与MMA7455 ......................2.6 单片机下载程序........................3总体方案................................3.1工作原理.............................3.2总体设计.............................4系统硬件设计............................4.1STC89C52RC单片机最小系统.............4.2各部分电路电路图.....................4.3整体电路.............................5系统软件设计............................5.1主程序流程...........................参考文献....................................附录........................................1设计要求1.1 发光二极管模块在暗处自动点亮功能。
1.2 利用霍尔传感器采集信号,由单片机处理后控制外围设备工作。
1.3 利用单片机控制12864液晶屏显示。
1.4 将指定的数据放入24C02中,达到断电不丢失的效果。
1.5 用Keil uVision3编写C程序,利用单片机最小系统烧写程序到单片机。
1.6 利用传感器模块计算倾角(坡度),由12864液晶显示。
2设计方案2.1 芯片的选择自行车测速仪按系统功能实现要求,决定控制系统采用STC89C52RC单片机,采集信号的霍尔传感器采用A3144,保存信息的E^2PROM 24C02,计算倾角的加速度倾角传感器MMA7455,用于显示的12864液晶。
2.2 霍尔传感器与单片机之间的通信将霍尔传感器的信号输出端和单片机的某一个I/O口相连(本板子中使用P2^3),通过检测P2^3电平的下降沿和上升沿来编写程序,以达到计数的功能。
2.3 12864液晶屏与单片机将12864液晶屏按照其操作指南正确连接在电路中,编写程序,由单片机控制12864液晶显示各种数据。
2.4 单片机与24C02程序编写中,要求保存功能的按键按下时,总里程的数据写入到24C02芯片中,达到断电不丢失的功能。
将24C02按照操作手册正确连接到电路中,由单片机控制,当检查到按键按下时,执行程序:经总里程数据写入24C02中,保存起来。
2.5 单片机与MMA7455此模块是用集成工艺制作好的商品。
按照操作手册正确连接到电路中,根据芯片资料和示例程序可以使其输出角度值,然后在12864中显示出来。
2.6单片机下载程序利用单片机最小系统和串口(配合MAX232转电平芯片),借助STC下载器完成程序的烧写。
3 总体方案3.1 工作原理本实验主要是利用STC89C52RC、12864液晶、24C02E^2PROM、霍尔传感器和加速度倾角传感器来实现自行车测速功能。
通过霍尔传感器来采集信号,经过单片机处理后,由12864液晶显示其总里程,分里程,速度,加速度;信号经过加速度倾角传感器读出坡度值,并在12864液晶中显示出来;然后由数学公式计算出消耗的卡路里值。
12864显示页面一共有三面。
按键具有调控展现的页面,清除分里程数据,保存总里程数据的功能,利用24C02实现断电不消失的功能。
发光二极管模块,利用MOS管的特性可以实现在暗处自动点亮。
3.2设计总体框图4 系统硬件设计4.1 STC89C52RC单片机最小系统4.1.1最小系统包括晶体振荡电路、复位开关和电源部分。
4.2各部分电路4.2.1 主要控制部分(STC89C52RC)4.2.2 12864液晶部分4.2.3 24C02部分电路4.2.4 串口及MAX232部分4.2.5 倾角传感器MMA74554.2.6 霍尔传感器部分4.2.7 发光二极管独立显示模块4.3整体电路5 系统软件设计主程序流程图参考文献[1] 沈红卫《基于单片机结构的智能系统设计与实现》电子工业出版社[2] 黄惠媛《单片机原理与接口技术》海洋出版社[3] 周平伍云辉《单片机应用技术》电子科技大学出版社[4] 吴金戌沈金阳郭庭吉《8051单片机实践与应用》清华大学出版社[5] 黄正谨等《电子设计竞赛赛题解析》东南大学出版社附录程序:/*************河北大学电信学院***********//*******************李炜*****************//***********自行车测速仪程序**************/#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int/**********液晶屏相关部分*****************/#define lcd_port P0 //液晶屏指令、数据通信接口sbit rs=P2^7; //液晶屏寄存器选择接口(rs=0时选择指令寄存器,rs=1时选择数据寄存器)sbit rw=P2^6; //液晶屏读写选择接口(rw=0时选择写入,rw=1时选择读出)sbit en=P2^5; //液晶屏使能接口(en=0时通信接口中断,en=1时通信接口接通)sbit ret=P2^4; //液晶屏主复位引脚/*********子函数部分*****************/void delayms_lcd(uint ms); //延时子函数,时间为1msvoid delay_n10_us(uint n); //10微秒延时函数(n*10us)void lcd_wr_command(uchar com); //向液晶屏输入命令子函数void lcd_wr_data(uchar dat); //向液晶屏输入数据单字节子函数void lcd_int(); //LCD初始化void picture_show0(); //12864画面0void picture_show1(); //12864画面1void picture_show2(); //12864画面2void picture_select(); //12864画面选择void key_select(); //按键相关判断void interrupt_set(); //中断函数参数设定void start_24C02(); //24C02起始信号void write_one_char(uchar x); //写入一个字节void wait_ack(); //等待应答uchar read_one_char(); //读出一个字节void stop_24C02(); //24C02终止信号void read_total_distance(); //读出24C02中数据并且赋值给total_distancevoid write_total_distance(); //写入24C02中total_distance数据void write_total_distance1(); //写入24C02中total_distance数据void forbid_data(); //限制所有变量的取值/*********24C02相关部分****************/sbit SCL=P1^5; //串口时钟引脚sbit SDA=P1^4; //串口数据引脚/**********相关数组部分***********/uchar code data1[]="欢迎使用";uchar code data2[]="自行车测速仪";uchar code data3[]="制作人";uchar code data4[]="李炜";uchar code data5[]="赵向辉";uchar code data6[]="总里程";uchar code data7[]="分里程";uchar code data8[]="速度";uchar code data9[]="加速度";uchar code data10[]="坡度";uchar code data11[]="卡路里";uchar code data12[]="请注意安全";uchar code data_show[]="0123456789" ;/***********相关变量部分************/uint new_total_distance=0,old_total_distance=0; //四位数据uint new_part_distance=0,old_part_distance=0; //三位数据uint old_speed=0,new_speed=0; //两位数据uint old_acceleration=0,new_acceleration=0; //两位数据uint old_ascent=0,new_ascent=0; //三位数据uint calorie=0; //三位数据uchar old_j=0,new_j=0,part_flag=0,write_flag=0,show_flag=0,control_flag=0; static uint time=0;/*******按键相关**************/sbit key1=P1^0; //页面上翻sbit key2=P1^1; //手动保存sbit key3=P1^2; //页面下翻sbit key4=P1^3; //清除分里程数据/*********霍尔传感器相关部分**********/sbit A3145_OUT=P2^3;/***********************************/void main(){read_total_distance();lcd_int(); //LCD初始化picture_show0();delayms_lcd(2000);lcd_int();picture_show1();delayms_lcd(2000);lcd_int();picture_show2();delayms_lcd(2000);interrupt_set();A3145_OUT=1;while(1){key_select();picture_select();if(control_flag==0)new_total_distance=new_part_distance;if(show_flag==1){if(old_j==1)picture_show1();if(old_j==2)picture_show2();}if(part_flag==1){while(A3145_OUT==0) ;ET0=0;TR0=0;new_speed=250/time;new_acceleration=(new_speed-old_speed)*50/time;time=0;ET0=1;TR0=1;new_part_distance+=5;calorie=(calorie+5);part_flag=0;show_flag=1;}forbid_data();}}/************限制所有变量的取值************/void forbid_data(){if((old_total_distance+new_total_distance)>9999){new_total_distance=old_total_distance=0;}if(new_part_distance>999){new_part_distance=0;write_total_distance();read_total_distance();}if(new_speed>99)new_speed=0;if(new_acceleration>99)new_acceleration=0;if(calorie>999)calorie=0;}/***********LCD显示画面0********************/ void picture_show0(){uchar i;i=0;lcd_wr_command(0x82); //设置液晶屏的显示位置while(data1[i]!=0){lcd_wr_data(data1[i]);i++;}i=0;lcd_wr_command(0x91);while(data2[i]!=0){lcd_wr_data(data2[i]);i++;}i=0;lcd_wr_command(0x8A);while(data3[i]!=0){lcd_wr_data(data3[i]);i++;}i=0;lcd_wr_command(0x99);while(data4[i]!=0){lcd_wr_data(data4[i]);i++;}i=0;lcd_wr_command(0x9C);while(data5[i]!=0){lcd_wr_data(data5[i]);i++;}}/**************LCD画面1********************/ void picture_show1(){uchar i,flag=0;uint temp;i=0;lcd_wr_command(0x81); //设置液晶屏的显示位置while(data6[i]!=0){lcd_wr_data(data6[i]);i++;}lcd_wr_command(0x84);temp=(new_total_distance+old_total_distance);if(temp/1000==0)lcd_wr_data(' ');else{lcd_wr_data(data_show[temp/1000]); //显示数据(字符)flag=1;}temp%=1000;if((temp/100)!=0||flag==1){lcd_wr_data(data_show[temp/100]); //显示数据(字符)flag=1;}elselcd_wr_data(' ');temp%=100;if((temp/10)!=0||flag==1){lcd_wr_data(data_show[temp/10]); //显示数据(字符)flag=1;}elselcd_wr_data(' ');temp%=10;lcd_wr_data(data_show[temp]); //显示数据(字符)lcd_wr_command(0x86);lcd_wr_data('m');i=0;flag=0;lcd_wr_command(0x91);while(data7[i]!=0){lcd_wr_data(data7[i]);i++;}lcd_wr_command(0x94);temp=new_part_distance;if(temp/100==0)lcd_wr_data(' ');else{lcd_wr_data(data_show[temp/100]); //显示数据(字符)flag=1;}temp%=100;if((temp/10)!=0||flag==1){lcd_wr_data(data_show[temp/10]); //显示数据(字符)flag=1;}elselcd_wr_data(' ');temp%=10;lcd_wr_data(data_show[temp]); //显示数据(字符)lcd_wr_command(0x96);lcd_wr_data('m');i=0;flag=0;lcd_wr_command(0x89);while(data8[i]!=0){lcd_wr_data(data8[i]);i++;}lcd_wr_command(0x8B);temp=new_speed;if(temp/10==0)lcd_wr_data(' ');elselcd_wr_data(data_show[temp/10]); //显示数据(字符)temp%=10;lcd_wr_data(data_show[temp]); //显示数据(字符)lcd_wr_command(0x8C);lcd_wr_data('m');lcd_wr_data('/');lcd_wr_data('s');i=0;old_speed=new_speed;lcd_wr_command(0x99);while(data12[i]!=0){lcd_wr_data(data12[i]);i++;}}/**************LCD画面2********************/void picture_show2(){uchar i,flag=0;uint temp;i=0;lcd_wr_command(0x81);while(data9[i]!=0){lcd_wr_data(data9[i]);i++;}lcd_wr_command(0x84);temp=new_acceleration;if(temp/10==0)lcd_wr_data(' ');elselcd_wr_data(data_show[temp/10]); //显示数据(字符)temp%=10;lcd_wr_data(data_show[temp]); //显示数据(字符)lcd_wr_command(0x85);lcd_wr_data('m');lcd_wr_data('/');lcd_wr_data('s');lcd_wr_data('2');i=0;flag=0;lcd_wr_command(0x91);while(data10[i]!=0){lcd_wr_data(data10[i]);i++;}lcd_wr_command(0x93);temp=new_ascent;if(temp/100==0)lcd_wr_data(' ');else{lcd_wr_data(data_show[temp/100]); //显示数据(字符)flag=1;}temp%=100;if((temp/10)!=0||flag==1){lcd_wr_data(data_show[temp/10]); //显示数据(字符)flag=1;}elselcd_wr_data(' ');temp%=10;lcd_wr_data(data_show[temp]); //显示数据(字符)lcd_wr_command(0x95);lcd_wr_data(0x09);i=0;flag=0;lcd_wr_command(0x89);while(data11[i]!=0) {lcd_wr_data(data11[i]);i++ ;}lcd_wr_command(0x8C);temp=calorie;if(temp/100==0)lcd_wr_data(' ');else{lcd_wr_data(data_show[temp/100]);flag=1;}temp%=100;if((temp/10)!=0||flag==1){lcd_wr_data(data_show[temp/10]); //显示数据(字符)flag=1;}elselcd_wr_data(' ');temp%=10;lcd_wr_data(data_show[temp]); //显示数据(字符)lcd_wr_command(0x8E);lcd_wr_data('k');i=0;flag=0;lcd_wr_command(0x99);while(data12[i]!=0){lcd_wr_data(data12[i]);i++ ;}}/***************LCD初始化************************/void lcd_int(){ret=0; //液晶屏复位delayms_lcd(2);ret=1;delayms_lcd(2);lcd_wr_command(0x30); //启动液晶屏基本指令集并开启绘图显示功能lcd_wr_command(0x0c); //开显示,关光标,不闪烁lcd_wr_command(0x06); //字符进入模式为:字符不动,光标右移,地址加一lcd_wr_command(0x01); //清屏delayms_lcd(2); //等待清屏完成}/**********向液晶屏写入命令子函数******************/void lcd_wr_command(uchar com){en=0;//关闭通信,为设置参数做准备rs=0;//选择指令寄存器rw=0;//写入液晶en=1;//为开始通信做准备lcd_port=com;delay_n10_us(8);//大于72us的延时(根据手册)en=0;//数据送如液晶屏并关闭通信(en的下降沿液晶屏接收数据)}/********向液晶屏输入数据子函数************/void lcd_wr_data(uchar dat){en=0;//关闭通信,为设置参数做准备rs=1;//选择数据寄存器rw=0;//写入液晶en=1;//为开始通信做准备lcd_port=dat;delay_n10_us(8);//大于72us的延时(根据手册)en=0;//数据送如液晶屏并关闭通信(en的下降沿液晶屏接收数据) }/***********毫秒延时函数,延时1ms***********/void delayms_lcd(uint ms){uchar i;while(ms--){for(i=0;i<121;i++);}}/***********10微秒延时函数(n*10us)***********/void delay_n10_us(uint n){while(n--){_nop_();_nop_();}}/*************LCD显示画面选择********************/void picture_select(){if(old_j==new_j) ;else{switch(new_j){case 1 :lcd_int();picture_show1();old_j=new_j;break;case 2 :lcd_int();picture_show2();old_j=new_j;break;}}}/*************按键相关判断********************/void key_select(){if(key1==0){delayms_lcd(7);if(key1==0){new_j=2;while(key1==0);}}if(key2==0){delayms_lcd(7);if(key2==0){old_total_distance+=new_total_distance;new_total_distance=0;write_total_distance();control_flag=1;while(key2==0);}}if(key3==0){delayms_lcd(7);if(key3==0){new_j=1;while(key3==0);}}if(key4==0){delayms_lcd(7);if(key4==0){old_total_distance+=new_total_distance;new_part_distance=0;while(key4==0);}}}/*************中断函数参数设定**************/void interrupt_set(){TMOD=0x11; //0001 0001 T1、T0工作在定时方式1TH1=(65536-10000)/256; //T1定时时间为10毫秒(10000微秒)TL1=(65536-10000)%256;TH0=(65536-20000)/256;TL0=(65536-20000)%256;ET1=1; //启动T1中断允许位ET0=1;EA=1; //启动总中断允许位TR1=1; //启动T1TR0=1;}/*************T1中断函数**************/void timer1() interrupt 3 using 1{ET1=0; //关闭T1中断允许位TH1=(65536-10000)/256; //重设T1定时时间为10毫秒(10000微秒)TL1=(65536-10000)%256;if(A3145_OUT==0){part_flag=1;}ET1=1; //开启T1中断允许位}/*************T0中断函数**************/void timer2() interrupt 1 using 2{TH0=(65536-20000)/256;TL0=(65536-20000)%256;time++;}/*************写入24C02中数据************/void write_total_distance(){start_24C02();write_one_char(0xa0);wait_ack();write_one_char(0x01);wait_ack();write_one_char(old_total_distance/256);wait_ack();stop_24C02();delayms_lcd(100);start_24C02();write_one_char(0xa0);wait_ack();write_one_char(0x02);wait_ack();write_one_char(old_total_distance%256);wait_ack();stop_24C02();delayms_lcd(100);}/*************读出24C02中total_distance数据****************/ void read_total_distance(){start_24C02();write_one_char(0xa0);wait_ack();write_one_char(0x01);wait_ack();start_24C02();write_one_char(0xa1);wait_ack();old_total_distance=read_one_char()*256;stop_24C02();delayms_lcd(100);start_24C02();write_one_char(0xa0);wait_ack();write_one_char(0x02);wait_ack();start_24C02();write_one_char(0xa1);wait_ack();old_total_distance+=read_one_char();stop_24C02();delayms_lcd(100);}/*************24C02启动程序****************/void start_24C02(){SCL=0;_nop_();SDA=1;_nop_();SCL=1;_nop_();SDA=0;_nop_();SCL=0;}/***********24C02写入一个字节*************/ void write_one_char(uchar x)//写入一个字节{uchar i;for(i=0;i<8;i++){x<<=1;SCL=0;_nop_();SDA=CY;_nop_();SCL=1;_nop_();}SCL=0;_nop_();}/**********24C02等待应答***********/void wait_ack(){SCL=0;_nop_();SDA=1;//释放数据线_nop_();SCL=1;_nop_();while(SDA==1);SCL=0;_nop_();}/*************24C02读出一个字节**********/ uchar read_one_char()//读出一个字节{uchar i,temp=0;SCL=0;_nop_();SDA=1;//释放数据线_nop_();for(i=0;i<8;i++){SCL=1;_nop_();temp<<=1;temp=temp|SDA;SCL=0;_nop_();}return(temp);}/*************24C02终止程序*************/ void stop_24C02(){SCL=0;_nop_();SDA=0;_nop_();SCL=1;_nop_();SDA=1;_nop_();SCL=0;//当总线多个器件时必须SCL=1;}。