《出租车计价器(单片机c语言)(共22页).doc》由会员分享,可在线阅读,更多相关《出租车计价器(单片机c语言)(共22页).doc(22页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上一、设计目的了解和掌握掉电存储芯片AT24C02、霍尔传感器A44E、数码管、驱动芯片74LS245等外部接口芯片器件的应用。二、主要设计内容实现出租车行驶里程和总金额的显示,预设起步价和起步公里数;实现清零、复位和掉电保护功能;实现对单价的调整。三、重点研究问题(1)按下启动按键,显示起步里程与起步价。(2)按模拟传感器信号的按键,显示行驶里程与总金额。(3)按键控制清零、复位、掉电保护、调整预设单价。(4)在软件中实现起步价,单价。四、主要技术指标(1)数码管显示起步里程、单价,总里程、总金额。(2)用按键控制清零、复位、掉电保护、调整预设单价。五、设计成果要求(
2、1)源程序通过编译、运行(2)软件烧录单片机硬件进行调试,运行(3)实现所述功能(4)电路板焊接、检测(5)最终提交软硬件、设计说明书、外文翻译、毕业设计说明书等专心-专注-专业设计开题报告 题目名称基于单片机的出租车计价器的设计主要内容设计的主要内容是利用51单片机实现出租车计价器的功能。用数码管显示行驶里程和总金额。并有清零,复位,掉电保护等功能。1驱动芯片的选用:设计中我们采用74LS245作为数码管的驱动芯片,用来提高数码管显示的亮度。2按键替代霍尔传感器的选用:我们选用按键替代传感器,主要因为它接线简单,价格便宜,同时对它的控制也是相对容易,易于实现的。3显示器件的选用:本次设计采用
3、8段集成数码管作为显示电路,以便于连线,使电路简明易懂。数码管显示的稳定性虽不及液晶屏,但其价格比液晶屏便宜,由于本设计简单,采用数码管显示较好。4掉电保护芯片的选用:选用存储器芯片AT24C02组成掉电保护电路。采取的主要技术路线或方法一、单片机芯片:AT89S51单片机芯片采用40引脚的双列直插封装方式。40条引脚如下:1、主电源引脚Vss和Vcc2、外接晶振引脚XTAL1和XTAL23、控制或与其它电源复用引脚RST/VPD,ALE/,和/Vpp4、输入/输出引脚P0.0 - P0.7,P1.0 - P1.7,P2.0 - P2.7,P3.0 - P3.7。二、74LS245驱动芯片:7
4、4LS245是我们常用的驱动芯片,用来驱动led或者其他的设备。总线驱动器74LS245经常用作三态数据缓冲器,它也是8路同相三态双向总线收发器,可双向传输数据。 三、霍尔传感器:霍尔传感器安装在车轮上,主要检测汽车行进的公里数,并产生一系列相应的脉冲输出,脉冲送到单片机进行处理,单片机根据程序设定通过计算脉冲数换算出行驶公里数,再根据从EEPROM中读取的价格等相关数据进行金额的计算,计算出的金额、里程实时地显示在数码管上。本设计中采用按键替代。四、掉电保护电路:AT24C02是一个CMOS标准的EEPROM存储器,掉电时能保存数据。五、显示电路:显示电路采用的是三位一体共阴数码管显示。预期
5、的成果及形式上电时显示全为零,通过按下启动按键来开始计价,数码管开始显示起步价和起步金额;按下模拟开关按键来产生一个脉冲信号,模拟行驶的里程;计算应付金额;按下停止按键,停止计价,数码管显示所走总里程和用户所需付总金额;按下清零按键,数码管全显示零,以备下次计价。单片机断电后,数码管显示数据不丢失。本电路以AT89S51单片机为中心,附加A44E霍尔传感器测距(本电路中用模拟开关替代),实现对出租车计价,采用AT24C02 实现在系统掉电的时候保存单价,输出采用8段数码显示管,显示行驶总里程和总金额。模拟出租车计价器设计:进行里程显示,预设起步价和起步公里数;行程按全程收费,有复位功能和启动功
6、能,启动后,开始计价。我们采用单片机进行设计,可以用较少的硬件和适当的软件相互配合来实现设计要求,且灵活性强,可以通过软件编程来完成更多的附加功能,应用前景广阔。关键字:出租车计价器 AT89S51单片机 A44E霍尔传感器 断电保存 8段数码显示管第 1章 绪 论1.1 课题背景 我们知道,只要乘坐的出租车启动,随着行驶里程的增加,就会看到司机旁边的计价器里程数字显示的读数从零逐渐增大,而当行驶到某一值时(如2KM)计费数字显示开始从起步价(如4元)增加。当乘客到站时,按下停止按键,计费数字显示总里程和总金额,它可以很直观的反映用户使用情况。1.2.2 主要设计内容及基本要求利用AT89S5
7、1单片机,设计简单的出租车计价器。在出租车计价器的总体设计中,我主要负责出租车计价器硬件设计。其中主要的外围功能电路有:驱动电路,按键控制电路,掉电保护电路,时钟部分,数码管显示电路等。通过对以上各功能的设计,制作出的出租车计价器应具有以下功能:上电时显示全为零,通过按下启动按键来开始计价,数码管开始显示起步价和起步金额;按下模拟开关按键来产生一个脉冲信号,模拟行驶的里程;数码管开始显示所走里程和所应付的金额,并逐渐增加;按下停止按键,停止计价,数码管显示所走总里程和用户所需付总金额,按下清零按键,数码管全显示零,以备下次计价。方案二:设计采用AT89S51单片机为主控器,以A44E霍尔传感器
8、测距(按键替代),实现对出租车的基本的计价设计,并采用AT24C02实现在系统掉电的时候保存单价等信息,输出采用8段数码显示管。利用单片机丰富的I/O端口,及其控制的灵活性,实现基本的计价功能。系统结构图如下:按键控制 89S51单片机复位电路掉电保护时钟电路显示模块显示总里程和总金额1.1系统结构图通过比较以上两种方案,我们采用方案二实现出租车计价器的功能。本电路设计的计价器能实现基本的计价功能,单片机计算总价的公式为:总价=起步价+单价*(总里程-起步里程)+1。AT89S51作为一个单片微型计算系统,灵活性高,其强大的控制处理功能和可扩展功能设计电路提供了很好的选择。第2章 系统硬件设计
9、2.1硬件设计说明单片机是单片微型计算机的简称,单片机以其卓越的性能,得到广泛的应用,已经深入到各个领域。在这次设计中,我们用到P0口和P2口,P0口为8位三态I/O口,此口为地址总线及数据总线分时复用;P2口为8位准双向口,与地址总线高八位复用;P0口和P2口都有一定的驱动能力,P0口的驱动能力较强。 设计中,为了能够让数码管更好的正常显示,我们采用了驱动电路来驱动。在本次硬件设计中,我们考虑采用芯片74LS245来驱动数码管显示。设计电路时,考虑到用里程(霍尔)传感器价格昂贵,且不便于试验检测,在设计中采用一个模拟开关来代替。模拟开关一端接在P3.4口,另一端接地,通过来回高低电平的变化,
10、每按两次,对应的里程数加一。通过在程序中设置的里程和金额的信息,在加上驱动电路的设计,就可以在数码管上分别显示总金额和总里程。在显示方面,可以用液晶显示,也可以用数码管进行显示。由于在这次设计中只需要显示里程和金额信息,我们采用数码管进行显示。这样既节约了成本,又可以达到显示的目的。同时为了减少硬件的复杂度,我们采用了动态显示方式,选用了共阴极数码管。为了焊接方便,我们选用了集成在一起的数码管。我们还设计了控制按键,能够很好的对出租车计价器控制,如启动/停止按键,清零按键等。2.2 AT89S51单片机简介AT89S51具有如下特点:40个引脚,4k Bytes Flash片内程序存储器, 1
11、28 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。P0口有二个功能:1、外部扩展存储器时,当做数据/地址总线。2、不扩展时,可做一般的I/O使用,但内部无上拉电阻,作为输入或输出时应在外部接上拉电阻。P1口只做I/O口使用:其内部有上拉电阻。 P2口有两个功能: 1、扩展外部存储器时,当作地址总线使用。 2、做一般I/O口使用,其内部有上拉电阻。 P3口有两个功能:除了作为I/O使用外(其内部有上拉电阻),还有一些特殊功能,由特殊寄存器来设置。
12、图2.1 AT89S51引脚图 图2.2 AT89S51封装图设计中用到的单片机各管脚(图2.1)功能介绍如下:VCC:接+5V电源。VSS:接地。时钟引脚:XTAL1和XTAL2两端接晶振和30PF的电容,构成时钟电路。它可以使单片机稳定可靠的运行。RST:复位信号输入端,高电平有效。当在此引脚加两个机器周期的高电平时,就可以完成复位操作。P1.0:接启动/停止按键,控制计价。P1.1:接功能键。P1.3:接清零键。P0口接数码管段选端,P2口接驱动芯片。P3.4(T0):接模拟开关按键,替代了出租车计价器中的霍尔传感器。P3.1、P3.0口接掉电保护电路。2.3 硬件电路设计 按下计价按键
13、时,显示起步价和起步里程范围,这些在程序中设置;当等于或超过两公里后,按计算总价的公式为:总价=起步价+单价*(总里程-起步里程)+1进行计价。本设计中,起步价为4元,起步里程为2公里,当然这些数据可以在程序中改写,以满足不同时期价格调整的需要。下图是通过在Keil C中编译通过,并生成Hex文件,在PROTEUS中仿真通过的整体硬件原理图: 图2.3硬件原理图2.4 硬件组成2.4.1 驱动电路74LS245是我们常用的芯片,用来驱动led或者其他的设备。总线驱动器74LS244和74LS245经常用作三态数据缓冲器,74LS244为单向三态数据缓冲器,而74LS245为双向三态数据缓冲器。
14、本设计用74LS245作为驱动芯片,双向总线发送器/接收器(3S)。图2.4驱动芯片管脚图74LS245主要电器特性的典型值如下: 引出端符号: A A总线端 B B总线端 /G 三态允许端(低电平有效) DIR 方向控制端 功能表: 表 2.5功能表利用74LS245来驱动数码管显示,单片机的P2.0到P2.5分别接A0到A5管脚,进行数据的传送,其中AB/BA接高电平,控制数据从A到B进行传送,B0到B5分别接数码管的位选端,驱动数码管依次显示。P2.0到P2.5的数据通过A传送到B中的数据送到数码管,以达到显示数据信息的目的。2.4.2 显示电路 多数的应用系统,都要配输入和输出外设,L
15、ED显示器和LCD显示器,虽然LCD显示效果比较好,已经成为了一种发展趋势,但为了节约成本,我们选用了LED显示器(图2.6)。在显示方面,我们选用了动态显示。静态显示虽然亮度较高,接口编程容易,但是每位的段码线分别与一个8位的锁存器输出相连。占用的I/O口线比较多,在显示位数较多的情况下,一般都采用动态显示方式。利用动态显示的方法,由于LED显示器的余辉和人眼的视觉暂留现象,只要每位显示的时间间隔足够短,就仍能感觉到所有的数码管都在显示。为了简化硬件,通常将所有位的段码线相应段并联在一起,由一个8位I/O口控制,在同一时刻,只让一位选通,如此循环,就可以使各位显示出将要显示的字符。 图2.6
16、 LED数码管 图2.7集成数码管LED数码有共阳和共阴两种,把这些LED发光二极管的正极接到一块(一般是拼成一个8字加一个小数点)而作为一个引脚,就叫共阳的,相反的,就叫共阴的,那么应用时这个脚就分别的接VCC和GND。再把多个这样的8字装在一起就成了多位的数码管了。在本设计仿真中使用的是6个一组的共阴8段数码管(图2.7)。 找公共共阴和公共共阳的方法:首先我们找个(3到5伏)和1个1K(几百欧的也行)的,VCC串接个电阻后和GND接在任意2个脚上,组合有很多,但总有一个LED会发光的,找到一个就够了,然后用GND不动,VCC(串电阻)逐个碰剩下的脚,如果有多个LED(一般是8个),那它就
17、是共阴的了。共阴极数码管,阴极接地,当某个发光二极管的阳极为高电平时,发光二极管点亮,对应的段就显示。2.4.3 复位电路单片机的复位是由外部的复位电路实现的, 复位电路通常采用上电自动复位和按钮复位两种方式。上电自动复位是通过外部复位电路的电容充电来实现的。除了上电复位外还需要按键手动复位(图2.8)。按键手动复位有电平方式和脉冲方式两种。其中电平复位是通过RST端经电阻与电源VCC接通而实现的。单片机的复位速度比外围I/O接口电路快为能够保证系统可靠的复位,在初始化程序中应安排一定的复位延迟时间。图2.8复位电路2.4.4 掉电保护电路掉电保护电路中采用了存储芯片AT24C02。AT24C
18、02是一个CMOS标准的EEPROM存储器,是AT24CXX系列(AT24C01/02/04/08/16)成员之一,这些EEPROM存储器的特点是功耗小、成本低、电源范围宽,静态电源电流约30uA110uA,具有标准的I2C总线接口,是应用广泛的小容量存储器之一。 图29 AT24C02引脚图上图是AT24C02的引脚图,这个芯片是一个8脚芯片,内部存储器有256字节。引脚功能介绍如下:A0(引脚1):器件地址的A0位,是器件地址的最低位,器件地址排列是A6 A5 A4 A3A2 A1 A0 R/W。A1(引脚2):器件地址的A1位。A2(引脚3):器件地址的A2位。GND(引脚4):地线。S
19、DA(引脚5):数据总线引脚。SCL(引脚6):时钟总线引脚。TEST(引脚7):测试引脚。Vcc(引脚8):电源线引脚。本设计采用掉电存储电路图如下:图2.10掉电存储电路2.4.5 时钟电路MCS-51单片机的各功能部件都是以时钟控制信号为基准,内部电路在时钟信号的控制下,严格地按时序执行指令进行工作,单片机本身如同一个复杂的同步时序电路,为了保证其各个部分同步工作,电路要在唯一的时钟信号控制下,严格地按照时序进行工作。其实只需在时钟引脚连接上外围的定时控制元件,就可以构成一个稳定的自激振荡器。为更好地保证振荡器稳定可靠地工作,谐振器和电容应尽可能安装得与单片机芯片靠近。本设计中使用的振荡
20、电路,由12MHZ晶体振荡器和两个约30PF的电容组成,在XTAL1和XTAL2两端跨接晶体,电容的大小不会影响振荡频率的高低。在整个系统中为系统各个部分提供基准频率,以防因其工作频率不稳定而造成相关设备的工作频率不稳定,晶振可以在电路中产生振荡电流,发出时钟信号。如图2.11所示。图2.11时钟电路2.4.6 按键电路按键控制电路中,单片机的P1.0管脚接启动/停止按键,通过软件编程,当按下按键计数器开始工作,开始计价;当弹起按键时,计数器停止工作,停止计价,启动/停止按键带自锁功能。按下启动按键,开关处于导通状态,这时给P1.0送低电平信号,这时TR0=1,计数器开始工作,调用计价子程序开
21、始计价。清零按键接单片机的P1.3管脚,按下清零按键,P1.3为低电平,调用清零子程序,用于将显示数据清零,在程序中给各位赋0代码(0x3f),以达到清零的目的,方便下次计价。另外为功能键,控制价格调整,这个按键是在没有按下启动/停止按键时有作用,计价过程中无效。图2.12 按键电路第4章 系统调试4.1 软件调试4.1.3 单片机仿真软件在线调试PROTEUS1.打开Proteus软件。2.选择file菜单下的 open design选项,找到所需的元器件,元器件上单击右键选中,再单击左键对其进行命名和赋值,接着在编辑器左边的一栏中,找出并绘制设计所要的各种元器件,按照电路图连接后并保存。3
22、.将用keil编译产生的hex文件下载到单片机中:双击51单片机,在对话框中把保存过的hex文件打开,再单击确定。 4.单击左下角运行按钮,进行软件仿真调试,直到出现正确的结果。下图为软件的仿真窗口图:图4.2软件仿真窗口图4.2.1 电路元件检测在焊接电路前,首先要进行元器件的检测。检测主要是测出各个元器件的型号。对于数码管的检测在显示电路中已介绍。识别电阻时可根据各环的数量级和色码表,判断电阻的阻值。排阻是将多个电阻集中封装在一起,组合制成的。排阻具有装配方便、安装密度高等优点。常用排阻有A型和B型。A型排阻的引脚总是奇数的。它的左端有一个公共端(用白色的圆点表示),常见的排阻有4、7、8
23、个电阻,所以引脚共有5或8或9个。B型排阻的引脚总是偶数的。它没有公共端,常见的排阻有4个电阻,所以引脚共有8个。排阻的阻值读法如下:“103”表示:10k,“510”表示:51。以此类推。对于集成芯片的检测,就是根据它的管脚图,来识别各个引脚,以方便焊接。4.3 硬件检测晶振部分使用示波器查看波形。如果出现看不到12MHZ的正弦波形的现象,说明此部分电路不正常。AT89S51是美国ATMEL公司生产的低功耗,高性能CMOS 8位单片机,片内含4k bytes的可系统编程的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准8051指令系统及引脚。它集Fla
24、sh程序存储器既可在线编程(ISP)也可用传统方法进行编程及通用8位微处理器于单片芯片中,ATMEL公司的功能强大,低价位AT89S51单片机可为您提供许多高性价比的应用场介,可灵活应用于各种控制领域。 主要性能参数:与MCS-51 产品指令系统完全兼容4k字节在线系统编程(ISP) Flash闪速存储器1000次擦写周期4. 0-5. 5V的工作电压范围全静态工作模式:0Hz-33MHz三级程序加密锁1288字节内部RAM32个可编程I/O口线2个16位定时/计数器6个中断源全双工串行UART通道低功耗空闲和掉电模式中断可从空闲模式唤醒系统看门狗(WDT)及双数据指针掉电标识和快速编程特性灵
25、活的在线系统编程(ISP一字节或页写模式)功能特性概述:AT89S51提供以下标准功能:4k字节Flash闪速存储器,128字节内部RAM, 32个I/O口线,看门狗(WDT),两个数据指针,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89S51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。引脚功能说明:Vcc:电源电压GND:地P0口:P0口是一组8位
26、漏极开路型双向I/O口,也即地址/数据总线复用口。作为输出口用时,每位能驱动8个TTL逻辑门电路,对端口写1可作为高阻抗输入端用。在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低8位)和数据总线复用,在访问期间激活内部上拉电阻。在Flash编程时,P0 口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。P1口:P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写1,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,囚为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(In)
27、。Flash编程和程序校验期间 P 1接收低8位地址。P2口:P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对端口写1,通过内部的上拉电阻把端口拉到高电平,此时可作输入口,作输入口使用时,囚为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(In)。在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX DPTR指令)时,P2口送出高 8位地址数据。在访问8位地址的外部数据存储器(如执行MOVX Ri指令)时,P2口线的内容(也即特殊功能寄存器(SFR)区中P2寄存器的内容),在整个访问期间不改变。Flash编程
28、或校验时,P2亦接收高位地址和其它控制信号。P3口:P3口是一组带有内部上拉电阻的8位双向I/O口。P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑门电路。对P3 口写入“1”时,它们被内部上拉电阻拉高并可作为输入端口。作输入端时,被外部拉低的P3 口将用上拉电阻输出电流(In)。P3口除了作为一般的I/O口线外,更重要的用途是它的第二功能。P3 口还接收一些用于Flash闪速存储器编程和程序校验的控制信号。RST:复位输入。当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。WDT溢出将使该引脚输出高电平,设置SFR AUXR 的DISRTO位(地址8EH)可打开或关闭
29、该功能。DISRTO位缺省为RESET输出高电平打开状态。ALE/PROG:当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节。即使不访问外部存储器,ALE仍以时钟振荡频率的1/6输出固定的正脉冲信号,囚此它可对外输出时钟或用于定时目的。要注意的是:每当访问外部数据存储器时将跳过一个ALE脉冲。对Flash存储器编程期间,该引脚还用于输入编程脉冲(PROG)。如有必要,可通过对特殊功能寄存器(SFR)区中的8EH单元的D0位置位,可禁正ALE操作。该位置位后,只有一条MOVX和MOVC指令ALE才会被激活。此外,该引脚会被微弱拉高,单片机执行外部程序时,
30、应设置ALE无效。PSEN:程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89S51由外部程序存储器取指令(或数据)时,每个机器周期两次PSEN有效,即输出两个脉冲。当访问外部数据存储器,没有两次有效的PSEN信号。EA/VPP:外部访问允许。欲使CPU仅访问外部程序存储器(地址为0000H-FFFFH), EA端必须保持低电平(接地)。需注意的是:如果加密位LB1被编程,复位时内部会锁存EA端状态。如EA端为高电平(接Vcc端),CPU则执行内部程序存储器中的指令。Flash存储器编程时,该引脚加上+12 V的编程电压Vpp。XTAL 1:振荡器反相放大器及内部时钟发生器的
31、输入端。XTAL2:振荡器反相放大器的输出端。特殊功能寄存器:特殊功能寄存器的于片内的空间分布的这些地址并没有全部占用,没有占用的地址亦不可使用,读这些地址将得到一个随意的数值。而写这些地址单元将不能得到预期的结果。中断寄存器:各中断允许控制位于IE寄存器,5个中断源的中断优先级控制位于IP寄存器。双时钟指针寄存器:为更方便地访问内部和外部数据存储器,提供了两个16位数据指针寄存器:DP0位于SFR(特殊功能寄存器)区块中的地址82H, 83H和DP1位于地址84H, 85H,当SFR中的位DPS=0选择DP0,而DPS=1则选择DP1。用户应在访问相应的数据指针寄存器前初始化DPS位。电源空
32、闲标志:电源空闲标志(POF)在特殊功能寄存器SFR中PCON的第4位(PCON.4,电源打开时POF置1,它可由软件设置睡眠状态并不为复位所影响。程序存储器:如果EA引脚接地(GND),全部程序均执行外部存储器。在AT89S51,假如EA接至Vcc(电源+),程序首先执行地址从0000H-OFFFH (4KB)内部程序存储器,而执行地址为1000H-FFFFH (60KB)的外部程序存储器。数据存储器:AT89S51的具有128字节的内部RAM,这128字节可利用直接或间接寻址方式访问,堆栈操作可利用间接寻址方式进行,128字节均可设置为堆栈区空间。看门狗定时器(WDT):WDT是为了解决C
33、PU程序运行时可能进入混乱或死循环而设置,它由一个14bit计数器和看门狗复位SFR (WDTRST)构成。外部复位时,WDT默认为关闭状态,要打开WDT,用户必须按顺序将01EH和0E1H写到WDTRST寄存器(SFR地址为OA6H,当启动了WDT,它会随晶体振荡器在每个机器周期计数,除硬件复位或WDT溢出复位外没有其它方法关闭WDT,当WDT溢出,将使RSF引脚输出高电平的复位脉冲。定时器0和定时器1:定时器0和1都是一个16位定时/计数器。附录程序源代码#include /#include #include #define uchar unsigned char#define uint
34、unsigned intint xscode6=0x3f,0x06,0x5b,0x4f,0x66,0x6d;/显示存储区int zxscode6=0x1f,0x2f,0x37,0x3b,0x3d,0x3e;/共阴显示片选码int codetab=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/共阴极数码int i,j,flag;uchar sec;int kk=0;/路程标志位int jkk=0;/费用int jflag=0;/费用标志位int kflag=0;/路程标志位int zdflag=0;/中断标志位int kilo=0;/路程i
35、nt dj=1;/路程单价 int djflag=0;/路程单价biaozhiweisbit key1=P10;sbit key2=P11;sbit key3=P12;sbit key4=P13;sbit key5=P34;sbit SDA=P30; /IIC引脚sbit SCL=P31;void delay() ;void delay1 (xms)/延时程序子程序 uint i,j; for(i=xms;i0;i-) for(j=110;j0;j-); void start() /IIC开始位 SDA = 1; SCL = 1; delay(); SDA = 0; delay(); void
36、 stop() / IIC停止位 SDA = 0; delay(); SCL = 1; delay(); SDA = 1; void respons() /IIC应答位 uchar i; SCL=1; delay(); while(SDA=1)&(i250) i+; SCL=0; delay();void init() SDA=1; delay(); SCL=1; delay(); uchar read_byte() / 从EEPROM读到MCU uchar i,j; for(i=0;i8;i+) SCL=1; j=1; j|=SDA; SCL=0; return(j);void write_
37、byte(uchar date) / 从MCU写到EEPROM uchar i,temp; temp=date; for(i=0;i8;i+) temp=temp1; SCL=0; delay(); SDA=CY; delay(); SCL=1; delay(); SCL=0; delay(); SDA=1; delay();void write_data(uchar addr, uchar date) / 在指定地址addr处写入数据date start(); write_byte(0xa0); respons(); write_byte(addr); respons(); write_by
38、te(date); respons(); stop();uchar read_data(uchar addr) / 在指定地址addr读取数据 uchar date; start(); write_byte(0xa0); respons(); write_byte(addr); respons(); start(); write_byte(0xa1); respons(); date=read_byte(); stop(); return date; void xianshi()/显示程序子程序 for(flag=0;flag6;flag+) P0= xscodeflag;/送显示码P2= z
39、xscodeflag;/ 送片选码 delay1(2);P0=0; void jijia()/计费子程序 if(kk2&kk35&kk900) jkk=4+2*dj*(kk-2)+1; kflag=kk/100;/路程百位 jflag=jkk/100;/路费百位 xscode2=codetabkflag; xscode5=codetabjflag; kflag=kk/10;/路程十位 jflag=jkk/10;/路费十位 xscode1=codetabkflag; xscode4=codetabjflag; kflag=kk%10;/路程个位 jflag=jkk%10;/路费个位 if(kfl
40、ag=0)kflag=2;/不足两公里时,显示两公里 xscode0=codetabkflag; xscode3=codetabjflag; void qingling() for(i=0;i100) sec=0; TL0=(65536-2)%256 ;/计数值设置,记满两次产生中断 TH0=(65536-2)/256 ; TMOD=0x06; EA=1; ET0=1; TR0=0;/关定时器 kilo=0; qingling(); aa: if(key1=0)/当键按下去,开始计费 TR0=1;/开计数器0kk=kilo;jijia(); if(key1=1)/当键松开,停止计费TR0=0;
41、/停计数器1 if(key2=0)/功能调整键 delay1(10);/延时判断键是否松开 if(key2=1) xscode2=codetabdjflag+;/当p1.2口的按键按下时功能标志位加一 if(key3=0&djflag=2)/当功能键标志位等1时,改变每公里的价钱 delay1(10); if(key3=1) dj+; xscode1= codetabdj/10 ;/把价钱十位送显示区,单价不能超100 xscode0=codetabdj%10; if(key4=0)/有键按下,清显示,单价会初始值,单价标志位清零 qingling(); dj=1; djflag=0; xianshi();/调显示子程序goto aa; void Timer0_Int() interrupt 1 using 2 / 计数器0中断服务 zdflag=zdflag+1;/中断标志位加一 if(zdflag=2)/当中断产生二次后,路程加一公里并清中断标志位 zdflag=0; kilo=kilo+1; 附录III电路仿真图