基于单片机的出租车计价器设计方案.docx_第1页
基于单片机的出租车计价器设计方案.docx_第2页
基于单片机的出租车计价器设计方案.docx_第3页
基于单片机的出租车计价器设计方案.docx_第4页
基于单片机的出租车计价器设计方案.docx_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

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

文档简介

基于单片机的出租车计价器设计方案1 引言随着生活水平的提高,人们已不再满足于衣食住的享受,出行的舒适已受到越来越多人的关注。于是,出租车行业以快捷便利的服务给人们带来了出行的享受。但是,一直以来存在着的买卖纠纷困扰着行业的发展。而在出租车行业中解决这一矛盾的最好方法就是改良计价器。用更加精良的计价器来为乘客提供更加方便快捷的服务。 我国在70年代开始出现出租车,但那时的计费系统大都是国外进口不但不够准确,价格还十分昂贵。随着改革开放日益深入,出租车行业的发展势头已十分突出,国内各机械厂家纷纷推出国产计价器。出租车计价器的功能从刚开始的只显示路程,到能够自主计费,以及现在的能够打发票和语音提示、按时间自主变动单价等功能。随着城市旅游业的发展,出租车行业已成为城市的窗口,象征着一个城市的文明程度。 鉴于目前有关出租车计费又出台了新的政策,在原有政策基础上新增了等待费用,为了与时俱进,设计一个计费功能较全面的系统也已是迫在眉睫。 凡乘过出租车的人都知道,只要汽车开动,随着行驶里程的增加,就会看到汽车前面的计价器里程数字显示的读数从零逐渐增大,而当行驶到某一值时计费数字显示开始从起步价增加。当出租车到达某地需要在那里等候时,系统会自动根据时间进行计时,每等候一定时间,计费显示就增加一个该收的等候费用。汽车继续行驶时,停止计算等候费,继续增加里程计费。到达目的地,便可按显示的数字收费。 汽车计价器是乘客与司机双方的交易准则,它是出租车行业发展的重要标志,是出租车中最重要的工具。它关系着交易双方的利益。具有良好性能的计价器无论是对广大出租车司机朋友还是乘客来说都是很必要的。因此,汽车计价器的研究也是十分有应用价值的。 2 出租车计价器的方案论证2.1 出租车计价器的基本功能本课题所设计的出租车计价器的主要功能有:数据的复位、白天/晚上转换、计时计价、路程和总金额的统计,掉电数据储存。当按下按键后,启动计价器,开始采集脉冲信号,然后传送到单片机,单片机进行处理,计算出行驶路程以及总金额,将计算结果通过液晶显示屏显示,本电路设计的计价器不但能实现基本的计价,还能根据白天、黑夜、中途等待来调节单价,并且在计价器掉电后能将数据存储,不影响后续计费功能。2.2 出租车计价器的主要设计参数本课题对出租车计价器的设计要求如下:设计一个出租车自动计价器,计价包括起步价、行车里程计费、等待时间计费三部分,用1602液晶显示总金额,运行时间,最大值为999元,起步价为6元,等待时间单价为超过等待时间30秒后每分钟1元,用液晶显示总里程、等待时间和总金额。1、计费功能费用的计算是按行驶里程收费。设白天起步价为6元,晚上起步价为7元。等待时间超过30秒后按1元/min计费,未超过30秒时清零等待时间。2、显示功能(1)显示单价:用两位数字显示,显示方式“XX”,单位为1元/km.(2)显示行驶里程:用两位数字显示,显示方式为“XX”,单位为km。计程范围0-99km,里程精确到1km。(3)显示总费用:用三位数字显示,显示方式为“XXX”,单位为元。计价范围0-999元,精确到1元。2.3方案论证与比较方案一: 采用数字电子技术,利用555定时芯片构成多谐振荡器,或采用外围的晶振电路作为时钟脉冲信号,计数芯片对脉冲的计数和分频,最后通过译码电路对数据进行译码,将译码所得的数据送给数码管显示。方案二:用FPGA(可编程门阵列)实现:利用硬件描述语言编程,仿真调试后下载到可编程期间上(CPLD)上实现。可以对计程车整个过程进行判断、处理。整个过程完全实现了自动化和智能化。 方案三:采用单片机控制。以单片机为核心,设计上采用89S52单片机为主控器,利用单片机丰富的IO端口,及其控制的灵活性,实现基本的里程计价功能和价格选择功能。不但能实现所要求的功能而且能在很大的程度上扩展功能,而且还可以方便的对系统进行升级。通过各个方案的比较,我们知道采用数字电路设计的计价器整体电路的规模较大,用到的器件多,造成故障率高,并且难调试,而采用单片机进行设计,相对来说功能强大,用较少的硬件和适当的软件相互配合可以很容易的实现设计要求,且灵活性强,有较大的活动空间,可以通过软件编程来完成更多的附加功能,方便对系统进行升级和功能扩展。所以我们采用第三方案,用AT89S52单片机实现出租车计价的功能。系统结构如图2.1下:图2.1 系统结构图3. 系统硬件设计3.1 硬件设计说明单片机是单片微型计算机的简称,单片机以其卓越的性能,得到广泛的应用,已经深入到各个领域。在这次设计中,我们用到P0口和P2口,P0口为8位三态I/O口,此口为地址总线及数据总线分时复用;P2口为8位准双向口,与地址总线高八位复用;P0口和P2口都有一定的驱动能力,P0口的驱动能力较强。 在数据采集部分本系统采用霍尔传感器A3144,在数据显示部分本系统采用的是LCD1602这款液晶屏,由于采用LCD液晶屏显示器功能强大,可显示各种字体的数字、汉字、图像,还可以自定义显示内容,时尚美观,而且液晶的功耗和LED比起来要小的多。我们还设计了控制按键,能够很好的对出租车计价器控制,如启动/停止按键,清零按键,白天黑夜模式选择等。3.2 单片机的介绍AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52在众多嵌入式控制应用系统中得到广泛应用。AT89S52基本特性:8 位的 CPU, 片内有振荡器和时钟电路,工作频率为024MHz片内有 256字节 数据存储器 RAM片内有 8K字节 程序存储器 ROM4个8位 的并行I/O口(P0、P1、P2、P3)1个 全双工串行通讯口3个16位 定时器/计数器(T0、T1、T2)可处理 6个中断源,两级中断优先级AT89S52的引脚如图所示3.1: 图3.1 AT89S52的引脚结构 图3.2 AT89S52封装图 AT89S52各引脚功能说明:P0 口:P0口是一个8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻 辑电平。对P0端口写“1”时,引脚用作高阻抗输入。 当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。在这种模式下, P0不具有内部上拉电阻。 在flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。程序校验 时,需要外部上拉电阻。P1 口:P1 口是一个具有内部上拉电阻的8 位双向I/O 口,p1 输出缓冲器能驱动4 个 TTL 逻辑电平。对P1 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入 口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。此外,P1.0和P1.1分别作定时器/计数器2的外部计数输入(P1.0/T2)和定时器/计数器2 的触发输入(P1.1/T2EX)。 在flash编程和校验时,P1口接收低8位地址字节。引脚号第二功能:P1.0 T2(定时器/计数器T2的外部计数输入),时钟输出P1.1 T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制)P1.5 MOSI(在系统编程用)P1.6 MISO(在系统编程用)P1.7 SCK(在系统编程用)P2 口:P2 口是一个具有内部上拉电阻的8 位双向I/O 口,P2 输出缓冲器能驱动4 个 TTL 逻辑电平。对P2 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入 口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。 在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX DPTR) 时,P2 口送出高八位地址。在这种应用中,P2 口使用很强的内部上拉发送1。在使用 8位地址(如MOVX RI)访问外部数据存储器时,P2口输出P2锁存器的内容。 在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。P3 口:P3 口是一个具有内部上拉电阻的8 位双向I/O 口,p3 输出缓冲器能驱动4 个 TTL 逻辑电平。对P3 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入 口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。 P3口亦作为AT89S52特殊功能(第二功能)使用,如下表所示。 在flash编程和校验时,P3口也接收一些控制信号。端口引脚第二功能:P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2 INTO(外中断0)P3.3 INT1(外中断1)P3.4 TO(定时/计数器0)P3.5 T1(定时/计数器1)P3.6 WR(外部数据存储器写选通)P3.7 RD(外部数据存储器读选通)此外,P3口还接收一些用于FLASH闪存编程和程序校验的控制信号。RST:复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将是单片机复位。ALE/PROG:当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个ALE脉冲。对FLASH存储器编程期间,该引脚还用于输入编程脉冲(PROG)。如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁止ALE操作。该位置位后,只有一条MOVX和MOVC指令才能将ALE激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,应设置ALE禁止位无效。PSEN:程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89S52由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲,在此期间,当访问外部数据存储器,将跳过两次PSEN信号。EA/VPP:外部访问允许,欲使CPU仅访问外部程序存储器(地址为0000H-FFFFH),EA端必须保持低电平(接地)。需注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。如EA端为高电平(接Vcc端),CPU则执行内部程序存储器的指令。FLASH存储器编程时,该引脚加上+12V的编程允许电源Vpp,当然这必须是该器件是使用12V编程电压Vpp。XTAL1:振荡器反相放大器和内部时钟发生电路的输入端。XTAL2:振荡器反相放大器的输出端。3.3 硬件电路组成本系统硬件电路组成主要包括:复位电路、晶振震荡电路、显示模块,掉电存储电路,按键电路。整体硬件原理图如图3.3所示图3.3 硬件电路原理图3.3.1 复位电路复位操作有两种基本形式:一种是上电复位,另一种是按键复位。本系统采用按键复位(如图3.4)。按键复位电路原理:在单片机启动后,电容C两端的电压持续充电为5V,这是时候10K电阻两端的电压接近于0V,RESET处于低电平所以系统正常工作。当按键按下的时候,开关导通,这个时候电容两端形成了一个回路,电容被短路,所以在按键按下的这个过程中,电容开始释放之前充的电量。随着时间的推移,电容的电压从5V释放到变为了1.5V,甚至更小。根据串联电路电压为各处之和,这个时候10K电阻两端的电压为3.5V,甚至更大,所以RESET引脚又接收到高电平。单片机系统自动复位。图3.4 按键复位电路3.3.2 晶振震荡电路单片机内部有一个高增益、反相放大器,其输入端为芯片引脚XTAL1,其输出端为引脚XTAL2。通过这两个引脚在芯片外并接石英晶体振荡器和两只电容(电容一般取30pF)。这样就构成一个稳定的自激振荡器。振荡电路脉冲经过二分频后作为系统的时钟信号,再在二分频的基础上三分频产生ALE信号,此时得到的信号是机器周期信号。晶振电路如图3.5所示:图 3.5 晶振震荡电路3.3.3 数据采集模块介绍里程计算是通过安装在车轮上的霍尔传感器A44E检测到的信号,送到单片机,经处理计算,送给显示单元的。其原理如图3.6所示。 图3.6传感器测距原理图 一端接在P3.2口,另一端接地,车轮每转一圈小磁铁提供一个磁场,通过霍尔传感器进出磁场来回高低电平的变化,就检测并输出信号,引起单片机的中断,每中断一次代表汽车轮胎旋转了一圈。本设计以165/70R14这款轮胎为准,165代表胎宽,指轮胎的名义宽度就是165mm,就是轮胎与地面接触的那个面得宽度。/70代表扁平比,指轮胎的扁平比是70% ,扁平比可以间接反映胎壁的名义高度胎壁的名义高度计算式为:名义宽度扁平比。所以该轮胎的胎壁名义高度为:165mm70%=115.5mm。轮胎的外圆半径为:胎壁高度(115.5mm)轮胎内圆半径(330.2mm/2) ;周长=2*3.14*半径;所以汽车轮胎转一圈大概行驶1.88米,轮胎旋转圈543转行驶一公里的路程,通过在程序中设置的里程和金额的信息,就可以在LCD显示屏上分别显示总金额和总里程。霍尔传感器集成芯片管脚图如图3.7所示图3.7 霍尔传感器集成芯片管脚图霍尔传感器集成芯片A44E外部引脚说明:(1) Vcc 外接供电电源输入端(2) GND外接电源地(3) OUT 数字信号输出端3.3.4 掉电存储单元设计 当计价器因为外界因素的影响而发生掉电现象时,应该把统计得到的里程,总金额,单价等数据进行保存,当恢复供电后还能够继续进行计价,这就是掉电保护模块的作用。可以进行存储的芯片有很多种,在这个设计中采用了AT24C08这款芯片。 AT24C08是一个2K串行CMOS EPROM,内部有1024个8位字节,CATALYST公司的先进CMOS技术实质上减少了器件的功耗,AT24C08还有一个16字节页写缓冲器。当遇到意外断电的情况,通过程序每次都会自动从AT24C08中读取信息,这样就达到了对单价,路程,总费用信息的保护,避免司机和乘客因为掉电数据丢失而造成不必要的价格纠纷。AT24C08管脚图如图3-6所示。图3-6 AT24C08管脚图AT24C08管脚描述见表3-1。表3-1 AT24C08管脚描述管脚名称功能A0、A1、A2器件地址选择SDA串行数据/地址SCL串行时钟WP写保护Vcc+1.8V6.0V工作电压Vss接地所有引脚中只需要将SCL和SDA加到单片机的数据端,其它引脚接地就可以了。3.3.5 显示模块介绍显示部分要求显示里程、等待时间、总金额信息的显示。 下面是LCD1602的基本参数和各个引脚的功能,必须根据下面的参数来设计显示电路的原理图。LCD1602的基本参数及各引脚功能见表3-2和3-3。表3-2 LCD1602主参数 LCD1602显示容量:16X2个字符芯片工作电压:4.5-5.5V工作电流:2.0mA(5V)最佳工作电压:5V字符尺寸:2.95X4.35(WXH)mm表3-3 LCD1602接口信号说明编号符号引脚说明编号符号引脚说明1VSS电源地9D2DATAI/O2VDD电源正极10D3DATAI/O3VL液晶显示偏压信号11D4DATAI/O4RS数据命令选择端(H/L)12D5DATAI/O5R/W读写数据端(H/L)13D6DATAI/O6E使能信号14D7DATAI/O7D0DATAI/O15BLA背光源正极8D1DATAI/O16BLK背光源负极根据LCD1602的基本工作参数和引脚接口信号的介绍,设计出显示电路,显示模块如图3.7所示。 图 3.7 LCD1602液晶显示屏此模块电路电源电压为5V,由接口VCC引入,上电后可看到发光二极管被点亮。数据端8位接分别由单片机的P1 I/O口与其线连接,3个控制端口分别有P05P06端口来控制,8位双向数据线714与单片机的P1端口相连,实现液晶与单片机的通信。液晶对比度通过1602的第三脚接可调电阻来提供可调。3.3.6 按键模块介绍 单片机常用的键盘分为独立式键盘和矩阵式键盘。独立式键盘特点:每个按键占用一条I/O线,当按键数量较多时,I/O口利用率不高,但程序编制简单。适用于所需按键较少的场合。矩阵键盘特点:电路连接复杂,但提高了I/O口利用率,软件编程较复杂。适用于需使用大量按键的场合。由于本设计用到的按键较少如果使用矩阵键盘(如图3.8所示),扫描时需要较长的时间,因此利用三个独立按键作为系统开始,结束和白天黑夜模式切换的按键,运用比较方便。 图3.8 独立按键4.程序设计4.1主程序模块主程序软件的任务要求包括定时器的设置、按键的扫描、按键的功能处理、脉冲的计数、路途等待超3分钟的计时以及总金额的计算等。程序设计的思路:使用中断方式对定时器的溢出进行计数实现3分钟的计时。主程序采用查询外部中断标志实现脉冲的计数,由于每个脉冲代表 1.88m,因此,当脉冲计数超过543时,计价器按照收费标准计价。主程序在初始化变量和定时器参数设置之后,进入一个循环结构,循环扫描键盘、查询脉冲的中断、数码管的动态扫描等功能,当脉冲的中断标志被查询到,若路途等待时间未超3分钟时,要及时将路途等待时间的值清除为零。主程序的流程图如图 4-1 所示。主程序开始初始化变量清零计时器清除中断标志定时器1启动产生脉冲中断启动定时器1白天晚上切换关闭定时器1按键是按下将当前的键值暂存按键弹起或按下扫描键盘设置定时器T1的参数NNY N Y脉冲个数40) /如果计数3999,计时1s T0_cnt=0;if(cnt_3180) cnt_3+;else /超过30秒,途中等待计价 cnt_3=0; cnt_cost=cnt_cost+cost_val2; TH0=0x4C; /定时器T0的高8位重新赋初值TL0=0x00; /定时器T0的高8位重新赋初值180秒的计时清0途中等待超180秒计价结束中断180秒的计时+到达180秒的计时中断次数=0计时一秒中断次数中断次数+1中断程序开始 Y Y N图 4.2 中断程序流程图5.系统调试根据系统设计方案,本系统的调试共分为两大部分:软件调试,硬件调试。5.1 软件调试5.1.1编程工具C51语言8051单片机的应用程序设计,使用C51语言进行程序设计虽然相对于汇编语言代码效率有所下降,但可以方便地实现程序设计模块化,代码结构清晰、可读性强,易于维护、更新和移植,适合较大规模的单片机程序设计。近年来,随着C51语言的编译器性能的不断提高,在绝大多数应用环境下,C51程序的执行效率已经非常接近汇编语言,因此,使用C51进行单片机程序设计已经成为单片机程序设计的主流选择之一。本设计的软件都是在 Keil Vision 7.5上进行编写,编译,调试以及运行操作并生成Hex文件。5.1.2 单片机仿真软件在线调试PROTEUS1.打开Proteus软件。2.选择file菜单下的 open design选项,找到所需的元器件,元器件上单击右键选中,再单击左键对其进行命名和赋值,接着在编辑器左边的一栏中,找出并绘制设计所要的各种元器件,按照电路图连接后并保存。3.将用keil编译产生的hex文件下载到单片机中:双击51单片机,在对话框中把保存过的hex文件打开,再单击确定。 4.单击左下角运行按钮,进行软件仿真调试,直到出现正确的结果。下图是在PROTEUS中仿真通过的整体硬件原理图。 图 5.1 PROTEUS仿真原理图5.2 硬件调试由于本系统的硬件电路完全符合锐志单片机开发板的电路结构,所以我们将程序烧进锐志单片机开发板进行硬件调试,表5.1 的测试条件是:设定白天的起步价是6 元,晚上起步价是7元,等待价格测得数据如表5-1。表5-1 硬件测试数据表计价状态单价起步价等待时间里程总金额白天模式1¥/km6元3分钟3 km10¥黑夜模式2¥/km7元3分钟3 km14¥ 从上表的测得的数据得出,本计价器运行稳定,测得的数据满足计价器的需求。结 论在本次设计中,我们采用AT89S52芯片为核心器件,设计出了简单的出租车计价器,能够实现显示总金额和总里程,按键控制清零,调价,白天,黑夜模式的转换,还能进行掉电数据保存。选题后,我便开始复习单片机方面的知识,也查阅、搜索了很多相关资料,进行总体设计与具体设计,同时也学习仿真软件Protues和编程软件KeiC。由于以前都采用汇编语言实现编程,对用C语言来实现单片机的编程不太习惯,花费了一些时间来熟悉C语言的编程。在设计开始,要形成流程图,它可以使设计有一定的逻辑性与严密性,使得设计思路明确。采用模块化的设计思想很重要,它方便编写、修改与调试,另外加上必要的注释,便于交流与理解。这次毕业设计完成后,体会颇多,在学与做的过程中,取长补短,不断学习新的知识,吸取经验,达到进步的目的。通过自身的努力以及相关图书资料的帮助,逐渐熟悉了KEIL、PROTEUS和C语言等软件的使用以及硬件调试与检测过程中的一些小技巧。本次设计我学习到不少单片机的知识,但由于自己的理论知识水平有限,实践知识和设计经验不足,在设计过程中难免存在一些问题。恳请各位老师批评指正,以使我在以后的学习和实践中加以改进和提高。致 谢本论文是在我的指导老师徐老师的悉心指导下完成的。徐老师作为一名优秀的、经验丰富的教师,具有丰富的知识和教学经验,在整个论文实验和论文写作过程中,对我进行了耐心的指导和帮助,提出严格要求,引导我不断开阔思路,为我答疑解惑,鼓励我大胆创新,使我在这一段宝贵的时光中,既增长了知识、开阔了视野、锻炼了心态,又培养了良好的实验习惯和科研精神。在此,我向我的指导老师表示最诚挚的谢意! 在论文即将完成之际,我的心情久久无法平静,本次毕业设计培养了我们独立思考问题,分析问题与解决问题的能力,在指导老师的指导下,加上同组同学的讨论与分析,使所遇到的问题逐步得到解决。本次毕业设计所得到的经验也并将继续影响我今后的学习和工作。我们的大学即将结束,今天所取得的成绩也一直以来关心、教导我的父母、老师密不可分,在此祝愿他们身体健康、工作顺利、万事如意!我再次感谢学校和老师给了我这次实践锻炼的机会,以及很多同学对我的帮助,为此我将尽最大的努力,并以最好的心态来回报社会,服务祖国。参 考 文 献1. 吴承琦,孙培生. 出租汽车计价器发展历程回顾、感悟及展望R.北京.中国计量 2008年03期 2.秦浩华 具有区域识别功能出租车计价器车载定位模块的研制J.辽宁技术工程学院工学报,2005.3.陈伟宏、肖卫初、邱飚 基于PROTEUS的多功能出租车计价器设计J.重庆工学院学报,2009.4胡泉、谢芳.C语言程序设计.华中科技大学出版社,20095戴 佳.51单片机C语言应用程序设计实例精讲.电子工业出版社,20076张毅刚.单片机原理及应用.高等教育出版社,20047.陈伟宏、肖卫初、杨明 基于单片机的多功能出租车计价器的设计J.现代电子技术,2008.8.杨世品、陈林 基于PROTEUS的单片机出租车计价器的设计J.微计算机信息期刊,2007.9. 邱淑贤.霍尔式汽车车速传感器检测系统J. 长春工业大学学报(自然科学版), 2010,31(3).10马忠梅.单片机的C语言应用程序设计(第三版).北京航空航天大学出版社,200411胡汉才.单片机原理及其接口技术.北京:清华大学出版社,199512潘永雄.新编单片机原理与应用.西安电子科技大学出版社,200313肖玲妮、袁增贵.Protel 99 SE印刷电路板设计教程.清华大学出版社,2003 14戴梅萼 史嘉权.微型计算机技术与应用.清华大学出版社,200315 谭浩强C语言程序设计M。清华大学出版社。2005 16单片机学习网./17电子电路网./18张靖武.单片机原理 应用与PROTEUS仿真. 电子工业出版社,2009附 录程序清单#include#include /包含随机函数rand()的定义文件#include /包含_nop_()函数定义的头文件#defineOP_READ0xa1/ 器件地址以及读取操作,0xa1即为1010 0001B#defineOP_WRITE 0xa0/ 器件地址以及写入操作,0xa1即为1010 0000B#define uchar unsigned char#define uint unsigned intsbit K5=P32;sbit RS=P20; /寄存器选择位,将RS位定义为P2.0引脚sbit RW=P21; /读写选择位,将RW位定义为P2.1引脚sbit E=P22; /使能信号位,将E位定义为P2.2引脚sbit BF=P07; /忙碌标志位,将BF位定义为P0.7引脚sbit SCL=P34; /将串行时钟总线SCL位定义在为P3.4引脚sbit SDA=P35;uint data T0_cnt,D_cnt;uchar data cnt_3,cnt_distance,cnt_cost,begin;uchar data lose_power=1;uchar data state_val,flag=0; uchar data key_val,key_val_old; /定义新旧键值uchar code cost_val3=1,2,1; /收费标准 cost_val0白天 cost_val1黑夜 cost_val2等待uchar code digit =0123456789; /定义字符数组显示数字uchar code string1 =price:; /定义字符数组显示提示信息uchar code string2 =/km;uchar code string3 =total:;uint h,d,t;void delay(uint i) /1ms延时基准函数uchar j;while(i-)for(j=0;j115;j+);void delaynms(uint n) delay(n); void init_variant()/初始化一些变量的内容cnt_3=0; /3分钟的计时D_cnt=0; /脉冲的个数cnt_distance=0;/距离的计数cnt_cost=0; /保存总价格uchar scan_key() uchar i,k;i=P1;if(i=0xff)k=255; /无键按下else /有键按下 delay(10);/延时去抖动 if(i!=P1) k=255; elseswitch (i) case 0xef:k=0; break;/P1.4按下,启动键 case 0xdf:k=1; break;/P1.5按下,清除键 case 0xbf:k=2; break;/P1.6按下,切换键 return k;/*函数功能:开始数据传送*/void start()/ 开始位SDA = 1; /SDA初始化为高电平“1” SCL = 1; /开始数据传送时,要求SCL为高电平“1”_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期SDA = 0; /SDA的下降沿被认为是开始信号_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期SCL = 0; /SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递) /*函数功能:结束数据传送*/void stop()/ 停止位SDA = 0; /SDA初始化为低电平“0”_nSCL = 1; /结束数据传送时,要求SCL为高电平“1”_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期SDA = 1; /SDA的上升沿被认为是结束信号_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期SDA=0;SCL=0;/*函数功能:检测应答位*/bit Ask() /检测应答 bit ack_bit; /储存应答位 SDA = 1; / 发送设备(主机)应在时钟脉冲的高电平期间(SCL=1)释放SDA线, /以让SDA线转由接收设备(AT24Cxx)控制_nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 SCL = 1; /根据上述规定,SCL应为高电平_nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期_nop_(); /等待一个机器周期 ack_bit = SDA; /接受设备(AT24Cxx)向SDA送低电平,表示已经接收到一个字节 /若送高电平,表示没有接收到,传送异常 结束发送SCL = 0; /SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)return ack_bit;/ 返回AT24Cxx应答位/*函数功能:从AT24Cxx读取数据出口参数:x*/unsigned char ReadData()/ 从AT24Cxx移入数据到MCUunsigned char i;unsigned char x; /储存从AT24Cxx中读出的数据for(i = 0; i 8; i+)SCL = 1; /SCL置为高电平x=1; /将x中的各二进位向左移一位x|=(unsigned char)SDA; /将SDA上的数据通过按位“或“运算存入x中SCL = 0; /在SCL的下降沿读出数据return(x); /将读取的数据返回/*函数功能:向AT24Cxx的当前地址写入数据入口参数:y (储存待写入的数据)*/在调用此数据写入函数前需首先调用开始函数start(),所以SCL=0void WriteCurrent(unsigned char y)unsigned char i;for(i = 0; i 8; i+)/ 循环移入8个位 SDA = (bit)(y&0x80); /通过按位“与”运算将最高位数据送到S /因为传送时高位在前,低位在后_nop_(); /等待一个机器周期 SCL = 1; /在SCL的上升沿将数据写入AT24Cxx _nop_(); /等待一个机器周期 _nop_(); /等待一个

温馨提示

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

评论

0/150

提交评论