单片机实训第四组实验报告

更新时间:2024-06-04 05:57:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

评语:

电子实时时钟/万年历系统

摘要

随着电子技术的迅速发展,特别是随大规模集成电路出现,给人类生活带来了根本性的改变。由其是单片机技术的应用产品已经走进了千家万户。电子万年历的出现给人们的生活带来的诸多方便。

本文首先描述系统硬件工作原理,并附以系统结构框图加以说明,着重介绍了本系统所应用的各硬件接口技术和各个接口模块的功能及工作过程,其次,详细阐述了程序的各个

模块和实现过程。本设计以数字集成电路技术为基础,单片机技术为核心。本文编写的主导思想是软硬件相结合,以硬件为基础,来进行各功能模块的编写。

本系统以单片机的C语言进行软件设计,增加了程序的可读性和可移植性,为了便于扩展和更改,软件的设计采用模块化结构,使程序设计的逻辑关系更加简洁明了。系统通过点阵式液晶为载体显示数据,所以具有人性化的操作和美观的页面效果。可以显示年月日、星期、时、分、秒、温度等。

关键词:单片机;电子实时时钟,数字温度计,DS1302;LM016L;DS18B20

目 录

1. 设计任务 ................................................................................................ 错误!未定义书签。

1.1 任务描述....................................................................................... 错误!未定义书签。

1.1.1 小任务 ............................................................................... 错误!未定义书签。 1.2 技术指标....................................................................................... 错误!未定义书签。 1.3 难点分析....................................................................................... 错误!未定义书签。

2. 方案比较与论证..................................................................................... 错误!未定义书签。

2.1 方案选择....................................................................................... 错误!未定义书签。 2.2 方案论证....................................................................................... 错误!未定义书签。 2.3 小结 .............................................................................................. 错误!未定义书签。 3. 系统硬件设计......................................................................................... 错误!未定义书签。

3.1 总体设计....................................................................................... 错误!未定义书签。 3.2 硬件模块电路分析 ....................................................................... 错误!未定义书签。 3.3 发挥部分设计 ............................................................................... 错误!未定义书签。 3.5 电路原理图 ................................................................................... 错误!未定义书签。 3.6 小结 .............................................................................................. 错误!未定义书签。 4. 系统仿真与软件设计 ............................................................................. 错误!未定义书签。

4.1 仿真设计与分析 ........................................................................... 错误!未定义书签。 4.2 软件设计....................................................................................... 错误!未定义书签。 4.3 工程文件....................................................................................... 错误!未定义书签。 4.4 小结 .............................................................................................. 错误!未定义书签。 5. 系统调试与组装..................................................................................... 错误!未定义书签。

5.1 PCB板............................................................................................ 错误!未定义书签。 5.2 样机调试....................................................................................... 错误!未定义书签。 5.3 样机功能....................................................................................... 错误!未定义书签。 5.4 发挥部分测试结果 ....................................................................... 错误!未定义书签。 5.5 小结 .............................................................................................. 错误!未定义书签。 6. 结论 ........................................................................................................ 错误!未定义书签。 参考文献 ........................................................................................................ 错误!未定义书签。 附录 ................................................................................................................ 错误!未定义书签。

1.设计任务

此设计即在液晶上显示年、月、日、时、分、秒及星期和温度,时间和日期可通过四个按键K1-K4调试,原理框图如图(1.1),电路一般包括以下几个部分:键盘、单片机、

温度芯片DS18B20,时间芯片DS1302,及显示电路。

LM016L显示屏 单片机 DS1302 DS18B20温度计 图1.1 四个时间日期调试按键 1.1任务描述 (1) 为使时钟走时与标准时间一致,而且每次重新上电后,时间和日期都会复位显示初

始设置值,因此校时电路是必不可少的,键盘就是用来校正液晶上显示的时间和日期。

(2) 单片机通过输出各种电脉冲信号来驱动控制各部分正常工作。 (3) 温度传感器用来显示当天的确定温度值。

(4) 单片机发送的信号经过显示电路通过译码最终在液晶上显示出来。

1.1.1小任务

1.阅读相关材料,熟悉DS1302;LM016L;DS18B20的结构,掌握其寄存器和时序。 2.学会DS1302;LM016L;DS18B20的编程,通过单片机控制相应模块。

3.编程通过单片机编程将S1302;LM016L;DS18B20各模块组合起来,使结果显示在液晶屏上。并且数据可通过按键调整。

1.2技术指标

Ds1302具有有能力计算2100年之前的秒、分、时、日、月、年的能力。 Ds1302工作电压范围2.0~5.5V Ds1302工作电流2.0V时小于300nA。 Ds1302工作电压2.0~5.5V 工作温度范围:-40~+85

1.3难点分析

这次一周之内学会使用DS1302,DS18B20,LCD1602.对我们来说真的很难,每个芯片入门都不容易,其中DS1302更是复杂,每一个芯片的质料就有十几页,程序更是比我们平时课本上多的多,而且复杂多,各芯片的驱动程序搞得我们晕头转向,这次实验做的非常吃力,做的非常烦。

2.方案比较与论证

方案一 :用EDA技术及VHDL语言控制来实现显示及测温度,且显示也可以用数码管,但是数码管屏幕有限不是很方便的显示很多的数据以及文字等。

方案二: 用C(51)语言编程来控制单片机让它在液晶上显示数据及文字。由于单片机结构简单、控制功能强、可靠性高、体积小、价格低等优点,以及液晶屏幕可以完整的同时显示数据及文字等内容,综合上述方案的选择与比较,选择方案二。主要是由于电器元件的熟悉程度以及市场的供求关系。

2.1方案选择

由于对于VHDL语言也不够了解,故不采用方案一。而在方案二中,大部分的电器元件我们较熟悉并且更容易获得,而且我们对C语言有一定的基础,即选择方案二。

2.2方案论证

设计的电路主要由五大模块构成:温度传感器电路,单片机控制电路,时间日期传输电路,显示电路以及校正电路。

当温度传感器接受到外面的信号,送入单片机,单片机将接受到的信号输出,让它在液晶上显示。

同时由单片机控制的万年历以及时间显示,当时间及秒计数计满60时就向分进位,分计数器计满60分后向时计数器进位,小时计数器按“24翻1”规律计数。时、分、秒的计数结果经过数据处理可直接送显示器显示。当计时发生误差的时候可以用校时电路进行校正。时计数器计满24小时后自动向日计数器进一,日计数器由平年、闰年的28/30/31对大、小月和二月的判断应与当月相应的日期相一致,当日计数器计满时,向月计数器进位,月计数器计满12月向年计数器进位,当年计数器计满100时所以计数器清零。设计采用的是年、月、日和时、分、秒、星期显示,所以在单片机通过对数据处理进行同时在液晶上显示。

2.3小结

本次设计主要用单片机控制程序让它在液晶上显示年、月、日、时、分、秒及星期,同时用18B20温度传感器来接受外面的信号,让单片机来接受它,且也让它在液晶上显示测的温度。

时、分、秒的计数结果经过数据处理可直接送显示器显示。当计时发生误差的时候可以用校时电路进行校正。时计数器计满24小时后自动向日计数器进一,日计数器由平年、闰年的28/30/31对大、小月和二月的判断应与当月相应的日期相一致,当日计数器计满时,向月计数器进位,月计数器计满12月向年计数器进位,当年计数器计满100时所以计数器清零。设计采用的是年、月、日和时、分、秒、星期以及温度同时显示。

3. 系统硬件设计

3.1总体设计

设计的电路主要由五大模块构成:温度传感器电路,单片机控制电路,时间日期传输电路,显示电路以及校正电路。

键盘 单片机 显示 温度传感器 实时时钟 其电路原理图如下图1.2. 1.显示模块 5.单片机控制模块 2.时间日期模块 3.温度模块 4.校正模块 图1.2

3.2 硬件模块电路分析

1.显示模块

第1脚:VSS为地电源。

第2脚:VDD接5V正电源。

第3脚:VEE使用时可以通过一个10K的电位器调整对比度。

第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。 第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。

第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。 第7~14脚:D0~D7为8位双向数据线。 1602液晶模块内部的控制器共有11条控制指令 序号 1 2 3 4 5 6 7 8 9 10 11

1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平)

指令1:清显示,指令码01H,光标复位到地址00H位置。 指令2:光标复位,光标返回到地址00H。

指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效。

指令4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。

指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标。

指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵

指令

RS

R/W 0 0 0

D7 0 0 0 0 0 0 0 0

D6 0 0 0 0 0 0 0 0 1 1

D5 0 0 0 0 0 1 0 1 BF 0 1

D4 0 0 0 0 0 DL 1

D3 0 0 0 0 0 N

D2 0 0 0 1 1 F

D1 0 0 1 D S/C *

D0 1 1I/DCR/L*

清显示 0 光标返回 *

置输入模式 S

显示开/关控制 0 B

光标或字符移位 *

*

0

字符发生存贮器地址

置功能 0

置字符发生存贮器地址 0 置数据存贮器地址 读忙标志或地址

显示数据存贮器地址 计数器地址 要写的数据内容 读出的数据内容

写数到CGRAM或DDRAM) 1 从CGRAM或DDRAM读数

字符。

指令7:字符发生器RAM地址设置。 指令8:DDRAM地址设置。

指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。 指令10:写数据。 指令11:读数据。

2.时间日期模块

Vcc1:主电源;Vcc2:备份电源。当Vcc2>Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc2< Vcc1时,由Vcc1向DS1302供电。

SCLK:串行时钟,输入,控制数据的输入与输出; I/O:三线接口时的双向数据线;

CE:输入信号,在读、写数据期间,必须为高。该引脚有两个功能:第一,CE开始控制字访问移位寄存器的控制逻辑;其次,CE提供结束单字节或多字节数据传输的方法 。

DS1302工作时为了对任何数据传送进行初始化,需要将复位脚(RST)置为高电平且将8位地址和命令信息装入移位寄存器。数据在时钟(SCLK)的上升沿串行输入,前8位指定访问地址,命令字装入移位寄存器后,在之后的时钟周期,读操作时输出数据,写操作时输出数据。时钟脉冲的个数在单字节方式下为8+8(8位地址+8位数据),在多字节方式下为8加最多可达248的数据

DS1302有关日历、时间的寄存器共有12个,其中有7个寄存器(读时81h~8Dh,写时80h~8Ch),存放的数据格式为BCD码形式,如图1.3所示。

图1.3

DS1302与单片机的连接仅需要3条线:CE引脚、SCLK串行时钟引脚、I/O串行数据引脚,Vcc2为备用电源,外接32.768kHz晶振,为芯片提供计时脉冲。

3.温度模块

图1.4

如图1.4所示,DS18B20只需要接到控制器(单片机)的一个I/O口上。3脚借+5v电源,1脚接地。

DS18B20的主要特征: ? 全数字温度转换及输出。 ? 先进的单总线数据通信。

? 最高12位分辨率,精度可达土0.5摄氏度。 ? 12位分辨率时的最大工作周期为750毫秒。 ? 可选择寄生工作方式。

? 检测温度范围为–55°C ~+125°C (–67°F ~+257°F) ? 内置EEPROM,限温报警功能。

? 64位光刻ROM,内置产品序列号,方便多机挂接。 ? 多样封装形式,适应不同硬件系统。

DS18B20引脚功能:

?GND 电压地 ?DQ 单数据总线 ?VDD 电源电压 ?NC 空引脚

DS18B20工作原理及应用:DS18B20的温度检测与数字数据输出全集成于一个芯片之上,从而抗干扰力更强。其一个工作周期可分为两个部分,即温度检测和数据处理。在讲解其工作流程之前我们有必要了解18B20的内部存储器资源。18B20共有三种形态的存储器资源,它们分别是:

ROM 只读存储器:用于存放DS18B20ID编码,其前8位是单线系列编码(DS18B20的编码是19H),后面48位是芯片唯一的序列号,最后8位是以上56的位的CRC码(冗余校

验)。数据在出产时设置不由用户更改。DS18B20共64位ROM。

RAM 数据暂存器:用于内部计算和数据存取,数据在掉电后丢失,DS18B20共9个字节RAM,每个字节为8位。第1、2个字节是温度转换后的数据值信息,第3、4个字节是用户EEPROM(常用于温度报警值储存)的镜像。在上电复位时其值将被刷新。第5个字节则是用户第3个EEPROM的镜像。第6、7、8个字节为计数寄存器,是为了让用户得到更高的温度分辨率而设计的,同样也是内部温度转换、计算的暂存单元。第9个字节为前8个字节的CRC码。EEPROM 非易失性记忆体,用于存放长期需要保存的数据,上下限温度报警值和校验数据,DS18B20共3位EEPROM,并在RAM都存在镜像,以方便用户操作。

4.校正模块

图1.5

如图1.5所示,K1、K2、K3、K4分别与单片机的P34、P35、P32、P33引脚相连。可以通过K1~K4调试时间日期。

5.单片机控制模块 AT89C52图

图1.6

1.AT89S52的简介

AT89S52是一种低功耗,高性能的CMOS8位微处理器,内部有8K字节的闪速PEROM ,该芯片采用ATMEL公司高密度、非挥发性存储器工艺制成且与工业标准的MCS-51系列的引脚及指令兼容,FLASH系列存储器为快速擦写存贮器。相对于MCS-51系列芯片而言,其特点如下 :

1、可擦写1000次

2、全静态操作:0Hz.~24MHz 3、32根可编程I/O口线 4、内部RAM为256字节 5、三个16位的定时/计数器 6、8个中断源

AT89S52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,AT89S52可以按照常规方法进行编程,也可以在线编程。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。

2.AT89S52芯片的管脚、引线与功能 (1)引脚信号介绍:

P00~P07 :P0口8位双向口线 P10~P17 :P1口8位双向口线

隙命令,既同时读出第1,2个字节,既为温度的数据。

开始初始化DS18B20No应答脉冲Yes发起SkipRom命令读取第1,2字节即为温度数据发起Convert T命令延时1s等待温度转换完成发起Read Scratchpad命令初始化DS18B20No应答脉冲?Yes万年历流程如下图所示。

流程图分析:开始既当日加一天,同时星期也就相应的加1,看星期是否加到7,若加到了7,就返回到1,若没有就返回到时钟状态,当日加到相应的最大数时,月分就相应的加1,看月份是否加到了13, 若没有到13,就一直等待,若到了13就返回1,且年份就加1,当年份到2099时就清到2005年,若没有,就一直等待,直到2099为止。

开始Day+1Week+1Week=7Day=dmax Yes week清1day清1NOMonth清1Year+1Year=2099Month+1YesYear清2005NOMonth=13NO开始

4.3 工程文件

其中protues软件生成工程文件主要有

Keil软件生存的工程文件主要有 4.4小结

软件的设计和仿真的设计很重要,尤其是软件的设计,需要很好逻辑思维,使各个模块程序都有清晰的思路,软件的设计也要与仿真图结合起来,因此仿真的设计也是要很好的逻辑思维,要布置好原件的位置,接好端口,总得来说系统的仿真与软件设计需要较强的逻

辑思维,需要很清晰的思路,这样设计软件才能更容易,而不会把自己搞得晕头转向。

5.系统调试与组装

一、KEIL uVision3简介 8051开发工具

KEIL C51标准C编译器为8051微控制器的软件开发提供了C语言环境,同时保留了汇编代码高效,快速的特点。C51编译器的功能不断增强,使你可以更加贴近CPU本身,及其它的衍生产品。C51已被完全集成到uVision3的集成开发环境中,这个集成开发环境包含:编译器,汇编器,实时操作系统,项目管理器,调试器。uVision3 IDE可为它们提供单一而灵活的开发环境。

C51 V7版本是目前最高效、灵活的8051开发平台。它可以支持所有8051的衍生产品,也可以支持所有兼容的仿真器,同时支持其它第三方开发工具。因此,C51 V7版本无疑是8051开发用户的最佳选择。 二、uVision3集成开发环境 (1)、项目管理

工程(project)是由源文件、开发工具选项以及编程说明三部分组成的。

一个单一的uVision3工程能够产生一个或多个目标程序。产生目标程序的源文件构成“组”。开发工具选项可以对应目标,组或单个文件。

uVision3包含一个器件数据库(device database),可以自动设置汇编器、编译器、连接定位器及调试器选项,来满足用户充分利用特定 微控制器的要求。此数据库包含:片上存储器和外围设备的信息,扩展数据指针(extra data pointer)或者加速器(math accelerator)的特 性。 uVision3可以为片外存储器产生必要的连接选项:确定起始地址和规模。 (2)、集成功能

uVision3的强大功能有助于用户按期完工。

1.集成源极浏览器利用符号数据库使用户可以快速浏览源文件。用详细的符号信息来优化用户变数存储器。

2.文件寻找功能:在特定文件中执行全局文件搜索。 3.工具菜单:允许在V3集成开发环境下启动用户功能。 4.可配置SVCS接口:提供对版本控制系统的入口。 5.PC-LINT接口:对应用程序代码进行深层语法分析。 6.Infineon的EasyCase接口:集成块集代码产生。

7.Infineon的DAVE功能:协助用户的CPU和外部程序。DAVE工程可被直接输入uVision3。 三、Proteus简介

Proteus ISIS是英国Labcenter公司开发的电路分析与实物仿真软件。它运行于Windows操作系统上,可以仿真、分析(SPICE)各种模拟器件和集成电路,该软件的特点是:①实现了单片机仿真和SPICE电路仿真相结合。具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232动态仿真、I2C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。②支持主流单片机系统的仿真。目前支持的单片机类型有:68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外围芯片。③提供软件调试功能。在硬件仿真系统中具有全速、单步、设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状态,因此在该软件仿真系统中,也必须具有这些功能;同时支持第三方的软件编译和调试环境,如Keil C51 uVision3等软件。④具有强大的原理图绘制功能。总之,该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大。本章介绍Proteus ISIS软件的工作环境和一些基本操作。 1.进入Proteus ISIS

双击桌面上的ISIS 6 Professional图标或者单击屏幕左下方的“开始”→“程序”→“Proteus 6 Professional” →“ISIS 6 Professional”,出现如图4.1所示屏幕,表明进入Proteus ISIS集成环境 2.工作界面

Proteus ISIS的工作界面是一种标准的Windows界面,如图4.2所示。包括:标题栏、主菜单、标准工具栏、绘图工具栏、状态栏、对象选择按钮、预览对象方位控制按钮、仿真进程控制按钮、预览窗口、对象选择器窗口、图形编辑窗口。

四、软件调试

软件调试的任务是利用ISIS开发工具进行在线仿真调试,发现和纠正程序错误,同时也能发现仿真结果故障。程序的调试应一个模块一个模块地进行,我们首先单独调试各功能子程序,检验程序是否能够实现预期的功能,接口电路的控制是否正常等;最后逐步将各子程序连接起来总调。联调需要注意的是,各程序模块间能否正确传递参数,特别要注意各子程序的现场保护与恢复。调试的基本步骤如下:

(1)、修改显示缓冲区内容,屏蔽拆字程序,调试动态扫描显示功能。例如将DISP0~DISP5单元置为“012345”,应能在LCD上从左到右显示“012345”。若显示不正确,可在中断子程序相应位置设置断点调试检查。然后修改计时缓冲区内容,调用拆字程序,调试显示模块。

(2)、运行主程序调试模块,不按下任何键,检查是否能开始正确显示。若不能正确显示,则应在定时器中断服务子程序中设置断点,检查HOUR、MIN、SEC单元是否随断点运行而变化。然后屏蔽缓冲区初始化部分,用仿真器修改万年历显示缓冲区内容为2013年5月27日09时52分00秒,运行主程序(调进位键),检验能否正确进位,以及试调时间看能否正确的进位,以及温度显示。

(3)、调试键盘扫描模块,先用延时5ms子程序代替显示子程序延时消抖,在求取键号后设置断点,中断后观察A累加器中的键号是否正确;然后恢复用显示子程序延时消抖,检验与显示模块能否正确连接。

(4)、调试时间设置模块。首先屏蔽COMB子程序,单独调试键盘设置模块,观察显示缓冲区DISP0~DISP5单元的内容是否随键入的键号改变,以及键号能否在LCD上显示。然后屏蔽子程序,单独调试合字模块。

(5)、运行主程序联调,检查能否用键盘修改当前万年历,时间,以及温度能否正确显示。

5.1 PCB板

5.2 样机调试

设计原理图→定义元件封装→PCB基本图纸设置→生成网络表和加载网络表→元件布局→布线规则设置→手动或自动布线→编译

5.3 样机功能

通过LCD1602显示出日历、年、月、日、时、分、秒,且时间不停的在运行,还显示出温度,通过按键的按键不同LCD显示也不同。

5.4 发挥部分测试结果

5.5 小结

通过本次画板PCB让我了解基本的pcb画法的步骤、不仅仅要提前阅读相关设计所需要的元件资料,还要非常的了解,因为在编写程序是要用到芯片的资料。在PCB时也要知道他的外围的体型、边框的长度和宽、高。设计时要要考虑的他的可行性、以及他的美观。他的大小。要尽量的小。布线的宽度要适宜。

6. 结论

这次的实验对从我们来说很兴庆,从这次的实验中,让我们更加了解和掌握单片机结构以及液晶内部的结构,提高我们编程的能力,理解软件对硬件的控制以及硬件对软件的制约。本次设计的重点在于定时中断的合理使用,各相互独立的程序通过有机的组合,来完成所需功能则是本次设计的精妙之所在,也正是因为此,深刻领悟到“实践出真知”这句俗语。其实有好多的知识需要在一步一步的实际动手当中慢慢地体会,慢慢地学习。不能只是想当然怎样就会怎样,还要靠自己亲手去验证它才行在设计的过程中还是会学到不少东西,但是经过这次实验使我对它们有了一定的了解。经过这一次实验我们认识到实验是一门能够提高个人动手能力的一门课程,同时也帮助了我们,怎么样把书本上理论的知识应用到实践中去。

通过这次的锻炼,我们不仅动手能力得到了加强,更重要的是学到了很多新的专业技能知识,经验也更加丰富了。我觉得我还有很多不足的地方,如:基本知识掌握不牢固、动手能力不强、知识面不够宽。我争取在以后的学习当中弥补它,不断的完善自己。虽然期间我们遇到了不少的难题,但是经过努力,再大的困难也被我们给一一的解决了。

本实验还有很多做的不够好的地方,还望老师批评指正。

参考文献

中文书:

[1]郭天祥 新概念51单片机C语言教程.入门、提高、开发, 电子工业出版社 2012

中文文献

[2]百度文库中:DS1302中文数据手册 DS18B20中文数据手册 LCD1602中文数据手册

附录

DS1302的部分程序

/***************************************************** 函数功能:向1302写一个字节数据 入口参数:x

***************************************************/ void Write1302(unsigned char dat) {

unsigned char i;

SCLK=0; //拉低SCLK,为脉冲上升沿写入数据做好准备 delaynus(2); //稍微等待,使硬件做好准备 for(i=0;i<8;i++) //连续写8个二进制位数据 { }

/***************************************************** 函数功能:根据命令字,向1302写一个字节数据 入口参数:Cmd,储存命令字;dat,储存待写的数据 ***************************************************/ void WriteSet1302(unsigned char Cmd,unsigned char dat)

DATA=dat&0x01; //取出dat的第0位数据写入1302 }

delaynus(2); //稍微等待,使硬件做好准备 SCLK=1; //上升沿写入数据

delaynus(2); //稍微等待,使硬件做好准备 SCLK=0; //重新拉低SCLK,形成脉冲

dat>>=1; //将dat的各数据位右移1位,准备写入下一个数据位

{

RST=0; //禁止数据传递

SCLK=0; //确保写数居前SCLK被拉低 }

/***************************************************** 函数功能:从1302读一个字节数据 入口参数:x

***************************************************/ unsigned char Read1302(void) {

unsigned char i,dat; }

/***************************************************** 函数功能:根据命令字,从1302读取一个字节数据 入口参数:Cmd

***************************************************/ unsigned char ReadSet1302(unsigned char Cmd) {

unsigned char dat;

RST=0; //拉低RST

delaynus(2); //稍微等待,使硬件做好准备 for(i=0;i<8;i++) //连续读8个二进制位数据 {

dat>>=1; //将dat的各数据位右移1位,因为先读出的是字节的最低位 }

if(DATA==1) //如果读出的数据是1 dat|=0x80; //将1取出,写在dat的最高位 SCLK=1; //将SCLK置于高电平,为下降沿读出 delaynus(2); //稍微等待

SCLK=0; //拉低SCLK,形成脉冲下降沿 delaynus(2); //稍微等待

RST=1; //启动数据传输

delaynus(2); //稍微等待,使硬件做好准备 Write1302(Cmd); //写入命令字 Write1302(dat); //写数据

SCLK=1; //将时钟电平置于已知状态 RST=0; //禁止数据传递

return dat; //将读出的数据返回

SCLK=0; //确保写数居前SCLK被拉低 RST=1; //启动数据传输 Write1302(Cmd); //写入命令字 dat=Read1302(); //读出数据

SCLK=1; //将时钟电平置于已知状态 RST=0; //禁止数据传递 return dat; //将读出的数据返回 }

/***************************************************** 函数功能: 对1302进行写设置和写数据

***************************************************/ void Init_DS1302(void) {

WriteSet1302(0x8E,0x00); //1302进行初始化,根据写状态寄存器命令字,写入不保护指令

WriteSet1302(0x80,((time_m/10)<<4|(time_m))); //根据写秒寄存器命令字,写入秒的初始值

WriteSet1302(0x82,((time_f/10)<<4|(time_f))); //根据写分寄存器命令字,写入WriteSet1302(0x84,((time_s/10)<<4|(time_s))); //根据写小时寄存器命令字,写入WriteSet1302(0x86,((time_r/10)<<4|(time_r))); //根据写日寄存器命令字,写入日WriteSet1302(0x88,((time_y/10)<<4|(time_y))); //根据写月寄存器命令字,写入月

分的初始值 小时的初始值 的初始值 的初始值

WriteSet1302(0x8a,((time_w/10)<<4|(time_w))); //根据写周寄存器命令字,写入周的初始值 }

二、温度模块程序(部分程序) /*产生复位脉冲初始化DS18B20*/ void Init() {

uint i=100; DQ=0;

while(i>0)i--;//拉低约900us

WriteSet1302(0x8c,((time_n/10)<<4|(time_n))); //根据写年寄存器命令字,写入

年的初始值

}

DQ=1;//拉高电平,产生上升沿 i=4; while(i>0)i--;

/*等待应答脉冲*/ void Wait() { }

/*读数据一位*/ bit Rebit() { }

/*读一个字节数据*/ uchar Rebyte() { }

uchar i,j=0,k=0; for(i=0;i<8;i++) { } return(j);

k=Rebit(); j=(k<<7)|(j>>1);

uint i; bit b; DQ=0;

i++;//保持低电平至少1us DQ=1;

i++;i++;//延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效 b=DQ; i=9;

while(i>0)i--;//读时隙不低于60us return(b); uint i; while(DQ); while(~DQ); i=4; while(i>0)i--;

//检测到应答脉冲

/*写一个字节数据*/ void Wrbyte(uchar b) { }

/*启动温度转化*/ void Convert() { }

Init();//初始化DS18B20 Wait();//等待应答 delay(1);//延时

Wrbyte(0xcc);//skip rom命令 Wrbyte(0x44);//convert T命令 uint i,j; bit temp; for(j=0;j<8;j++) { }

temp=b&0x01; b>>=1; if(temp) { } else { }

/*写0*/ DQ=0; i=8; while(i>0)i--; DQ=1; i++;i++; /*写1*/ DQ=0;

i++;i++;//延时15us DQ=1; i=8;

while(i>0)i--;//整个写1时隙不低于60us

/*读取温度值*/ void Retemp() {

Init();//初始化DS18B20

Wait();//等待应答 delay(1);//延时

Wrbyte(0xcc);//skip rom命令

Wrbyte(0xbe);//read scratchpad(读暂存器)命令

tplsb=Rebyte();//温度低位字节(其中第四位为小数部分) tpmsb=Rebyte();//温度高位字节(其中高五位为符号位) temp=(tpmsb*256+tplsb)*0.0625;//转换 }

//温度显示 void Display() {

Convert();//温度转换 delay(10); Retemp();//读温度 delay(10);

WriteAddress(0xb); WriteData(digit[temp/10]); }

WriteData(digit[temp]);

本文来源:https://www.bwwdw.com/article/7716.html

Top