基于单片机的车用数字仪表的设计及实现_第1页
基于单片机的车用数字仪表的设计及实现_第2页
基于单片机的车用数字仪表的设计及实现_第3页
基于单片机的车用数字仪表的设计及实现_第4页
基于单片机的车用数字仪表的设计及实现_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

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

文档简介

基于单片机的车用数字仪表的设计及实现摘要:本设计是基于单片机的车用数字仪表,其中控制部分采用at89c51rb芯片,外围电路采用全数字技术,实现了高效实用的车用数字仪表。它能够实时显示汽车的速度,行驶里程,车内的温度,以及当前的时间。对于现在的汽车仪表是一个很大的改进和升级。同时还能改善汽车仪表的美观性,为更方便的设计出各式各样的汽车仪表提供基础。本设计还完成了外围数据采集芯片的应用,驱动程序的编写,以及基于protues的整体仿真。实现了车用数字仪表的整个程序正常运行。关键词:单片机,数字仪表,仿真IDesignandimplementationofdigitalinstrumentforvehiclebasedonsinglechipmicrocomputerAbstract:Inthisdesign,basedonvehicledigitalinstrumentofsinglechipmicrocomputer,theat89c51rbchipandthedigitaltechnologywerepreparedtothesectionsofcontrollingandperipheralcircuitrespectivelytomakehigh-effectiveandpracticalvehicledigitalinstrumentcometrue.Itcanalsorealizethereal-timedisplayinvolvingthespeedofcars,themileages,thetemperatureinthecarsandthecurrenttime,whichnotonlyimprovedandupgradedsignificantlypresentmotormeter,butbeautifiedmotormetertoprovidefoundationfortheeasydesignofvariousmotormeter.Italsofinishedtheapplicationonchipofperipheraldataacquisition,thecompilingofdriveprogram,aswellasthewholesimulationofProtues,makingthewholeprogramofvehicledigitaloperatenormally.Keywords:Singlechipmicrocomputer,Digitalinstrument,SimulationII目录1前言.11.1研究背景.11.2国内外研究进展.11.3本课题研究内容.12.1方案一.32.2方案二.32.3确定方案.43车用数字仪表硬件设计.53.1主控系统.53.1.1单片机选择.53.1.2最小系统设计.53.2外围硬件.73.2.1车速模块设计.73.2.2温度模块设计.93.2.3时间模块设计.103.2.4显示模块设计.113.2.5存储模块设计.123.3电源设计.143.3.1电源硬件电路设计.144车用数字仪表软件设计.154.1开发语言选择.154.2程序流程设计.154.2.1基本流程设计.154.2.2速度算法设计.184.2.3里程算法设计.184.3驱动程序设计.184.3.1LCD驱动程序.184.3.2DS18B20驱动程序设计.194.3.3DS1302驱动程序设计.23III4.3.4SPI存储芯片驱动程序设计.245基于PROTUES模拟仿真.296总结.30参考文献.31致谢.32附录.33附录1:系统硬件原理图.33附录2:源程序.3301前言1.1研究背景车用仪表是驾驶员获知汽车信息的重要接口界面,是驾驶员了解汽车状况的直接方法。然而,传统汽车仪表采用模拟电子技术,体积大,效率低,美观性差,故障率高。为此,人们提出了很多方案来改善汽车仪表。但都不尽如人意。随着电子技术的飞速发展,微处理器性能的不断提高,使得以微处理器为核心的电子控制技术飞速发展。由此,车用数字仪表代替传统汽车仪表成为可能。车用数字仪表应用单片机控制,数字电路设计实现。由于其单片机体积小,处理速度非常快,所以可以设计出美观实用的车用数字仪表。并且单片机超长的寿命,和低错误性,使得基于单片机的车用仪表既安全可靠又长久节约。因此,车用数字仪表的设计及实现具有重要的经济价值和社会意义。1.2国内外研究进展汽车仪表从刚开始的机械式,到后来的模拟电子电路式经历了两个阶段的发展,到现在,数字电路式汽车仪表开始出现,它先进的技术和物美价廉的特性,决定它即将全面取代传统的汽车仪表。从去年出台的2013-2017年中国汽车仪器仪表行业分析及市场预测报告中可以看出未来我国汽车仪器仪表行业发展方向为:(1)提高国产汽车仪表的质量和稳定性。(2)不断的创新,将智能技术和其他科技应用在汽车仪表的设计中,提高汽车仪表的集成度,智能化。(3)研发高端汽车数字仪表,提高国产汽车仪表市场份额。由此可见,国外相对国内发展领先,国内数字仪表存在很多问题,需要我们不断努力创新改进,发展新型,可靠,高精度,数字化,集成化的车用仪表。1.3本课题研究内容1本设计研究以单片机为控制元件,由速度传感器,存储芯片,数字温度传感器,显示器件,步进电动机,时钟芯片等外围元件组成数字仪表。系统主要由七部分组成,日期时间模块,汽车速度采集模块,里程存储模块,电动机模块,计算控制模块,车内温度采集模块,显示信息模块。(1)日期时间模块,日期时间芯片完成日期时间存储。(2)汽车速度采集模块,传感器完成汽车车轮转速的采集。(3)里程存储模块,单片机掉电时,把里程信息存入存储芯片,掉电保护里程数据。(4)电动机模块,单片机处理的车速信息转换为电动机的转动角度,实时显示车速。(5)计算控制模块,由单片机完成数据的计算和传递。(6)车内温度采集模块,温度芯片完成温度信息采集。(7)显示信息模块,显示汽车的车内温度,日期时间和里程信息。22方案设计本设计要求有较高的实用性,为此,充分考虑方案的经济性和可行性以及用户的习惯性之后,在第一章论述的基础上,查阅有关资料,得出以下设三种计方案。2.1方案一At89c51速度传感器温度传感器存储器LED时钟芯片图2.1方案一系统框图本方案采用传统的AT89C51单片机,集合外围电路。各类传感器实现信号的采集,由单片机处理后,送到LED数码管显示。系统框图如图2.1。由六部分组成,日期时间模块,汽车速度采集模块,里程存储模块,MCU计算控制模块,车内温度采集模块,LED显示信息模块。AT89C51是应用最广泛的单片机之一,其结构简单,代码执行快速可靠。LED数码管应用方便简单。但是,AT89C51单片机结构简单,执行快的同时,也牺牲了一部分功能。它没有看门狗功能,且内存容量有限。LED方便,但其存在体积大,不够美观,信息显示量有限等缺点。2.2方案二3At89c51rb2速度传感器温度传感器存储器LCD步进电动机时钟芯片图2.2方案二系统框图图2.2中,由七部分组成,日期时间模块,汽车速度采集模块,里程存储模块,步进电动机模块,MCU计算控制模块,车内温度采集模块,LCD显示信息模块。控制模块采用AT89C51rb2。相比AT89C51,AT89C51rb2系统结构变化很小,使用也很方便。在控制能力,可靠性等方面也十分接近。重要的是,AT89C51rb2有自带的看门狗功能,能很好的防止程序的跑偏死飞现象。速度显示方案为步进电动机带动指针实时显示。与现在市场上的迈速表在用户体验上保持一致。显示部分应用LCD显示屏。能容纳更多的信息量。2.3确定方案比较方案一和方案二的优缺点,可以看出,方案二的设计,更好的考虑了现实问题和用户体验,具有更强的可行性和应用价值。所以采用方案二进行设计。43车用数字仪表硬件设计在上一章确立方案的基础上,本章进行车用数字仪表的硬件选型和电路设计。包含:单片机最小系统电路设计、数据采集器件的比较选择和硬件电路设计、液晶显示,步进电机电路连接等几部分。3.1主控系统单片机采用超大规模集成电路技术,把CPU、RAM、ROM、I/O口等集成在一块电路芯片上。单片机还带有中断系统,定时器计数器功能。从上世纪开始,随着单片机的不断发展,其应用领域不断扩展到各行各业。可以毫不夸张的说,单片机的数量比人类的总人口还多。3.1.1单片机选择AT89C51RB2是一种带16K字节FLASH存储器(FPEROMFlashProgrammableandErasableReadOnlyMemory)8位单片机。相比AT89C51,AT89C51RB2系统结构变化很小,使用也很方便。在控制能力,可靠性等方面也十分接近。重要的是,AT89C51RB2有自带的看门狗功能,能很好的防止程序的跑偏死飞现象,兼容标准的MCS-51指令集。AT89C51RB2单片机应用在本设计中既廉价又实用。3.1.2最小系统设计(1)控制部件及振荡器单片机的控制部分包括定时电路,控制电路,传输电路等。单片机是时钟驱动器件,没有时钟晶振,单片机就不能工作。单片机以晶振频率为基准,发出CPU时序,来控制完成各种功能。如数据运算和传送,地址锁存,外部程序存储器选通PSEN,以及通过P3.6和P3.7发出数据存储器读RD和写WR等控制信号,并且接收处理外接的复位RST和外部程序存储器访问控制EA信号。单片机的驱动方式分为两种,一种是以外部晶振为基准的内部时钟方式,另一5种是以外部时钟为基准的方式。如图3.1和3.2所示。图3.1内部振荡器方式图3.2外部振荡器方式本设计采用外部晶振为基准的内部时钟方式,如图3.1。晶振与AT89C51rb2的反向放大器连接,接口为XTAL1、XTAL2。由此组成一个自激振荡电路,向AT89C51rb2内部时钟电路提供振荡时钟。自激振荡电路的频率主要取决于晶体的振荡频率,晶体选择12MHZ。电容10pF25pF之间,可以起到频率微调的作用。(2)复位电路单片机的复位原理为,在RST端持续给出两个周期的高电平。单片机复位方法分为两种,上电自动复位和手动复位。(1)上电自动复位:在每次接通电源上电时,都会自动进行复位,复位后单片机内部的各寄存器值变为初始状态。实现原理为,在RST端加一个RC电路。上电时RST与Vcc电压相同。经过两个机器周期后,电容逐渐存电,电压上升。RST端的电压下降。电路参数C取23uf,R取1K,可在RST端产生足够的高电平脉冲,使单片机能够可靠的上电自动复位。(2)手动复位:当需要手动复位时,可以人为产生两个机器周期以上的高电压。以实现复位目的。这里可以在RC电路上并接一个开关按钮,就能实现人为手动复位的目的。当需要外部复位时,可以按下复位按钮达到复位目的。电路图如图3.3。6图3.3单片机复位电路3.2外围硬件通过外围硬件电路的设计,完成硬件选型和电路的连接。3.2.1车速模块设计(1)霍尔数字测速元件车用数字仪表的测速需要用到霍尔测速元件,它比现阶段所使用的感应电动机有很多优点,比如体积小寿命长等等。霍尔元件的线性精度很高。开关元件更是有无触点无抖动等优点。并且,它的工作环境使用性很强,在灰尘油污高低温环境下都可正常运行。用在测速时,它的频率可以达到1MHZ,足以满足测速的测量。本设计选用霍尔开关元件a3144e,通过把a3144e安装在车轮上,车轮每转动一周,就由a3144e产生一定数量的脉冲信号。脉冲信号送到单片机,单片机对脉冲信号进行计数。每10ms对计数值进行计算处理,得出汽车的速度,送给显示单元,这样便完成了车速计算。本设计把脉冲信号送到单片机的P3.2口,使用P3.2口的第二功能,对脉冲信号进行计数,车轮每转一圈,霍尔开关就检测并输出信号,单片机对脉冲计数。为了增强抗干扰性能,在信号传输中采用光耦合元件。如图3.4。7图3.4霍尔传感器A3144E和单片机连接电路(2)步进电动机步进电动机是应用很广泛的执行元件,由于它的转速,停止位置只取决于脉冲频率和脉冲数量。所以,很多开环控制系统都采用步进电动机作为执行单元。相比较,控制系统的执行单元还有伺服电机,伺服电机也有很多优点,它控制精度高,能实现闭环控制,但是,在本设计中,应用伺服电机的成本会升高。同样的功能,本设计更趋向于物美价廉的步进电动机,他同样能很好的完成既定目标功能。单片机的控制精度和步距角有关,为了实现本设计的功能,采用步距角为0.9度的步进电动机。由于步进电动机的驱动电压和单片机的不同,为12v。所以采用ULN2003A作为电压放大之用。步进电动机硬件电路如图3.5所示。由此,车用数字仪表的速度模块由霍尔元件和步进电动机完成实时速度的显示,步进电机步距角0.9度,可以设计180度的扇形显示200KM/小时。这样,迈速表的分辨率为1KM/小时。83.5步进电动机与单片机连接电路3.2.2温度模块设计DS18B20是一种单总线数字温度传感器,测试温度范围-55-125。温度数据精度可设置为9、10、11、12位,对应的刻度值分别为0.5、0.25、0.125、0.0625,对应的最长转换时间分别为93.75ms、187.5ms、375ms、750ms。出厂默认精度设置为12位数据,刻度值为0.0625。温度转换时间最长为750ms。DS18B20是达拉斯公司生产的,拥有公司自主研发的单总线通信技术。控制芯片只需要一根总线。DS18B20有很多优点,使用方便,且环境适应性强。对电源的要求也很低。可以工作在寄生电源和单独供电两种模式下。本设计使用DS18B20,可以发挥它体积小精度高等优势。而且,车用数字仪表中使用DS18B20也完全可以满足要求。它的耗电量很小。广泛的应用实例也可以为我的开发提供参考。DS18B20硬件连接如图3.6所示。9图3.6DS18B20与单片机连接电路3.2.3时间模块设计DS1302是DALLAS公司生产的。它是一种涓流充电时钟芯片。DS1302芯片中内含有一个实时时钟/日历和31字节静态RAM。DS1302可以提供秒、分、时、日、日期、月、年的信息。它还有一个很大的优点,就是可以自动调整每月的天数。并且可以通过编程设置采用24小时或12小时的格式。DS1302与单片机的通信很简单。采用的是同步串行方式。连接的线也很少,只用到三根,分别是RST复位线,I/O数据线,SCLK串行时钟线。他在工作时的耗电很低。保持信息时只要1mW。硬件电路如图3.7图3.7DS1302与单片机硬件电路103.2.4显示模块设计由于需要显示的信息量多,且含有中文信息。本设计采用PG12864F图形液晶显示器。它内置了T6963C液晶显示控制器。T6963C液晶显示控制器多用于中小规模的液晶显示器件常被装配在图形液晶显示模块上以内藏控制器型图形液晶显示模块的形式出现。表3.1PG12864F功能引脚D0-D7T6963C与MPU接口的数据总线,三态/RD/WR读写选通信号低电平有效输入信号/CET6963C的片选信号低电平有效C/D通道选择信号1为指令通道0为数据通道/RESET/HALT/RESET为低电平有效的复位信号它将行列计数器和显示寄存器清零关显示/HALT具有/RESET的基本功能还将中止内部时钟振荡器的工作DUALSDSELDUAL=1为单屏结构DUAL=0为双屏结构SDDEL=0为一位串行数据传输方式MD2,MD3设置显示窗口长度,从而确定了列数据传输个数的最大值FS1显示字符的字体选择本设计采用PG12864F的原因是,它可以提供128*64的图形显示区,相比较字符显示屏的优点,它可以自定义很多图形。能完成汉字的显示。唯一的缺点是需要自行建立汉字字模表。在连接电路时,把它接在单片机的P0口,由于P0口没有内部上拉电阻,在作为输入输出功能使用时,加上拉排阻RP1。P0口作为LCD的数据通道。其余控制信号则由P2.0-P2.4五个口来控制。本设计默认采用6*8的字模格式,所以FS1口直接接地。硬件电路如图3.8所示,其中P0口为数据输出,需要加RP1拉排阻。113.8PG12864F与单片机连接电路3.2.5存储模块设计本设计采用SPI接口芯片25AA010A。SPI是串行外设接口(SerialPeripheralInterface)的缩写。SPI,在现在的应用很是广泛。她是一种高速的,全双工,同步的通信总线。SPI只需要四根总线。而且体积很小。在传输速率上又很快。本设计采用的25AA010A有六根线,其中四根是所有基于SPI的设备共有的,它们是SI(数据输入)、SO(数据输出)、SCLK(时钟)、CS(片选),其余两根是这个系列芯片特有的,HOLD(保持信号)、WP(写保护)。12表3.225AA010A引脚功能SI主设备数据输出,从设备数据输入SO主设备数据输入,从设备数据输出SCLK时钟信号,由主设备产生CS从设备使能信号,由主设备控制HOLD保持状态信号WP写保护信号要想和SPI接口的芯片通信,必须使片选信号CS为预先规定的使能信号相同时,才能通信。这样,就能在同一根总线上连接多个SPI接口的芯片了。当CS信号为有效时,通讯通过数据线来实现的。SPI是一种串行接口,顾名思义,就是通讯的数据是一位一位的传输的。所以,必须有时钟总线SCLK来协调两个元件之间的步调。就好比一个音乐指挥官一样,来统一指挥元件的节奏。这样,SI和SO就知道应该按照什么频率来传输数据了。由于SCLK的作用是指挥官,所以它必须由传输数据的主动方来控制,也就是只能由主设备控制。这里还有介绍HOLD,它是允许传输暂停的控制信号,当HOLD为有效信号时,通讯暂停,单片机可以去完成别的操作,比如说处理中断等。这个功能的实用性就是既可以保证传输数据的完整性,又不耽误高优选级的事情得到处理。本设计的数据存储量很小。只需要存储几个字节的里程数据,固而采用的是25AA010A芯片,它的结构小巧,能存储2kb的数据,足以满足里程数据的存储。25AA010A与单片机的连接如图3.9所示。其中时钟信号由P3.0提供。数据输入输出分别为P3.1口和P3.2口。片选信号为P3.4口控制。其余两个引脚HOLD、WP分别接在P3.5口和P3.6口。13图3.92AA010A与单片机连接的硬件电路3.3电源设计汽车的蓄电池低压为12V,正好可以为步进电动机提供电源。而单片机的工作电压为5V左右。这就要求设计硬件电路来完成12V到5V电压的转变。3.3.1电源硬件电路设计本设计拟用LM317T直流稳压器作为电压转换芯片。输出电压的大小由R4和R3的比值来确定。D1是电源指示灯,为一个红色发光二极管。D2和D3起到过压保护的作用。防止芯片引脚被烧坏。其电路如图3.10所示。图3.10电源电路设计144车用数字仪表软件设计4.1开发语言选择汇编语言它是计算机语言,计算机语言说通俗点就是人类与计算机(CPU)沟通的桥梁,计算机它不认识人类的语言,听不懂也读不懂,要让计算机替我们去完成我们的工作,就需要我们将要交给计算机完成的任务翻译为计算机语言。汇编语言是各种语言中的一种,它属于低级的计算机语言,这是相对于面向过程的C语言,以及面向对象的C+,java而言。它是除机器语言以外最接近硬件的计算机语言,而且可以通过学习汇编语言深入的了解操作系统的底层运行机制,并以CPU的角度思考问题。这样可以让你在编写高级语言的程序的时候避免很多错误,并且能更深入理解高级语言的执行原理。因为汇编语言属于低级语言,所以既然低级就肯定不容易被普通用户认识,这需要一定的硬件基础知识和一些计算机工作原理的知识。C语言相比较低级语言,有很强的可读性,编程很方便。可以大大提高开发效率。由于他们各有优缺点。本设计采用混合编程,充分发挥了两种语言的优势,实时性高的地方用汇编语言,实时低的地方用C语言。将汇编语言程序模块嵌入到C语言程序。4.2程序流程设计程序的开发,首先的对需求进行分析,得出程序流程图,再在此基础之上进行程序代码的开发,和修改完善。4.2.1基本流程设计(1)车用数字仪表的程序设计应充分考虑它的实际情况。汽车的车速是一个实时显示的数据,而且实时性很高,而其他的温度日期等相对实时性低。所以,应该把汽车的速度模块放在中断中去处理。而且,当单片机掉电时,对里程数据的存储也至关重要,所以,单片机的掉电中断优选级最高。下面分三部分介绍系统流程图。其中图4.1为主程序框图。15图4.1主程序图(2)程序的循环体中应该不断更新各类数据。其中,温度跟新时,先对温度芯片发出温度转换信号,温度转换的时间大约为10ms,比较耗时。接下来完成速度里程的处理。速度里程处理完成后,再执行温度读取,时间读取,LCD更新等操作。循环体的流程框图为图4.2所示。开始温度转换读取数据显示初始化开中断循环标志循环体数据存储结束16是否图4.2循环体程序框图(3)中断程序的设计原则应尽可能短小。所以中断程序只完成中断标志置位和数据读取操作。温度转换中断标志判断步进电机驱动速度里程计算刷新LCD读取计数器值中断标志为1返回循环体17图4.3中断程序框图4.2.2速度算法设计由计数器T1对A3144E产生的脉冲信号进行计数,定时器T2每0.5秒产生一次中断,程序读取计时器值x,x则为0.5秒A3144E产生的脉冲个数。设计车轮轴向有四个均匀分布的磁极。由此得出车轮转过的圈数为x/4。根据汽车的车辆周长y。可以计算的出车速v=x*y/(4*0.5)。4.2.3里程算法设计每次定时器T2产生中断后,对里程数据进行累加x*y/4。4.3驱动程序设计4.3.1LCD驱动程序#define_LCD_H_/*定义引脚*/sbitLCD_WR=P20;sbitLCD_RD=P21;sbitLCD_CE=P22;sbitLCD_C_D=P23;sbitLCD_RST=P24;/*定义指令*18*/#defineCGRAM_ADDR0X22/D1低五位有效,D2为0x00,CGRAM偏置地址设置#defineADDR_POINT0X24/D1低字节,D2高字节,地址指针位置#defineSTART0x9c/开始显示#defineZHIFU0X84/选择字符发生器文本特征/*定义驱动函数*/voiddelayms(unsignedintz);/延时若干毫秒voidwrite_com(unsignedcharcom);/LCD液晶写无参数入指令voidwrite_com1(unsignedchardat1,unsignedcharcom);/LCD液晶写入1个参数指令voidwrite_com2(unsignedchardat1,unsignedchardat2,unsignedcharcom);/LCD液晶写入2个参数指令voidwrite_data(unsignedchardat);/LCD液晶写入数据voidread_data();/读取状态标志位voidLCD_Init();/初始化voidWrite_hanzi(unsignedchardat,unsignedcharaddr1);/写汉字voidWrite_shuzi(unsignedchardat,unsignedcharaddr1);/写数字voidWrite_CGRAM(unsignedchar*dat);/设置CGRAMunsignedcharshuzi(unsignedcharshu);/数字转换字摸吗unsignedcharshuzi_1(unsignedcharshu);/星期数字转换字摸吗voidvive_time_shuzi(unsignedchardat,unsignedcharaddr);/显示时间数字voidvive_xingqi_shuzi(unsignedchardat);/显示星期数字voidvive_licheng_shuzi(unsignedchar*dat);/显示里程数字voidlcd(unsignedchar*table);/lcd初始化#endif194.3.2DS18B20驱动程序设计/*温度传感器模块*/#ifndef_DS18B20_H_#define_DS18B20_H_sbitDQ=P37;sbitACC_0=ACC0;sbitACC_7=ACC7;externbitTem_Flag;/温度符号标志#defineSearch0xf0/搜索ROM#defineRead0x33/读取ROM单个ds18b20#defineMath0x55/匹配ROM#defineSkip0xcc/忽略ROM单个时只能跟读取指令#defineAlarm0xec/报警搜索#defineConvert0x44/温度转换指令#defineWrite_S0x4e/写暂存器#defineRead_S0xbe/读暂存器#defineCopy_S0x48/拷贝暂存器#defineRecall0xb8/召回EEPROMvoiddelayus(unsignedcharz);/延时2us的整数倍,最大510usvoidDs_Init();/初始化DS18B20voidDs_Write_Bit(bittemp);/写一位bitDs_Read_Bit();/读一位voidDs_Write_Byte(unsignedchartemp);/写一个字节unsignedcharDs_Read_Byte();/读一个字节voidDs_Tem_Fresh();/温度转化unsignedintDs_Read_Tem();/读温度#endif20#include#includebitTem_Flag;/温度符号标志voiddelayus(unsignedcharz)/延时2us的整数倍,最大510us#pragmaasm/汇编精确定时DELAY:DJNZR7,DELAY#pragmaendasmvoidDs_Init()/初始化DS18B20DQ=0;delayus(241);DQ=1;delayus(241);voidDs_Write_Bit(bittemp)/写一位if(temp)DQ=0;delayus(8);DQ=1;delayus(23);elseDQ=0;delayus(31);DQ=1;bitDs_Read_Bit()/读一位21bittemp;DQ=0;delayus(1);DQ=1;delayus(5);temp=DQ;delayus(26);return(temp);voidDs_Write_Byte(unsignedchartemp)/写一个字节unsignedchari;for(i=8;i0;i-)ACC=temp;Ds_Write_Bit(ACC_0);temp=ACC1;unsignedcharDs_Read_Byte()/读一个字节unsignedchari,temp;for(i=8;i0;i-)/此处循环会用到ACC累加器,所以用temp传递值ACC=temp;ACC=ACC1;ACC_7=Ds_Read_Bit();temp=ACC;return(temp);voidDs_Tem_Fresh()/温度转化22Ds_Init();Ds_Write_Byte(Skip);Ds_Write_Byte(Convert);unsignedintDs_Read_Tem()/读温度unsignedchartemp1,temp2;Ds_Init();Ds_Write_Byte(Skip);Ds_Write_Byte(Read_S);temp1=Ds_Read_Byte();temp2=Ds_Read_Byte();if(temp2&0xf0)/负温度temp2=temp2temp1=(temp24)+1;Tem_Flag=1;/负温度,标志位为1else/正温度temp2=temp2temp1=(temp24);Tem_Flag=0;/正温度,标志位为0return(temp1);/整数温度4.3.3DS1302驱动程序设计/*时钟模块*/#ifndef_DS1302_H_23#define_DS1302_H_sbitclock_rst=P25;/ds1302复位线引脚sbitclock_sclk=P26;/ds1302时钟线引脚sbitclock_io=P27;/ds1302数据线引脚sbitACC0=ACC0;sbitACC7=ACC7;#definesecond_addr0x80/定义“秒”地址#defineminute_addr0x82/定义“分”地址#definehour_addr0x84/定义“时”地址#defineday_addr0x86/定义“天”地址#definemonth_addr0x88/定义“月”地址#defineyear_addr0x8c/定义“年”地址#defineweek_addr0x8a/定义“星期”地址voidClock_Write_Byte(unsignedchartemp);/向时钟写入一个字节unsignedcharClock_Read_Byte();/从时钟读出一个字节voidClock_Write_Time(unsignedcharaddress,unsignedchartemp);/向时钟写入一个时间unsignedcharClock_Read_Time(unsignedcharaddress);/从时钟读出一个时间voidClock_Init(unsignedchar*clock_time);/时钟初始化voidClock_Fresh(unsignedchar*clock_time);/从时钟读出时间#endif4.3.4SPI存储芯片驱动程序设计/*SPI存储模块*/#ifndef_E2PROM_H_#define_E2PROM_H_/*24*定义引脚*/sbitSCK=P30;sbitSI=P31;sbitSO=P33;sbitCS=P34;sbitHOLD=P35;sbitWP=P36;/*定义指令*/#defineREAD0x03/从所选地址开始读数据#defineWRITE0x02/从所选地址开始写数据#defineWREN0x06/写使能寄存器置1#defineWRDI0x04/复位写使能寄存器#defineRDSR0x05/读STATUS寄存器#defineWRSR0x01/写STATUS寄存器sbitSPI_ACC_0=ACC0;sbitSPI_ACC_7=ACC7;voidSPI_Delay(unsignedchart);/SPI总线延时2*t个机器周期voidSPI_Delayms(unsignedchart);/SPI总线延时若干毫秒voidSPI_Init();/初始化voidSPI_Start();/产生SPI总线起始条件voidSPI_Stop()/产生SPI总线停止条件voidSPI_Write_Byte(unsignedchardat);/写一个字节unsignedcharSPI_Read_Byte();/读出一个字节bitSPI_Write_NByte(unsignedcharaddr,unsignedchar*dat,unsignedcharsize);/写N个字节25voidSPI_Read_NByte(unsignedcharaddr,unsignedchar*dat,unsignedcharsize);/读出N个字节#endif#include#includevoidSPI_Delay(unsignedchart)/SPI总线延时2*t个机器周期while(-t!=0);voidSPI_Delayms(unsignedchart)/SPI总线延时若干毫秒unsignedintx,y;for(x=t;x0;x-)for(y=110;y0;y-);voidSPI_Init()/初始化,主函数开始时执行HOLD=1;SCK=1;CS=1;SPI_Delay(10);voidSPI_Start()/产生SPI总线起始条件SCK=0;CS=0;SPI_Delay(1);voidSPI_Stop()/产生SPI总线停止条件CS=1;SPI_Delay(10);SCK=1;SI=1;SO=1;26voidSPI_Write_Byte(unsignedchardat)/写一个字节unsignedchari;for(i=8;i0;i-)ACC=dat;SI=SPI_ACC_7;SCK=1;SPI_Delay(1);SCK=0;dat=ACC0;i-)ACC=dat;ACC=ACC#includebitTem_Flag;/温度符号标志voiddelayus(unsignedcharz)/延时2us的整数倍,最大510us#pragmaasm/汇编精确定时DELAY:DJNZR7,DELAY#pragmaendasmvoidDs_Init()/初始化DS18B20DQ=0;delayus(241);42DQ=1;delayus(241);voidDs_Write_Bit(bittemp)/写一位if(temp)DQ=0;delayus(8);DQ=1;delayus(23);elseDQ=0;delayus(31);DQ=1;bitDs_Read_Bit()/读一位bittemp;DQ=0;delayus(1);DQ=1;delayus(5);temp=DQ;delayus(26);return(temp);voidDs_Write_Byte(unsignedchartemp)/写一个字节unsignedchari;for(i=8;i0;i-)43ACC=temp;Ds_Write_Bit(ACC_0);temp=ACC1;unsignedcharDs_Read_Byte()/读一个字节unsignedchari,temp;for(i=8;i0;i-)/此处循环会用到ACC累加器,所以用temp传递值ACC=temp;ACC=ACC1;ACC_7=Ds_Read_Bit();temp=ACC;return(temp);voidDs_Tem_Fresh()/温度转化Ds_Init();Ds_Write_Byte(Skip);Ds_Write_Byte(Convert);unsignedintDs_Read_Tem()/读温度unsignedchartemp1,temp2;Ds_Init();Ds_Write_Byte(Skip);Ds_Write_Byte(Read_S);temp1=Ds_Read_Byte();temp2=Ds_Read_Byte();if(temp2&0xf0)/负温度temp2=temp244temp1=(temp24)+1;Tem_Flag=1;/负温度,标志位为1else/正温度temp2=temp2temp1=(temp24);Tem_Flag=0;/正温度,标志位为0return(temp1);/整数温度Ds1302.c#include#includevoidClock_Write_Byte(unsignedchartemp)/向时钟写入一个字节unsignedchari;for(i=8;i0;i-)ACC=temp;clock_io=ACC0;clock_sclk=1;clock_sclk=0;temp=ACC1;unsignedcharClock_Read_Byte()/从时钟读出一个字节unsignedchari,temp;for(i=8;i0;i-)ACC=temp;ACC=ACC1;ACC7=clock_io;45clock_sclk=1;clock_sclk=0;temp=ACC;return(ACC);voidClock_Write_Time(unsignedcharaddress,unsignedchartemp)/向时钟写入一个时间clock_sclk=0;clock_rst=0;clock_rst=1;Clock_Write_Byte(address);Clock_Write_Byte(temp);clock_rst=0;clock_sclk=1;unsignedcharClock_Read_Time(unsignedcharaddress)/从时钟读出一个时间unsignedchartemp=0;clock_sclk=0;clock_rst=0;clock_rst=1;Clock_Write_Byte(address|0x01);temp=Clock_Read_Byte();clock_rst=0;clock_sclk=1;return(temp);voidClock_Init(unsignedchar*

温馨提示

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

评论

0/150

提交评论