精华内容
下载资源
问答
  • 2017-10-09 13:46:00

    什么是自行车码表?

    【码表】用以计算里程及速度的电子产品。由安装于前车圈钢条上的感应磁铁、前上的感应器、顺着连接线、置于握把上面的码表座和座上面的码表。

    自行车码表的工作原理是:

    车圈旋转时感应器捕捉到感应磁铁带来的信息,通过传感线传输至码表,主机码表对此进行处理后计算出时速、里程等信息。

    通俗点的说是:
    在前轮子上装了一个类似磁铁的东西,前叉上装有一个感应器,轮子转一圈,磁铁就从感应器旁边经过一次,码表就计一圈,根据事先设定好的轮子参数,码表就把速度,路程算出来了。

    简单的说:工作原理就是骑行过程中形成的气流通过码表的风孔产生感应,从而测量出速度。

    自行车码表哪个品牌的好?

    一般主流是SIGAM(德国的西格玛)和CAT EYE(日本的猫眼)两个牌子。SIGMA是台湾产,德国的设计;CAT EYE是大陆产,日本的设计。

    代表型号是SIGMA的BC 5069061106三个型号,以及更高一点的BC1606L。前两位或者一位数字代表功能数量,L代表夜光功能。

    CAT EYE的VELO 5VELO 8比较常见,分别是5功能表和8功能表,对应SIGMA的BC506、BC906。但是价格都比SIGMA的稍微高个二三十块钱。做工差不多,外观秀气一点。

    另外提醒一下,在网店买码表的时候注意,有仿制的SIGMA BC506和906,价格非常便宜,但是不是真品。正品的SIGMA码表应该是承诺一年内产品质量问题免费更换的。

    自己装不麻烦,价格差异来自于精准度、耐用度等。推荐西格玛506,性价比很高的码表,口碑很好。

    码表(你所说的计速器)的主要区别是稳定性和精确度,现在的SIGAM(西格玛)的码表和猫眼的码表是车友用的比较多的,入门的SIGAM 506码表是SIGAM里面档次最低的,但是也是性价比很高的,正品价格应该在六七十元左右(淘宝价,车行贵点),其他的20多元的是类似于山寨的产品,价格低,但是质量和稳定性不一定好。

    自行车码表怎样安装和设置

    一直是广大骑友所费思的,今天本文就浅谈一下自行车码表的安装和设置方法,教大家如何安装自行车码表。说的比较简单,希望广大车友能参与讨论。

    数据线的一头连着感应器,另一头是码表的底座。感应磁铁和两条橡皮筋(大号用在固定感应器上,小号的固定在底座上,后面会用到),还有几根扎线就不细述了,直接开始码表的安装步骤。

    1、下面开始第一步,安装码表的底座。

    首先要确定你希望将码表安装在①处还是②处。厂家默认是安装在①处的,如果你希望安装在①处就不需要调整了;如果你想安装在②处,需要用螺丝刀取下底座旋转90度然后再安装。

    底座的背面有泡沫胶,撕下黄色的胶面就可以黏贴在车把上,然后用橡皮筋绕车把一圈,卡在底座的两边的卡槽里,将码表底座牢固地固定在车把上。
    2、接下来安装感应头。

    感应线绕着刹车线缠绕而下,一直到你需要安装感应器的位置,感应器可以安装在车前杆上车轴与刹车的中间位置。

    安装方法于安装底座类似,将感应器的位置选准后,用手指按紧,然后用大号的橡皮筋绕车杆一圈,将橡皮筋扣在感应器的卡槽内。

    3、再安装感应磁铁。

    感应磁铁需安装在轮胎的钢丝条幅上,能正对感应器为的位置。将软磁铁套在钢丝上后,用安装包内的铁套圈从下往上卡在磁铁的凹槽内就完成了,角度调整一下,让钢辐经过感应器的时候磁铁能正对感应器,这样感应效果才最佳。

    到此码表安装完毕,接下来就是调整码表的轮子周长,这样读出的数据才准确。

    将码表以倾斜45度角放到底座上,略微下按,逆时针旋转就可以固定。

    然后找路上一条直线,一般的水泥地都有,人骑到车上,将轮胎的气门芯调整地面最近的位置做一个标记,保持直线骑行1圈,等气门芯离地面最近的时候停下,量出经过的距离就是车轮的周长,这样测量比直接看说明书上轮胎的参考值要准,因为人骑在上面的时候,胎压将发生变化,如此进行2、3次,取个平均值就可以了。具体设置可以将码表调到WHEEL SIZE菜单,填入预设值就可以了。

    更多相关内容
  • 本项目设计一个类似自行车码表的产品,除了LCD显示骑行速度、骑行里程外、日期时间外,增加了GPS卫星状态、电池电量、电子指南针(当前方向)、转向及警示尾灯。 软件基于FreeRTOS嵌入式操作系统。各功能模块对应...
  • 一台基于STM32的智能自行车码表,能够实现测量当前自行车行驶速度、行驶距离、踩踏频率、通过ANT 数据传输协议并配合心率带实现实时心率显示等功能。
  • 自行车码表Proteus仿真

    2021-03-27 17:07:42
    自行车码表Proteus仿真
  • 基于单片机的自行车码表设计

    千次阅读 2021-11-25 07:12:21
    基于单片机的自行车码表设计-硬件开发文档类资源-CSDN下载内容包括详细设计文档word版,附带开题报告和相关PPT等文档,供大家参考学习。也可在本博客主页找到更多下载资源、学习资料请访问CSDN下载频道....

      word完整版可点击如下下载>>>>>>>>  

    基于单片机的自行车码表设计-硬件开发文档类资源-CSDN下载内容包括详细设计文档word版,附带开题报告和相关PPT等文档,供大家参考学习。也可在本博客主页找到更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/u013253075/40315187

      录

    摘  要----------------------------------------------------------------------------------- I

    ABSTRACT---------------------------------------------------------------------------- II

    1  引言--------------------------------------------------------------------------------- 1

    1.1  研究现状--------------------------------------------------------------------- 1

    1.2  研究目的及意义------------------------------------------------------------- 1

    1.3  研究内容--------------------------------------------------------------------- 2

    2  系统总体设计与选型-------------------------------------------------------------- 3

    2.1  主控模块论证---------------------------------------------------------------- 3

    2.2  霍尔模块论证---------------------------------------------------------------- 4

    2.3  电源模块论证---------------------------------------------------------------- 5

    2.4  显示模块论证---------------------------------------------------------------- 5

    3  自行车码表的硬件设计------------------------------------------------------------ 7

    3.1  总体设计思路---------------------------------------------------------------- 7

    3.2  主控电路--------------------------------------------------------------------- 8

    3.2.1  AT89C52单片机----------------------------------------------------- 8

    3.2.2  最小系统-------------------------------------------------------------- 8

    3.3  测速模块设计---------------------------------------------------------------- 9

    3.4  时钟模块设计-------------------------------------------------------------- 11

    3.4.1  DS1302时钟芯片--------------------------------------------------- 11

    3.4.2  时间设置------------------------------------------------------------- 11

    3.5  按键模块设计-------------------------------------------------------------- 13

    3.6  显示模块设计-------------------------------------------------------------- 14

    3.7  整体电路设计-------------------------------------------------------------- 14

    4  系统软件设计--------------------------------------------------------------------- 16

    4.1  程序总体设计思路--------------------------------------------------------- 16

    4.2  主程序设计----------------------------------------------------------------- 16

    4.3  显示程序设计-------------------------------------------------------------- 18

    4.4  超速报警程序设计--------------------------------------------------------- 18

    5  设计结果分析--------------------------------------------------------------------- 20

    5.1  仿真结果-------------------------------------------------------------------- 20

    5.1  实物图片-------------------------------------------------------------------- 20

    6  总结与展望------------------------------------------------------------------------ 21

    6.1  总结------------------------------------------------------------------------- 21

    6.2  展望------------------------------------------------------------------------- 21

    参考文献------------------------------------------------------------------------------ 23

    致  谢--------------------------------------------------------------------------------- 25

    附  录--------------------------------------------------------------------------------- 26

    摘  要

    在家用汽车、电车等各种交通工具日益增长的今天,以石油、电力等为代表的能源的消耗也越来越大,大气中的二氧化碳排放量与日俱增,因此在能源需求不断增加的今天,低碳出行成为了人们主流的节能出行方式,自行车就是人们环保节能出行的主要方式,随之涌现出了各种各样的辅助工具,自行车码表是其中的代表,它可以集速度、距离、骑行时间、路程、心率、卡路里等多种功能于一体,因此被广泛应用在各种样式自行车上。

    本设计主要以AT89C52单片机为控制核心,设计了一款多功能自行车码表。主要模块包括霍尔传感器测速模块、按键控制模块、显示模块和时钟模块,可以实现实时速度、骑行时间、单次骑行里程和总里程的显示。通过霍尔传感器采集车轮的转速信息经过AD转换传输给单片机,单片机对信号进行处理并计算车轮的转速及周长算出自行车的速度,最终传送给LCD显示屏显示。

    关键词:单片机   传感器   数据采集

    ABSTRACT

    Nowadays, with the increasing of various means of transportation such as household cars and trams, the energy consumption represented by oil and electricity is also increasing, and the carbon dioxide emissions in the atmosphere are increasing day by day. Therefore, with the increasing demand for energy, low-carbon travel has become the mainstream energy-saving way for people, and bicycle is the main way for people to travel environmentally friendly and energy-saving With the development of science and technology, there are more and more auxiliary functions of various styles. Bicycle code meter is a powerful auxiliary tool with the functions of speed, distance, riding time, distance, heart rate, calories and so on. Therefore, it is widely used in various styles of bicycles. Therefore, a powerful and reasonable auxiliary tool is necessary.

    This design mainly takes AT89C52 single chip microcomputer as the control core, and designs a multifunctional bicycle code table. The main modules include Hall sensor speed measurement module, key control module, display module and clock module, which can realize the display of real-time speed, riding time, single ride mileage and total mileage. The rotation speed information of the wheel is collected by Hall sensor and transmitted to the single chip microcomputer through AD conversion. The single chip microcomputer processes the signal and calculates the rotation speed and circumference of the wheel to calculate the speed of the bicycle at this time. Finally, it is transmitted to the LCD display screen for display.

    Keywords: MCU  Sensor  data acquisition

    1  引言

    1.1  研究现状

    爱好骑行的骑行者大部分都有一款辅助工具,就是自行车码表,骑行者们用它来记录自行车的实时速度,骑行里程,最快速度,骑行时间,更高档一些的还会有心率功能,......

    1.2  研究目的及意义

    自行车码表是一款功能丰富的辅助性工具,在畅行绿色环保出行的今天,以自行车为首的环保代步工具是其他代步工具所不能比较的,因此对自行车设计一款辅助工具是有必要的,......

    目前市面上的码表主要有两个种类,一是包括传统的有线或无线自行车码表,其工作原理,通过手动设定,......

    码表的选择对于一个热爱骑行的骑手来说是非常重要的,现在市面上的大部分码表受到类似于GPS、踏频功能、......

    1.3  研究内容

    把霍尔传感器放置到前轮胎的位置上,将前车轮辐条上安装永磁体以记录车轮转动的频率,前车轮转动时永磁体跟随车轮转动,转动的永磁体可以看作是一点频率的脉冲信号,......主要完成以下任务:

    1.选用合适控制芯片满足系统控制要求......

    2.将处理完成的信号转换为数字显示到LCD显示屏上......

    3.通过LCD屏幕显示日期、温度、速度、里程等参数供.....

    4.控制测量精度在规定范围......

    2  系统总体设计与选型

    2.1  主控模块论证

    根据上述设计的要求,码表控制系统属于输入参数设置比较少的系统,据此考虑价格与性能拟定了以下两个方案:

    方案一

    采用STM32系列芯片,实物如图2-1所示,库函数丰富、......

    图2-1  STM32系列芯片

    方案二

    采用AT89C52系列单片机作为主控芯片,AT89C52系列单......

    图2-2  AT89C52芯片

    综合考虑过后,STM32虽然运算速度更快,功能更强大,但是对于本设计有太多多余的资源,并且相对AT89C52单片机开发难度相对较大,......

    2.2  霍尔模块论证

    把开关型霍尔传感器按照固定的位置放置,此时自行车的轮条可以看作一个磁性转盘再将永久磁铁安装在自行车轮条上,车轮每转动一圈可以认为是一次脉冲,霍尔传感器......

    方案一

    采用霍尔元件传感器即霍尔片,霍尔片一般分为贴片型和直插型。贴片型的霍尔片型号比较多有单极、双极锁存和线性等,贴片型的霍尔片用途比较窄,......

    方案二

    采用霍尔传感器,选型号为CHV-25P/10的霍尔传感器。这种类型的霍尔传感器体积比较大,在电焊机,工业控制以及伺服电机等大型器械设备应用广泛......

    综上考虑,选择方案一直插型霍尔传感器,方案二......实物如图2-4所示。

    图2-3  A3144型霍尔传感器

    2.3  电源模块论证

    电源模块作为单片机的能量来源十分重要,因此要选择合理的电源模块为单片机供电。

    方案一

    采用锂电池作为电源模块,锂电池是一种可以循环充......

    方案二

       采用干电池串并联达到5V作为电源模块为单片机供电。干电池价格低廉应用范围广泛,该方案实施比较简单,因此不用搭建外接电路降低电源电压,......

    对比这两种电源的解决方案,干电池在价格还是购买的方便性都比锂电池要高,......

    2.4  显示模块论证

    方案一

    采用8段LED数码管作为显示模块显示参数。数码管显示器件......

    方案二

    采用LCD1602液晶显示器作为显示模块核心。LCD显示......

    综上所述,采用性价比较高且成本更低的方案二......

     

    3  自行车码表的硬件设计

    3.1  总体设计思路

    此系统以AT89C52单片机为核心,包括霍尔传感器、LCD显示屏、按键电路、时钟芯片,可以实现信息显示和报警功能。

    由霍尔传感器接收安装在自行车轮辐条上的永磁体接受到的脉冲信号,该脉冲信号经过放大传送给霍尔传感器接收,霍尔传感器接收到的脉冲信号交给单片机做数据处理......

    图3-1  总体框图

    以AT89C52单片机为核心,外接霍尔传感器模块根据实际情况测量并显示自行车行驶过程中的各项参数,包括行驶时间、当前行驶里程、实时速度等,各参数显示在LCD屏幕上......

    3.2  主控电路

    3.2.1  AT89C52单片机

    AT89C52 单片机以低电压、高性能有着广泛的的应用,......具体功能如表3-1所示。

    表3-1   AT89C52功能特性

    标准MCS-52内核和指令系统

    片内8kROM(可扩充64kB外部存储器)

    32个双向I/O口

    256x8bit内部RAM(可扩充64kB外部存储器)

    3个16位可编程定时/计数器

    时钟频率3.5-12/24/33MHz

    向上或向下定时计数器

    改进型快速编程脉冲算法

    6个中断源

    5.0V工作电压

    全双工串行通信口

    布尔处理器

    帧错误侦测

    4层优先级中断结构

    自动地址识别

    兼容TTL和CMOS逻辑电平

    空闲和掉电节省模式

    PDIP(40)和PLCC(44)封装形式

    3.2.2  最小系统

    单片机最小系统或者称为最小应用系统,最小系统是用最少的元器件使单片机可以工作。......

    下图3-2是一个单片机的最小系统,在这个图上有6个外接电路和元器件使单片机工作分别有18脚和19脚并联在一起的晶振,与晶振并联在一起的是两个20uF的电容,......

    在30和31引脚接入5V的电源为单片机供电,这样单片机就构成了一个最小系统,其中晶振频率是固定的,暂时不可调节。

    图3-2  最小系统

    3.3  测速模块设计

    霍尔传感器是由霍尔效应的原理来制作的,当电流垂直外磁场并且通过半导体,这时自由电荷发生偏转,垂直于电路和磁场的方向会产生附加电场,从而半导体两端产生电势差。.......

    本次设计采用A3144型霍尔传感器该传感器的产品特点:体积小、灵敏度高、精......

    表3-2   A3144型霍尔传感器工作参数

    电源电压工作范围

    4.5V-24V

    输出反向击穿电压Vce

    50V

    输出低电平电流IOL

    50mA

    工作环境温度       TA

    E档: -20~85℃,L档: -40~150℃

    贮存温度范围TS

    -65~150 ℃

    此次设计要面对的外部环境是自行车骑行者们所面对的外界环境,因此它的工作温度环境完全够用,典型的应用场合以电动机和风机控制,转速计以及流量传感等为主,.......

    测量模块的就是对霍尔传感器测量辐条上的永久磁体进行分析测量,自行车的车轮每转动一圈可以看作一个周期根据这个周期的时间以及自行车车轮的周长计算公式不难算出自行车在这个周期内走过的路程。目前市场上常用的自行车车轮直径规格由22英寸、......

    图3-3   A3144型霍尔传感器

    3.4  时钟模块设计

    3.4.1  DS1302时钟芯片

    DS1302是由美国DALLAS公司推出的一款低功耗实时时钟芯片。它可以对年、......

    图3-4  DS1302芯片

    DS1302芯片给系统提供时间设置,X1、X2一般外接一个频率为32.768kHz的晶振保证震荡频率。Vcc2为主电源,Vcc1作为后备电源,即使断电后Vcc2不工作也能保证芯片......

    3.4.2  时间设置

    DS1302芯片的I/O口与P1.4连接,SCLK与P1.3连接,DS1302内部有7个时间寄存器分别对应秒、分、时、天、周、月、年,根据本次的设计需求设置到年。......

    表3-3  DS1302芯片功能引脚

    编号

    符号

    引脚说明

    标号

    符号

    引脚说明

    1

    VSS

    电源地

    9

    D2

    数据

    2

    VDD

    电源正极

    10

    D3

    数据

    3

    VL

    液晶显示偏压

    11

    D4

    数据

    4

    RS

    数据/命令选择

    12

    D5

    数据

    5

    R/W

    读/写选择

    13

    D6

    数据

    6

    E

    使能信号

    14

    D7

    数据

    7

    D0

    数据

    15

    BLA

    背光源正极

    8

    D1

    数据

    16

    BLK

    背光源负极

    3.5  按键模块设计

    随着单片机硬件性能的提高和程序代码量的加大,在编写单片机的应用程序的过程当中,编程的复杂性随之提高,按键模块是必不可少的,码表设置了5个按键,.......

    图3-5  按键设计图

    3.6  显示模块设计

    显示模块采用LCD1602液晶显示器,LCD1602引脚功能如表3-3所示。

    表3-4  LCD1602芯片功能引脚

    编号

    符号

    引脚说明

    编号

    符号

    引脚说明

    1

    Vss

    电源地

    9

    D2

    数据口

    2

    VDD

    电源正极

    10

    D3

    数据口

    3

    VO

    液晶显示对比度调节端

    11

    D4

    数据口

    4

    RS

    数据/命令选择端(H/L)

    12

    D5

    数据口

    5

    R/W

    读写选择端(H/L)

    13

    D6

    数据口

    6

    E

    使能信号

    14

    D7

    数据口

    7

    D0

    数据口

    15

    BLA

    背光电源正极

    8

    D1

    数据口

    16

    BLK

    背光电源负极

    LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。......

    图3-6  显示模块设计

    3.7  整体电路设计

    电路的整体设计如图3-6所示,由时钟模块、霍尔传感器模块、电源模块、LCD显示......图3-7是PCB图

    图3-7  电路总体设计

    图3-8  PCB图

    4  系统软件设计

    4.1  程序总体设计思路

    首先,在明确开发环境后程序设计部分采用C语言进行编写,满足每个模块的设计功能,模块与模块之间也要有相对独立性。

    程序设计应当遵循逻辑性,逻辑性较强的设计会带来整个系统的流畅感,当系统供电后对模块初始化,自行车处于静止状态时,设置一个低功耗模式,......

    4.2  主程序设计

    主程序模块当系统启动后首先对液晶模块进行初始化,当液晶模块初始化完成后定时器中断开启,此时中断开启后模块就会判断中断时间是否到,当中断时间未到时,......

    图4-1 主程序流程图

    在本次设计中的中断系统比较少除了系统总体模块只有部分主流程序采用了中断,在自行车从行驶状态到未行驶状态时单片机采用了低功耗模式,......

    4.3  显示程序设计

    显示流程图如图4-2所示。程序开始执行初始化程序,程序对寄存器初始化和定时器初始化,此时系统判断是否中断,当显示器亮了则继续显示内容,......。

    图4-2  显示流程图

    4.4  超速报警程序设计

    超速报警程序在自行车运行中提供警报功能,自行车运动时,单片机手动上电运行,运动中的自行车产生的运动速度由霍尔传感器接收,单片机处理运行速度,系统判断运行速度......

    图4-3  速度流程

     

    5  设计结果分析

    5.1  仿真结果

    本次仿真是基于AT89C52单片机为核心的设计,此次设计用Proteus完成仿真,5个按键用来对系统设置,晶振模块提供频率,LCD1302时钟芯片可设置年、月、日、小时、分钟,......

    图5-1 仿真结果

    5.2  实物图片

    下图5-2中用电动马达代替自行车轮条,马达模拟自行车的轮条转动,当马达转动时与单片机相连的霍尔传感器就能感应到马达的转动,霍尔传感器感应到马达转动后就会将信号传输给......

    图5-2 自行车码表实物图

    6  总结与展望

    6.1  总结

    本次设计的自行车码表以AT89C52单片机为主控芯片,包括霍尔传感器模块、LCD显示模块、时钟控制模块、超速报警模块。经过测试,可以实现以下功能:

    1. 自行车在正常行驶状态下显示里程数与时间并显示实时速度。

    2. 按键模块可以设置骑行时间和骑行速度阈值

    3. 自行车的车速超过设定值时可以报警提示。

    4. 通过电动机模拟自行车骑行,完成了电路仿真及调试。

    5. 制作了自行车码表实物电路。

    6.2  展望

    本次设计在充分考虑了自行车转速与霍尔传感器采样之间的关系会产生一定的测量误差与精确度问题,根据自行车辐条上的永磁体数量决定了自行车的转速测量精度因此只要怎加辐条上的永磁体就可以提高精确度.......

    自行车码表是一个扩展性较强的科技型产品,现代的数码产品的发展方向大多趋向于集成化和智能化,不同类型的智能产品日新月异......

    文末惊喜,为方便参考,一起打包的资料如下,可在下面链接下载哦。

     

    下载链接如下:

    基于单片机的自行车码表设计-硬件开发文档类资源-CSDN下载内容包括详细设计文档word版,附带开题报告和相关PPT等文档,供大家参考学习。也可在本博客主页找到更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/u013253075/40315187

    展开全文
  • 基于51单片机的自行车码表设计.pdf
  • SunDing自行车码表说明书 详细操作员说明使用
  • 按照此方法简单轻松设置此自行车码表
  • 1-源程序_自行车码表_

    2021-09-30 05:25:40
    ? 1.本设计采用STC89C51/52(与AT89S51/52、AT89C51/52通用,可任选)单片机作为主控制器? 2.采用霍尔传感器非接触式测电机转速? 3.LCD1602液晶上行显示当前的速度,下行显示里程? 4.电机的速度可调,来模拟速度快慢
  • 基于单片机 Proteus的实用自行车码表的设计 该项目包括原理图电路图 程序源码 演示视频讲解文档全套资料 三分拿去 超值了
  • 51单片机自行车码表设计:喜欢骑自行车,当时我还没有智能的手机,想知道我骑了多少公里,多久,实时速度多少,让我想到了可以利用自行车车轮检测加计算来得到这些参数。 于是在我根据所了解的知识,使用霍尔传感器+...
  • 1、资源内容:毕业设计lun-wen word版10000字+;开题报告,任务书 2、学习目标:快速完成相关题目设计; 3、应用场景:课程设计、diy、毕业、参赛; 4、特点:直接可以编辑使用; 5、使用人群:设计参赛人员,学生,...
  • 自行车码表

    万次阅读 2016-06-15 20:47:20
    6.编写完整的码表程序,PA12的按钮标识车轮转了一圈,通过计数器可以得到里程,通过定时器中断得到的时间可以计算出速度;PA的按钮切换模式,模式一在串口输出里程,模式二在串口输出速度。 四、 实验过程和...

    一、      实验目的和要求

    1.    理解MCU上电启动过程;

    2.    掌握使用Cube库来编写STM32裸机程序的方法;

    3.    掌握使用Cube库来编写GPTO和UART程序的方法;

    4.    掌握使用Cube库来编写中断响应程序的方法;

    5.    理解前后台程序模式

    6.    掌握在STM32F103上编写裸机程序并下载运行的方法。

     

    二、      实验器材

    1.    STM32F103核心板一块;

    2.    MicroUSB线一根;

    3.    STLink板或USB串口板一块;

    4.    交叉编译软件

     

    三、      实验内容和原理

    1.编写Cube程序,配置UART0为9600,8n1,上电后向串口输出“Hello”,在PC上通过串口软件观察结果

    2.通过面包板在PA11和PA12各连接一个按钮开关到地

    3.编写Cube程序,配置PA11和PA12为内部上拉到输入模式,在main()函数循环检测PA11按钮按下,并在按钮按下时在串口输出Pressed。

    4.编写Cube程序,配置PA12下降沿触发中断,程序中设置两个全局变量,一个为计数器,一个为标识。当中断触发时,计数器加1,并设置标识。在主循环中判断标识,如果标识置位则清除标识并通过串口输出计数值;

    5.编写Cube程序,开启定时器为200ms中断一次,中断触发时设置标识,主循环根据这个标识来做串口输出(取消4的串口输出);

    6.编写完整的码表程序,PA12的按钮标识车轮转了一圈,通过计数器可以得到里程,通过定时器中断得到的时间可以计算出速度;PA的按钮切换模式,模式一在串口输出里程,模式二在串口输出速度。

    四、      实验过程和数据记录

    1.    下列图片为实物连接图


    其中串口使用PA9,PA10;GPIO使用PA11,PA12,分别连接按钮。黑线接地。

     

    2.    在Cube软件中配置UART0的波特率为9600, 8n1,然后向串口输出Hello,通过Mac上的串口软件观察结果。

    a.    下图为配置图片,将波特率设置为9600,8n1.



    b.    配置完成后,我们就可以用HAL_UART_Transmit和HAL_UART_Receive两个函数来进行串口的收发数据。使用GNUC需要重写__io_putchar和fputc函数,我们通过宏定义来完成。


    c.    测试串口输出,在while循环前添加printf函数来输出Hello


    d.    下面是实验结果展示图


    3.    编写Cube程序,配置PA11和PA12为内部上拉到输入模式,在main()函数循环检测PA11按钮按下,并在按钮按下时在串口输出Pressed

    a.    首先配置PA11和PA12为内部上拉到输入模式,如下图所示



     

    b.    在while循环中写出如果按下按钮,则在串口输出Pressed字样,循环代码如下图所示


    c.    下面是输出图示


    4.    编写Cube程序,配置PA12下降沿触发中断,程序中设置两个全局变量,一个为计数器,一个为标识。当中断触发时,计数器加1,并设置标识。在主循环中判断标识,如果标识置位则清除标识并通过串口输出计数值

    a.    配置PA12下降沿触发中断,配置过程如下




    b.    设置两个全局变量stopwatch_counter和stopwatch_flag,并且实现HAL_GPIO_EXTI_Callback(unit16_tGPIO_Pin)函数,函数实现如下


    c.    在while循环中,通过判断全局变量stopwatch_flag的值,来判断中断是否发生,代码实现如下


    d.    成功编译之后下载到板子上,运行结果如下图所示

     

    5.    编写Cube程序,开启定时器为200ms中断一次,中断触发时设置标识,主循环根据这个标识来做串口输出(取消4的串口输出)

    a.    配置时钟信息如下




    b.    实现HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)函数,用来设置标识符


    c.    在main函数初始化定时器,并且根据stopwatch_flag来判断中断是够发生。实现代码如下


    d.    在串口软件监测到如下结果


     

    6.    编写完整的码表程序,PA12的按钮标识车轮转了一圈,通过计数器可以得到里程,通过定时器中断得到的时间可以计算出速度;PA的按钮切换模式,模式一在串口输出里程,模式二在串口输出速度。

    a.    在计算速度和里程的过程中,里程默认中断一次为1m,速度计算公式为stopwatch_mile*18/stopwatch_time,stopewatch_time为添加的全局变量,表示定时器的中断次数。

    b.    完整代码如下

    /**

      ******************************************************************************

      * File Name          : main.c

      * Description        : Main program body

      ******************************************************************************

      *

      * COPYRIGHT(c) 2016 STMicroelectronics

      *

      * Redistribution and use in source and binary forms, with or without modification,

      * are permitted provided that the following conditions are met:

      *   1. Redistributions of source code must retain the above copyright notice,

      *      this list of conditions and the following disclaimer.

      *   2. Redistributions in binary form must reproduce the above copyright notice,

      *      this list of conditions and the following disclaimer in the documentation

      *      and/or other materials provided with the distribution.

      *   3. Neither the name of STMicroelectronics nor the names of its contributors

      *      may be used to endorse or promote products derived from this software

      *      without specific prior written permission.

      *

      * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"

      * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE

      * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE

      * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE

      * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL

      * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR

      * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER

      * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,

      * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE

      * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

      *

      ******************************************************************************

      */

    /* Includes ------------------------------------------------------------------*/

    #include "stm32f1xx_hal.h"

     

    /* USER CODE BEGIN Includes */

     

    /* USER CODE END Includes */

     

    /* Private variables ---------------------------------------------------------*/

    TIM_HandleTypeDef htim2;

     

    UART_HandleTypeDef huart1;

     

    /* USER CODE BEGIN PV */

    /* Private variables ---------------------------------------------------------*/

     

    int stopwatch_counter;

    int stopwatch_flag;

    int stopwatch_time;

    int stopwatch_mode;

     

    /* USER CODE END PV */

     

    /* Private function prototypes -----------------------------------------------*/

    void SystemClock_Config(void);

    static void MX_GPIO_Init(void);

    static void MX_USART1_UART_Init(void);

    static void MX_TIM2_Init(void);

     

    /* USER CODE BEGIN PFP */

    /* Private function prototypes -----------------------------------------------*/

    #ifdef __GNUC__

    /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf

       set to 'Yes') calls __io_putchar() */

    #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)

    #else

    #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)

    #endif /* __GNUC__ */

     

    /* USER CODE END PFP */

     

    /* USER CODE BEGIN 0 */

     

    /* USER CODE END 0 */

     

    int main(void)

    {

     

      /* USER CODE BEGIN 1 */

     

      /* USER CODE END 1 */

     

      /* MCU Configuration----------------------------------------------------------*/

     

      /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

      HAL_Init();

     

      /* Configure the system clock */

      SystemClock_Config();

     

      /* Initialize all configured peripherals */

      MX_GPIO_Init();

      MX_USART1_UART_Init();

      MX_TIM2_Init();

     

      /* USER CODE BEGIN 2 */

                GPIO_PinState key;

                HAL_TIM_Base_Start_IT(&htim2);

                printf("Hello\n\r");

               

                double mile = 0;

                double speed = 0;

               

     

      /* USER CODE END 2 */

     

      /* Infinite loop */

      /* USER CODE BEGIN WHILE */

               

      while (1)

      {

      /* USER CODE END WHILE */

     

      /* USER CODE BEGIN 3 */

                           

                            key = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11);

                            if (key == GPIO_PIN_RESET)

                            {

                                        stopwatch_mode = !stopwatch_mode;

                            }

                            if (stopwatch_flag == 1)

                            {

                                        stopwatch_flag = 0;

                                       

                                        mile = stopwatch_counter * 1;

                                        if (stopwatch_mode == 0)

                                        {

                                                    printf("Current Mile: %f\n\r", mile);

                                        }

                                        else

                                        {

                                                    speed = stopwatch_counter  / stopwatch_time;

                                                    printf("Current Speed: %1f\n\r", speed);

                                        }

                            }

                            HAL_Delay(100);

                           

     

      }

      /* USER CODE END 3 */

     

    }

     

    /** System Clock Configuration

    */

    void SystemClock_Config(void)

    {

     

      RCC_OscInitTypeDef RCC_OscInitStruct;

      RCC_ClkInitTypeDef RCC_ClkInitStruct;

     

      RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;

      RCC_OscInitStruct.HSIState = RCC_HSI_ON;

      RCC_OscInitStruct.HSICalibrationValue = 16;

      RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;

      HAL_RCC_OscConfig(&RCC_OscInitStruct);

     

      RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

                                  |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;

      RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;

      RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

      RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

      RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

      HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0);

     

      HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

     

      HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

     

      /* SysTick_IRQn interrupt configuration */

      HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);

    }

     

    /* TIM2 init function */

    void MX_TIM2_Init(void)

    {

     

      TIM_ClockConfigTypeDef sClockSourceConfig;

      TIM_MasterConfigTypeDef sMasterConfig;

     

      htim2.Instance = TIM2;

      htim2.Init.Prescaler = 8000;

      htim2.Init.CounterMode = TIM_COUNTERMODE_UP;

      htim2.Init.Period = 199;

      htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

      HAL_TIM_Base_Init(&htim2);

     

      sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;

      HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig);

     

      sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;

      sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;

      HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig);

     

    }

     

    /* USART1 init function */

    void MX_USART1_UART_Init(void)

    {

     

      huart1.Instance = USART1;

      huart1.Init.BaudRate = 9600;

      huart1.Init.WordLength = UART_WORDLENGTH_8B;

      huart1.Init.StopBits = UART_STOPBITS_1;

      huart1.Init.Parity = UART_PARITY_NONE;

      huart1.Init.Mode = UART_MODE_TX_RX;

      huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;

      huart1.Init.OverSampling = UART_OVERSAMPLING_16;

      HAL_UART_Init(&huart1);

     

    }

     

    /** Configure pins as

            * Analog

            * Input

            * Output

            * EVENT_OUT

            * EXTI

    */

    void MX_GPIO_Init(void)

    {

     

      GPIO_InitTypeDef GPIO_InitStruct;

     

      /* GPIO Ports Clock Enable */

      __HAL_RCC_GPIOA_CLK_ENABLE();

     

      /*Configure GPIO pin : PA11 */

      GPIO_InitStruct.Pin = GPIO_PIN_11;

      GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

      GPIO_InitStruct.Pull = GPIO_PULLUP;

      HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

     

      /*Configure GPIO pin : PA12 */

      GPIO_InitStruct.Pin = GPIO_PIN_12;

      GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;

      GPIO_InitStruct.Pull = GPIO_PULLUP;

      HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

     

      /* EXTI interrupt init*/

      HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0);

      HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);

     

    }

     

    /* USER CODE BEGIN 4 */

    PUTCHAR_PROTOTYPE

    {

      /* Place your implementation of fputc here */

      /* e.g. write a character to the USART1 and Loop until the end of transmission */

      HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);

     

      return ch;

    }

     

    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

    {

                if (GPIO_Pin == GPIO_PIN_12)

                {

                            stopwatch_counter += 1;

    //                      stopwatch_flag = 1;

                }

    }

     

    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

    {

                if (htim->Instance == TIM2)

                {

                            stopwatch_flag = 1;

                            stopwatch_time += 1;

                }

               

    }

     

     

    /* USER CODE END 4 */

     

    #ifdef USE_FULL_ASSERT

     

    /**

       * @brief Reports the name of the source file and the source line number

       * where the assert_param error has occurred.

       * @param file: pointer to the source file name

       * @param line: assert_param error line source number

       * @retval None

       */

    void assert_failed(uint8_t* file, uint32_t line)

    {

      /* USER CODE BEGIN 6 */

      /* User can add his own implementation to report the file name and line number,

        ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

      /* USER CODE END 6 */

     

    }

     

    #endif

     

    /**

      * @}

      */

     

    /**

      * @}

    */

     

    /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

    c.    下面是实验结果图展示


     

    7.    扩展内容

    a.    扩展内容由于工程具有完整性,故统一完成如下

    b.    Main函数中代码较为简单,为休眠操作,由于SysTick中断也会终止休眠,故应该关掉中断。

    int main(void)

    {

      HAL_Init();

     

      /* Configure the system clock */

      SystemClock_Config();

     

      /* Initialize all configured peripherals */

      MX_GPIO_Init();

      MX_USART1_UART_Init();

      MX_TIM2_Init();

     

      /* USER CODE BEGIN 2 */

                GPIO_PinState key;

                HAL_TIM_Base_Start_IT(&htim2);

                printf("Hello\n\r");

               

      /* USER CODE END 2 */

      while (1)

      {

      /* USER CODE END WHILE */

     

      /* USER CODE BEGIN 3 */

                           

                            HAL_SuspendTick();

                            __HAL_RCC_PWR_CLK_ENABLE();

                            HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);

                            HAL_ResumeTick();

      }

      /* USER CODE END 3 */

     

    }

    c.    下面是中断处理函数的修改

    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

    {

               

               

                double mile = 0;

                double speed = 0;

               

               

                if (htim->Instance == TIM2)

                {

    //                      stopwatch_flag = 1;

                            stopwatch_time += 1;

                           

                            mile = stopwatch_counter*1;

                            if (stopwatch_mode == 0)

                            {

                                        printf("Current Mile: %f\n\r", mile);

                            }

                            else

                            {

                                        speed = (double)stopwatch_counter / stopwatch_time;

                                        printf("Current Speed: %1f\n\r", speed);

                            }

                }

               

    }

               

    d.    下面是实验结果图


    可以看出和之前实验的输出结果相类似,实验成功。

     

    展开全文
  • 丰色 发自 凹非寺量子位 报道 | 公众号 QbitAI民间又有高手“出没”:一位“技术宅”自制的自行车码表在B站火了,短短几天引来20多万人围观!速度、距离、时间、卡路里、航向显示的记录...
    丰色 发自 凹非寺
    量子位 报道 | 公众号 QbitAI

    民间又有高手“出没”:

    一位“技术宅”自制的自行车码表在B站火了,短短几天引来20多万人围观!

    速度、距离、时间、卡路里、航向显示的记录功能自不用多提,还可显示经纬度和海拔。

    它还配有离线地图,可显示你的实时位置与骑行轨迹

    在汽车、高铁上也能测速!

    切换界面查看电量、骑行记录、GPS定位、传感器等系统数据,相当丝滑:

    再看细节上,UI设计可是比市面上不少码表都要高级!(佳明:你直接报我身份证得了)

    这要是告诉我它是某个大牌而非自制的(除了壳很明显以外),我可能都信了。

    网友们也是纷纷respect,称赞它打爆那些溢价离谱的码表:

    “完成度离谱”,是不是很想要链接?

    好家伙,连稚晖君都被吸引过来了(后来佳明也现身评论区“自黑”,见后文):

    诶?稚晖君的真·自行车和这个码表是不是可以搭配使用?

    除了在B站上很火,这个码表项目也登上了今日GitHub热榜:

    而据网友粗略估算这个码表的硬件成本大概不到300,如此优秀的它,是如何DIY出来的呢?

    如何DIY一个自行车码表

    X-TRACK软件架构示意图如下:由HAL、Framework 和 APP 三层组成,Framework为核心。


    HAL层负责底层芯片驱动和传感器原始数据获取;

    Framework又包括三个模块,分别负责图形渲染、页面生命周期管理和消息分发处理。

    其中消息框架模块提供数据的分发和处理。

    使用订阅发布机制,将HAL层的接收到的传感器数据发布,转发给对应的订阅者进行数据处理。

    以GPS为例,GPS数据处理节点每秒读取一次卫星数据,然后发起publish,由消息框架将 GPS 数据推送给订阅者。

    在运动数据处理节点中订阅GPS数据。在收到GPS数据之后,运动数据处理节点根据 GPS 数据计算总里程,平均速度等信息。在表盘页面中,拉取运动数据节点信息,将其显示在表盘页面中。

    ps. 地图软件为GPXSee。

    实现主要有7步:

    1、首先是硬件设计

    用AD(Altium Designer)进行PCB板线路设计:

    电路图和PCB文件也可以在GitHub详细查看。

    2、然后就是被大家纷纷夸赞的UI设计:

    设计软件是Adobe AI。

    3、接着在3ds MAX上进行外壳设计:

    4、再然后就是软件设计了:

    编程语言为C++:

    5、再使用模拟器直接在PC上模拟效果。

    码表的图形界面采用了免费开源的GUI图形库LVGL

    成品使用了许多LVGL提供的基础控件,例如在地图页面的轨迹显示中使用了line控件,地图显示使用了image控件,在表盘页面的页面切换选择,使用了button控件。

    6、调试调试,没问题就可进行编译下载。

    这里用的是Keil

    7、最后,将最终程序烧录到单片机(AT32F403ACGU7)上运行,再连上ST-Link进行调试。

    成功!

    另外可能很多人不知道,UP主用的这个AT32系列MCU是国产‍设计(重庆雅特力),可替代意法半导体STM32F103系列,主频更高、RAM更大。

    全部硬件配置如下:

    内存有32GB,存下一个1GB多的北京地图不是事儿。

    另外,除了开头提到的功能以外,它还支持地图缩放、计步功能、导出标准GPX格式的轨迹、RTC自动根据GPS校准、掉电自动保存数据(JSON格式文件)、不过续航为4小时(持续工作,始终亮屏)……

    整个设计的硬件和软件部分都已开源

    连“竞品”佳明都来点赞

    怎么样?学会(废)了吗?

    不少围观群众觉得这样一个UI颜值爆表、功能丰富的自行车码表如果真的能有厂商合作生产的话,那还有佳明这些产品什么事儿

    有人在评论区@Garmin佳明,没想到还真把它引过来了:这下好了,连“竞品”都给X-TRACK点赞

    有人还算了一笔账,在某宝按教程买这些配件一共需要不到300元,比佳明上千的价格是便宜不少(虽然续航能力低一点)。

    催量产的网友真的非常非常多,不过真要商业化的话,除了续航能力,有自行车骑行爱好者认为还需支持ant+、踏频、心率、功率设备的连接、防尘防水等功能,以及考虑现在的屏幕在阳光下的能见度等问题。

    不知道未来,X-TRACK还会不会被继续增加或改进呢?

    毕竟毕业于电子信息专业的UP主说自己也算半个自行车爱好者。

    最后,除了这个梦幻般的自行车码表,他还用STM32自制过智能手表、航模遥控器(被网友称赞可以直接拿来卖的程度)。

    视频链接:
    https://www.bilibili.com/video/BV1GB4y1K7VV

    开源地址:
    https://github.com/FASTSHIFT/X-TRACK

    软件设计介绍:
    https://mp.weixin.qq.com/s/rCtmW7tawr7zRIuMK1l5Iw

    展开全文
  • 具有导航功能的自行车码表——HOLUX-245自行车GPS码表.pdf
  • 自行车码表c语言完整程序
  • msp430自行车码表

    2015-07-08 18:33:39
    可显示速度 行驶距离 电子罗盘hmc5883L。除了sd卡读取部分未完成
  • 基于51单片机的自行车码表设计,可以显示行驶速度,里程,时间,温度,方向等信息,通过1602液晶进行显示
  • 基于AT89C51单片机的自行车码表设计.pdf
  • 基于单片机的自行车里程监测系统的设计(自行车码表) 主要设计内容: 以单片机为主控元件,通过电机转动模拟自行车车轮转动情况; 能够实时显示骑行速度、里程、当前时间和当前温度; 可以通过按键对部分功能数值...
  • 多功能自行车码表设计.doc
  • 038【毕设课设】基于单片机自行车码表系统设计,实现的功能是按键切换设定校准时间,LCD上显示的时间、踏频、公里数、速度。速度通过输入不同频率方波来实现速度检测模拟,同时有报警功能。包含的电路有单片机控制...
  • 基于51单片机的自行车码表设计 内附代码和说明
  • 使用STC89C52RC制作的自行车码表。采用LCD1602液晶屏显示速度和里程,引脚连接简单,合理布局后可以装在自行车上。资料中有C语言编写的程序和电路图。
  • 本文档介绍了一种基于瑞萨低功耗、内置LCD 驱动器的单片机R7F0C002 的自行车码表解决方案。该方案作为一款测速装置,能合理的计算出速度和公里数,真实地反映骑行状况,使骑行者能够评估自己的运动量,以达到健康...
  • 1、资源内容:毕业设计lun-wen word版10000字+;开题报告,任务书 2、学习目标:快速完成相关题目设计; 3、应用场景:课程设计、diy、毕业、参赛; 4、特点:直接可以编辑使用; 5、使用人群:设计参赛人员,学生,...
  • 基于单片机的自行车码表设计.doc

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 434
精华内容 173
关键字:

自行车码表