04-基于单片机的自行车码表设计_第1页
04-基于单片机的自行车码表设计_第2页
04-基于单片机的自行车码表设计_第3页
04-基于单片机的自行车码表设计_第4页
04-基于单片机的自行车码表设计_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本科毕业设计题目:基于单片机的自行车码表设计姓名:学号:专业:班级:学院:指导教师:完成时间:2021年6月

毕业设计诚信声明书本毕业设计是在导师指导下独立研究、写作的成果,文中所引用他人的无论以何种方式发布的文字、研究成果,均在文中加以说明;有关教师、同学和其他人员对本文的写作、修订提出过并为我在文中加以采纳的意见、建议,均已在我的致谢辞中加以说明并深致谢意。学生(签字): 时间: 年 月 日指导教师已阅(签字): 时间: 年 月 日毕业设计版权使用授权书本毕业设计是在导师指导下独立完成的。本人同意学校保留或向国家有关部门或机构送交设计的印刷件和电子版,允许设计被查阅和借阅;本人授权山东协和学院可以将本设计的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或其他复制手段保存和汇编。学生(签字): 时间: 年 月 日指导教师已阅(签字): 时间: 年 月 日目录目录TOC\o"1-3"\h\u摘要 引言1.1研究现状爱好骑行的骑行者大部分都有一款辅助工具,就是自行车码表,骑行者们用它来记录自行车的实时速度,骑行里程,最快速度,骑行时间,更高档一些的还会有心率功能,踏频记录,当然这种码表的价格也是非常高的,还有一些带有踏频记录的功能能帮助骑手进行自行车运动训练,此次设计针对市场上昂贵的码表价格设计一款成本相对廉价性价比较高的产品,以此用来供预算有限的骑行者选择。对于码表来说,功能已经越来越强大如今的码表在便携性、外观的时尚性、功能的多样性以及长续航等方面提出了更高的要求,本设计在控制成本的情况下尽量满足上述要求。1.2研究目的及意义自行车码表是一款功能丰富的辅助性工具,在畅行绿色环保出行的今天,以自行车为首的环保代步工具是其他代步工具所不能比较的,因此对自行车设计一款辅助工具是有必要的,因此自行车码表的丰富功能就能满足这种需求,码表的丰富功能能够使我们实时了解自己的运动状态,能够让运动者更好更合理的利用码表上的数据来提醒骑行者骑行的路程或者骑行的时间等信息以供骑行者参考。目前市面上的码表主要有两个种类,一是包括传统的有线或无线自行车码表,其工作原理,通过手动设定,车轮的周长参数,利用固定于前闸车架位置的感应器,及固定在辅条上的永久磁铁来计算车轮的转动频率,码表内置的芯片可以根据以的上数据计算并显示即时速度。另一种是GPS码表,除了包括传统支架的速度测量以外,还提供更多的专业运动数据,通过卫星定位进行操作,高端GPS码表会配置ant+协议的感应器和磁铁等传统测量配件,测量结果更准确并减少信号扰动对数据收集造成。码表的选择对于一个热爱骑行的骑手来说是非常重要的,现在市面上的大部分码表受到类似于GPS、踏频功能、心率测量等功能的扩展价格也是非常高以西格玛码表为例子价格在300元到800元不等价格波动非常大。在考虑到码表的续航时间功耗等参数后对于预算有限的骑行爱好者非常重要,因此对于高续航的骑行爱好者来说有一款有合理价位区间的码表有非常重要的意义。1.3研究内容把霍尔传感器放置到前轮胎的位置上,将前车轮辐条上安装永磁体以记录车轮转动的频率,前车轮转动时永磁体跟随车轮转动,转动的永磁体可以看作是一点频率的脉冲信号,脉冲信号被固定的霍尔传感器所捕获,此时的霍尔传感器就可以将被测量的信号传给单片机做数据处理。根据对脉冲信号的计数与处理可以测出自行车的速度与里程等参数。并由此计算出均速、路程等量。本设计采用集成霍尔传感器A3144,它具有频率响应快,抗干扰能力强的特点。主要完成以下任务:1.选用合适控制芯片满足系统控制要求;2.将处理完成的信号转换为数字显示到LCD显示屏上供骑行者观看;3.通过LCD屏幕显示日期、温度、速度、里程等参数供骑行者参考;4.控制测量精度在规定范围。2系统总体设计与选型2.1主控模块论证根据上述设计的要求,码表控制系统属于输入参数设置比较少的系统,据此考虑价格与性能拟定了以下两个方案:方案一采用STM32系列芯片,实物如图2-1所示,库函数丰富、处理速度快、I/O口丰富等特点。性能优越,适用于复杂的项目中,能够发挥其高效强大的性能,综合来说STM32系列单片机无论在处理速度还是外部接口等方面拥有较大优势。图2-1STM32系列芯片方案二采用AT89C52系列单片机作为主控芯片,AT89C52系列单片机是市面上常用的单片机,是一种低功耗芯片,这种低功耗特性非常适合本次的高续航设计,32个的外部双向输入\输出串口,扩展模块丰富也符合本次设计的霍尔传感器等外接设备,有8K的可编程Flash存储器,完全符合本次编程的需求REF_Ref23903\r\h[2]。图2-2AT89C52芯片综合考虑过后,STM32虽然运算速度更快,功能更强大,但是对于本设计有太多多余的资源,并且相对AT89C52单片机开发难度相对较大,所以综合比较后选择了方案二,既满足设计的实际需要,也不会过多地浪费资源、投入不必要的成本,大大降低了开发难度节约了开发时间,增加了开发的速度。2.2霍尔模块论证把开关型霍尔传感器按照固定的位置放置,此时自行车的轮条可以看作一个磁性转盘再将永久磁铁安装在自行车轮条上,车轮每转动一圈可以认为是一次脉冲,霍尔传感器收集到的脉冲信号交给单片机做数据处理,在永久磁体上焊装一个固定的铁框架用以加固磁体的稳定性,避免自行车行驶在复杂路面时引起的剧烈晃动将磁体震落或脱离磁体固定的位置避免磁体因位置移动引起霍尔传感器数据收集不准确,影响骑行者对行驶数据的错误判断REF_Ref4302\r\h[6]。因此在霍尔传感器选择的过程中要充分考虑到自行车路面的复杂性和传感器与单片机连接的稳定性,同时还要考虑传感器的测量精度,因为此方案面对的是追求性价比的骑行者因此还要考虑此霍尔传感器合理的价格区间,综合上述几个条件目前给出两种霍尔传感器的方案选择条件供选择。方案一采用霍尔元件传感器即霍尔片,霍尔片一般分为贴片型和直插型。贴片型的霍尔片型号比较多有单极、双极锁存和线性等,贴片型的霍尔片用途比较窄,因此选择直插型霍尔片。霍尔片的体积小,安装灵活方便比较符合对于此次设计的需求,可用于测速,且与普通的磁钢片配套使用,价格便宜一般为2.5~5元REF_Ref4498\r\h[18]。方案二采用霍尔传感器,选型号为CHV-25P/10的霍尔传感器。这种类型的霍尔传感器体积比较大,在电焊机,工业控制以及伺服电机等大型器械设备应用广泛,在对于这次的设计的便携性不太符合,价格一般为30~130元之间不等。综上考虑,选择方案一直插型霍尔传感器,方案二所用传感器价格比较昂贵并且应用方向偏大型的器械设备,在对比方案一之后选择便携性更高应用更灵活价格较低的方案一,选择A3144EUA直插型霍尔传感器,实物如图2-4所示。图2-3A3144型霍尔传感器2.3电源模块论证电源模块作为单片机的能量来源十分重要,因此要选择合理的电源模块为单片机供电。方案一采用锂电池作为电源模块,锂电池是一种可以循环充放电的以锂合金为负极材料的电池,能量密度比较大,添加电压稳定模块降低高电压电流对单片机造成伤害。该方案实施成本非常高并且需要加入复杂的降低电压电流模块,现在常用的智能手机大多采用锂电池供电,但是很明显该方案的高昂的价格与复杂的模块不太符合我们对于低成本的考虑。方案二采用干电池串并联达到5V作为电源模块为单片机供电。干电池价格低廉应用范围广泛,该方案实施比较简单,因此不用搭建外接电路降低电源电压,干电池可回收利用,现阶段干电池技术比较成熟,安全隐患小。对比这两种电源的解决方案,干电池在价格还是购买的方便性都比锂电池要高,尽管要考虑到续航等问题上,但还是选择价格相对便宜的干电池为单片机供电。2.4显示模块论证方案一采用8段LED数码管作为显示模块显示参数。数码管显示器件价格方面会便宜一些,但是数码管的功耗比较大、编写程序时相对麻烦,工作量大,本次程序编写在追求优良的显示效果的同时也在追求编程的方便性与快捷性。方案二采用LCD1602液晶显示器作为显示模块核心。LCD显示器工作原理比较简单,编程速度较为方便和快捷,LCD1602所消耗的功耗比较少节能又环保符合今天时代节能环保的发展主题,对于本次设计也能够提供优良的显示效果,能够满足对该设计的任务。综上所述,采用性价比较高且成本更低的方案二。一般LCD1602分为带背光与无背光两种,两者在应用中差别不大。

3自行车码表的硬件设计3.1总体设计思路此系统以AT89C52单片机为核心,包括霍尔传感器、LCD显示屏、按键电路、时钟芯片,可以实现信息显示和报警功能。由霍尔传感器接收安装在自行车轮辐条上的永磁体接受到的脉冲信号,该脉冲信号经过放大传送给霍尔传感器接收,霍尔传感器接收到的脉冲信号交给单片机做数据处理,其中单片机和霍尔传感器由通过过压保护电路的电源供电,该电源由串联电池组组成。时钟芯片提供单片机振荡频率,时钟芯片一般由2个20pF的电容以及石英晶体振荡器组成,单片机提供外接按键供骑行者设置码表的参数功能,单片机外接一个低功耗的LCD显示屏用以显示设置的参数和时间等重要信息。另外单片机外接一个报警功能,当骑行者使用自行车在运动的过程中,难免会有速度过快的情况,当自行车运动速度过快,为避免引发交通事故增加报警功能提醒骑行者。图3-1总体框图以AT89C52单片机为核心,外接霍尔传感器模块根据实际情况测量并显示自行车行驶过程中的各项参数,包括行驶时间、当前行驶里程、实时速度等,各参数显示在LCD屏幕上。本设计在车轮运行时才进行时间计算,具有行驶时间准确性,且实用性高。当自行车开始运动时在自行车辐条上的永久磁铁提供给自行车车架上固定的霍尔传感器磁场,当霍尔传感器在磁场在穿过时会引起霍尔传感器内部半导体的电动势的变化,由此产生了一次脉冲信号,此信号在经过霍尔传感器脉冲放大后交给单片机做数字信号处理,此时处理的是数字信号,因此此数字信号要经过BCD编码之后才能用LCD1602显示芯片显示出来,当单片机在单位的时间内收到的脉冲信号过多时,此刻说明自行车的速度过快,单片机就会针对过快的骑行速度向蜂鸣器发送信号提醒骑行者自行车速度过快。3.2主控电路3.2.1AT89C52单片机AT89C52单片机以低电压、高性能有着广泛的的应用,本次设计采用AT89C52单片机做主控芯片具体功能如表3-1所示。表3-1AT89C52功能特性标准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的电容,晶振作为驱动单片机的模块之一非常重要因为晶振要为单片机提供频率来源,单片机若没频率来源是无法正常工作的,所以晶振模块对于单片机来说非常重要。9引脚是单片机的复位引脚,系统开启时复位会是高电平状态,但此时的单片机处于不稳定状态需要上电复位至单片机电压稳定,在下图3-2我们观察此复位电路由电容C和电阻R构成,高电平的持续时间可以由电路的RC值决定,一般来说RC组合要在RST引脚上产生不少于两个机械周期的高电平。在30和31引脚接入5V的电源为单片机供电,这样单片机就构成了一个最小系统,其中晶振频率是固定的,暂时不可调节。图3-2最小系统3.3测速模块设计霍尔传感器是由霍尔效应的原理来制作的,当电流垂直外磁场并且通过半导体,这时自由电荷发生偏转,垂直于电路和磁场的方向会产生附加电场,从而半导体两端产生电势差。这就是霍尔效应,此次设计就是通过固定永久磁铁霍尔传感器经过永久磁铁产生的电势差来进行测量脉冲的,因此根据霍尔效应制作的霍尔传感器会有误差,测量精度等问题,霍尔传感器的价格也要考虑,综合来看用以下型号的霍尔传感器比较合适。本次设计采用A3144型霍尔传感器该传感器的产品特点:体积小、灵敏度高、精确度高、可靠性高、可和各种逻辑电路直接接口等。表3-2A3144型霍尔传感器工作参数电源电压工作范围4.5V-24V输出反向击穿电压Vce50V输出低电平电流IOL50mA工作环境温度 TAE档:-20~85℃,L档:-40~150℃贮存温度范围TS-65~150 ℃此次设计要面对的外部环境是自行车骑行者们所面对的外界环境,因此它的工作温度环境完全够用,典型的应用场合以电动机和风机控制,转速计以及流量传感等为主,所以此型号传感器应用范围广泛。综上所属此款传感器可以无压力的应用在本次设计中。测量模块的就是对霍尔传感器测量辐条上的永久磁体进行分析测量,自行车的车轮每转动一圈可以看作一个周期根据这个周期的时间以及自行车车轮的周长计算公式不难算出自行车在这个周期内走过的路程。目前市场上常用的自行车车轮直径规格由22英寸、24英寸、26英寸和28英寸,所以本设计在计算车轮直径时会优先考虑计算这四种规格的车轮直径。以24英寸的车轮直径为例相当于0.61米,利用圆周计算公式C=Rπ可以计算出车轮的周长约为1.9米,我们所用的霍尔传感器相当于一块集成芯片。

它结合了采样和放大功能一体。首先我们把永磁体放在自行车的辐条上,而霍尔元件就放在与其水平的固定转轴上,当我们完成安装后,转动自行车的转轴,永久磁铁也就跟着一起旋转,永磁体用螺丝固定住以免自行车在经过复杂的山地,坡道等路面时产生剧烈晃动,将永磁体震落导致无法霍尔传感器无法测量,因此加一个螺丝固定是必要的,此时的永磁体为了方便可以安装两个,一个代表高电平另外一个代表低电平,也就是霍尔传感器在自行车车轮旋转一周之内被永久磁铁改变了两次磁场强度,这样一圈之内霍尔传感器将输出两个脉冲,这样每过100米霍尔传感器会有大概52个脉冲,单片机这52个脉冲进行计数所计算得来的数据交给单片机分析并显示在LCD显示屏上就可以判断我们走过的里程数。单片机在计算的过程中由于是脉冲数据也就是数字信号因此必须要对数字信号进行BCD编码才能将结果输入到显示模块供骑行者参考。下图3-3为霍尔传感器在单片机中的连接。图3-3A3144型霍尔传感器3.4时钟模块设计3.4.1DS1302时钟芯片DS1302是由美国DALLAS公司推出的一款低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时,并且具有闰年补偿等多种功能。图3-4DS1302芯片DS1302芯片给系统提供时间设置,X1、X2一般外接一个频率为32.768kHz的晶振保证震荡频率。Vcc2为主电源,Vcc1作为后备电源,即使断电后Vcc2不工作也能保证芯片不断电。RST为复位引脚,当RST为高电平时电路被复位,允许DS1302操作。I/O为串行双向输入端,SCLK串行时钟引脚。3.4.2时间设置DS1302芯片的I/O口与P1.4连接,SCLK与P1.3连接,DS1302内部有7个时间寄存器分别对应秒、分、时、天、周、月、年,根据本次的设计需求设置到年。分寄存器设置到60制,即60秒一个循环,时寄存器可以设置12小时制也可以设置24小时制,天寄存器7天一个循环到周,月寄存器可分为30天或31天或28天DS1302还可以设置闰年,因此年寄存器可以区分闰年和平年。寄存器的值采用BCD码的形式存放,方便读取。表3-3DS1302芯片功能引脚编号符号引脚说明标号符号引脚说明1VSS电源地9D2数据2VDD电源正极10D3数据3VL液晶显示偏压11D4数据4RS数据/命令选择12D5数据5R/W读/写选择13D6数据6E使能信号14D7数据7D0数据15BLA背光源正极8D1数据16BLK背光源负极3.5按键模块设计随着单片机硬件性能的提高和程序代码量的加大,在编写单片机的应用程序的过程当中,编程的复杂性随之提高,按键模块是必不可少的,码表设置了5个按键,默认的功能键为KEY1键,这是系统总键用来切换功能设置,KEY2键当切换到某一功能后进行功能转换设置,KEY3键用来设置加,KEY3键用来设置减,KEY4为复位REF_Ref10176\w\h[8]。图3-5按键设计图

3.6显示模块设计显示模块采用LCD1602液晶显示器,LCD1602引脚功能如表3-3所示。表3-4LCD1602芯片功能引脚编号符号引脚说明编号符号引脚说明1Vss电源地9D2数据口2VDD电源正极10D3数据口3VO液晶显示对比度调节端11D4数据口4RS数据/命令选择端(H/L)12D5数据口5R/W读写选择端(H/L)13D6数据口6E使能信号14D7数据口7D0数据口15BLA背光电源正极8D1数据口16BLK背光电源负极LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。图3-6显示模块设计3.7整体电路设计电路的整体设计如图3-6所示,由时钟模块、霍尔传感器模块、电源模块、LCD显示模块、CPU模块、蜂鸣器报警电路、按键部分以及电机接口组成。图3-7是PCB图图3-7电路总体设计图3-8PCB图4系统软件设计4.1程序总体设计思路首先,在明确开发环境后程序设计部分采用C语言进行编写,满足每个模块的设计功能,模块与模块之间也要有相对独立性。程序设计应当遵循逻辑性,逻辑性较强的设计会带来整个系统的流畅感,当系统供电后对模块初始化,自行车处于静止状态时,设置一个低功耗模式,此时的低功耗模式并非单片机断电,此模式下既降低了功耗又增加了码表续航时间,低功耗模式设置一个时间2个小时,当两个显示后单片机断电,这样防止自行车一直处于低功耗模式,当自行车开始行驶时则系统判断骑行开始,此时单片机正常工作不再处于低功耗模式,自行车骑行时正常判断此时的状态日期、时间、行驶速度等,按键的设置分为单片机开关机时间的设置、里程的设置、速度的设置等,单片机根据当前的速度进行判断当速度为零时程序初始化,重复上面的判断REF_Ref10176\w\h[8]。4.2主程序设计主程序模块当系统启动后首先对液晶模块进行初始化,当液晶模块初始化完成后定时器中断开启,此时中断开启后模块就会判断中断时间是否到,当中断时间未到时,程序则循环会到上一步再次判断中断时间而进行循环。中断时间到时则重新设置中断时间,当中断时间被重新设置后,就会计算速度和里程等参数,并将计算得来的参数显示到LCD显示屏上,显示内容。图4-1主程序流程图在本次设计中的中断系统比较少除了系统总体模块只有部分主流程序采用了中断,在自行车从行驶状态到未行驶状态时单片机采用了低功耗模式,此时的单片机要进行中断判断自行车此时的状态是静止的状态,判断完成后的单片机要进行低功耗模式。4.3显示程序设计显示流程图如图4-2所示。程序开始执行初始化程序,程序对寄存器初始化和定时器初始化,此时系统判断是否中断,当显示器亮了则继续显示内容,若显示器未亮则系统继续判断。图4-2显示流程图4.4超速报警程序设计超速报警程序在自行车运行中提供警报功能,自行车运动时,单片机手动上电运行,运动中的自行车产生的运动速度由霍尔传感器接收,单片机处理运行速度,系统判断运行速度,当速度未超速系统会循环判断自行车的运行速度,当速度超过骑行者手动设定的速度上限时,系统判断自行车超速,超速后单片机会发送信号给蜂鸣器,蜂鸣器发出警报警示自行车超速。根据不同骑行者的需求速度报警上限可手动调节REF_Ref10327\w\h[11]。图4-3速度流程

5设计结果分析5.1仿真结果本次仿真是基于AT89C52单片机为核心的设计,此次设计用Proteus完成仿真,5个按键用来对系统设置,晶振模块提供频率,LCD1302时钟芯片可设置年、月、日、小时、分钟,仿真结果如下图5-1所示,LCD显示屏可以输出sd(速度)、lc(里程)与时间显示。霍尔传感器由按键代替,按键按下后代表霍尔传感器发送给单片机一次信号。图5-1仿真结果5.2实物图片下图5-2中用电动马达代替自行车轮条,马达模拟自行车的轮条转动,当马达转动时与单片机相连的霍尔传感器就能感应到马达的转动,霍尔传感器感应到马达转动后就会将信号传输给单片机处理,处理完成信号的单片机将数据显示在LCD显示屏上如图5-2所示,sd表示速度、lc表示里程,屏幕右侧则是时间显示。最下面的黑色按键最右侧是页面切换键用以切换另外的页面,第二个按键为功能转换地三键为加,第四键为减。实物暂采用USB外接电源的方式。图5-2自行车码表实物图致谢6总结与展望6.1总结本次设计的自行车码表以AT89C52单片机为主控芯片,包括霍尔传感器模块、LCD显示模块、时钟控制模块、超速报警模块。经过测试,可以实现以下功能:自行车在正常行驶状态下显示里程数与时间并显示实时速度。按键模块可以设置骑行时间和骑行速度阈值自行车的车速超过设定值时可以报警提示。通过电动机模拟自行车骑行,完成了电路仿真及调试。制作了自行车码表实物电路。6.2展望本次设计在充分考虑了自行车转速与霍尔传感器采样之间的关系会产生一定的测量误差与精确度问题,根据自行车辐条上的永磁体数量决定了自行车的转速测量精度因此只要怎加辐条上的永磁体就可以提高精确度,添加永磁体会增加精确度的同时也提高了本次设计的成本,因此采用降低成本的方式减少精确度。自行车码表是一个扩展性较强的科技型产品,现代的数码产品的发展方向大多趋向于集成化和智能化,不同类型的智能产品日新月异,因此自行车码表的设计远远不止于此,智能化的码表还配备GPS定位系统,心率显示模块,蓝牙无线信号传输等,甚至在此基础上还能加入实时语音播报。科技的发展总是不断向前,可以预测在不远的未来自行车码表会更加趋于多元化。

参考文献陈贵银.单片机技术在机器人控制系统中的应用研究[J].自动化应用,2017(05):119-121.梁小廷.单片机技术的发展及应用研究[J].民营科技,2018(06):9.张承畅,吴孟林,张华誉,罗元,何丰.面向学生工程能力达成的“单片机技术”实验案例设计[J].实验技术与管理,2018,35(05):178-182.王鹏超,王伟东,刘霞,陈伟.基于单片机技术开发的智能遥控轮椅[J].价值工程,2018,37(16):134-135.子世界,2018(03):56-58.王子剑.“智能化”电子产品中单片机技术的应用[J].电子技术与软件工程,2017(15):251.刘婷.传感器设计中应用单片机技术的分析[J].数码设计,2017,6(09):85.肖骁,戈文祺.电气传动系统中单片机技术的应用解析[J].中国标准化,2017(22):250-252.SiliconPerspective,FirstEncounterTraining[M].CadenceDesignSystems,inc.2012,22-31.RicardoReis,PowerandTimingDrivenPhysicalDesignAutomation[J].Springer-VerilogBerlinHeidelberg,2013.348-357XinJuanShang.TheDesignoftheNCTeachingPlotterBasedonSingleChipMicrocomputer[J].AdvancedMaterialsResearch,2014,3079.李人厚.智能控制理论和方法[M].西安:西安电子科技大学出版社,2018.李兰光.单片机技术在智能家具中的应用与发展[J].电脑迷,2017(02):164-165.刘笃仁,韩保君.传感器原理及应用技术[M].机械工业出版社,2019.8.刘览.基于FPGA的32位RISC嵌入式微处理器设计[D].南京:南京航空航天大学,2018.茅阳.单片机技术在电气传动控制系统中的应用与研究[J].中国高新区,2018(01):24.任仁凯.智能家居中单片机控制系统设计[D].南京:南京师范大学,2017.杨德坤.单片机技术在传感器设计中的应用[J].电子测试,2018(18):127+140.姚越,吴宝庆.关于单片机技术应用的研究[J].科技资讯,2018,16(09):112-113.杨国君.单片机技术在机器人智能控制系统的协调运用[J].电子制作,2018(Z2):58-59.周正贵.基于单片机技术的按键扫描电路分析[J].信息与电脑(理论版),2018(13):29-30.

致谢本设计能够顺利完成,承蒙王老师以及身边同学的指导和帮助。在设计过程中,王老师给予了悉心的指导,最重要的是给了我解决问题的思路和方法,并且在设计环境和器材方面给予了大力的帮助和支持,在此,我对老师表示最真挚的感谢!同时感谢所有帮助过我的同学!感谢评阅老师百忙之中抽出时间对本论文进行了评阅!附录附录#include<reg52.h> //调用单片机头文件#defineucharunsignedchar//无符号字符型宏定义 变量范围0~255#defineuintunsignedint //无符号整型宏定义 变量范围0~65535sbitclk=P1^3; //ds1302时钟线定义sbitio=P1^4; //数据线sbitrst=P1^5; //复位线 //秒分时日月年星期 ucharcodewrite_add[]={0x80,0x82,0x84,0x86,0x88,0x8c,0x8a};//写地址ucharcoderead_add[]={0x81,0x83,0x85,0x87,0x89,0x8d,0x8b};//读地址ucharmiao,fen,shi,ri,yue,week,nian;uchari;unsignedlongspeed1,juli,time2;floatf_hz ,speed_km,speed_m;ucharTH11,TL11;ucharflag_en;//开始计算速度使能uintjuli_s; //每秒走的距离uintjuli_z;//总路程floatzhijing=0.55;//直径0.55Muints_zhijing=55;bitflag_1s=1; //1sucharmenu_1;//菜单设置变量ucharmenu_2;//菜单设置变量longzong_lc;//总量程ucharflag_200ms;uintshudu;//定义速度的变量uintbj_shudu=50; //报警速度//这三个引脚参考资料sbitrs=P1^0; //寄存器选择信号H:数据寄存器 L:指令寄存器sbitrw=P1^1; //寄存器选择信号H:数据寄存器 L:指令寄存器sbite=P1^2; //片选信号下降沿触发uchari;sbitbeep=P3^7;//蜂鸣器IO口定义/******************1ms延时函数*******************/voiddelay_1ms(uintq){ uinti,j; for(i=0;i<q;i++) for(j=0;j<120;j++);}/*********************************************************************名称:delay_uint()*功能:小延时。*输入:无*输出:无***********************************************************************/voiddelay_uint(uintq){ while(q--);}/*********************************************************************名称:write_com(ucharcom)*功能:1602命令函数*输入:输入的命令值*输出:无***********************************************************************/voidwrite_com(ucharcom){ i=0; e=0; rs=0; rw=0; P0=com; delay_uint(3); e=1; delay_uint(25); e=0;}/*********************************************************************名称:write_data(uchardat)*功能:1602写数据函数*输入:需要写入1602的数据*输出:无***********************************************************************/voidwrite_data(uchardat){ i=0; e=0; rs=1; rw=0; P0=dat; delay_uint(3); e=1; delay_uint(25); e=0; }/*********************************************************************名称:write_sfm2(ucharhang,ucharadd,uchardate)*功能:显示2位十进制数,如果要让第一行,第五个字符开始显示"23",调用该函数如下 write_sfm1(1,5,23)*输入:行,列,需要输入1602的数据*输出:无***********************************************************************/voidwrite_sfm2(ucharhang,ucharadd,uintdate){ if(hang==1) write_com(0x80+add); else write_com(0x80+0x40+add); write_data(0x30+date/10%10); write_data(0x30+date%10); }/*********************************************************************名称:write_sfm4(ucharhang,ucharadd,uchardate)*功能:显示2位十进制数,如果要让第一行,第五个字符开始显示"23",调用该函数如下 write_sfm1(1,5,23)*输入:行,列,需要输入1602的数据*输出:无***********************************************************************/voidwrite_sfm4(ucharhang,ucharadd,uintdate){ if(hang==1) write_com(0x80+add); else write_com(0x80+0x40+add); write_data(0x30+date/10000%10); write_data(0x30+date/1000%10); write_data(0x30+date/100%10); write_data(0x30+date/10%10); write_data(0x30+date%10); write_data('k'); write_data('m'); }voidwrite_sfm7(ucharhang,ucharadd,uintdate){ if(hang==1) write_com(0x80+add); else write_com(0x80+0x40+add); write_data(0x30+date/100000%10); write_data(0x30+date/100000%10); write_data(0x30+date/10000%10); write_data(0x30+date/1000%10); write_data('.'); write_data(0x30+date/100%10); write_data(0x30+date/10%10); write_data('k'); write_data('m'); }/***********************lcd1602上显示两位十进制数************************/voidwrite_sfm1(ucharhang,ucharadd,uchardate){ if(hang==1) write_com(0x80+add); else write_com(0x80+0x40+add); write_data(0x30+date%10); }/*********************************************************************名称:write_string(ucharhang,ucharadd,uchar*p)*功能:改变液晶中某位的值,如果要让第一行,第五个字符开始显示"abcdef",调用该函数如下 write_string(1,5,"abcdef;")*输入:行,列,需要输入1602的数据*输出:无***********************************************************************/voidwrite_string(ucharhang,ucharadd,uchar*p){ if(hang==1) write_com(0x80+add); else write_com(0x80+0x40+add); while(1) { if(*p=='\0')break; write_data(*p); p++; } }/***********************lcd1602上显示两位十进制数************************/voidwrite_sfm2_ds1302(ucharhang,ucharadd,uchardate){ if(hang==1) write_com(0x80+add); else write_com(0x80+0x40+add); write_data(0x30+date/16); write_data(0x30+date%16); }/*****************控制光标函数********************/voidwrite_guanbiao(ucharhang,ucharadd,uchardate){ if(hang==1) write_com(0x80+add); else write_com(0x80+0x40+add); if(date==1) write_com(0x0f);//显示光标并且闪烁 else write_com(0x0c);//关闭光标} /*********************************************************************名称:init_1602()*功能:初始化1602液晶*输入:无*输出:无***********************************************************************/voidinit_1602()//1602初始化{ write_com(0x38); write_com(0x0c); write_com(0x06); write_string(1,0,"sd:00km/h00:00"); write_string(2,0,"lc:00.00km"); }/*************写一个数据到对应的地址里***************/voidwrite_ds1302(ucharadd,uchardat){ rst=1; //把复位线拿高 for(i=0;i<8;i++) { //低位在前 clk=0; //时钟线拿低开始写数据 io=add&0x01; add>>=1; //把地址右移一位 clk=1; //时钟线拿高 } for(i=0;i<8;i++) { clk=0; //时钟线拿低开始写数据 io=dat&0x01; dat>>=1; //把数据右移一位 clk=1; //时钟线拿高 } rst=0; //复位线合低}/*************从对应的地址读一个数据出来***************/ucharread_ds1302(ucharadd){ ucharvalue,i; rst=1; //把复位线拿高 for(i=0;i<8;i++) { //低位在前 clk=0; //时钟线拿低开始写数据 io=add&0x01; add>>=1; //把地址右移一位 clk=1; //时钟线拿高 } for(i=0;i<8;i++) { clk=0; //时钟线拿低开始读数据 value>>=1; if(io==1) value|=0x80; clk=1; //时钟线拿高 } rst=0; //复位线合低 returnvalue; //返回读出来的数据}/*************把要的时间年月日都读出来***************/voidread_time(){ miao=read_ds1302(read_add[0]); //读秒 fen=read_ds1302(read_add[1]); //读分 shi=read_ds1302(read_add[2]); //读时 ri=read_ds1302(read_add[3]); //读日 yue=read_ds1302(read_add[4]); //读月 nian=read_ds1302(read_add[5]); //读年 week=read_ds1302(read_add[6]); //读星期}/*************把要写的时间年月日都写入ds1302里***************/voidwrite_time(){ write_ds1302(0x8e,0x00); //打开写保护 write_ds1302(write_add[0],miao); //写秒 write_ds1302(write_add[1],fen); //写分 write_ds1302(write_add[2],shi); //写时 write_ds1302(write_add[3],ri); //写日 write_ds1302(write_add[4],yue); //写月 write_ds1302(write_add[5],nian); //写星期 write_ds1302(write_add[6],week); //写年 write_ds1302(0x8e,0x80); //关闭写保护}/*************液晶显示时间程序***************/voidinit_1602_ds1302(){ write_sfm2_ds1302(1,11,shi); write_sfm2_ds1302(1,14,fen); }/***********外部中断0初始化程序****************/voidinit_int0(){ EX0=1; //允许外部中断0中断 EA=1; //开总中断 IT0=1; //外部中断0负跳变中断}/*************定时器0初始化程序***************/voidtime_init() //定时器0初始化程序{ EA=1; //开总中断 TMOD=0X11; //定时器0、工作方式1 ET0=1; //开定时器0中断 TR0=1; //允许定时器0定时 ET1=1; //开定时器1中断 TR1=1; //允许定时器1定时}/***********计算速度函数**************/voidmenu_dis() //计算速度函数{ if(menu_1==0) { if(flag_1s==1) { flag_1s=0; if((flag_en==1)) { flag_en=0; //1s=1/1000000us; //1m/s=0.001km除以1/3600h=3.6km/h f_hz=1/(TH11*256+TL11)/1000000;//算出来就是秒 speed_m=f_hz*zhijing*3.14; //算出来的是m/s juli_z=juli_z+speed_m;//总路程m speed_km=speed_m*3.6; //(带个小数点)km/s shudu=speed_km; zong_lc+=speed_m; } write_sfm2(1,3,shudu); write_sfm4(2,3,juli_z); } }}/********************独立按键程序*****************/ucharkey_can; //按键值voidkey() //独立按键程序{ if((P3&0x78)!=0x78) //按键按下 { delay_1ms(1); //按键消抖动 if((P3&0x78)!=0x78) { //确认是按键按下 switch(P3&0x78) { case0x70:key_can=4;break; //得到按键值 case0x68:key_can=3;break; //得到按键值 case0x58:key_can=2;break; //得到按键值 case0x38:key_can=1;break; //得到按键值 } } }}/**********************设置函数************************/voidkey_with(){ if(key_can==1) //设置键 { menu_1++; if(menu_1==1) //设置时间 { menu_2=1; write_string(1,0,"::W:"); write_string(2,0,"20--"); } if(menu_1==2) //设置报警速度 { menu_2=1; write_string(1,0,"set-sd:00km/h"); write_string(2,0,"zlc:"); } if(menu_1==3) //设置直径 { menu_2=1; write_string(1,0,"SetZhijing"); write_string(2,0,""); } menu_2=1; if(menu_1>2)//回到正常显示 { menu_1=0; write_guanbiao(1,2,0); //关闭光标 init_1602();//1602初始化//初始化液晶显示 } } if(key_can==2) //选择键 { if(menu_1==1) //设置时间 { menu_2++; if(menu_2>7) menu_2=1; } if(menu_1==2) //设置 { menu_2++; if(menu_2>2) menu_2=1; } } if(menu_1==1) { if(menu_2==1) //设置时 { if(key_can==3) //加 { shi+=0x01; if((shi&0x0f)>=0x0a) shi=(shi&0xf0)+0x10; if(shi>=0x24) shi=0; } if(key_can==4) //减 { if(shi==0x00) shi=0x24; if((shi&0x0f)==0x00) shi=(shi|0x0a)-0x10; shi--; } } if(menu_2==2) //设置分 { if(key_can==3) //加 { fen+=0x01; if((fen&0x0f)>=0x0a) fen=(fen&0xf0)+0x10; if(fen>=0x60) fen=0; } if(key_can==4) //减 { if(fen==0x00) fen=0x5a; if((fen&0x0f)==0x00) fen=(fen|0x0a)-0x10; fen--; } } if(menu_2==3) //设置秒 { if(key_can==3) //加 { miao+=0x01; if((miao&0x0f)>=0x0a) miao=(miao&0xf0)+0x10; if(miao>=0x60) miao=0; } if(key_can==4) //减 { if(miao==0x00) miao=0x5a; if((miao&0x0f)==0x00) miao=(miao|0x0a)-0x10; miao--; } } if(menu_2==4) //设置星期 { if(key_can==3) //加 { week+=0x01; if((week&0x0f)>=0x0a) week=(week&0xf0)+0x10; if(week>=0x08) week=1; } if(key_can==4) //减 { if(week==0x01) week=0x08; if((week&0x0f)==0x00) week=(week|0x0a)-0x10; week--; } } if(menu_2==5) //设置年 { if(key_can==3) //加 { nian+=0x01; if((nian&0x0f)>=0x0a) nian=(nian&0xf0)+0x10; if(nian>=0x9a) nian=1; } if(key_can==4) //减 { if(nian==0x01) nian=0x9a; if((nian&0x0f)==0x00) nian=(nian|0x0a)-0x10; nian--; } } if(menu_2==6) //设置月 { if(key_can==3) //加 { yue+=0x01; if((yue&0x0f)>=0x0a) yue=(yue&0xf0)+0x10; if(yue>=0x13) yue=1; } if(key_can==4) //减 { if(yue==0x01) yue=0x13; if((yue&0x0f)==0x00) yue=(yue|0x0a)-0x10; yue--; } } if(menu_2==7) //设置日 { if(key_can==3) //加 { ri+=0x01; if((ri&0x0f)>=0x0a) ri=(ri&0xf0)+0x10; if(ri>=0x32) ri=0; } if(key_can==4) //减 { if(ri==0x01) ri=0x32;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论