找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5822|回复: 3
收起左侧

具有实时时钟显示的自行车里程表的课程设计论文

[复制链接]
ID:161768 发表于 2017-7-28 02:58 | 显示全部楼层 |阅读模式

智能测控系统原理课程大作业

作业题目具有实时时钟显示的自行车里程表的设计

学院名称电气工程学院

专业班级测控1303

学生姓名   刘*涛

230*319

   完成时间: 2016-6            

任课教师

自评分:87

智能测控系统大作业任务书

学生姓名
刘帅涛
专业班级
测控1303班
学号
201323030319

具有实时时钟显示的自行车里程表的设计

完成时间
2016 年 6月26日
主要功能

实现以下功能:
  • 自行车的速度里程的计算显示
  • 当前环境温度测量与显示
  • 按键调整自行车半径
  • 具有实时时间显示
设计要求

  • 能够实现速度的测量,里程的计算与显示并且能够修改自行车的半径
  • 能够显示温度,当前时间
  • 设计总体的硬件连接
  • 设计MCU测控源程序并完成调试。
  • 画出相关的子程序流程图及其实现的C语言代码;


目  录

摘要
1 设计需求分析
1.1 设计目的
1.2 市场需求分析
1.3 主要功能
2 特色与创新
2.1 超低功耗微控制器
2.2 彩屏显示
3 功能规划
3.1 温度测量
3.2 时间显示
3.3 自行车半径的调整
3.4 速度里程的计算
4 硬件组成
4.1 硬件组成框图
4.2 整体原理图
4.3  ds18b20温度传感器
4.4  DS3231时钟模块
4.5 霍尔传感器
4.6 TFT彩屏
5 软件架构和开发环境
5.1 程序流程图
5.2 速度测量的原理
5.3 程序调试
总结
参考文献
附录一 元件清单
附录二 源程序
附录三 实物展示

摘要
随着居民生活水平的不断提高、低碳生活的提出,自行车不再仅仅是普通的运输、代步的工具,而是成为人们娱乐、休闲、锻炼的首选,骑自行车出行越来成为人们出行的首要选择,自行车里程表能够满足人们最基本的需求,让人们能清楚地知道当前的速度、里程等物理量。但是目前我们买的自行车好多都没有速度里程表,我们无法知道骑行的速度和已经骑行的里程数;因此就有了这样的想法:能不能自己设计一个自行车里程表,既经济又实用。刚好我们这学期开设了智能测控系统这门课程,学了MSP430g2553这款微控制器,于是就想利用这款单片机来设计一个自行车里程表。其实原理也是比较简单,通过传感器采集自行车轮在规定时间内转的圈数,然后通过单片机进行处理,最后用LCD显示屏将想要得到的数据显示出来,就可以实现自行车的测速,因此需要我们选择合适的传感器,编写相应的程序来处理数据。本设计所选的是霍尔传感器和1.44寸TFT彩屏模块来实现自行车的测速和显示的。                  

1 设计需求分析1.1 设计目的
随着低碳环保理念的提出,自行车越来越受人们的欢迎,虽然市面上也有好多自行车里程表,但是自己刚好学了430微处理器,因此就像能不能用430做一款自行车里程表,不仅可以更好的学习这门课程,而且还可以吧学到的理论知识用到实践中去,是一次很好的机会,并且,如果自己做的好的话这也是一个很大的市场。
自世界上第一辆自行车问世至今已有200多年的历史了。18世纪末,法国人西夫拉克发明了最早的自行车。这辆最早的自行车是木制的,其结构比较简单。世界上第一批真正实用型的自行车出现于19世纪初。在20世纪,自行车在中国获得了前所未有的普及和发展。从某种意义上来说,中国是一个自行车的王国。每天清晨和落日时分,滚滚车流在中国的城市中碾动,这是最为壮观的一道风景,这是一条现代中国流动的长城。
随着居民生活水平的不断提高,自行车不再仅仅是普通的运输、代步的工具,而是成为人们娱乐、休闲、锻炼的首选。因此,人们希望自行车的功用更强大,能给人们带来更多的方便。自行车里程表作为自行车的一大辅助工具也正是随着这个要求而迅速发展的,其功能也逐渐从单一的里程显示发展到速度、时间显示,甚至有的还具有测量骑车人的心跳、显示骑车人热量消耗等功能。本设计采用了MSP430系列单片机设计一种体积小、操作简单的便携式自行车里程表,它能自动地显示当前自行车行走的距离、运行的速度、当前的时间、实时的温度等。

1.2 市场需求分析
随着自行车越来越多的被人们使用,自己如果能设计一款功耗低、成本低,既经济又实用的自行的自行车里程表,也是非常有市场前景的,只是后期的话再对自己的作品加以改进,更加的完善就行。目前好多城市都有刷卡租自行车的装置,我们学校在今年也开始实施,这说明自行车在未来一段时间应该还是非常流行的,人们之所以现在又开始这么喜欢使用自行车,我感觉主要有以下几方面的原因:
  • 现在私家车越来越多,我们会经常听说,上班早高峰、下班晚高峰,开车的还没有走路的快,交通拥堵人们也许早已习以为常了,因此人们就又开始重视自行车的使用
  • 人们现在缺少锻炼,职业病越来越多,骑自行车不仅可以给人们的上班提供方便还可以锻炼身体,一举两得。
  • 低碳生活的提出人们越来越重视环境保护
1.3 主要功能
本设计主要实现的是自行车的测速、里程的计算,另外还加入了实时时间的显示,还可以通过按键调整自行车的半径,可以满足各种规格的自行车,又多增加了温度显示,当我们外出时可以给我们提提供实时的环境温度信息。通过里程表,可以给我们骑车出行实时提供骑行的一些速度里程温度等信息。供电采用的5V供电,供电电源比较常见。

2 特色与创新2.1 超低功耗微控制器
本款自行车里程表采用的是TI公司的MSP430g2553微控制器,MSP430 单片机之所以有超低的功耗,是因为其在降低芯片的电源电压和灵活而可控的运行时钟方面都有其独到之处。
首先,MSP430 系列单片机的电源电压采用的是1.8-3.6V 电压。因而可使其在1MHz 的时钟条件下运行时,芯片的电流最低会在165μA左右,RAM保持模式下的最低功耗只有0.1μA。
其次,独特的时钟系统设计。在 MSP430 系列中有两个不同的时钟系统:基本时钟系统、锁频环(FLL 和FLL+)时钟系统和DCO数字振荡器时钟系统。可以只使用一个晶体振荡器(32.768kHz)DT-26 OR DT-38,也可以使用两个晶体振荡器。由系统时钟系统产生 CPU 和各功能所需的时钟。并且这些时钟可以在指令的控制下,打开和关闭,从而实现对总体功耗的控制。
由于系统运行时开启的功能模块不同,即采用不同的工作模式,芯片的功耗有着显著的不同。在系统中共有一种活动模式(AM)和五种低功耗模式(LPM0~LPM4)。在实时时钟模式下,可达2.5μA ,在RAM 保持模式下,最低可达0.1μA 。
2.2 彩屏显示
这款自行车里程表采用的是1.44寸的128*128分辨率的TFT彩屏显示,可以显示16*16的汉字8行8列,足够显示各种想要的信息,并且是24位真彩屏,不仅实用,而且好看,价格也比较便宜。
3 功能规划3.1 温度测量
温度采用DS18B20数字温度传感器,不用再进行模数装换,使用方便,温度测量误差小,连接简单,价格便宜,多种特点综合分析后决定采用该数字温度传感器。
3.2 时间显示
时钟模块采用DS3231,DS3231内部集成了TCXO、RTC和32.768kHz晶体,并采用低成本、标准型、16引脚SOIC封装。在-40℃至+85℃温度范围内,计时精度为±2分钟/年。这一出色性能使DS3231成为当前要求高计时精度应用的最佳解决方案。因此本设计采用了该时钟模块,价格便宜,、精度高。
3.3 自行车半径的调整
由于每种自行车的半径不一样,在进行速度和里程的计算的时候需要用到自行车的半斤,从而计算出速度和里程,因此,为了使里程变能够适应各种规格的自行车,在安装的调试的时候需要对半径进行修改,而如果不加按键调整的话,每次修改半径都要在程序中输入对应规格型号的自行车半斤,这样可移植性就差了,不能量化生产,
3.4 速度里程的计算
速度计算原理是用的微处理器的计数器,大概原理:首先计数器清零,开始计数,延时一秒,停止计数,读取计数器中的数值,计数值即是测得的频率,通过机械结构来得到转速,通过半径计算出速度和里程。
4 硬件组成4.1 硬件组成框图
本设计设计的自行车里程表的硬件组成框图如图4.1-1所示:
1.001.jpg 图4.1-1 硬件组成框图
4.2 整体原理图
1.002.jpg
4.3 ds18b20温度传感器4.3.1 DS18B20功能特点
①采用单总线技术,与单片机通信只需要一根I/O线,在一根线上可以挂接多个DS18B20。
②每只DS18B20具有一个独有的,不可修改的64位序列号,根据序号访问对应的器件。
③低压供电,电源范围从3.0~5.5V,可以本地供电,也可以直接从数据线窃取电源(寄生电源方式)。
④测温范围为-55℃~+125℃,在-10℃~+85℃范围内误差为±0.5℃。
⑤可编辑分辨率为9~12位,对应的可分辨温度分别为0.5℃,0.25℃,0.125℃和0.0625℃,可实现高精度测温。
⑥用户可自设定报警上下限温度。
⑦报警搜索命令可识别和寻址超过程序限定温度(温度报警条件)的器件。
⑧DS18B20的分辨率由用户通过EEPROM设置为9~12位。
⑨DS18B20可将检测到温度值直接转化为数字量,并通过串行通信的方式与主控制器进行数据通信。
⑩负电压特性,电源极性接反时,温度计不会因为发热而烧毁,只是不能正常工作。
在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内。
4.3.2 工作原理
DS18B20在出厂时默认配置为12位,其中最高位为符号位,即温度值共11位,单片机在读取数据时,一次会读2字节共16位,读完后将低11位的二进制数转化为十进制数后再乘以0.0625便为所测的实际温度值。另外,还需要判断温度的正负。前5个数字为符号位,这5位同时变化,我们只需要判断11位就可以了。前5位为1时,读取的温度为负值,且测到的数值需要取反加1再乘以0.0625才可以得到世纪的温度值。前5位为0时,读取的温度为正值,且温度为正值时,只需要将测得的数值乘以0.0625即可得到实际的温度值。
DS18B20部分温度值对应的二进制温度表示数据 1.003.jpg
4.4 DS3231时钟模块
DS3231内部集成了TCXO、RTC和32.768kHz晶体,并采用低成本、标准型、16引脚SOIC封装。在-40℃至+85℃温度范围内,计时精度为±2分钟/年。这一出色性能使DS3231成为当前要求高计时精度应用的最佳解决方案。而RTC的其它集成功能也扩展了系统应用领域,适合那些对计时精度要求极高的应用。应用包括:服务器、电表、安防及门禁控制系统、车队管理、远程信息处理系统、GPS导航装置、POS终端以及ATM。DS3231是低成本、高精度I2C实时时钟(RTC),具有集成的温补晶振(TCXO)和晶体。该器件包含电池输入端,断开主电源时仍可保持精确的计时。集成晶振提高器件的长期精确度,并减少了生产线的元件数量。
DS3231的引脚功能说明如下:32kHz是32kHz频率输出;VCC用于主电源的DC引脚;INT/SQW为低电平有效中断或方波输出;RST是低电平有效复位引脚;NC表示无连接,外部必须接地;GND为地;VBAT为备用电源输入;SDA为串行数据输入、输出;SCL为串行时钟输入。
RTC保存秒、分、时、星期、日期、月和年信息。少于31天的月份,将自动调整月末的日期,包括闰年的修正。时钟的工作格式可以是24小时或带AM/PM指示的12小时格式。提供两个可设置的日历闹钟和一个可设置的方波输出。DS3231采用I2C总线与系统微控制器进行通信,I2C总线是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备,由于接口直接在组件之上,因此I2C总线占用空间少,减少了电路板的空间和芯片管脚的数量,降低了互联成本。它支持多主控,任何能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。I2C总线通过两根连线(串行时钟线SCL和双向传送SDA)实现半双工同步数据传输,确保两器件之间地址和数据信息的双向传输。它采用器件地址的硬件设置方法(即每个器件具有一个确定的ID),通过软件寻址,从而避免器件的片选信号线寻址,使硬件系统扩展灵活简便。为保证通信正常,必须保证I2C总线上的数据能够顺利传送。在数据开始传送前,首先让I2C接口进行初始化。DS3231的I2C接口的初始化操作可通过微控制器在总线上发送一个有效START条件来实现,因为微控制器产生的START信号能够终止DS3231的I2C接口当前的数据收、发过程,并将该接口置于START条件后的待命状态。但要发送一个有效的START条件,必须在DS3231释放SDA数据线时才能实现。如果SDA数据线处于低电平状态,这时,可以让系统微控制器产生一个附加的SCL脉冲来迫使DS3231接口送出下一位数据。假设下一位数据仍然为逻辑“0”,就继续产生附加的SCL脉冲,经过多个SCL脉冲后,DS3231就会释放SDA数据总线。完成I2C总线的初始化后,接着进行控制和状态寄存器的初始化设置,确定正确的数据范围,就可以运行相应的测控程序。
除计时精度高之外,DS3231还其有一些其它功能,这些功能扩展了系统主机的附加功能和选择范围。该器件内部集成了一个非常精确的数字温度传感器,可通过I2C接口对其进行访问(如同时间一样)。这个温度传感器的精度为±3℃。片上控制电路可实现自动电源检测,并管理主电源和备用电源(即低压电池)之间的电源切换。如果主电源掉电,该器件仍可继续提供精确的计时和温度,性能不受影响。
4.5 霍尔传感器
霍尔传感器是对磁敏感的传感元件,由磁钢、霍耳元件等组成。测量系统的转速传感器选用CS3144的霍尔传感器,其响应频率为250KHz,额定电压为4.5-24(V)、检测距离为10(mm)。其在大电流磁场或磁钢磁场的作用下,能测量高频、工频、等各种波形电流。该传感器具有测量精度高、电压范围宽、功耗小、输出功率大等优点,广泛应用在高速计数、测频率、测转速等领域。输出电压4.5~24V,直流电源要有足够的滤波电容,测量极性为S极。安装时将一非磁性圆盘固定在电动机的转轴上,将磁钢粘贴在圆盘边缘,磁钢采用永久磁铁,其磁力较强,霍尔元件固定在距圆盘1-10mm处。当磁钢与霍尔元件相对位置发生变化时,通过霍尔元件周围磁场强度就会发生变化。圆盘转动,磁钢靠近霍尔元件,穿过霍尔元件的磁场较强,霍尔传感器输出低电平;当磁场减弱时,输出高电平,从而使得在圆盘转动过程中,霍尔元件输出连续脉冲信号。霍尔电压随磁场强度的变化而变化,磁场越强,电压越高,磁场越弱,电压越低,霍尔电压值很小,通常只有几个毫伏,但经集成电路中的放大器放大,就能使该电压放大到足以输出较强的信号。若使霍尔集成电路起传感作用,需要用机械的方法来改变磁感应强度。下图所示的方法是用一个转动的叶轮作为控制磁通量的开关,当叶轮叶片处于磁铁和霍尔集成电路之间的气隙中时,磁场偏离集成片,霍尔电压消失。霍尔效应传感器属于被动型传感器,它要有外加电源才能工作,这一特点使它能检测转速低的运转情况。模块的原理图如图4.4-1所示:
1.004.jpg
图4.4-1 霍尔传感器模块原理图
4.6 TFT彩屏
TFT(Thin Film Transistor)即薄膜场效应晶体管。所谓薄膜晶体管,是指液晶显示器上的每一液晶象素点都是由集成在其后的薄膜晶体管来驱动。TFT液晶为每个像素都设有一个半导体开关,每个像素都可以通过点脉冲直接控制,因而每个节点都相对独立,并可以连续控制,不仅提高了显示屏的反应速度,同时可以精确控制显示色阶,所以TFT液晶的色彩更真。基本原理很简单:显示屏由许多可以发出任意颜色的光线的象素组成,只要控制各个象素显示相应的颜色就能达到目的了。在TFT LCD中一般采用背光技术,为了能精确地控制每一个象素的颜色和亮度就需要在每一个象素之后安装一个类似百叶窗的开关,当“百叶窗”打开时光线可以透过来,而“百叶窗”关上后光线就无法透过来。
本设计采用的是最基本的TFT彩屏,平时我们做实验的时候可以学习学习用一用,分辨率是128*128像素的,颜色是24位真彩色,响应速度快,可以显示16*16的汉字64个,用在本设计中刚好可以显示各种想要的功能。

5 软件架构和开发环境5.1 程序流程图
所有硬件搭建完成后就是软件的编程与调试,现在的硬件电路基本上都要通过软件编程来控制,基本的程序流程图如图5.1-1所示:
1.005.jpg
5.1-1 程序流程图

5.2 速度测量的原理
要得到自行车的速度,首先我们应该知道自行车在一秒内转了多少圈,比如一秒内转了10圈,周长为1m,那么自行车的速度就是10m/s;这样就得到了自行车的速度了,为了得到较为准确的结果,我们可以在自行车的轮子上面安装尽可能多的磁铁,加入安装了12个磁铁,那么自行车转一圈我们就可以检测到12个脉冲信号,转速n和频率f的关系为 1.006.jpg ,只要得到转速我们就可以通过半径计算出自行车的速度了。
对于里程的计算:速度的计算是每隔一秒计算一次,里程是一个累加的过程,将每秒走的路程累加起来,就可以得到里程。
5.3 程序调试
程序调试主要有精确延时1s的函数编写;用标准的方波信号测试看看显示的频率与示波器实际读到的数值误差有多大;测量电机的转速,模拟自行车。
1s延时函数主要是通过控制一个灯的亮或灭来测量,用示波器观察灯亮灭的周期,从而改变循环的值,得到精确延时1s的函数;然后用函数信号发生器产生一个100Hz的方波,通过实验发现,在100Hz以内误差为1左右,在200Hz左右误差为4左右,频率越高误差越大,但是考虑到实际情况,自行车在走的时候不会太快,因此测量的还是比较准确的;最后用测量电机的转速。



总结
通过这门课程的学习,感觉自己学到了很多的知识,我很庆幸自己能当上组长,每一次老师布置的作业自己在下面都是花费了大量的时间去研究它,因为要给组员讲,所以自己学的是非常的努力,并且每个程序都会遇到各种各样的问题,我觉得学习就是不断遇到问题和解决问题的过程,如果学习中什么问题都没遇到,那么我们是不可能学好的。自己也是在下面看各种资料、例程,问别的同学,一起进步,共同学习,再加上给他们讲自己的印象更是深刻。我感觉这种教学方法真的是挺好的,从实际的操作出发,不再只是老师一个人的教,而是同学们自主的学,只有这样同学们才能学到知识。如果只是让老师讲的话,我们很容易养成惰性,因为这种课程本来就枯燥无味,听着听着就不想听了,或者上课也听懂了,但是自己不练习的话还是跟没学一样。最后 ,通过这个课程设计大作业,感觉真是学到了不少,在制作的过程中,通过自己给别人的讲解,也是一种学习的最佳方法,因为每个人的都不太一样,所以要想给他们讲清楚,首先自己得搞明白,这个过程中,正是学习的最佳时机,感觉收获还是挺多的,不仅我们组的人问,别的组的有的也问我,这样一来自己学习的知识就更多了。总之,我感觉学习就应该这样,要敢于去给别人讲,要喜欢去给别人讲,这样别人不仅感激你,更重要的是自己能学到很多课本上和课堂上你学不到的知识,这才叫学习。

参考文献
[1] 王智, 潘强, 邢涛. MSP430系列超低功耗16位单片机原理与应用[D].电子工业出版社. 2009.
[2] 阎石.数字电子技术基础.北京:高等教育出版社,2009.
[3]  杨家成.单片机原理与应用及C51程序设计.北京:清华大学出版社,2007
[4]  赛尔吉欧.佛朗格著,刘树棠等译。基于运算放大器和模拟集成电路的电路设计(第三版).西安交通大学出版,2009.2

附录一 元件清单
名称
规格/型号
数量
单片机
MSP430g2553
1
稳压芯片
AMS1117-3.3
1
瓷片电容
105
1
22pF
1
103
4
电解电容
10uF
2
电阻
1K
4
温度传感器
DS18B20
1
时钟模块
DS3231
1
TFT彩屏
1
霍尔传感器
3114
1


附录二 源程序
  1. #include
  2. #include
  3. #include "font.h"
  4. #include "sys.h"
  5. #include "lcd.h"
  6. #include "ds18b20.h"
  7. #include"ds3231.h"
  8. extern uchar nian,yue,ri,shi,fen,miao;
  9. float  d = 40.0, per;
  10. void CLK_Init(void)                                                                       //时钟配置
  11. {
  12.     if (CALBC1_16MHZ ==0xFF || CALDCO_16MHZ == 0xFF)
  13.     {
  14.         while(1);                                   // If calibration constants erased
  15.                                                                                                                         // do not load, trap CPU!!
  16.     }
  17.     DCOCTL=0;
  18.     BCSCTL1 = CALBC1_16MHZ;                       // Set range
  19.     DCOCTL = CALDCO_16MHZ;                        // Set DCO step + modulation
  20.     BCSCTL2 |= 0X06;                               //SMCLK为DCO的8分频,2M
  21. }
  22. void showjiemian()                                                                         //界面显示
  23. {
  24.               LCD_Fill(0,0,128,20,GBLUE);                                          //在指定区域填充颜色
  25.               showhanzi1(13,2,0,RED,GBLUE);
  26.               showhanzi1(30,2,1,RED,GBLUE);
  27.               showhanzi1(47,2,2,RED,GBLUE);
  28.               showhanzi1(64,2,3,RED,GBLUE);
  29.               showhanzi1(81,2,4,RED,GBLUE);
  30.               showhanzi1(98,2,5,RED,GBLUE);                            //自行车里程表
  31.               showhanzi1(2,24,16,BLUE,YELLOW);              //温
  32.               showhanzi1(18,24,17,BLUE,YELLOW);              //度
  33.               LCD_ShowChar(34,24,':',1);
  34.               LCD_Fill(42,23,86,40,WHITE);                            //在指定区域填充颜色
  35.               showhanzi1(89,24,18,BLUE,YELLOW);              //℃
  36.               showhanzi1(2,48,8,BLUE,YELLOW);
  37.               showhanzi1(18,48,9,BLUE,YELLOW);
  38.               LCD_ShowChar(34,48,':',1);
  39.               LCD_Fill(42,47,86,65,WHITE);                            //在指定区域填充颜色
  40.               LCD_ShowString(88,48,"km/h");                            //速度km/h
  41.               showhanzi1(2,72,10,BLUE,YELLOW);
  42.               showhanzi1(18,72,11,BLUE,YELLOW);
  43.               LCD_ShowChar(34,72,':',1);
  44.               LCD_Fill(42,71,86,89,WHITE);                            //在指定区域填充颜色
  45.               LCD_ShowString(88,72,"km");                                          //里程km:
  46.               LCD_Fill(0,96,128,128,WHITE);                            //在指定区域填充颜色
  47.               showhanzi1(24,104,25,BLUE,WHITE);//月
  48.               showhanzi1(56,104,26,BLUE,WHITE);//日
  49.               LCD_ShowChar(96,104,':',1);
  50. }
  51. int main(void)
  52. {
  53.               u16 tem, a, b, c;
  54.               u16 f;
  55.               float v, l = 0.0;
  56.               WDTCTL = WDTPW + WDTHOLD;                                          //停止看门狗
  57.               P1DIR |= BIT1;
  58.               P1OUT |= BIT1;
  59.     P2DIR |= 0x1f;                                                                                    //设置P2为输出方式输出方式
  60.     P2OUT |= 0X1f;
  61. /************************配置P1.5,P1.6引脚为输入***************************
  62.   *****按下与P1.5连接的按键半径增加,按下与P1.6连接的按键半径减小***********/
  63.               P1DIR &= ~(BIT5+BIT6);
  64.               P1REN |= BIT5+BIT6;
  65. /************************频率测量信号输入引脚TACLK配置**********************/
  66.     P1SEL |= BIT0;                                                                          //设置P1.0引脚为外围功能模块引脚
  67.     P1DIR &= ~BIT0;                                                                         //设置P1.0引脚为输入引脚
  68. /***************实现频率测量的定时/计数器A(Timer_A)配置*********************/
  69.     TACTL |=TASSEL_0;                                                           //计数信号选择TACLK
  70.     TACTL |= ID_0;                                                              //计数信号分频选择1
  71.     LCD_ShowNum(48,48,0,3);
  72.     //BACK_COLOR=WHITE;                                                           //背景色,
  73.     //POINT_COLOR=BLUE;                                                           //画笔色
  74.     CLK_Init();
  75.     Lcd_Init();
  76.     LCD_Clear(YELLOW);
  77.     /**************时间初始化**************/
  78. #if 0
  79.     ModifyTime(16,5,6,17,34,00);
  80.     LCD_Show2Num(8,104,5,2);//月
  81.     LCD_Show2Num(40,104,6,2);//日
  82.     LCD_Show2Num(80,104,16,2);//时
  83.     LCD_Show2Num(104,104,12,2);//分
  84. #endif
  85.     /**************中断按键P1.4的配置**************/
  86.     P1OUT|=BIT4;//选择上拉方式
  87.     P1REN=BIT4;//使能上拉电阻
  88.     P1IE|=BIT4;//使能按键S2管脚中断
  89.     P1IES=0x00;//中断触发方式为上升沿
  90.     P1IFG=0x00;//清除中断标志
  91.     _EINT();//使能总中断
  92.     showjiemian();
  93.               BACK_COLOR=WHITE;                                                          //背景色
  94.               POINT_COLOR=BLUE;                                             //画笔色
  95.               P1OUT ^=BIT6;
  96.     while(1)
  97.     {
  98.                   /**************得到时间数值并显示**************/
  99.                   GetAllTime();
  100.         LCD_Show2Num(8,104,yue,2);//月
  101.         LCD_Show2Num(40,104,ri,2);//日
  102.         LCD_Show2Num(80,104,shi,2);//时
  103.         LCD_Show2Num(104,104,fen,2);//分
  104.         //LCD_Show2Num(72,104,miao,2);//秒
  105.         /**************得到温度值值并显示**************/
  106.                   tem = Read_Temp();
  107.                   a = tem/1000;
  108.                   b = tem%1000/100;
  109.                   c = tem%100/10;
  110.                   //d = tem%10;            
  111.                   LCD_ShowNum(51,24,a,1);                                          //显示温度十位
  112.                   LCD_ShowNum(59,24,b,1);                                          //显示温度个位
  113.                   LCD_ShowChar(67,24,'.',0);                            //显示"."
  114.                   LCD_ShowNum(75,24,c,1);                                          //显示温度十分位
  115.                   //LCD_ShowNum(83,24,d,1);                            //显示温度百分位
  116.                   /**************测量信号的频率**************/
  117.                   TAR = 0x0000;                                                                      //计数寄存器内部清零
  118.                   TACTL |= MC_2;                                                          //启动计数,计数终值0xffff
  119.                   delay_s(1);                                                                        //产生1s计数闸门
  120.                   TACTL |= MC_0;                                                          //停止计数
  121.                   f = TAR;                                                                                     //读频率测量值
  122.                   per = 3.14*(d/100.0);
  123.                   v = per*(f/16.0)*3.6+0.5;
  124.                   l += (1.5*(f/16.0))/1000.0;
  125.                   LCD_ShowNum(48,48,(u16)v,3);              //显示速度
  126.                   LCD_ShowNum(48,72,(u16)f,3);              //显示里程
  127.     }
  128. }
  129. #pragma vector=PORT1_VECTOR
  130. __interrupt void PORT1_key3(void)
  131. {
  132.               if(P1IFG & BIT4)
  133.               {
  134.                             P1DIR &= ~BIT4;
  135.                             P1REN |= BIT4;
  136.                             LCD_Fill(0,96,128,128,MAGENTA);//在指定区域填充颜色
  137.                             showhanzi1(4,104,30,WHITE,MAGENTA);
  138.                             showhanzi1(20,104,31,WHITE,MAGENTA);
  139.                             showhanzi1(36,104,32,WHITE,MAGENTA);
  140.                             showhanzi1(52,104,33,WHITE,MAGENTA);
  141.                             LCD_ShowChar(68,104,':',1);
  142.                             LCD_ShowChar(104,104,'c',1);
  143.                             LCD_ShowChar(112,104,'m',1);
  144.                             LCD_Fill(78,102,102,120,WHITE);//在指定区域填充颜色
  145.                             while(1)
  146.                             {
  147.                                           BACK_COLOR=WHITE;                                                          //背景色
  148.                                           POINT_COLOR=BLUE;                                             //画笔色
  149.                                 if(!(P1IN & BIT5))
  150.                                 {
  151.                                               delay_ms(50);
  152.                                               if(!(P1IN & BIT5))
  153.                                               {
  154.                                                             //while(!(P1IN & BIT5));
  155.                                                             delay_ms(150);
  156.                                                                           d++;
  157.                                                             if(d>90)
  158.                                                             {
  159.                                                                           d = 40;
  160.                                                             }
  161.                                               }
  162.                                 }
  163.                                 else if(!(P1IN & BIT6))
  164.                                 {
  165.                                               delay_ms(50);
  166.                                               if(!(P1IN & BIT6))
  167.                                               {
  168.                                                             delay_ms(150);
  169.                                                             d--;
  170.                                                             if(d<40)
  171.                                                             {
  172.                                                                d = 90;
  173.                                                             }
  174.                                               }
  175.                                 }
  176.                                 if(!(P1IN & BIT4))
  177.                                 {
  178.                                               while(!(P1IN & BIT4));
  179.                                               LCD_Fill(0,96,128,128,WHITE);                            //在指定区域填充颜色
  180.                                               showhanzi1(24,104,25,BLUE,WHITE);//月
  181.                                               showhanzi1(56,104,26,BLUE,WHITE);//日
  182.                                               LCD_ShowChar(96,104,':',1);
  183.                                     P1OUT|=BIT4;//LED配置为高电平,S2选择上拉方式
  184.                                     P1REN=BIT4;//使能上拉电阻0000 1000
  185.                                     P1IE|=BIT4;//使能按键S2所在P1.3管脚中断
  186.                                     P1IES=0x00;//中断触发方式为上升沿
  187.                                               break;
  188.                                 }
  189.                                           LCD_ShowNum(82,104,d,2);
  190.                             }
  191.                             P1IFG = 0x00;
  192.               }
  193. }
复制代码


附录三 实物展示
1.007.jpg

完整论文下载(word格式 可编辑):
http://www.51hei.com/bbs/dpj-82279-1.html



回复

使用道具 举报

ID:625113 发表于 2019-12-26 08:39 来自手机 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表