基于单片机的万年历加温度显示设计

更新时间:2024-01-26 17:41:01 阅读量: 教育文库 文档下载

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

郑州大学西亚斯国际学院

本科毕业论文(设计)

题 目 基于单片机的万年历加温度显示设计 指导教师 职称 讲师

学生姓名 学号 20081521 专 业 电子信息工程 班级 电信二班 院 (系) 电子信息工程学院 完成时间 2012年4月20日

1

基于单片机的万年历加温度显示设计

摘 要

本设计将制作一种基于单片机控制的带实时温度显示、具有定时功能的电子万年历。传统的电子日历大都体积大,功耗大,显示不准确等特点。为了缩小体积,减小功耗,使其变得小巧灵敏,本设计加入了时钟芯片DS1302,可对时间进行准确记时,同时可设置定时时间,实现定时功能。另外本设计具有显示实时温度的功能。传统的温度传感器系统大都采用放大、调理、A/D转换,转换后的数字信号送入计算机处理,处理电路复杂、可靠性相对较差,占用计算机的资源比较多。本设计将采用DS18B20一线制数字温度传感器,可将温度信号直接转换成数字信号送给微处理器,电路简单,成本低,实现了时间温度同时显示的效果。最后,温度和时间都将通过12864液晶显示器进行显示。测试表明系统达到了设计要求的各项功能,各部分工作正常。

关键词 时钟/温度检测/单片机/温度

I

MICROCONTROLLER-BASHED

CALENDER AND TEMPERATURE DISPLAY DESIGN

ABSTRACT

This design creates an electronic calendar with real-time temperature display and timing function based on single chip control. Most of traditional calendars are characterized by large size, high power consumption and inaccurate display. In order to reduce volume and power consumption and make calendars become small and exquisite, the design adds a clock chip DS1302, which can accurately record the time and set a regular time to achieve timing function. In addition, this design displays real-time temperature function. Traditional temperature sensor system is mostly amplified, recuperated and A / D converted. The converted digital signal is input the computer to be processed, but the processing circuit is complicated with relatively poor reliability and occupies more resources of the computer. This design uses the DS18B20 first-line system digital temperature sensor to directly convert the temperature signal into digital signal and send it the microprocessor, whose circuit is simple and low cost, achieving the displayed effect of time and temperature simultaneously. Finally, the temperature and time will be displayed through the 12864 liquid crystal display. The test indicates that the system has reached various functions of the design requirements and each part operates smoothly.

KEY WORDS clock, temperature detection, SCM, temperature

II

目 录

中文摘要 ..................................................................................................... I 英文摘要 .................................................................................................... II

1 概论 ....................................................................................................... 1

1.1 万年历发展背景 .......................................................................... 1 1.2 电子万年历的特点 ...................................................................... 1 1.3 国内外现状、发展 ...................................................................... 1

2 系统基本方案选择和论证 ................................................................ 2

2.1 单片机芯片的选择方案和论证 .................................................. 2 2.2 显示模块的选择方案和论证 ...................................................... 3 2.3 时钟芯片的选择方案和论证 ...................................................... 4 2.4 温度传感器的选择方案和论证 .................................................. 4 2.5 电路设计最终方案确定 .............................................................. 5

3 系统硬件电路设计 ............................................................................. 6

3.1 系统功能模块划分 ...................................................................... 6 3.2 各单元模块功能分析及模块电路设计 ...................................... 6

3.2.1 时钟模块 .............................................................................. 6 3.2.2 温度模块 .............................................................................. 7 3.2.3 显示模块 ............................................................................ 10 3.2.5 独立键盘模块 .................................................................... 18

1

3.2.6 蜂鸣器模块 ........................................................................ 19 3.2.7 单片机模块 ........................................................................ 20

3.3 电路原理图的绘制和电路的焊接 ............................................ 23

3.3.1 原理图绘制软件 PROTEL ............................................... 23 3.3.2 PCB制作 ............................................................................ 23 3.3.3 元器件的焊接 .................................................................... 24

4 系统软件设计 ................................................................................... 26

4.1 万年历软件系统的流程图 ........................................................ 26 4.2 温度信息的采集 ........................................................................ 27 4.3 时钟的读取 ................................................................................ 30

4.3.1 DS1302控制字节的说明 .................................................. 30 4.3.2 DS1302时间日期寄存器及相应位定义 .......................... 31 4.3.3 DS1302数据的输入和输出 ............................................... 31 4.3.4 DS1302读写部分(程序)部分 ............................................ 32

4.4 温度的显示控制 ........................................................................ 32 4.5 键盘模块 .................................................................................... 34 4.6 蜂鸣器模块 ................................................................................ 34

5 设计总结 ............................................................................................ 35

致谢 .......................................................................................................... 36 参考文献 .................................................................................................. 37 附录 .......................................................................................................... 38

2

1 概论

1.1 万年历发展背景

随着电子技术的发展,人类不断研究,不断创新纪录。万年历目前已经不再局限于以书本形式出现。以电脑软件或者电子产品形式出现的万年历被称为电子万年历。与传统书本形式的万年历相比,电子万年历得到了越来越广泛的应用,采用电子时钟作为时间显示已经成为一种时尚。目前市场上各式各样的电子时钟数不胜数,但多数是只针对时间显示,功能单一不能满足人们日常生活需求。

1.2 电子万年历的特点

电子万年历显示功能,包括公历年、月、日,时间、温度、星期、农历等等;附

带功能有:定时闹铃、以及按钮是否可以正常调动。本文提出了一种基于STC12C5A60S2单片机的万年历设计方案,采用LCD显示。本方案以STC12C5A60S2单片机作为主控核心,与时钟芯片DS1302、温度芯片DS18B20、人体红外感应模块、闹钟模块、按键、LCD显示等模块组成硬件系统。在硬件系统中设有7个独立按键和一个LCD显示器,能显示丰富的信息,根据使用者的需要可以随时对时间进行校准、时间、温度显示等,综上所述此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪器仪表的发展趋势,具有广阔的市场前景。

1.3 国内外现状、发展

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

万年历中使用的LCD的应用很广泛,如手表上的液晶显示屏,仪表仪器上的液晶显示器或者是电脑笔记本上的液晶显示器,都使用了LCD。在一般的办公设备上也很常见,如传真机,复印机,以及一些娱乐器材玩具等也常常见到LCD的足迹。字符型液晶显示模块是一种专门用于显示字母,数字,符号等的点阵式液晶显示模块。

1

在显示器件上的设计,它是由若干个5×7或5×11等点阵符位组成。每一个点阵字符位都可以显示一个字符。点阵字符位之间有一空点距的间隔起到了字符间距和行距的作用。目前市面上常用的有16字×1行,16字×2行,20字×2行和40字×2行等的字符模块组。这些LCD虽然显示字数各不相同,但是都具有相同的输入输出界面。

市场上有许多电子万年历的专用芯片,如:LM8363、LM8365等,但它们功能单一,电路连接复杂,不便于调试制作。因此本系统采用了以STC12C5A60S2单片机技术为核心,配合DS18B20温度测量模块,DS1302时钟模块,人体感应模块,LCD显示模块,键盘模块使该设计具有现实功能齐全,人机交互,节能的特点。

随着单片机的发展,电子万年历呈现了微型化 ,功能丰富化的趋势,而且价格在不断下降,考虑到资源问题,现在的设计设计的万年历都采用了节能设计方案,万年历对人们的生活有着十分重要的作用,所以电子万年历还是有很大的发展前景的。

2 系统基本方案选择和论证

2.1 单片机芯片的选择方案和论证

方案一:

采用89C51芯片作为硬件核心,89C51是一种带4K字节闪烁可编程可擦除只读存储器,采用Flash ROM,内部具有4KB ROM 存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,89C51是一种高效微控制器,51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案但是运用于电路设计中时由于不具备在线编程(ISP)技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插可能对芯片造成一定的损坏。

方案二:

采用STC12C5A60S2单片机,STC12C5A60S2单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换,针对电机控制,强干扰场。STC12C5A60S2单片机内部有60KB

2

的程序Flash存储器,1KB的数据Flash存储器,具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏。由于我们设计的万年历烧写文件大概在40KB左右 ,而STC12C5A60S2单片机的程序Flash为60KB,我们就不用在外接程序存储器了。万年历的程序复杂 ,采用1T单片机有利于提高运算速度,使万年历显示更快捷。

经过综合比较最终选择方案二,即选择STC12C5A60S2作为主控制器。

2.2 显示模块的选择方案和论证

方案一:

中文字库的LCD12864是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192个16*16点汉字,和128个16*8点ASCII字符集。利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4行16×16点阵的汉字,也可完成图形显示,低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。万年历要求显示年月日、时分秒、星期、和农历。LCD12864液晶可以完成设计的要求 。 方案二:

系统采用LED显示。LED应用可分为两大类:一是LED单管应用,包括背光源LED,红外线LED等;另外就是LED显示屏,目前,中国在LED基础材料制造方面与国际还存在着一定的差距,但就LED显示屏而言,中国的设计和生产技术水平基本与国际同步。LED显示屏是由发光二极管排列组成的显示器件。它采用低电压扫描驱动,具有:耗电少、使用寿命长、成本低、亮度高、故障少、视角大、可视距离远等特点。采用LED数码管动态扫描.价格上比较经济实惠,但不能显示文字,性价比不是很高,操作起来比较液晶显示来说略显繁琐,所以也不用此种作为显示。

经过综合比较最终选择方案一,即选择LCD12864液晶显示屏。

3

2.3 时钟芯片的选择方案和论证

方案一:

采用单片机定时。单片机集成度高、功能强、可靠性高、体积小、功耗低、使用方便、价格低廉等一系列优点,单片机的应用领域已从面向工业控制、通讯、交通、智能仪表等迅速发展到家用消费产品、办公自动化、汽车电子、PC机外围以及网络通讯等广大领域。

直接采用单片机定时计数器提供秒信号,计数的脉冲由外部提供,定时的脉冲由外部晶振提供,定时加1的周期为一个机器周期;定时时间与初值和晶振频率有关。使用程序实现年、月、日、星期、时、分、秒计数。采用此种方案减少芯片的使用,节约成本,但程序复杂度较高。 方案二:

采用DS1302时钟芯片。DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、星期、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录,因此广泛应用于测量系统中。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。采用DS1302只需要写出驱动程序,调用程序读出寄存器内数据经过简单的变换就可以输出万年历的数据。

经过综合比较最终选择方案二,即采用DS1302时钟芯片。

2.4 温度传感器的选择方案和论证

方案一:

采用热敏电阻作为温度传感器。热敏电阻是开发早、种类多、发展较成熟的敏感元器件。热敏电阻由半导体陶瓷材料组成,利用的原理是温度引起电阻变化。热敏电阻的主要特点是:灵敏度较高,其电阻温度系数要比金属大10~100倍以上;工作温度范围宽,常温器件适用于-55℃~315℃,高温器件适用温度高于315℃(目前最高

4

可达到2000℃)低温器件适用于-273℃~55℃;体积小,能够测量其他温度计无法测量的空隙、腔体及生物体内血管的温度;使用方便,电阻值可在0.1~100kΩ间任意选择;易加工成复杂的形状,可大批量生产;稳定性好、过载能力强。由于半导体热敏电阻有独特的性能,所以在应用方面它不仅可以作为测量元件(如测量温度、流量、液位等),还可以作为控制元件(如热敏开关、限流器)和电路补偿元件。热敏电阻广泛用于家用电器、电力工业、通讯、军事科学、宇航等各个领域,发展前景极其广阔。

使用热敏电阻作为传感器,用热敏电阻与一个相应阻值电阻相串联分压,利用热敏电阻阻值随温度变化而变化的特性,采集这两个电阻变化的分压值,并进行A/D转换。此设计方案需用A/D转换电路,增加硬件成本而且热敏电阻的感温特性曲线并不是严格线性的,会产生较大的测量误差。 方案二:

采用DS18B20温度传感器。在应用与高精度、高可靠性的场合时DALLAS(达拉斯)公司生产的DS18B20温度传感器当仁不让。超小的体积,超低的硬件开消,抗干扰能力强,精度高,附加功能强,使得DS18B20更受欢迎。对于我们普通的电子爱好者来说,DS18B20的优势更是我们学习单片机技术和开发温度相关的小产品的不二选择。这是世界上第一片支持―一线总线‖接口的温度传感器。DS18B20数字温度计提供9位(二进制)温度读数,指示器件的温度。信息经过单线接口送入DS18B20或从DS18B20送出,因此从单片机到DS18B20仅需一条线连接即可。它可在1秒钟(典型值)内把温度变换成数字

经过综合比较最终选择方案二,即采用采用DS18B20温度传感器。

2.5 电路设计最终方案确定

最终选择单片机STC12C5A60S2作为主控制器;选择LCD12864型液晶作为显示

模块,此模块可以显示字母、数字符号、中文字型及图形,具有绘图及文字画面混合显示功能;选择采用DS1302时钟芯片,使程序实现年、月、日、星期、时、分、秒,即农历阳历时间的显示。采用DS18B20温度传感器,可以对温度做出比较精确的测量,而且和单片机通讯只要一个IO,连接方便。

5

3 系统硬件电路设计

3.1 系统功能模块划分

根据系统功能要求,可大致画出系统所需硬件结构框图如图3-1所示:

图3-1 系统功能模块图

主控模块采用性价比较高的STC12C5A60S2单片机芯片,在其内部烧写好程序,可通过程序的运行控制测温模块进行测温;测温模块主要是由DS18B20构成,将其与所测对象进行接触即可获取被测对象的温度数据,而所测得的温度和时钟芯片测得的实时日历将通过显示模块的液晶显示器以数字形式显示;单片机调用程序,读取DS1302内寄存器,可以得到万年历的时间数据,经过程序处理就可以输出在LCD上;键盘电路可对实时日历进行调整;人体红外感应模块可以检测人体,当有人靠近时,就能打开LCD背光;蜂鸣器可以在闹钟定时中,作为声音提醒。

3.2 各单元模块功能分析及模块电路设计

3.2.1 时钟模块

DS1302的工作原理和单片机的接口:

6

DS1302为美国DALLAS公司的一种实时时钟芯片,主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。采用32.768Hz晶振。它可以对年、月、日、星期、时、分、秒进行计时,且具有闰年补偿等多种功能。DS1302 用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录。这种记录对长时间的连续测控系统结果的分析以及对异常数据出现的原因的查找有重要意义。在本设计中,它的实际电路图如图3-2所示:

图3-2 DS1302与单片机的连接

DS1302需要外接32.768K的晶振,1号引脚接主电源VCC(5V)电源,8号引脚

接备用电池(3V),当主电源掉电后,备用电源为DS1302提供电源,维持DS1302内数据不丢失,这正是时钟芯片所必须的特性。

3.2.2 温度模块

传统的温度传感器系统大都采用放大、调理、A/D转换,转换后的数字信号送入计算机处理,处理电路复杂、可靠性相对较差,占用计算机的资源比较多,本设计测温模块采用一线制总线数字温度传感器DS18B20,可将温度信号直接转换成数字信号送给微处理器,电路简单,成本低,其电路原理图如图3-3所示:

7

图3-3 DS18B20温度模块

从图中可看出,将温度传感器的一线制总线通过端口2与本设计主控芯片STC12C5A6S2的端口标号为DS18B20的相连即可实现相互之间的通信。设计中的测温元件采用的是DS18B20测温元件,DS18B20是由DALLAS(达拉斯)公司生产的一种温度传感器。超小的体积,超低的硬件开消,抗干扰能力强,精度高,附加功能强,使得DS18B20很受欢迎。这是世界上第一片支持―一线总线‖接口的温度传感器。DS18B20数字温度计提供9位(二进制)温度读数,指示器件的温度。信息经过单线接口送入DS18B20或从DS18B20送出,因此从单片机到DS18B20仅需一条线连接即可。它可在1秒钟(典型值)内把温度变换成数字。 3.2.2.1 DS18B20的主要特征 1)DS18B20的主要特征: ①全数字温度转换及输出; ②先进的单总线数据通信;

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

?⑥检测温度范围为–55℃——+125℃; ?⑦内置EEPROM,限温报警功能;

?⑧64位光刻ROM,内置产品序列号,方便多机挂接; ?⑨多样封装形式,适应不同硬件系统。 2)DS18B20芯片其封装结构如下:

8

图3-4 DS18B20芯片封装图

由其引脚可看出,其3个引脚: GND为电压地直接接地;DQ为单数据总线用来与单片机相连接,本系统中DS与单片机P2.2接口连接,仅此一个连接就能保证DS18B20与单片机之间的数据交换;VDD引脚接电源电压。 3.2.2.2 DS18B20的工作原理

DS18B20的温度检测与数字数据输出全集成于一个芯片之上,从而抗干扰力更强。一个工作周期可分为两个部分,即温度检测和数据处理。

DS18B20共有三种形态的存储器资源,分别是: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都存在镜像,以方便用户操作。我们在每一次读温度之前都必须进行复杂的且精准时序的处理,因为DS18B20的硬件简单结果就会导致软件的巨大开消。

9

3.2.3 显示模块

本设计显示模块主要采用LCD12864液晶显示器,其电路原理图如下:

图3-5 LCD12864模块

LCD12864液晶显示器通过数据端口也即端口7~14与主控芯片STC12C5A60S2的I/O端口P2相连接实现数据与指令的传输,再通过控制端口RS、RW、EN也即端口4~6与主控芯片P3.6,P3.7,P4.0端口相接实现对数据和指令传输的控制 。显示模块采用12864液晶显示器可实现对温度和时间的直接显示,清晰明了。 3.2.3.1 LCD12864的特征

带中文字库的LCD12864是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块其显示分辨率为128×64, 内置8192个16*16点汉字和128个16*8 点ASCII字符集。利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4行16×16点阵的汉字,也可完成图形显示。低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简得多,且该模块的价格也略低于相同点阵的图形液晶模块。其基本特性如下:

??1低电源电压(VDD:+3.0-+5.5V) ○

??2显示分辨率:128×64点 ○

??3内置汉字字库,提供8192个16×16点阵汉字(简繁体可选) ○

10

??4内置128个16×8点阵字符 ○

??52MHZ时钟频率 ○

??6显示方式:SIN、半透、正显 ○

??7背光方式:侧部高亮白色LED,功耗仅为普通LED的1/5—1/10 ○

??8通讯方式:串行、并行可选 ○

??9内置DC-DC转换电路,无需外加负压 ○

??10无需片选信号,简化软件设计 ○

??11工作温度:0℃—-+55℃,存储温度:-20℃—+60℃ ○

1.模块管脚是连接外部电路的纽带 ,在此模块中管脚主要由控制管脚和数据管脚等构成,现将其组成情况及相关功能介绍如下:

表3-1 12864液晶模块接口说明

管脚号 1 2 3 4 管脚名称 VSS VCC V0 RS(CS) 电平 0V 3.0V/5V - H/L 管脚功能描述 电源地 电源正 对比度(亮度)调整 RS=―H‖,表示DB7~DB0为显示数据 RS=―L‖,表示DB7~DB0为显示指令数据 R/W=―H‖,E=―H‖,数据被读到DB7~DB0 R/W=―L‖,E=―H→L‖, DB7~DB0的数据被写到IR或DR 使能信号 三态数据线 H:8位或4位并口方式,L:串口方式 空脚 复位端,低电平有效 LCD驱动电压输出端 背光源正端 背光源负端 5 6 7~14 15 16 17 18 19 20 R/W E(SCLK) DB0~DB7 PSB NC RESET VOUT A K H/L H/L H/L H/L - H/L - VDD VSS

2.控制器控制着模块内部指令的发出与否,存储器则对指令和数据进行存储与更换,现将分别介绍控制器各接口及各存储器的功能。

11

1)RS,R/W的配合选择决定控制界面的4种模式

表3-2 RS,R/W配合功能说明

RS L L H H R/W L H L H 功能说明 MPU写指令到指令暂存器(IR) 读出忙标志(BF)及地址记数器(AC)的状态 MPU写入数据到数据暂存器(DR) MPU从数据暂存器(DR)中读出数据 2)E信号

表3-3 E信号功能说明

E状态 高——>低 高 低/低——>高 执行动作 I/O缓冲——>DR DR——>I/O缓冲 无动作 结果 配合/W进行写数据或指令 配合R进行读数据或指令 忙标志BF: BF标志提供内部工作情况。BF=1表示模块在进行内部操作,此时模块不接受外部指令和数据。BF=0时,模块为准备状态,随时可接受外部指令和数据。利用STATUS RD 指令,可以将BF读到DB7总线,从而检验模块工作状态。

字型产生ROM(CGROM): 字型产生ROM(CGROM)是用于模块屏幕显示开和关的控制。DFF=1为开显示,DDRAM的内容就显示在屏幕上,DFF=0为关显示。DFF的状态是指令DISPLAY ON/OFF信号控制的。

显示数据RAM(DDRAM ):模块内部显示数据RAM提供64×2个位元组的空间,最多可控制4行各16字的中文字型显示,当写入显示数据RAM时,可分别显示CGROM与CGRAM 的字型;此模块可显示三种字型,分别是半角英数字型(16*8)、CGRAM 字型及CGROM的中文字型。三种字型的选择,由在DDRAM中写入的编码选择,在0000H—0006H的编码中将选择CGRAM的自定义字型,02H—7FH的编码中将选择半角英数字的字型,至于A1以上的编码将自动的结合下一个位元组,组成两个位元组编码形成中文字型的编码。

字型产生 RAM(CGRAM):字型产生RAM提供图象定义(造字)功能,可以提供四组 16×16点的自定义图象空间,使用者可以将内部字型没有提供的图象字型自行定义到CGRAM中,便可和CGROM中的定义一样地通过DDRAM显示在屏幕中。

地址计数器AC: 地址计数器是用来贮存DDRAM/CGRAM 之一的地址,可由设定指令暂存器来改变,之后只要读取或写入DDRAM/CGRAM的值时,地址计数器的值就会自动加一。当RS =0且R/W=1时,地址计数器的值会被读取到DB6—DB0中。

12

光标/闪烁控制电路:此模块提供硬体光标及闪烁控制电路,由地址计数器的值来指定DDRAM中的光标或闪烁位置。

3.模块控制芯片提供两套控制指令:基本指令和扩充指令,这些由各控制端口和寄存器组合而成的指令可对液晶显示器自身模式、状态、功能等进行设置,也可控制与其他芯片进行数据和指令的通信。其指令分别如下:

表3-4 基本指令集(RE=0)

指 令 清除 显示 地址 归位 指 令 码 RS R/W D7 D6 D5 D4 D3 D2 D1 D0 0 0 0 0 0 0 0 0 0 1 功 能 将DDRAM填满\并且设定DDRAM的地址计数器(AC)到\0 0 0 0 0 0 0 0 1 设定DDRAM的地址计数器(AC)到\并X 且将游标移到开头原点位置;这个指令不改变DDRAM 的内容 B D=1: 整体显示 ON C=1: 游标ON B=1:游标位置反白允许 指定在数据的读取与写入时,设定游标的移动方向及指定显示的移位 设定游标的移动与显示的移位控制位;这个指令不改变DDRAM 的内容 DL=0/1:4/8位数据 RE=1: 扩充指令操作 RE=0: 基本指令操作 设定CGRAM 地址 设定DDRAM 地址(显示位址) 第一行:80H-87H 第二行:90H-97H 显示状0 0 0 0 态开/关 进入点 0 0 0 0 设定 游标或显示移0 0 0 0 位控制 功能 设定 0 0 0 0 0 0 1 D C 0 0 0 1 I/D S 0 1 S/C R/L X X 1 DL X RE X X 设定CGRAM 0 0 0 1 AC5 AC4 AC3 AC2 AC1 AC0 地址 设定DDRAM 0 0 1 0 AC5 AC4 AC3 AC2 AC1 AC0 地址 读取忙读取忙标志(BF)可以确认内部动作是否完成,标志和0 1 BF AC6 AC5 AC4 AC3 AC2 AC1 AC0 同时可以读出地址计数器(AC)的值 地址 写数据1 0 到RAM 读出RAM的1 1 值 数据 将数据D7——D0写入到内部的RAM (DDRAM/CGRAM/IRAM/GRAM) 从内部RAM读取数据D7——D0 (DDRAM/CGRAM/IRAM/GRAM 数据

13

表3-5 扩展指令集(RE=1)

指 指 令 码 功 能 令 RS R/W D7 D6 D5 D4 D3 D2 D1 D0 待命 0 0 0 0 模式 卷动地址0 0 0 0 开关开启 反白 0 0 0 0 选择 睡眠 0 0 0 0 模式 扩充 功0 0 0 0 能 设定 0 0 0 0 0 1 进入待命模式,执行其他指令都棵终止 待命模式 0 0 0 0 1 SR SR=1:允许输入垂直卷动地址 SR=0:允许输入IRAM和CGRAM地址 0 0 0 选择2行中的任一行作反白显示,并可决定反白与否。初始值R1R0=00,第一次设定为反白显1 R1 R0 示,再次设定变回正常 SL=0:进入睡眠模式 SL=1:脱离睡眠模式 0 0 1 SL X X 1 CL X RE G 0 CL=0/1:4/8位数据 RE=1: 扩充指令操作 RE=0: 基本指令操作 G=1/0:绘图开关 设定绘0 0 0 AC3 AC2 AC1 AC0 图0 0 1 RAAC6 AC5 AC4 AC3 AC2 AC1 AC0 M 地址 设定绘图RAM 先设定垂直(列)地址AC6AC5…AC0 再设定水平(行)地址AC3AC2AC1AC0 将以上16位地址连续写入即可

14

当IC1在接受指令前,微处理器先确认其内部处于非忙碌状态,即读取BF标志时,BF需为零方可接受新的指令;如果在送出一个指令前不检查BF标志,那么在前一个指令和这个指令中间必须延长一段较长的时间,即等待前一个指令确实执行完成。

4.12864液晶显示器不仅可以显示字符同时也可以图形,因此可以满足不同使用者更多的要求,如显示一幅图画或者一个曲线图等。使用者在使用时便可根据自身需求进行不同的显示。

1)字符显示:带中文字库的128X64-0402B每屏可显示4行8列共32个16×16 点阵的汉字,每个显示RAM可显示1个中文字符或2个16×8点阵全高ASCII码字符,即每屏最多可实现32个中文字符或64个ASCII码字符的显示。带中文字库的128X64-0402B内部提供128×2字节的字符显示RAM缓冲区(DDRAM)。字符显示是通过将字符显示编码写入该字符显示RAM实现的。根据写入内容的不同,可分别在液晶屏上显示CGROM(中文字库)、HCGROM(ASCII码字库)及 CGRAM(自定义字形)的内容。三种不同字符/字型的选择编码范围为:0000~0006H (其代码分别是0000、0002、0004、0006 共4 个)显示自定义字型,02H~7FH 显示半宽ASCII 码字符,A1A0H~F7FFH 显示8192 种GB2312中文字库字形。字符显示RAM 在液晶模块中的地址80H~9FH。字符显示的RAM的地址与32个字符显示区域有着一一对应的关系,其对应关系如下表所示:

表3-6 字符RAM与显示区域对应关系

80H 90H 88H 98H 81H 91H 89H 99H 82H 92H 8AH 9AH 83H 93H 8BH 9BH 84H 94H 8CH 9CH 85H 95H 8DH 9DH 86H 96H 8EH 9EH 87H 97H 8FH 9FH

2)图形显示:先设垂直地址再设水平地址(连续写入两个字节的资料来完成垂直与水平的坐标地址)。垂直地址范围AC5...AC0,水平地址范围AC3...AC0。绘图RAM的地址计数器(AC)只会对水平地址(X轴) 自动加一,当水平地址=0FH时会重新设为00H但并不会对垂直地址做进位自动加一,故当连续写入多笔资料时,程序需自行判断垂直地址是否需要重新设定。GDRAM的坐标地址与资料排列顺序如下图:

15

图3-6 GDRAM的坐标地址与资料排列顺序

3.2.4 人体红外感应模块

本设计基于HC-SR501的人体红外感应模块,由于该传感器手工制作信号不稳定,所以我们采用高度集中的成品人体感应模块,它的输入输出结构如下图图3-7:

图3-7 人体红外感应模块图

从图中我们可以知道,该模块有3个引脚,1号引脚接电源正极,是我们的电源正极输入极;3号引脚为电源负极,在我们的设计里,3号引脚接地;2号引脚为高低电平输出引脚,当有人进入模块的感应区内时,模块会输出持续的高电平(3.3V),我们可以运用此高电平控制LCD12864的背光开关,实现LCD12864背光的只能开关。 3.2.4.1 人体红外模块的技术参数

(1)工作电压:DC5V至20V (2)静态功耗:65微安

16

(3)电平输出:高3.3V,低0V (4)延时时间:可调(0.3秒~18秒) (5)封锁时间:0.2秒

(6)触发方式:L不可重复,H可重复,默认值为H (7)感应范围:小于120度锥角,7米以内 (8)工作温度:-15~+70度 3.2.4.2 人体红外模块功能特点

(1)全自动感应:当有人进入其感应范围则输入高电平,人离开感应范围则自动延时关闭高电平。输出低电平。

(2)光敏控制:模块预留有位置,可设置光敏控制,白天或光线强时不感应。 (3)两种触发方式:L不可重复,H可重复。可跳线选择,默认为H。 1不可重复触发方式:即感应输出高电平后,延时时间一结束,输出将自动○

从高电平变为低电平。

2可重复触发方式: 即感应输出高电平后,在延时时间段内,如果有人体○

在其感应范围内活动,其输出将一直保持高电平,直到人离开后才延时将高电平变为低电平(感应模块检测到人体的每一次活动后会自动顺延一个延时时间段,并且以最后一次活动的时间为延时时间的起始点)。 (4)具有感应封锁时间(默认设置:0.2秒):感应模块在每一次感应输出后(高电平变为低电平),可以紧跟着设置一个封锁时间,在此时间段内感应器不接收任何感应信号。此功能可以实现(感应输出时间和封锁时间)两者的间隔工作,可应用于间隔探测产品;同时此功能可有效抑制负载切换过程中产生的各种干扰。 (5)工作电压范围宽:默认工作电压DC5V至20V。

17

3.2.4.3 人体红外模块的外围电路

由于LCD12864是5V控制的显示器,但红外模块的高电平输出仅为3.3V,不符合我们的理想要求,所以本设计中我们采用电压比较器来解决这个问题,原理图如下图3-8:

图3-8 电压比较器

该设计运用电压比较器原理,运用μa741芯片作为电压比较器的主要芯片,μa741是一款集成运算放大器,8个引脚,当2号引脚(IN-)接一电压时,如果3号引脚(IN+,本设计里是人体红外模块的输入输出引脚)的电平高于2号引脚的电平,则6号引脚(OUT,本设计里它连接到LCD12864的背光开关19号引脚)会输出高电平,从而使LCD12864打开背光,方便人们查看万年历。

3.2.5 独立键盘模块

键盘是人与万年历实现信息交互的接口,本设计中,我们采用7个独立键盘,电

路原理如下图3-9:

18

图3-9 独立键盘

当按键按下,与主控芯片连接的端口被降为低电平,按键松开则也升为高电平。按键采用的是Tack Switch按钮开关,它具有自动恢复(弹回)的功能。当我们按下按钮时,其中的接点接通(或切断),放开按钮后,接点恢复为切断(或接通)。按照尺寸区分,电子电路或微型计算机所使用的Tack Swith可分为8mm、10mm、12mm等。虽然Tack Switch有4个引脚,但实际上,其内部只有一对a接点,即其中两个引脚是内部相连通的,而另外两个引脚内部也是相连通的。7个按键实现了开机模式选择,日期调节等功能,独立按键的引入使得体现了本设计的人性化,智能化,功能的强大。

3.2.6 蜂鸣器模块

蜂鸣器模块是本设计中体现人机交互的又一大设计亮点,其电路原理图如下图:

19

图3-10 蜂鸣器模块

(1)蜂鸣器的介绍

1蜂鸣器的作用:蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,○

广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。

2 蜂鸣器的分类:蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两类。 ○

3 蜂鸣器的电路图形符号:蜂鸣器在电路中用字母―H‖或―HA‖(旧标准用―FM‖、○

―LB‖、―JD‖等)表示。

本设计里,我们采用有源蜂鸣器,由于蜂鸣器的工作电流一般比较大,以至于单片机的I/O 口是无法直接驱动的,所以要利用放大电路来驱动,我们使用三极管来放大电流,驱动蜂鸣器,此模块只要通过BELL(连接到到单片机P0.2)输入的PWM波既可以使蜂鸣器分出声音,我们设计的这款万年历可以再开机时选择按键声音的有无,以及在闹钟定时中作为声音提醒信号。

3.2.7 单片机模块

STC12C5A60S2单片机是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高

速/低功耗/超强抗干扰的新一代8051单片机,指令代码完全兼容传统8051,但速度快8-12倍。内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S),针对电机控制,强干扰场合,本设计中单片机的引脚连接如图3-11所示:

20

图3-11 STC12C5A60S2引脚连接

其主要特性如下:

●增强型8051 CPU,1T,单时钟/机器周期,指令代码完全兼容传统8051 ●工作电压: 5.5V- 3.3V

●工作频率范围:0 - 35MHz,相当于普通8051的 0~420MHz ●用户应用程序空间60K 字节 ●片上集成1280字节RAM

●通用I/O口(36/40/44个),复位后为:准双向口/弱上拉(普通8051传统I/O口),可设置成四种模式:准双向口/弱上拉,推挽/强上拉,仅为输入/高阻,开漏,每个I/O口驱动能力均可达到20mA,但整个芯片最大不要超过55mA

● ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器,可通过串口(P3.0/P3.1)直接下载用户程序,数秒即可完成一片

●有EEPROM功能(STC12C5A62S2/AD/PWM无内部EEPROM) ● 看门狗

●内部集成MAX810专用复位电路(外部晶体12M以下时,复位脚可直接1K电阻到地)

21

●外部掉电检测电路:在P4.6口有一个低压门槛比较器,5V单片机为1.32V,误差为+/-5%,3.3V单片机为1.30V,误差为+/-3%

●时钟源:外部高精度晶体/时钟,内部R/C振荡器(温漂为+/-5%到+/-10%以内) 用户在下载用户程序时,可选择是使用内部R/C振荡器还是外部晶体/时钟,常温下内部R/C振荡器频率为:11MHz~15.5MHz。精度要求不高时,可选择使用内部时钟,但因为有制造误差和温漂,以实际测试为准

●共4个16位定时器:两个与传统8051兼容的定时器/计数器,16位定时器T0和T1,没有定时器2,但有独立波特率发生器,做串行通讯的波特率发生器,加上2路PCA模块可再实现2个16位定时器

●2个时钟输出口,可由T0的溢出在P3.4/T0输出时钟,可由T1的溢出在P3.5/T1输出时钟

●外部中断I/O口7路,传统的下降沿中断或低电平触发中断,并新增支持上升沿中断的PCA模块,Power Down模式可由外部中断唤,INT0/P3.2, INT1/P3.3, T0/P3.4, T1/P3.5, RxD/P3.0,CCP0/P1.3(也可通过寄存器设置到P4.2 ), CCP1/P1.4 (也可通过寄存器设置到P4.3)

●PWM(2路)/PCA(可编程计数器阵列,2路),也可用来当2路D/A使用,也可用来再实现2个定时器,也可用来再实现2个外部中断(上升沿中断/下降沿中断均可分别或同时支持)

●A/D转换, 10位精度ADC,共8路,转换速度可达250K/S(每秒钟25万次) ●通用全双工异步串行口(UART),由于STC12系列是高速的8051,可再用定时器或PCA软件实现多串口

●STC12C5A60S2系列有双串口,后缀有S2标志的才有双串口,RxD2/P1.2(可通过寄存器设置到P4.2),TxD2/P1.3(可通过寄存器设置到P4.3)

●工作温度范围:-40 - +85℃(工业级) / 0 - 75℃(商业级)21.封装:PDIP-40,LQFP-44,LQFP-48 I/O口不够时,可用2到3根普通I/O口线外接 74HC164/165/595(均可级联)来扩展I/O口, 还可用A/D做按键扫描来节省I/O口,或用双CPU,三线通信,还多了串口。

22

3.3 电路原理图的绘制和电路的焊接

在硬件的设计前期,根据框图对电路中可能出现的电路,进行了模拟实验,并根据实验结果对后期的硬件设计进行了合理化的修改完善。在前面已分析了系统并绘制了框图,并根据框图分别设计了各部分电路。由于温度传感器与时钟芯片集成度较高,所以在硬件电路设计时不需要太多其他元件即可实现预期功能。因此在PROTEL上对原理图进行了绘制,从而得出了最终的完整电路原理图[附录1]。

3.3.1 原理图绘制软件 PROTEL

PROTEL是PORTEL公司在80年代末推出的EDA软件,在电子行业的CAD

软件中,它当之无愧地排在众多EDA软件的前面,是电子设计者的首选软件,它包含了电原理图绘制、模拟电路与数字电路混合信号仿真、多层印制电路板设计(包含印制电路板自动布线)、可编程逻辑器件设计、图表生成、电子表格生成、支持宏操作等功能,并具有Client/Server (客户/服务器)体系结构,同时还兼容一些其它设计软件的文件格式,如ORCAD,PSPICE,EXCEL等,其多层印制线路板的自动布线可实现高密度PCB的100%布通率。Protel 99SE采用数据库的管理方式。该软件沿袭了Protel以前版本方便易学的特点,内部界面与Protel 99大体相同,新增加了一些功能模块,功能更加强大。新增的层堆栈管理功能,可以设计32个信号层,16个地电层,16个机械层。新增的3D功能在加工印制版之前可以看到板的三维效果。其具有的打印功能,可以轻松修改打印设置控制打印结果。Protel 99SE容易使用的特性还体现在其帮助功能,按下右上角的小问号,然后输入你所要的信息,可以很快地看到特性的功能,然后用到设计中,按下状态栏末端的按钮,使用帮助顾问。

3.3.2 PCB制作

当通过

PROTEL绘制出完整的电路原理图后,就可以按照绘制好的原理图制作

PCB了,具体步骤如下:

(1)打印电路板。将绘制好的电路板用转印纸打印出来,注意滑的一面面向自己,一般打印两张电路板,即一张纸上打印两张电路板。在其中选择打印效果最好的制作线路板。

23

(2)裁剪覆铜板,也就是表面面都覆有铜膜的线路板,将覆铜板裁成电路板的大小,不要过大,以节约材料。

(3)预处理覆铜板。用细砂纸把覆铜板表面的氧化层打磨掉,以保证在转印电路板时,热转印纸上的碳粉能牢固的印在覆铜板上,打磨好的标准是板面光亮,没有明显污渍。

(4)转印电路板。将打印好的电路板裁剪成合适大小,把印有电路板的一面贴在覆铜板上,对齐好后把覆铜板放入热转印机,放入时一定要保证转印纸没有错位。一般来说经过2-3次转印,电路板就能很牢固的转印在覆铜板上。热转印机事先就已经预热,温度设定在90-1400摄氏度,由于温度很高,操作时注意安全。

(5)腐蚀线路板,回流焊机。先检查一下电路板是否转印完整,若有少数没有转印好的地方可以用黑色油性笔修补。然后就可以腐蚀了,等线路板上暴露的铜膜完全被腐蚀掉时,将线路板从腐蚀液中取出清洗干净,这样一块线路板就腐蚀好了。腐蚀液的成分为浓盐酸、浓双氧水、水,比例为1:2:3,在配制腐蚀液时,先放水,再加浓盐酸、浓双氧水,若操作时浓盐酸、浓双氧水或腐蚀液不小心溅到皮肤或衣物上要及时用清水清洗,由于要使用强腐蚀性溶液,操作时一定注意安全。

(6)线路板钻孔。线路板上是要插入电子元件的,所以就要对线路板钻孔了。依据电子元件管脚的粗细选择不同的钻针,在使用钻机钻孔时,线路板一定要按稳,钻机速度不能开的过慢。

(7)线路板预处理。钻孔完后,用细砂纸把覆在线路板上的墨粉打磨掉,用清水把线路板清洗干净。水干后,用松香水涂在有线路的一面,为加快松香凝固,我们用热风机加热线路板,只需2-3分钟松香就能凝固。

按照上面的流程,我们就做出来一块PCB电路板了。

3.3.3 元器件的焊接

元器件装焊顺序依据的原则是:先低后高,先小后大。一般情况下,应按电阻、

电容、二极管、三极管、集成电路、大功率管顺序焊接。 (1)对元器件焊接的要求

1电阻的焊接:按图将电阻准确装入规定位置,型号标记要易见且方向也尽量一○

24

致。要求焊接一种规格后再焊接另一种规格。

2电容的焊接:按图将电容准确装入规定位置,并注意有极性电容的极性方向不○

能错。电容上的型号标记要易见见且方向也尽量一致。电解电容要紧靠PCB板,不可悬浮。

○3二极管的焊接:正确辨认正负极性后按要求装入规定位置,型号标记要易见,焊接时间尽量可能短。

○4三极管的焊接:正确辨认各引脚后按要求装入规定位置,型号标记要易见,焊接时间尽可能短。

○5 场效应管的焊接:正确辨认各引脚后按要求装入规定位置,焊接时间尽可能短。需要加散热片的,将接触面打磨光滑并加硅脂后再紧固。 ○6集成电路(芯片)的焊接:

集成电路(芯片)焊接时,要注意按图纸要求检查型号、焊接位置是否符合要求,焊接时先焊芯片边沿的两只引脚,以便使其定位,然后再从左到右或从上到下进行逐点焊接。焊接时间尽可能短,禁止拉焊。 (2) 焊接质量检查

○1元器件不得有错装、漏装、错联和歪斜松动等。

○2焊点应吃锡饱满,无毛刺、无针孔、无气泡、裂纹、挂锡、拉点、漏焊、碰焊、虚焊等缺陷。

3焊接后电路板上的金属件表面应无锈蚀和其它杂质。 ○

4焊接完成的电路板不得有斑点、裂纹、气泡、发白等现象,铜箔及敷形涂覆层○

不得脱落、不起翘、不分层。

5元器件的引脚或引线表面应渗锡均匀。 ○

25

在完成电路的焊接后,测试之前,一定要先对电路检测,看是否有短路情况出现,

以免芯片损坏。电源输入电压也是关键因素,在供电之前务必用万用表先测量。

4 系统软件设计

在系统软件设计中,我们使用了Keil μVision3,它是2006年1月30日ARM推出全新的针对各种嵌入式处理器的软件开发工具,集成Keil μVision3的RealView MDK开发环境。 RealView MDK开发工具KeilμVision3源自Keil公司。 RealView MDK集成了业内领先的技术,包括Keil μVision3集成开发环境与RealView编译器。支持ARM7、ARM9和最新的Cortex-M3核处理器,自动配置启动代码,集成Flash烧写模块,强大的 Simulation设备模拟,性能分析等功能,与ARM之前的工具包ADS等相比,RealView编译器的最新版本可将性能改善超过20%。Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势,所以我们选择该软件来开发我们的万年历程序。

4.1 万年历软件系统的流程图

图4-1 系统软件流程图

26

当接通电源开始工作后,单片机中的程序开始运行,将对DS18B20进行初始化,以便和单片机芯片达成通信协议。完成初始化后,由于本系统只有一个测温元件,单片机会向其发出跳过RAM指令,接下来便可向其发送操作指令,启动测温程序,测温过程完成后,发出温度转换指令,从而便可将温度转化成数字模式进行显示读取;同时DS1302将读取时分秒星期以及年月日寄存器然后通过液晶显示实时时间、星期及日期;键盘电路中按键可对实时日历时钟进行调整。

4.2 温度信息的采集

通过DS18B20单线总线的所有执行处理都从一个初始化序列开始。初始化序列包括一个由总线控制器发出的复位脉冲和随后由从机发出的存在脉冲:

(1)复位:首先我们必须对DS18B20芯片进行复位,复位就是由控制器(单片机)给DS18B20单总线至少480us的低电平信号。当18B20接到此复位信号后则会在15~60us后回发一个芯片的存在脉冲。

(2)存在脉冲:在复位电平结束之后,控制器应该将数据单总线拉高,以便于在15~60us后接收存在脉冲,存在脉冲为一个60~240us的低电平信号。至此,通信双方已经达成了基本的协议,接下来将会是控制器与18B20间的数据通信。

(3)控制器发送ROM指令:双方打完了招呼之后最要将进行交流了,ROM指令共有5条,每一个工作周期只能发一条,ROM指令分别是读ROM数据、指定匹配芯片、跳跃ROM、芯片搜索、报警芯片搜索。各自功能如下:

Read ROM(读ROM)[33H] (方括号中的为16进制的命令字): 这个命令允许总线控制器读到DS18B20的64位ROM。只有当总线上只存在一个DS18B20的时候才可以使用此指令。

Match ROM(指定匹配芯片)[55H]: 这个指令后面紧跟着由控制器发出了64位序列号,当总线上有多只DS18B20时,只有与控制发出的序列号相同的芯片才能做出反应,其它芯片将等待下一次复位。这条指令适合单芯片和多芯片挂接。

Skip ROM(跳跃ROM指令)[CCH]: 这条指令使芯片不对ROM编码做出反应,在单总线的情况之下,为了节省时间则可以选用此指令。如果在多芯片挂接时使用此指令将会出现数据冲突,导致错误出现。

Search ROM(搜索芯片)[F0H]: 在芯片初始化后,搜索指令允许总线上挂接多

27

芯片时用排除法识别所有器件的64位ROM。

Alarm Search(报警芯片搜索)[ECH]: 在多芯片挂接的情况下,报警芯片搜索指令只对附合温度高于TH或小于TL报警条件的芯片做出反应。只要芯片不掉电,报警状态将被保持,直到再一次测得温度值达不到报警条件为止。

ROM指令为8位长度,功能是对片内的64位光刻ROM进行操作。其主要目的是为了分辨一条总线上挂接的多个器件并作处理。诚然,单总线上可以同时挂接多个器件,并通过每个器件上所独有的ID号来区别,一般只挂接单个18B20芯片时可以跳过ROM指令(注意:此处指的跳过ROM指令并非不发送ROM指令,而是用特有的一条―跳过指令‖)。

(4)控制器发送存储器操作指令:在ROM指令发送给18B20之后,紧接着(不间断)就是发送存储器操作指令了。操作指令同样为8位,共6条,存储器操作指令分别是写RAM数据、读RAM数据、将RAM数据复制到EEPROM、温度转换、将EEPROM中的报警值复制到RAM、工作方式切换。

Write Scratchpad (向RAM中写数据)[4EH]:这是向RAM中写入数据的指令,随后写入的两个字节的数据将会被存到地址2(报警RAM之TH)和地址3(报警RAM之TL)。写入过程中可以用复位信号中止写入。

Read Scratchpad (从RAM中读数据)[BEH]:此指令将从RAM中读数据,读地址从地址0开始,一直可以读到地址9,完成整个RAM数据的读出。芯片允许在读过程中用复位信号中止读取,即可以不读后面不需要的字节以减少读取时间。

Copy Scratchpad (将RAM数据复制到EEPROM中)[48H]:此指令将RAM中的数据存入EEPROM中,以使数据掉电不丢失。此后由于芯片忙于EEPROM储存处理,当控制器发一个读时间隙时,总线上输出―0‖,当储存工作完成时,总线将输出―1‖。在寄生工作方式时必须在发出此指令后立刻超用强上拉并至少保持10MS,来维持芯片工作。

Convert T(温度转换)[44H]:收到此指令后芯片将进行一次温度转换,将转换的温度值放入RAM的第1、2地址。此后由于芯片忙于温度转换处理,当控制器发一个读时间隙时,总线上输出―0‖,当储存工作完成时,总线将输出―1‖。在寄生工作方式时必须在发出此指令后立刻超用强上拉并至少保持500MS,来维持芯片工作。 Recall EEPROM(将EEPROM中的报警值复制到RAM)[B8H]:此指令将EEPROM

28

中的报警值复制到RAM中的第3、4个字节里。由于芯片忙于复制处理,当控制器发一个读时间隙时,总线上输出―0‖,当储存工作完成时,总线将输出―1‖。另外,此指令将在芯片上电复位时将被自动执行。这样RAM中的两个报警字节位将始终为EEPROM中数据的镜像。

Read Power Supply(工作方式切换)[B4H]:此指令发出后发出读时间隙,芯片会返回它的电源状态字,―0‖为寄生电源状态,―1‖为外部电源状态。

存储器操作指令的功能是命令18B20作什么样的工作,是芯片控制的关键。 (5)执行或数据读写:一个存储器操作指令结束后则将进行指令执行或数据的读写,这个操作要视存储器操作指令而定。

DS18B20需要严格的协议以确保数据的完整性。协议包括几种单线信号类型:复位脉冲、存在脉冲、写0、写1 、读0和读1。所有这些信号,除存在脉冲外,都是由总线控制器发出的。和DS18B20间的任何通讯都需要以初始化序列开始。一个复位脉冲跟着一个存在脉冲表明DS18B20已经准备好发送和接收数据(适当的ROM命令和存储器操作命令)。

DS18B20的复位时序:

图4-2 DS18B20复位时序图 DS18B20的读时序:

对于DS18B20的读时序分为读0时序和读1时序两个过程。对于DS18B20的读时隙是从主机把单总线拉低之后,在15us之内就得释放单总线,以让DS18B20把数据传输到单总线上。DS18B20在完成一个读时序过程,至少需要60us才能完成。

29

图4-3 DS18B20读时序图 DS18B20的写时序:

对于DS18B20的写时序仍然分为写0时序和写1时序两个过程。对于DS18B20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us到45us之间能够正确地采样IO总线上的―0‖电平,当要写1时序时,单总线被拉低之后,在15us之后就得释放单总线。

图4-4 DS18B20写时序图 4.3 时钟的读取

4.3.1 DS1302控制字节的说明

控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302 中位6 如果为0,则表示存取日历时钟数据,为1 表示存取RAM数据;位5至位1 指示操作单元的地址;最低有效位(位0)如为0 表示要进行写操作,为1 表示进行读操作,控制字节总是从最低位开始输出。

30

图4-5 DS1302控制字节

4.3.2 DS1302时间日期寄存器及相应位定义

表4-1为DS1302时间寄存器信息:

表4-1 DS1302时间日期寄存器

4.3.3 DS1302数据的输入和输出

在控制指令字输入后的下一个SCLK 时钟的上升沿时数据被写入DS1302,数据输入从低位即位0 开始。同样,在紧跟8 位的控制指令字后的下一个SCLK 脉冲的下降沿读出DS1302 的数据,读出数据时从低位0 位至高位7。

图4-6 DS1302的时序

31

4.3.4 DS1302读写部分(程序)部分

DS1302读写模块与单片机进行数据交换时,先有STC89C52向电路发出命令字节,命令字节的最高位MSB(D7)必须为逻辑1,如果D7=0,则禁止写DS1302,即写保护;如果D6=0,指定时数据,D6=1,指定RAM数据;D5~D1指定输入的寄存器;最低位MLB(D0)为逻辑0,指定写操作(输入),=1,指定读操作(输出)。 若进行单字节传送,8位命令字节传送结束后,在下另一个SCLK周期的上升沿输入数据字节,或在下八个SCLK周期的下降沿输出数据字节。

开始复位关闭变量初始化关闭DS1302写保护写入DS1302地址复位关闭延时DS1302地址写入读地址的数据读出延时地址增加向该地址写入数据地址增加数据读完否?NYN数据写完否?Y显示数据

图4-7 DS1302读写程序模块流程图

4.4 温度的显示控制

当所测温度从DS18B20输送到单片机上之后,下一步就是要将其在液晶显示器

32

上显示出来。

首先对液晶进行初始化,液晶显示器12864的初始化过程如下:

先将复位引脚置高位即RST=1、数据传输方式设为并口方式即PSB=1(在设计中,我们将LCD的该引脚接VCC),然后将指令集调到基本指令集上来即写指令30H,再将显示打开、关光标、清除液晶里先前的显示内容即分别写指令0CH、01H,写指令时需分别延时5ms。

然后就是数据的传送过程,要使数据在液晶显示器上显示必须要按照其读写操作时序来进行,其读、写操作时序图为:

写操作时序:

图4-8 12864 液晶显示器写时序图 读操作时序:

33

图4-9 12864液晶显示器读时序图

4.5 键盘模块

键盘模块的软件程序相对于温度模块和时钟模块比较简单。键盘模块的设计,关

键是消陡。通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。按键的消抖,可用硬件或软件两种方法。因为硬件消抖需要添加额外的硬件,故这里我们采用软件消抖。

软件方法去抖,即检测出键闭合后执行一个延时程序,5ms~10ms的延时,让前

沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序。

4.6 蜂鸣器模块

蜂鸣器模块的设计,主要是让单片机产生一定频率的电流信号,在我们的设计中,

使用单片机通过程序输出方波信号,来产生蜂鸣器需要的信号,当闹钟定时结束时,就可以调用蜂鸣器程序,让蜂鸣器发出声音。当然,我们的万年历再开机时会提醒用户是否开启按键时,蜂鸣器是否声音提醒,实现的方法是:我们在蜂鸣器中设置了flag

34

标志位,当开机时,用户的选择会赋给flag标志位,从而由单片机判断是否让蜂鸣器工作,为了记录用户的选择,我们将flag标志位放在了DS1302的空闲寄存器中,以保证用户的选择不会因为系统的掉电而消失,当系统重新上电时,系统还可以恢复用户的选择。

5 设计总结

在硬件电路焊接和软件程序设计分别完成的基础之上,进行软硬件的结合与调试。通过下载将在电脑上已完成的程序下载到单片机芯片中。在调试中发现软件中存在的问题,及时解决问题,确保系统能正常工作并达到设计要求。通过反复的调试与实验,可以证明该系统能够较好地完成设计所需的基本要求。即能够正确的显示万年历。

在完成软件系统时,刚开始我是用的是11.0592M的晶振,所有器件正常,后来我换了12M的晶振,结果温度就不正常了,经过认真排查才发现是由于DS18B20在数据读取时,对时间要求很精确,由于晶振的不同造成了读数据的错误,经过这次调试,让我更清晰的认识到了时序对元器件的重要性。在设计中,因为考虑到闹钟定时功能,我们希望我们设置的闹钟时刻不会因为系统的掉电而丢失,考虑到DS1302是有锂电池作为电源的,不会因为主系统掉电丢失内部数据,所以我们将闹钟的定时时刻放到了DS1302内的空余寄存器里面,像这些灵活的技巧就需要我们认真的阅读元件的数据手册,从中索取对自己有用的信息。

经过万年历的设计,让我学到了很多,让我认识到了学习基础知识的重要性,当设计完整的系统时,要考虑到硬件和软件两者的结合,有时硬件的不足,我们可以用软件程序来弥补,从而节约硬件成本,在设计软件程序时要模块化,可以提高程序的可读性。

35

致 谢

在论文即将完成之际,我要特别感谢我的指导老师董承廷老师对我的热情关怀和细心指导。在我做毕业设计的整个过程中,董老师都以他最大的可能来帮助我,教导我,跟着董老师做毕业设计,我学会了好多东西,这些都对我未来的工作和生活产生重大的影响。他不仅仅是我们学术上的良师,更是生活中的益友。他以一个教育工作者热忱的心胸不厌其烦地指导着我们,教育者我们,使我们不仅学到了扎实的专业知识,更学到了做人的道理。他孜孜不倦悉心细致的教诲和严谨治学一丝不苟的工作作风使我永远都不能忘记。在此,特向他表示真诚的感谢。祝董老师身体健康,桃李满天下。

同时,在我四年的大学生活中,也得到了很多老师、同学、朋友的支持和帮助,在此一并表示感谢,正是由于你们,才使我的大学生活更加丰富多彩,感谢你们。

最后,感谢我即将离开的母校——西亚斯,你使我的心灵得到了升华;你使我的思维更加成熟,你是我生命的归宿,是我成长的阶梯,在你的培养下我成功的从学校走进了社会。感谢你,西亚斯。

36

参考文献

[1] 李群芳,肖看.单片机原理、接口及应用.北京:清华大学出版社,2007 [2] 谭浩强.C语言程序设计.北京:清华大学出版社,2006

[3] 张义和,王敏男,许宏昌等.例说51单片机.北京:人民邮电出版社,2008

[4] 刘坤,宋戈,赵红波等.51单片机C语言应用技术开发技术大全.北京:人民邮电出版社,2008 [5] 白延敏.51单片机典型系统开发实例精讲.北京:电子工业出版社,2009 [6] 周丽娜.Protel99SE电路设计技术.北京:中国铁道出版社,2009

[7] 王为青,程国钢.单片机Keil C×51应用开发技术.北京:人民邮电出版社,2007 [8] 江志红.51单片机技术与应用系统开发案例精选.北京:清华大学出版社,2009

[9] Muhammad Ali Mazidi,Janice Gillispie,Rolin Mckinlay.The 8051 Microcontroller and Embedded

Systems:Using Assembly and C,Second Edition.Pearson Education,2006

[10] U. Tietze Ch. Schenk. Electronic Circuits. Handbook for Design and Application, Berlin, New York:

Springer-Verlag,2005

37

附 录

电路原理图:

38

设计主程序:

/****************************************************** STC12C5A60S2读取 DS18B20数据,用 12864显示

********************************************************/ #include #include #include #include #include

#define uchar unsigned char #define uint unsigned int

/********************************************************* 12864程序部分

*********************************************************/ sbit rs_12 = P3^6; //rs为H dat 为显示数据 rs为L dat为显示指令数据 sbit rw_12 = P3^7; // rw = 'H',en ='H', dat被写到DB7--DB0;rw ='L',en = 'H-->L'DB7--DB0的数据被写到IR或DR sbit en_12 = P4^0; //使能信号,(sclk) //sbit psb_12 = P2^3; // 并(8位或4位)串口选择标志口 高为并行,低为串行 sbit rst_12 = P0^7; //复位口 低电平有效 sbit bf_12 = P2^7; //忙先检测位 #define dat_12 P2 // 12864并行数据口

/******************************************************* 延迟函数

*******************************************************/ #define DELAY 500 // 按键去抖动延时 void delay1ms(uint x) { uint i,j; for(i=0;i

void delay() { _nop_(); }

/************************************************ 12864 读取忙线状态

************************************************/ void busy_12() {

dat_12 = 0xff;

39

rs_12 = 0; rw_12 = 1; en_12 = 1;

while(bf_12 == 1); en_12 = 0; }

/******************************* 12864 写数据

********************************/ void wr_dat_12(uchar dat) { busy_12(); rs_12 = 1; //数据 rw_12 = 0; //写数据 dat_12 = dat; en_12 = 1; delay(); en_12 = 0; }

/******************************** 12864 写命令

*********************************/ void wr_com_12(uchar com) { busy_12(); rs_12 = 0; //写入命令 rw_12 = 0; dat_12 = com; en_12 = 1; delay(); en_12 = 0; }

/********************************* 12864 指定要显示的坐标

*********************************/ void goto_xy_12(uchar x, uchar y) { if(y==0) wr_com_12(0x80|x); if(y==1)

wr_com_12(0x90|x); if(y==2) wr_com_12((0x80|x)+8); if(y==3)

40

wr_com_12((0x90|x)+8); }

/************************************** 12864 显示字符串

***************************************/ void print_string(uchar *s) { while(*s!='\\0') { wr_dat_12(*s); s++; } }

/**************************************** 12864 清屏

****************************************/ void clear_12( ) { wr_com_12(0x01); //清楚显示 将DDRAM填满―20H‖(空格), //并设定CGRAM位址到位址计数器AC为0 }

/****************************************** 12864 液晶初始化

******************************************/ void init_12( ) { // psb_12 = 1; wr_com_12(0x06); //光标的移动方向 游标右移,DDRAM地址计数器(AC)加1 wr_com_12(0x0c); // 开显示,关游标,正常显示 wr_com_12(0x30); //功能设定:8位接口 clear_12(); }

/********************************************* 18B20程序部分

***********************************************/ uchar temp_buf[5]={1,0,'.',0,'\\0'}; uchar flag; sbit dp = P0^1;

/********************************* 延迟 大约8us

************************************/ void delay_us(uint y) { while (y--)

41

{

_nop_(); _nop_(); } }

/****************************************** DS18B20 初始化

********************************************/ void init_1820() { dp = 1; delay_us(1); //拉高一段时间 dp = 0; delay_us(260); //拉低大约480us dp = 1; while(dp); // 检测是否复位成功或DS18B20是否存在 delay_us(70); dp = 1; }

/*************************************** 写操作,每次写入一个dat

****************************************/ void wr_1820(uchar dat) { uchar i; for(i=0;i<8;i++) { dp = 0; delay_us(1); dp = dat&0x01; delay_us(70); dp = 1; dat = dat>>1; } }

/**************************************** 读操作,每次返回16位数据

******************************************/ uint re_1820() { uchar i; uint dat; for(i=0;i<16;i++) {

42

dp = 0; delay_us(1); dp = 1; if(dp) { dat = (dat>>1)|0x8000; } else dat = dat>>1; dp=1; delay_us(60); } return(dat); }

/***********************************************************

读取温度函数,返回温度的绝对值,并标注flag,flag=1表示负,flag=0表示正 **********************************************************/ uint readtemp() { uint temp; float m; init_1820(); wr_1820(0xcc); wr_1820(0x44); init_1820(); wr_1820(0xcc); wr_1820(0xbe); temp = re_1820(); if(temp > 0xfff) { flag = 1; temp = (~temp)+1; } else { flag = 0; } m = temp*0.0625; temp = m*10+0.5; return(temp); }

/******************************************* 温度读取及处理函数

******************************************/

43

void gettemp() { uint tem; tem = readtemp(); temp_buf[0] = tem/100 + '0'; temp_buf[1] = tem0/10 + '0'; temp_buf[2] = '.'; temp_buf[3] = tem + '0'; temp_buf[4] = '\\0'; }

/******************************************************************** 显示温度函数

********************************************************************/ void print_tem(uchar x,uchar y) { goto_xy_12(x,y); print_string(temp_buf); goto_xy_12(x+2,y); print_string(\℃\}

/******************************************************* DS1302 程序部分

****************************************************/ sbit ds_1302 = P1^0; // 定义数据线 sbit clk_1302 = P4^2; // 定义时钟线 sbit rst_1302 = P1^1; // 定义复位线-

uchar second,minute,hour,year,month,day,week; //定义 秒,分,时,年,月,日 ,星期

uchar date_buf[13] = {'2','0',0,0,'-',0,0,'-',0,0,'\\0' }; // 2011/10/12 为什么后面括号不能缩进呢 uchar time_buf[9] = {0,0,':',0,0,':',0,0,'\\0' }; //24:12:12 uchar week_buf[2] = {'0','\\0'}; //星期

/******************************************************************** 延时x个us

********************************************************************/ void delayus_1302( ) { _nop_(); _nop_(); }

/************************************************ 向DS1302 写数据

**********************************************/ void write_byte1302(uchar dat) { uchar i;

44

clk_1302 = 0; for(i=0;i<8;i++) { ds_1302 = dat&0x01; delayus_1302( ); clk_1302 = 1; delayus_1302( ); clk_1302 = 0; dat = dat>>1; } }

/******************************************************************** 从DS1302 读数据

********************************************************************/ uchar read_byte1302( ) { uchar i,dat; delayus_1302( ); for(i=0;i<8;i++) { dat = dat>>1; if(ds_1302==1) dat = dat|0x80; clk_1302 = 1; delayus_1302( ); clk_1302 = 0; delayus_1302( ); } return dat; }

/*************************************** 向地址DS1302中写数据

入口参数: com命令字, dat 数据

*******************************************/ void write1302(uchar com,uchar dat) { rst_1302= 0; clk_1302 = 0; rst_1302 = 1; delayus_1302( ); write_byte1302(com); write_byte1302(dat); clk_1302 = 1; rst_1302 = 0;

45

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

Top