1、 毕业论文目 录摘要第 1 章 引 言 11. 1 出租车计价器概述 11. 2 本设计任务 11.2.1 设计任务 11.2.2 设计要求 11. 3 系统主要功能 2第 2 章 出租车计价器硬件设计 32.1 系统的硬件构成及功能 32. 2 AT89S51 单片机及其引脚说明 42.3 AT24C02引脚图及其引脚功能 6毕业论文2. 4 AT24C02 掉电存储单元的设计 62.5 里程计算、计价单元的设计 72.6 数据显示单元设计 8第 3 章 系统软件设计103. 1 系统主程序设计103. 2 定时中断程序设计123. 3 里程计数中断服务程序设计123.4 中途等待中断服务程
2、序设计123. 5 键盘服务程序设计123. 6 显示子程序服务程序设计12第 4 章系统调试与测试结果分析 134. 1 使用的仪器仪毕业论文表 134.2 系统调试 13毕业论文第 1 页共 44 页第 1 章 引 言本次课程设计利用单片机技术来实现一台多功能出租车计价器,具有性能可靠、电路简单、成本低等特点。1.1 出租车计价器概述计价器显示的营运金额是营运里程与价格的函数(等候时间一般折算成一定比例的里程来计算) 。出租车计价器通过传感器与行驶车辆连接。出租汽车的实际里程通过传感器的脉冲信号在计价器里折算成一定的计价营运里程。目前市场上出租车计价器功能主要有具有数据的复位功能、白天/晚
3、上转换功能、数据输出功能、计时计价功能等等,但能够进行语音播报数据信息的出租车计价器还是比较少见的,针对这一点我们来设计一款多功能出租车计价器,在原有功能的基础上增加单价输出、单价调整、路程输出、显示当前的系统时间、语音播报数据信息等功能。1.2 本设计任务1.2.1 设计任务设计一款基于 AT89S51 单片机的出租车计价器。1.2.2 设计要求1.基本要求(1) 不同情况具有不同的收费标准。白天晚上途中等待(10min 开始收费)(2) 能进行手动修改单价。(3) 具有数据的复位功能。(4) IO 口分配的简易要求。毕业论文距离检测使用霍尔开关A44E白天/晚上收费标准的转换开关数据的清零
4、开关单价的调整(最好使用和按键)(5) 数据输出(采用 LCM103)。单价输出 2 位路程输出 2 位总金额输出 3 位(6) 按键。启动计时开关数据复位(清零)白天/晚上转换2.发挥部分(1) 能够在掉电的情况下存储单价等数据。(2) 能够显示当前的系统时间。(3) 语音播报数据信息。1.3 系统主要功能本课程设计所设计的出租车计价器的主要功能有:数据的复位、白天/晚上转换、数据输出、计时计价、单价输出及调整、路程输出、语音播报数据信息、实现在系统掉电的时候保存单价和系统时间等信息等功能。输出采用8 段数码显示管。本电路设计的计价器不但能实现基本的计价,而且还能根据白天、黑夜、中途等待来调
5、节单价,同时在不计价的时候还能作为时钟为司机同志提供方便。第 2 章 计价器硬件设计本系统的硬件设计主要包括单片机AT89S51、数据显示部件、A44E霍尔传感器电路、AT24C02 掉电存储单元的设计、里程计算及计价单元的设计。在硬件设毕业论文计过程中,充分利用各部件的功能,实现多功能的出租车计价器设计。2.1 系统的硬件构成及功能计价器的单片机控制方案图如图 1 单片机控制方案图所示。它由以下几个部件组成:单片机 AT89S51、总金额及单价显示部件、键盘控制部件,AT24C02 掉电存储控制、里程计算单元、串中显示驱动电路等。利用单片机丰富的IO端口,及其控制的灵活性,实现基本的里程计价
6、功能和价格调节、时钟显示功能。不但能实现所要求的功能而且能在很大的程度上扩展功能,而且还可以方便的对系统进行升级。具体电路参见附录中“多功能出租车计价器总体电路图”如图1 单片机控制方案图。图 1 单片机控制方案图2.2 AT89S51 单片机及其引脚说明AT89S51是美国ATMEL公司生产的低功耗,高性能CMOS 8位单片机,片内含4KB的可系统编程的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准8051指令系统及引脚。它集Flash程序存储器既可在线编程(ISP)也可用传统方法进行编程及通用 8位微处理器于单片芯片中,具有高性价比。AT89S51
7、 是一个有 40 个引脚的芯片,引脚配置如图 2 AT89S51 引脚配置所示。毕业论文图 2 AT89S51 引脚配置AT89S51 芯片的 40 个引脚功能为:VCC 电源电压。GND 接地。RST 复位输入。当 RST 变为高电平并保持 2 个机器周期时,将使单片机复位。WDT 溢出将使该引脚输出高电平,设置 SFR AUXR 的 DISRTO 位(地址 8EH)可打开或关闭该功能。DISKRTO 位缺省为 RESET 输出高电平打开状态。XTAL1 反向振荡放大器的输入及内部时钟工作电路的输入。XTAL2 来自反向振荡放大器的输出。P0 口 一组 8 位漏极开路型双向 I/O 口。也即
8、地址/数据总线复用口。作为输出口用时,每位能驱动 8 个 TTL 逻辑门电路,对端口写“1”可作为高阻抗输入端用。在访问外部数据存储器或程序存储器时,这组口线分时转换地址(低 8位)和数据总线复用,在访问期间激活内部上拉电阻。在 Flash 编程时,P0 口接收指令字节,而在程序校验时,输出指令字节,校验时,要求外接上拉电阻。P1 口 一个带内部上拉电阻的 8 位双向 I/O 口,P1 的输出缓冲级可驱动(吸收或输出电流)4 个 TTL 逻辑门电路。对端口写“1” ,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,毕业论文某个引脚被外部信号拉低时会输出
9、一个电流(I IL) 。Flash 编程和程序校验期间,P1 接收低 8 位地址。P1 口部分端口引脚及功能如表 1 P1 口特殊功能所示。表 1 P1 口特殊功能P1 口引脚 特殊功能P1.5 MOSI(用于 ISP 编程)P1.6 MOSI(用于 ISP 编程)P1.7 SCK(用于 ISP 编程)P2 口 一个带内部上拉电阻的 8 位双向 I/O 口。P1 的输出缓冲级可驱动(吸收或输出电流)4 个 TTL 逻辑门电路。对端口写“1” ,通过内部的上拉电阻把端口拉到高电平,此时可作输入口。作输入口使用时,因为内部存在上拉电阻,某个引脚被外部信号拉低时会输出一个电流(I IL) 。在访问外
10、部程序存储器或 16位地址的外部数据存储器时,P2 口送出高 8 位地址数据。在访问 8 位地址的外部数据存储器时,P2 口线上的内容在整个访问期间不改变。Flash 编程和程序校验期间,P2 亦接收低 8 位地址。P3 口 一个带内部上拉电阻的 8 位双向 I/O 口。P3 的输出缓冲级可驱动(吸收或输出电流)4 个 TTL 逻辑门电路。对 P3 口写“1”时,它们被内部的上拉电阻把拉到高电并可作输入端口。作输入端口使用时,被外部拉低的 P3 口将用上拉电阻输出电流(I IL) 。P3 口除了作为一般的 I/O 口线外,更重要的用途是它的第二功能,如表 2 P3 口特殊功能所示。P3 口还接
11、收一些用于 Flash 闪速存储器编程和程序校验期间的控制信号。表 2 P3 口特殊功能P3 口引脚 特殊功能P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2 (外部中断 0)P3.3 (外部中断 1)P3.4 T0(定时器 0 外部输入)P3.5 T1(定时器 1 外部输入)P3.6 (外部数据存储器写选通)P3.7 (外部数据存储器读选通)PSEN/ 程序储存允许输出是外部程序存储器的读先通信号,当 AT89S51 由外部程序存储器取指令(或数据)时,每个机器周期两次 PSEN/有效,即输出两毕业论文个脉冲。当访问外部数据存储器,没有两次有效的 PSEN/信号。EA/V
12、PP 外部访问允许。欲使 CPU 仅访问外部程序存储器,EA 端必须保持低电平,需注意的是:如果加密位 LB1 被编程,复位时内部会锁存 EA 端状态。Flash 存储器编程时,该引脚加上+12V 的编程电压 VPP。2.3 AT24C02 引脚图及其引脚功能AT24C02 芯片引脚配置如图 3 AT24C02 引脚配置图所示。图 3 AT24C02 引脚配置图AT24C02 芯片 DIP 封装,共有 8 个引脚,其中:A2A0 地址引脚;SDA、SCL I2C 总线接口;WP 写保护引脚,WP 接 VSS 时,禁止写入高位地址,WP 接 VDD 时,允许写入任何地址;VCC 电源端GND 接
13、地端2.4 AT24C02 掉电存储单元的设计掉电存储单元的作用是在电源断开的时候,存储当前设定的单价信息。AT24C02 是ATMEL公司的2KB 字节的电可擦除存储芯片,采用两线串行的总线和单片机通讯,电压最低可以到2.5V,额定电流为1mA,静态电流10Ua(5.5V),芯片内的资料可以在断电的情况下保存40 年以上,而且采用8 脚的DIP 封装,使用方便。其电路如图 4 掉电存储电路原理图所示。毕业论文图 4 掉电存储电路原理图图中R8、R10 是上拉电阻,其作用是减少AT24C02 的静态功耗,由于AT24C02 的数据线和地址线是复用的,采用串口的方式传送数据,所以只用两根线SCL
14、(移位脉冲)和SDA(数据/地址)与单片机传送数据。每当设定一次单价,系统就自动调用存储程序,将单价信息保存在芯片内;当系统重新上电的时候,自动调用读存储器程序,将存储器内的单价等信息,读到缓存单元中,供主程序使用。2.5 里程计算、计价单元的设计里程计算是通过安装在车轮上的霍尔传感器A44E检测到的信号,送到单片机,经处理计算,送给显示单元的。其原理如图 5 传感器测距示意图所示。图 5 传感器测距示意图由于A44E 属于开关型的霍尔器件,其工作电压范围比较宽(4.518V),其输出的信号符合TTL 电平标准,可以直接接到单片机的 IO 端口上,而且其最毕业论文高检测频率可达到1MHZ。A4
15、4E 集成霍耳开关由稳压器A、霍耳电势发生器(即硅霍耳片)B、差分放大器C、施密特触发器D 和OC 门输出E 五个基本部分组成。在输入端输入电压 CC V ,经稳压器稳压后加在霍耳电势发生器的两端,根据霍耳效应原理,当霍耳片处在磁场中时,在垂直于磁场的方向通以电流,则与这二者相垂直的方向上将会产生霍耳电势差 H V 输出,该 H V 信号经放大器放大后送至施密特触发器整形,使其成为方波输送到OC 门输出。当施加的磁场达到 工作点( 即 OP B )时,触发器输出高电压(相对于地电位),使三极管导通,此时OC 门输出端输出低电压,通常称这种状态为 开 。当施加的磁场达到释放点( 即 rP B )
16、时,触发器输出低电压,三极管截止,使OC 门输出高电压,这种状态为 关 。这样两次电压变换,使霍耳开关完成了一次开关动作。我们选择了P3.2 口作为信号的输入端,内部采用外部中断0(这样可以减少程序设计的麻烦),车轮每转一圈(我们设车轮的周长是1 米),霍尔开关就检测并输出信号,引起单片机的中断,对脉计数,当计数达到1000 次时,也就是1 公里,单片机就控制将金额自动的加增加,其计算公式:当前单价公里数=金额。2.6 数据显示单元设计由于设计要求有单价(2 位)、路程(2 位)、总金额(3 位)显示输出,加上我们另外扩展了时钟显示(包含时分秒的显示),采用LCD 液晶段码显示,在距离屏幕1
17、米之外就无法看清数据,不能满足要求,而且在白天其对比度也不能够满足要求,因此我们采用6 位LED数码管的分屏显示,如图 6 采用6 位LED数码管的分屏显示所示:时钟显示(图中显示为12 点0 分46 秒)图 6 采用6 位LED数码管的分屏显示数据的分屏的显示是通过按键 S1 来实现切换的,如图 7 S1 切换显示屏所示。毕业论文图 7 S1 切换显示屏在出租车不走的时候,按下S1,可以实现数据的分屏显示;车在行走的时候只有总金额和单价显示屏在显示,当到达目的地的时候,客户要求查看总的里程的时候,就可以按下S1 切换到里程和单价显示屏,供客户查询。显示电路的电路原理图如图 8 显示器原理图所
18、示。图 8 显示器原理图从单片机串口输出的信号先送到左边的移位寄存器(74HC164 ),由于移位脉冲的作用,使数据向右移,达到显示的目的。移位寄存器74HC164 还兼作数码管的驱动,插头1(header1)接电源,插头2(header2)接数据和脉冲输出端。电路毕业论文中的三个整流管D1D3 的作用是降低数码管的工作电压,增加其使用寿命。第 3 章 系统的软件设计本系统的软件设计主要可分为主程序模块、定时计数中断程序、里程计数中断服务程序、中途等待中断服务程序、显示子程序服务程序、键盘服务程序六大模块。下面对各部分模块作介绍。3.1 系统主程序设计在主程序模块中,需要完成对各接口芯片的初始
19、化、出租车起价和单价的初始化、中断向量的设计以及开中断、循环等待等工作。另外,在主程序模块中还需要设置启动/清除标志寄存器、里程寄存器和价格寄存器,并对它们进行初始化。然后,主程序将根据各标志寄存器的内容,分别完成启动、清除、计程和计价等不同的操作。主程序流程图如图9 所示。当按下S1时,就启动计价,将根据里程寄存器中的内容计算和判断出行驶里程是否已超过起价公里数。若已超过,则根据里程值、每公里的单价数和起价数来计算出当前的累计价格,并将结果存于价格寄存器中,然后将时间和当前累计价格送显示电路显示出来。当到达目的地的时候,由于霍尔开关没有送来脉冲信号,就停止计价,显示当前所应该付的金额和对应的
20、单价,到下次启动计价时,系统自动对显示清零,并重新进行初始化过程。毕业论文开始S1 按下?初始化数据S4 按下?设定默认单价(白天)启动计价器里程中断?到一公里?总路程加 1总金额加 1传感有信号?停止计价和里程计数是是是是否否否设定晚上单价按下 S4?设定中途等待单价S4 按下?返回时间显示是是是否否否显示金额及单价S3 按下?否是显示路程和单价S3 按下?是 否图 9 主程序流程图毕业论文3.2 定时中断服务程序在定时中断服务程序中,每100ms 产生一次中断,当产生10 次中断的时候,也就到了一秒,送数据到相应的显示缓冲单元,并调用显示子程序实时显示。其程序流程如图10 所示。3.3 里
21、程计数中断服务程序每当霍尔传感器输出一个低电平信号就使单片机中断一次,当里程计数器对里程脉冲计满1000 次时,使微机进入里程计数中断服务程序中。在该程序中,需要完成当前行驶里程数和总额的累加操作,并将结果存入里程和总额寄存器中。3.4 中途等待中断服务程序当在计数状态下霍尔开关没有输出信号,片内的T1 定时器便被启动,每当计时到达10分钟,就对当前金额加上中途等待的单价,以后每十分钟都自动加上中途等待的单价。当中途等待结束的时候,也就自动切换到正常的计价。3.5 显示子程序服务程序由于是分屏显示数据,所以就要用到4 个显示子程序,分别是:时分秒显示子程序(HMS_DIS)、金额单价显示子程序
22、( CP_DIS)、路程单价显示子程序(DP_DIS)、单价调节子程序(PA_DIS)。3.6 键盘服务程序键盘采用查询的方式,放在主程序中,当没有按键按下的时候,单片机循环主程序,一旦有按键按下,便转向相应的子程序处理,处理结束再返回。如图 9 主程序流程图,图 10 定时中断服务程序。毕业论文图 10 定时中断服务程序第 4 章 系统调试与测试结果分析根据系统设计方案,本系统的调试共分为三大部分:硬件调试,软件调试和软硬件联调。测试包括里程计价测试、掉电存储测试测试。4.1 使用的仪器仪表 数字万用表 DT9203单片机仿真器 WAVE6000烧写器 GF2100双踪稳压稳流电源 DH17
23、18E-5数字示波器 TDS1002重置计数初值中断 10 次?数据送显示缓冲单元调用显示子程序恢复现场并中断返回否是开始保护现场毕业论文4.2 系统调试根据系统设计方案,本系统的调试共分为三大部分:硬件调试,软件调试和软硬件联调。由于在系统设计中采用模块设计法,所以方便对各电路模块功能进行逐级测试。XTAL218XTAL119ALE3031PSN29RST9P0./AD0390.1/138P0.2/AD2370.3/336P0.4/AD4350.5/534P0.6/AD630.7/732P1.011.2P1.231.34P1.451.56P1.671.78P3.0/RXD103.1/T1P3
24、.2/IN0123./IT113P3.4/014P3.7/RD173.6/W163.5/T115P2.7/A1528P2.0/A8212.1/92P2./A10232.3/124P2.4/A12252.5/13262.6/1427U1AT89C51X1CRYSTALC13pC23pC310u7 R21k SCL6DA5WP7 A12U2AT24C1024NE=a10R34.7k R44.7ks1s2s3s4掉 电 保 护p2.p2.3复 位毕业论文结 束 语通过本次课程设计,又使我学到了许多书本上无法学到的知识,也使也深该体会到单片机技术应用领域的广泛,不仅使我对学过的单片机知识有了很多的巩固
25、,同时也对单片机这一门课程产生了更大的兴趣。在本次课程设计过程中,我学会了在网络上查找有关本设计的各硬件的资源,其中包括:AT89S51 单片机及其引脚说明、AT24C02 引脚图及其引脚功能等,为本次课程设计提供了一定的资料。由于平时很少进行课程设计,所以对于课程设计报告的格式也是近期才接触到,经过这两次的设计,为我们以后毕业设计的制作也奠定了一定的基础。2计价表使用说明(1)S1 按键的功能在出租车不走的时候,按下 S1,可以实现数据的分屏显示;车在行走的时候只有总金额和单价显示屏在显示,当到达目的地的时候,客户要求查看总的里程的时候,就可以按下 S1 切换到里程和单价显示屏,供客户查询。
26、(2)S2 按键的功能在按下 S1 按键之后,若接着按下 S2 键则进行单价调整(默认为调整白天单价),当接着按下 S1 时,则进行晚上单价调,再次按下 S1 可进行中途等待单价调整。当单价调整结束后,可以通过过按下 S2 按键进行时间调整,默认为调整时,接着按下 S1 可进行调整分,分调整后再接下 S1 可进行秒调整。当时调整完成后,若接着按下 S2 则又可进行单价调整。(3)S3 按键的功能在显示金额及单价时,若按下 S3 键则显示路程和单价,再次按下 S3,可返回显示金额及单价。(4)S4 按键的功能在按下 S1 按键之后,若接着按下 S4 按键,则进行设定默认晚上单价,并启动计价器,若
27、没有按下 S4 则可设定默认单价(白天) ,并启动计价器。当设定默认晚上单价结束后,再次接下 S4 按键,则可设定默认中途等待单价,并启动计价器。当设定默认中途等待单价后,若还按一次 S4,则返回系统时间的显示。2.全部源程序毕业论文/12864(带字库) (汉字及字母的显示,汉字不能错位)#include #include #include #define lcd_bus P0 / 数据总线sbit rs =P32; /数据 /读 /读写使能sbit psb=P30; /psb=H,并口模式, psb=L,串口模式sbit rst=P35; /LCD 复位,低有效sbit bf =P07;
28、/忙闲状态标志位,H:内部正执行操作,L:空闲sbit P20=P20; /进入单价调节sbit P21=P21; /计价开始按键sbit P23=P23; /时间调节按键sbit P26=P26; /停车锁定屏显按键sbit P27=P27; /确认按键sbit P16=P16; /光电开关检测sbit P14=P14; /373 片选void delayus(unsigned char us);/延时子程序 usvoid delayms(unsigned int ms);/延时子程序 msvoid init_lcd(void);/初始化void chk_busy(void);/检测忙闲vo
29、id wr_data(unsigned char dat);/写数据到 LCDvoid wr_comm(unsigned char comm);/写命令到 LCDvoid wr_str(unsigned char *s);/向 LCD 写字符串,长度 64 字符之内(32 个汉字)void wendu();sbit DS18B20=P17; / ds18b20 数据线void leddisplay(); / 数码管显示void shijian();毕业论文bit ResetDS1820(void); /复位子程序void WRDS18B20(unsigned char); / 写 1 个字节子
30、程序unsigned char RDDS18B20(void); / 读 1 个字节子程序unsigned int GetTempDS18B20(void); /读取温度子程序void delay1s(); /延时子程序 1s/*-DS1302 程序开始- -*/sbit SCLK1302=P13; / 时钟sbit DATA1302=P12; / 数据sbit RST1302=P11; / 复位sbit BIT0=ACC0; / 累加器 A 最低位sbit BIT7=ACC7; / 累加器 A 最高位void wr1302(unsigned char dat); /向 1302 写 1 个字
31、节unsigned char rd1302(void); /从 1302 读 1 个字节void v_wr1302(unsigned char add,unsigned char dat); /先写地址,后写 1 字节数据unsigned char v_rd1302(unsigned char add); /先写地址,后读 1 字节数据void v_set1302(unsigned char *p2); /设置初始时间void v_get1302(void); /读取 DS1302 当前时间/* -DS1302 程序结束- */unsigned char RcvData8; / 1302 接收
32、缓冲区unsigned char SendData8=0,0,0,0,0,0,0,0; / 1302 发送缓冲区unsigned char time7; /当前时间,格式: 秒 分 时 日 月 星期 年unsigned char settime7=0x20,0x55,0x14,0x20,0x07,0x03,0x09;毕业论文/时间初始值: 秒 分 时 日 月 星期 年unsigned char ledxs08; / 时-分-秒 LED 显示unsigned char ledxs3; / 数码管显示缓冲区unsigned char ledxs28; / 时-分-秒 LED 显示unsigned
33、char xs16; /显示缓冲区年 月 日 时 分 秒unsigned char aa5=0x30,0x30,0x30,0x30,0; /距离数组unsigned char bb5=0x30,0x30,0x30,0x30,0; /费用数组unsigned char cc2=0x31,0x35;/单价数组unsigned char dd4=0,0,0,0; /语音芯片报价数组void zongkong();void tiaojie();void jijia();void baojia();void danjia();unsigned int x=15;/单价main()delayms(200)
34、;v_set1302(settime); / 设置初始时间zongkong();void zongkong() P14=1;init_lcd();/LCD 初始化,并清屏while(1)shijian();wendu();毕业论文if(P20=0)danjia();/进入单价调节函数if(P21=0)init_lcd();/LCD 初始化,并清屏jijia(); /进入计价页面if(P23=0)tiaojie(); /调节时间wr_comm(0x80);wr_str(“泰山学院出租车行“);wr_comm(0x90);wr_str(“ 欢 迎 您“);wr_comm(0x88);wr_str(
35、“ “);wr_data(ledxs20);wr_data(ledxs21);wr_data(ledxs22);wr_data(ledxs23);wr_data(ledxs24);wr_data(ledxs25);wr_data(ledxs26);wr_data(ledxs27);wr_comm(0x98);wr_data(ledxs00);wr_data(ledxs01);wr_data(ledxs02);wr_data(ledxs03);wr_data(ledxs04);毕业论文wr_data(ledxs05);wr_data(ledxs06);wr_data(ledxs07);wr_co
36、mm(0x9d);wr_data(ledxs0);wr_data(ledxs1);wr_str(“.“);wr_data(ledxs2);wr_str(“度“);void shijian()unsigned char i,j;v_get1302(); /取得当前时间j=2;for(i=7;i0;i-)xsj=(timei-14)+0x30;xsj+1=(timei-1 /BCD 码拆成 2字节j=j+2;ledxs00=xs2;ledxs01=xs3; / 年ledxs02=0x2d; / -ledxs03=xs6;ledxs04=xs7; / 月ledxs05=0x2d; / -ledxs0
37、6=xs8;ledxs07=xs9; / 日毕业论文ledxs20=xs10;ledxs21=xs11; / 时ledxs22=0x2d; / -ledxs23=xs12;ledxs24=xs13; / 分ledxs25=0x2d; / -ledxs26=xs14;ledxs27=xs15; / 秒void wr1302(unsigned char dat) /向 1302 写 1 个字节unsigned char i;for(i=0;i1; /数据右移;unsigned char rd1302(void) /从 1302 读 1 个字节unsigned char i;for(i=0;i1;D
38、ATA1302=1; /读数据之前,P1 口输出 1毕业论文SCLK1302=1;/时钟置高电平;SCLK1302=0;/时钟下降沿,接收数据有效;BIT7=DATA1302;/接收 1 位数据;return ACC;void v_wr1302(unsigned char add,unsigned char dat)/先写地址,后写 1 字节数据 / 地址或命令 数据RST1302=0;/复位引脚低电平,所有数据传送终止;SCLK1302=0;/清时钟总线;RST1302=1;/复位引脚高电平,控制逻辑有效;wr1302(add); /写地址或命令;wr1302(dat); /写 1 个数据;
39、SCLK1302=1;RST1302=0;unsigned char v_rd1302(unsigned char add) /先写地址,后读 1 字节数据 / 地址unsigned char i;RST1302=0;/复位引脚低电平,所有数据传送终止;毕业论文SCLK1302=0;/清时钟总线;RST1302=1;/复位引脚高电平,控制逻辑有效;wr1302(add); /写地址或命令;i=rd1302(); /读取数据SCLK1302=1;RST1302=0;return i; /返回读取的数据/* 名称: send_byte1302* 说明: 先写地址,后写数据(时钟多字节方式)* 功能
40、: 往 DS1302 写入时钟数据(多字节方式)* 调用: wr1302();v_wr1302();* 输入 : *p: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制* 8Byte (BCD 码) 1B 1B 1B 1B 1B 1B 1B 1B* 返回值: 无*/void send_byte1302(unsigned char *p)unsigned char i;v_wr1302(0x8e,0x00); / 控制命令,WP=0,写操作RST1302=0;/复位引脚低电平,所有数据传送终止;SCLK1302=0;/清时钟总线;毕业论文RST1302=1;/复位引脚高电平,控制逻辑
41、有效;wr1302(0xbe); /0xbe:时钟多字节写命令for(i=0;i8;i+)/发送数据 8 字节wr1302(*p);p+;SCLK1302=1;RST1302=0;/* 名称: rcv_byte1302* 说明: 先写地址,后读数据(时钟多字节方式)* 功能: 读取 DS1302 时钟数据* 调用: wr1302() , rd1302()* 输入: *p1: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年* 7Byte (BCD 码) 1B 1B 1B 1B 1B 1B 1B* 返回值: ucDa :读取的数据*/unsigned char rcv_byte1302(unsigned char *p1)unsigned char i;RST1302=0;/复位引脚低电平,所有数据传送终止;SCLK1302=0;/清时钟总线;RST1302=1;/复位引脚高电平,控制逻辑有效;毕业论文wr1302(0xbf);/ 0xbf:时钟多字节读命令for(i=0;i8;i+)/接收数据 8 字节*p1=rd1302();p1+;SCLK1302=1;RST1302=0;/* 名称: v_set1302* 说明:* 功能: 设置初始时间* 调用: v