题目类型:
编号:
毕业设计说明书
题 目:带温度显示功能的电子万年历
学 院: 电子工程与自动化学院 专 业: 测控技术与仪器 学生姓名: 学 号: 指导教师:
职 称:
理论研究 实验研究 工程设计 √ 工程技术研究 软件开发 2011年5月 10日
桂林电子科技大学毕业设计(论文)报告用纸 第 I 页 共4页
摘 要
在当代繁忙的工作与生活中,时间与我们每一个人都有非常密切的关系。为了更好的利用我们自己的时间,我们必须对时间有一个度量,因此产生了钟表还有万年历。传统的钟表体积较大,携带不方便,时间准确性较差。数字化的电子万年历体积小,时间准确,携带方便,已经成为我们生活中不可或缺的必需品。研究万年历对我们的日常生活有重意义。
本设计采用STCS52单片机作为控制核心,功耗小,能在3V的低压工作,电压可选用3至5V电压供电。时钟电路采用了美国DALLAS公司推出的具有涓细电流充电能的低功耗实时时钟电路DS1302。它可以对年、月、日、周日、时、分、秒进行计时,还具有闰年补偿等多种功能。温度传感器电路使用数字芯DS18B20芯片,转换速度快,数据准确。显示电路采用了Nokia5110液晶显示屏,液晶显示屏的显示功能强大,可以显示日期、时间、闹钟和温度。语音电路采用ISD1760,准确播报当前时间和温度且能够整点报时。
最终经检测本设计能够实现时间闹钟可调、可以显示温度、语音提示和液晶显示等基本功能,还实现了夜间关闭LCD液晶显示,按下报时键播报当前语音的创新功能。 关键词:单片机;液晶显示;电子万年历;语音播报
桂林电子科技大学毕业设计(论文)报告用纸 第 2 页 共4页
Abstract
In contemporary busy work and life, time and every one of us has a very close relationship. In order to make better use of our own time, we must have a measure of time, resulting in a clock and calendar. The traditional horological large size, portability, time accuracy is poorer. Digital electronic calendar small volume, time accurate, easy to carry, has become an indispensable in our life necessities. Research calendar to our daily life have heavy significance.
This design USES the STCS52 single chip microcomputer as control core, low consumption in the low-pressure 3V can work, voltage can choose 3 ~ 5V voltage power supply. Clocking circuit using America DALLAS company launched Juan fine with the current charging can DS1302 low-power real-time clock circuit. It can be for year, month, day, week, when, minutes and seconds for timing, but also has a leap year compensation functions. Temperature sensor using a digital circuit, the core DS18B20 chip converting speed, data accuracy. Display circuit adopted Nokia5110 LCD screen, LCD display powerful, can show the date, time, alarm clock and temperature. Voice circuits using ISD1760, accurate reporting current time and temperature and able to strike the hour.
Finally after testing this design can realize the time clock is adjustable, can display temperature, voice prompt and LCD display basic functions, but also achieving the night LCD, press close to strike the key under the current voice broadcasts innovation function.
Key words:one-chip computer; LCD;Electronic calendar; Speech broadcast
桂林电子科技大学毕业设计(论文)报告用纸 第 3 页 共4页
目 录
引言 ..................................................................................................................... 1 1
电子万年历 .................................................................................................. 1
1.1电子万年历概述 ............................................................................................................... 1 1.2 电子万年历设计要求 ...................................................................................................... 1
2 原理以及方案论证 ....................................................................................... 2
2.1 时钟电路 .......................................................................................................................... 2 2.2 温度传感器电路 .............................................................................................................. 2 2.3 语音电路 .......................................................................................................................... 3 2.4 液晶显示电路 .................................................................................................................. 3 2.5 主控芯片 .......................................................................................................................... 3
3 系统硬件设计 ............................................................................................... 4
3.1 主控单片机 ...................................................................................................................... 5 3.2 语音电路 .......................................................................................................................... 5 3.3 液晶显示电路 .................................................................................................................. 8 3.4 温度传感器电路 ............................................................................................................ 12 3.5 时钟电路DS1302 .......................................................................................................... 16 3.6 按键电路 ........................................................................................................................ 19 3.7 蜂鸣器电路 .................................................................................................................... 19
4 电子万年历的软件设计 ............................................................................. 19
4.1 主程序 ............................................................................................................................ 19 4.2 按键处理程序 ................................................................................................................ 23 4.3 整点报时程序 ................................................................................................................ 23 4.4 液晶显示程序 ................................................................................................................ 23 4.5 按键报时程序 ................................................................................................................ 26 4.6 夜晚关闭LCD显示程序 .............................................................................................. 26
5 硬件和软件调试 ......................................................................................... 26
桂林电子科技大学毕业设计(论文)报告用纸 第 4 页 共4页
5.1 硬件调试 ........................................................................................................................ 26 5.2 软件调试 ........................................................................................................................ 27
6 结论 ............................................................................................................. 28 谢 辞 ............................................................................................................... 29 参考文献 ........................................................................................................... 30 附 录1 附 录2
电路图 ............................................................................................ 31 程序设计 ........................................................................................ 38
第 1 页 共 53 页 引言
当前社会,电子技术获得了飞速的发展,在时代的推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
电子产品离我们是如此之近,我们甚至离不开他们。比如说时间管理,就要用到时钟和万年历。时间是一种重要的资源,却无法开拓、积存与取代,每个人的时间都是相同的。时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。
对个人来说,时间管理的品质,是个人的绩效表现,对企业而言,时间管理的品质,是企业整体生产力的状态,其中唯一差別是个人所显示的是人格的成熟度,而企业则是上下不同层次,左右不同部门之间对时间管理的互动效益与效率,立即时间管理制度的好坏,不管个人人与企业,时间永远不断地流动,稍有疏忽就消失了。所以,我要制作一个电子万年历系统,随时提醒人们做好时间的管理。
本文主要介绍电子万年历的系统设计,包括软件和硬件,分几个模块:时钟模块、温度转换模块、液晶显示模块、语音播报模块。另外还说明软件设计的思路,程序结构及流程,通过调试修改,完成了电子万年历的基本要求,即可随意设定起始时间,设置任意时刻闹钟,显示当前日期时间和温度,语音播报等功能。
1 电子万年历
1.1电子万年历概述
随着人们生活水平的提高和生活节奏的加快,对时间的要求越来越高,精准数字计时的消费需求也是越来越多。
二十一世纪的今天,最具代表性的计时产品就是电子万年历,它是近代世界钟表业界的第三次。第一次是摆和摆轮游丝的发明,相对稳定的机械振荡频率源使钟表的走时差从分级缩小到秒级,代表性的产品就是带有摆或摆轮游丝的机械钟或表。第二次是石英晶体振荡器的应用,发明了走时精度更高的石英电子钟表,使钟表的走时月差从分级缩小到秒级。第三次就是单片机数码计时技术的应用(电子万年历),使计时产品的走时日差从分级缩小到1/600万秒,从原有传统指针计时的方式发展为人们日常更为熟悉的夜光数字显示方式,直观明了,并增加了全自动日期、星期、温度以及其他日常附属信息的显示功能,它更符合人们的生活需求!因此,电子万年历的出现带来了钟表计时业界跨跃性的进步„ „ 1.2 电子万年历设计要求
本课题设计的电子万年历系统要求为:
(1)具有数显功能,能显示日期(年月日),时间(时分秒); (2)具有语音播报功能,语音整点报时;
第 2 页 共 53 页 (3)日期、时间可调; (4)具有闹钟预设提醒功能; (5)具有温度测量及显示功能; 拓展功能:
(1)掉电存储功能,可存储掉电前用户时间和闹钟设置; (2)夜间关闭液晶显示;
(3)按报时键报当前时间和温度。
2 原理以及方案论证
2.1 时钟电路
51单片机功能比较强,可以利用单片机的定时计数器来设计电子时钟,例子也有很多,但是要实现时间日期可以调节,还有闹钟提醒功能,编程起来很复杂,使用时钟控制芯片,可以简化程序的设计,故不采用。
DS12C887能够自动产生世纪、年、月、日、时、分、秒等时间信息,其内部又增加了世纪寄存器,从而利用硬件电路解决子“千年”问题;DS12C887中自带有锂电池,外部掉电时,其内部时间信息还能够保持10年之久;对于一天内的时间记录,有12小时制和24小时制两种模式。在12小时制模式中,用AM和PM区分上午和下午;时间的表示方法也有两种,一种用二进制数表示,一种是用BCD码表示;DS12C887中带有128字节 RAM,其中有11字节RAM用来存储时间信息,4字节RAM用来存储DS12C887的控制信息,称为控制寄存器,113字节通用RAM使用户使用;此外用户还可对DS12C887进行编程以实现多种方波输出,并可对其内部的三路中断通过软件进行屏蔽。但是芯片不易获得,所以不能采用该芯片。
DS1302也可以实现时钟的控制功能,该芯片电路的接口简单、价格低廉、使用方便,被广泛地采用。DS1302是DALLAS公司的一种具有涓细电流充电能力的电路,主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。采用普通32.768kHz晶振。主要考虑到芯片的获得比较简单,芯片的功能比较强大,可以实现闰年补偿功能,使用的例子比较多,芯片的使用比较简单,故采用DS1302作为时钟控制电路的芯片。 2.2 温度传感器电路
温度传感器可以使用传统的模拟温度传感器和数字的温度传感器。模拟温度传感器,如热电偶、热敏电阻和RTDS对温度的监控,在一些温度范围内线性不好,需要进行冷端补偿或引线补偿;热惯性大,响应时间慢。故不采用模拟的温度传感器。
DS18B20系列温度传感器是数字式温度传感器,相对于传统温度传感器精度高、稳定性好、电路简单、控制方便,等优点。DS18B20是全数字温度转换及输出,单总线数据通信电路连接简单,电源要求5V即可,最高 12 位分辨率,精度可达土 0.5 摄氏度,
第 3 页 共 53 页 12 位分辨率时的最大工作周期为750毫秒,检测温度范围为–55 °C +125°C,可以实现正常室温的检测。芯片获得比较容易,使用的例子比较多,所以选择后者。 2.3 语音电路
可以实现语音播报的芯片有很多,可以考察apr9600芯片和ISD1760系列。APR9600语音录放芯片,是继美国ISD公司以后采用模拟存储技术的又一款音质好、噪音低、不怕断电、可反复录放的新型语音电路,单片电路可录放32-60秒,串行控制时可分256段以上,并行控制时最大可分8段 。APR9600语音录放芯片资料和使用例子比较少,调试电路搭建很麻烦,故没有采用。
ISD4004系列工作电压3V,单片录放时8至16分钟,音质好。芯片采用CMOS 技术,内含振荡器、防混淆滤波器、平滑滤波器、音频放大器、自动静噪及高密度多电平闪烁存贮陈列。芯片设计是基于所有操作必须由微控制器控制,操作命令可通过串行通信接口(SPI 或Microwire)送入。芯片采用多电平直接模拟量存储技术, 每个采样值直接存贮在片内闪烁存贮器中,因此能够非常真实、自然地再现语音、音乐、音调和效果声,避免了一般固体录音电路因量化和压缩造成的量化噪声和\"金属声\"。使用ISD4004系列芯片可以实现报时功能,但是录音不是很方便,搭建录音调试电路很麻烦,所以没有采用。
ISD1760芯片是华邦公司推出的单片语音录放芯片,该芯片,音质好,价格低,有开发板,录音和调试时候很方便。不仅可以进行按键录音,还可以进行按键播放和SPI控制播放等操作。其中能够进行精确的地址控制分段播放,实现了语音播报时间温度的要求,因此就选择了这款芯片。 2.4 液晶显示电路
考察液晶的显示内容要求,要显示第一行“年、月、日”,第二行“星期几”,第三行“温度”,第四行“闹钟数目”1602液晶不能方便的显示出时间和闹钟,因为是要分几行来显示的,1602只有2行,故不采用。
另外有功能强大的128液晶,可以显示图形、汉字和字符,但是价格比较高,引脚多电路做以来比较复杂,故不采用。
最终选择Nokia5110液晶,改液晶使用简单,功能强大,即可显示图形也可以显示汉字和字符,仅有8个外部引脚,与单片机连接6跟线即可,另外一根接3V电源,还有一根接地即可。程序控制起来也不麻烦,例子也多,进行相应的初始化和写入要显示字符的模值即可显示。 2.5 主控芯片
AVR系列的单片机不仅具有良好的集成性能,而且都具备在线编程接口,其中的Mega系列还具备JTAG仿真和下载功能;含有片内看门狗电路、片内程序Flash、同步串行接口SPI;多数AVR单片机还内嵌了A/D转换器、EEPROM、模拟比较器、PWM定时计数器等多种功能;AVR单片机的I/O接口具有很强的驱动能力,灌人电流可直接驱动继电器、
第 4 页 共 53 页 LED等元件,从而省去驱动电路,节约系统成本。利用Mega16单片机内部时钟作为时间基准,通过软件编程控制可编程器件Mega16,实现秒、分、时、日、月、年的控制,最终通过LCD液晶显示屏显示结果。此外还可以实现时间调整、定时等多种实用功能。整个设计分硬件和软件两大部分。硬件部分采用Mega16单片机作为可编程芯片,1602字符液晶作为信号显示;软件部分利用C语言作为设计语言,对Mega16进行编程实现各种功能。虽然编程的语言可以用C语言,AVR系列单片机也有一定的好处,但是对于AVR单片机的学习要花太多的时间,故没有采用。
ATC51是一种低功耗、高性能的片内含有4KB快闪可编程/擦除只读存储器的8位CMOS微控制器,使用高密度、非易失存储技术制造,并且与80C51引脚和指令系统完全兼容,宽工作电压范围:Vcc可为2.7V到6V,32条可编程I/O线,两个16位定时器/计数器,中断结构具有5个中断源和2个优先级,使用ATC51可以实现主控功能。
STCC51是51系列的单片机,和ATC51的51类似,特点是可以选择倍频,提高速度,比如用的10M的晶振可以倍频工作在20M下,下载程序非常的方便,3条串口线就可以速度还非常的快,使用STCC51也可以实现主控功能。最后使用的是STCC52芯片,因为它具有足够的存储空间。
3 系统硬件设计
语音播报模块 LCD显示模块 DS1302时钟模块 键盘模块 ATS52 主控制模 块 图3.1 电子万年历原理图
本系统主要有主控单片机模块、键盘模块、温度采集模块、语音播报模块、LCD显
温度采集模块 示模块和时钟模块构成。主控单片机为51单片机,负责对系统的控制,循环扫描键盘,实时控制温度的采集,发送语音数据到语音播报模块进行语音播报,控制LCD显示当前时间和温度等内容,接收时钟数据和调节当前时间和闹钟。
键盘模块由按键组成,主要完成时间和闹钟的调节。
温度采集模块有集成电路DS18B20组成,负责测量当前的温度并把得到的温度转换成为数字,把数据传到单片机进行处理。
语音播报模块,由数字芯片ISD1760和外围电路组成,单片机根据处理后的时间和温度数据结果发送相应的控制命令,即可播放准确的当前时间和温度以及闹钟提醒。
LCD显示模块,根据单片机发送过来的命令,显示当前的时间、闹钟和温度信息,
第 5 页 共 53 页 由单片机控制屏幕的亮灭。
DS1302时钟模块,是电子万年历的重要组成部分,由时钟芯片DS1302和外围电路组成,主要功能是完成时钟的运算,有单片机控制时间和闹钟的调节。单片机掉电后,由备用电源给芯片供电,时钟依然运行,保证时间的正确,实现系统的万年历功能。 3.1 主控单片机
STCC52单片机为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3, MCS-51单片机共有4个8位的I/O口(P0、P1、P2、P3),每一条I/O线都能地作输出或输入。
单片机的最小系统如下图3.2所示,18引脚和19引脚接时钟电路,XTAL1接外部晶振和电容的一端,在片内它是振荡器倒相放大器的输入,XTAL2接外部晶振和电容的另一端,在片内它是振荡器倒相放大器的输出.第9引脚为复位输入端,接上电容,电阻及开关后够上电复位电路,20引脚为接地端,40引脚为电源端. 3.2 语音电路
本系统的设计,语音部分采用ISD1760芯片,使用其典型的连接电路,SPI工作模式。ISD1760在系统中的功能是:①准点报时--“现在时间xx点整”,例如“现在时间19点整”;②按下报时键时报--“现在时间xx点xx分xx秒当前问度xx点摄氏度”,例如“现在时间19点20分22秒当前温度22点5摄氏度”。功能的实现原理见软件设计部分。
图3.2 单片机电路 图3.3 语音电路
实际的电路图见图3.2,MISO接单片机P04口,MOSI接P05、SCLK接P06、SS接P07口,其他各引脚经过电容接地是芯片的典型电路连接,使得ISD1760芯片能与主控单片机进行通信和驱动喇叭发出声音,在程序定义的头文件中对单片机的I/O口做如下定义。
sbit isd_ss=P0^1;//数据操作时为低电平 sbit isd_sclk=P0^2;//时钟输入
第 6 页 共 53 页 sbit isd_mosi=P0^3;//数据输入 sbit isd_miso=P0^4;//数据输出 ⑴ ISD1760的特点:
① 两种控制方式,两种录音输入方式,两种放音输出方式; ② 可处理多达255段以上信息;
③ 工作电压:2.4V-5.5V, 最高不能超过6V; ④ 静态电流:0.5 - 1μA; ⑵ 部分管脚说明见附表1。 ⑶ISD1700工作原理:
主控单片机主要通过四线(SCLK,MOSI,MISO,/SS)SPI协议对ISD1700进行串行通信。ISD1700作为从机,几乎所有的操作都可以通过这个SPI协议来完成。与主控单片机通讯时isd_ss先拉低,isd_mosi在上升沿送出数据(主机接收),isd_miso在时钟的下降沿接收数据(主机发数据)。软件部分用 isd_senddata(uchar dd)函数进行对1760芯片操作。使用isd_setplay(uint s,uint e)函数实现制定地址录音播放。使用命令SET_PLAY,SET_REC,SET_ERASE命令允许用户指定录音、放音和擦除的开始和结束地址。
⑷SPI协议总述
ISD1700系列的SPI串行接口操作遵照以下协议: ①一个SPI处理开始于/SS管脚的下降沿。
②在一个完整的SPI 指令传输周期,/SS管脚必须保持低电平。
③数据在SCLK的上升沿锁存在芯片的MOSI管脚,在SCLK的下降沿从MISO管脚输出,并且首先移出低位。
④SPI指令操作码包括命令字节,数据字节和地址字节,这决定于1700的指令类型。 ⑤当命令字及地址数据输入到MOSI管脚时,同时状态寄存器和当前行地址信息从MISO管脚移出。
⑥一个SPI处理在/SS变高后启动。
⑦在完成一个SPI命令的操作后,会启动一个中断信息,并且持续保持为低,直到芯片收到CLR_INT命令或者芯片复位。
⑸SPI处理的格式
指令数据以数据队列的形式从MOSI移入芯片,第一个移入的字节是命令字节,这个字节决定了紧跟其后的数据类型。与此同时,芯片状态以及当前行地址信息以数据队列的方式通过MISO被返给主机。
⑹MOSI数据格式
MOSI是SPI接口的“主机输出从机接收端”。数据在SCLK的上升沿锁存进芯片, 并且低位首先移出。1700的SPI指令格式依赖于命令的类型,根据不同类型的命令, 指令可能是两个字节,也可能多达7个字节。MOSI的一般序列由下表列出,送到芯片的第
第 7 页 共 53 页 一个字节是命令字节, 这个字节确定了芯片将要完成的任务。其中命令字节的 C4 确定LED功能是否被激活。当C4=1 ,LED指示被开启,功能开启后,每一个SPI指令启动后,LED灯会闪亮一下。在命令字节之后,与之相关联的数据字节有可能包括对用来存储信息进行精确操作的起始和结束地址。
⑺MISO数据格式
MISO即1700S的“主机接收从机发送”管脚,数据在SCLK的下降沿从MISO管脚输出,并且低位首先移出。对应每一个指令,MISO会伴随着指令码的输入,在前两个字节返回芯片当前的状态和行地址信息。而RD_STATUS,RD_PLAY_PNTR , RD_REC_PNTR和RD_APC这些命令会在前两个字节之后产生额外的信息(见下边的细节说明)。在输出信息中,第一字节的状态位提供了重要的信息,该信息标明了上一个SPI命令发送后的结果。例如,第一字节中的0位(command error bit)用来指示芯片是否接收了上一个SPI命令。而地址位则给出了当前地址。第一和第二个数据字节的内容取决于上一个SPI命令。第五,第六和第七字节则是重复SR0状态寄存器的内容。 ⑻ SPI协议格式 在SPI命令输入到ISD1700前,SPI端口的状态应该保持如下状态: /SS=HIGH ; SCLK=HIGH; MOSI=LOW
图3.4 SPI时序图
⑼ISD1700芯片内部寄存器这些寄存器可以返回1700芯片的内部状态,下边将描述每个寄存器的数据模式:
① Status Register0(SR0)状态寄存器SR0是两字节数据,由MISO返回。它包括5个状态位(D4:D0以及11个地址位(A10:A0) ②Status Register1(SR1)见附表4。 ③APC( 模拟通道寄存器 ) 见附表2。 ⑽1760SPI 部分指令见附表3。 ⑾ISD1760的存储结构
第 8 页 共 53 页 环形存储结构管理系统管理的地址是0x10到末地址,0x00至0x0f为SE的地址。 当地址指针指到末地址后,会自动跳到0x10。在此管理系统下录音段之间是连续存放的,但首地址与末地址之间至少有一个空地址间隔来让系统区分首末地址。在SPI模式下,用户可对任意地址进行操作,但若不按管理系统的方式存储或擦除录音段,在按键模式下将不能操作。
表3.1状态寄存器SR0
SR0 第一字节 名称 A2 A1 A0 INT 位 7 6 5 4 3 2 1 EOM PU FULL 0 CMD_ERR 描述 当前行地址bit2 当前行地址bit1 当前行地址bit0 当一个操作完成时,该位置1,可被CLR_INT命令清除 当检测到EOM时此位置1,可被CLR_INT命令清除 当芯片在SPI模式中上电后,此位置1 此位置1表示存储区已满。芯片不能再录任何信息,除非旧的信息被删除。此位只有遵循按键模式的存储体系才有效 此位置1表示上一个SPI命令无效 表3.2状态寄存器SR0 SR0 第二字节 名称 A10 A9 A8 A7 A6 A5 A4 A3 位 15 14 13 12 11 10 9 8 3.3 液晶显示电路
描述 当前行地址bit10 当前行地址bit9 当前行地址bit8 当前行地址bit7 当前行地址bit6 当前行地址bit5 当前行地址bit4 当前行地址bit3 第 9 页 共 53 页 本设计使用Nokia5110液晶,由PCD8544 CMOS LCD控制驱动器驱动,实现的功能是:①在模式1、2、3、4下的显示,具体如下图所示;②在夜间且无按键按下时关闭LCD。
2011-5-1212:20:32星期一23.4 CAlarm:1 on模式1时间设置2011-5-1210:34:55模式2闹 钟1 14:10:34 on2 15:20:33 on3 22:33:56 off模式3闹钟设置1 14:10:34 on2 15:20:33 on3 22:33:56 off模式4 图3.5 显示模式图
工作原理:设计电路图和实物图如下图3.6和图3.7所示。7号管脚控制液晶的背光,P1.0为高电平,液晶不背光;为低电平,液晶背光;6号管脚接3V电压,有稳压LM317提供;PCD8544是一块低功耗的CMOS LCD控制驱动器,设计为驱动48行84列的图形显示。所有必须的显示功能集成在一块芯片上,包括LCD电压及偏置电压发生器,只须很少外部元件且功耗小。PCD8544与微控制器的接口使用串行总线。程序设计时使用水平水平寻址模式(V=0),X地址在每个字节之后递增,经最后的X地址(X=83)之后,X绕回0,Y递增到下一行的地址。经每一个最后地址之后(X=83,Y=5),地址指针绕回地址(X=0,Y=0)。写入命令对显示进行设置,写入相应的字符或汉字的数据设置显示内容。对芯片的写操作见按照传送1个字节串行总线协议 。
其他管脚做如下定义,定义完了在程序中使用,有关液晶的初始化,清屏操作,显示操作,在程序中都有详细的体现,请参考附件程序相应部分—-Nokia_5110.c。下面是有关PCD8544的介绍。
图3.6 液晶实际管脚连接图 图3.7 液晶实物图 sbit SCLK = P1^1; sbit SDIN = P1^2;
// pin 2 时钟输入 // pin 3 数据输入
sbit LCD_DC =P1^3; // pin 4 输入命令时是低电平,输入数据时是高电平
第 10 页 共 53 页 sbit LCD_CE =P1^4; // pin 5 下降沿时开始数据传输
sbit LCD_RST = P1^5; // pin 9 复位信号端
sbit LCD_BLK=P1^0; //背光控制端,夜晚来临且没有按键按下,关闭LCD显示 PCD8544驱动有以下特征: ⑴单芯片LCD控制/驱动 ⑵48行,84列输出 ⑶显示数据RAM48*84位
⑷芯片集成:LCD电压发生器(也可以使用外部电压供应)、LCD偏置电压发生器、振荡器不需要外接元件(也可以使用外部时钟) ⑸外部RES(复位)输入引脚 ⑹串行界面最高4.0Mbits/S ⑺混合速率:48
⑻逻辑电压范围VDD到VSS:2.7V~3.3V
⑼显示电压范围VLCD到VSS:6.0~8.5V LCD内部电压发生器(充许电压发生器6.0~9.0V LCD外部电压供应(电压发生器关闭)
引脚功能描述:
(1)VSS1,VSS2:负电源供应,VSS和VSS2必须连接在一起; (2)VDD1,VDD2:正电源供应,VDD和VDD2必须连接在一起;
(3)VLCD1,VLCD2: LCD电源供应,液晶显示器正电源,VLCD1和VLCD2必须连接在; (4)SDIN:串行数据线,输入数据线;
(5)SCLK: 串行时钟线 ,输入时钟信号: 0.0~4.0Mbits/s.; (6)D/C: 模式选择,输入:选择命令/地址或输入数据; (7)SCE: 芯片使能,使能引脚充许输入数据,低电平有效。 (8)RES:复位此信号会复位设备,应用于初始化芯片。低电平有效。
部分功能描述 :
①地址计数器((AC)):地址计数器为写入显示数据存储器指定地址。X地址X6~X0和Y地址Y2~Y0分别设置。写入操作之后,地址计数器依照V标志自动加1.
②显示数据存储器((DDRAM)):DDRA是存储显示数据的48*84位静态RAM。RAM分为6排,每84字节(6*8*84位)。访RAM期间,数据通过串行接口传输。这里X地址与列输出号码直接通信。
③显示地址计数器:通过列输出,LCD点矩阵RAM数据行连续移位产生显示。显示状态(所有点开/关和正常/反转映象)通过‘显示控制’命令的E、D位来设置。
④寻址:数据以字节为单位下载到PCD8544的48*84位显示数据RAM矩阵。列通过地址指针寻址,地址范围为:X0~83(1010011),Y 0~5(101)。地址不充许超出这个范围。
第 11 页 共 53 页 在水平寻址模式(V=0),X地址在每个字节之后递增, 经最后的X地址(X=83)之后,X绕回0,Y递增到下一行的地址。经每一个最后地址之后(X=83,Y=5),地址指针绕回地址(X=0,Y=0)。
图3.8 水平寻址方式
⑧温度补偿:由于液晶体的温度依赖,在低温时必须增加LCD控制电压VLCD来维持对比度。在PCD8544,VLCD的温度系数可以通过设置TC1和TC0位来选择四个值
指令见附表5:
指令格式分为两种模式:如果D/C(模式选择)置为低,当前字解释为命令字节。置D/C置为高,接下来的字节将存储到显示数据RAM。每一个数据字存入之后,地址计数自动递增。在数据字节最后一位期间会读取D/C号的电平。
每一条指令可用任意次序发送到PCD8544。首先传送的是字节的(高位)。C高时,串行接口被初始化。在这个状态,SCLK时钟脉冲不起作用,行接口不消耗电力。SCE上的负边缘使能串行接口并指示开始数据输。
当SCE为高时,忽略SCLK时钟信号;在SCE为高期间,串行接口被初始化;SDIN 在SCLK的正边沿取样;D/C 指出字节是一个命令(D/C = 0)或是一个RAM数据(D/C = 1);它在第八个SCLK脉冲被读出;在命令/数据字节的最后一位之后,如果SCE为低,串行接口在下一个SCLK正边缘等待下一个字节的位7;
RES端的复位脉冲中断传输。数据不会写进RAM。寄存器被清除。如果在RES正边缘之后SCE为低,串行接口准备接收命令/数据字节的位7。
第 12 页 共 53 页
图3.9串行总线复位功能(SCE)
图3.10 串行总线复位功能(RES)
图3.11 串行总线协议—传送1个字节
3.4 温度传感器电路
采用数字式温度传感器DS18B20。DS18B20具有测量精度高,电路连接简单特点,仅需要一条数据线进行数据传输,使用P0.0与DS18B20的I/O口连接加一个上拉电阻,Vcc接电源,Vss接地。DS18B20是单总线数据传输格式,硬件连接时,接VCC和GND,单片机对其进行操作时候,使用DQ引脚。
第 13 页 共 53 页 若要读出当前的温度数据我们需要执行两次工作周期,第一个周期为复位、跳过ROM指令、执行温度转换存储器操作指令、等待500uS温度转换时间。紧接着执行第二个周期为复位、跳过ROM指令、执行读RAM的存储器操作指令、读数据(最多为9个字节,中途可停止,只读简单温度值则读前2个字节即可)。
DS18B20 的主要特征: ⑴全数字温度转换及输出; ⑵先进的单总线数据通信;
⑶最高12位分辨率,精度可达土 0.5 摄氏度;
18B20共有三种形态的存储器资源,它们分别是:
ROM只读存储器,用于存放DS18B20ID编码,其前8位是单线系列编(DS18B20的编码是19H),后面48位是芯片唯一的序列号,最后8位是以上56的位的CRC码(冗余校验)。数据在出产时设置不由用户更改。DS18B20共位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都存在镜像,以方便 用户操作。
控制器对18B20操作流程:
(1)复位:首先我们必须对DS18B20芯片进行复位,复位就是由控制器(单片机) 给DS18B20单总线至少480uS的低电平信号。当18B20接到此复位信号后则会15~60uS后回发一个芯片的存在脉冲。
(2)存在脉冲:在复位电平结束之后,控制器应该将数据单总线拉高,以便于在 15~60uS后接收存在脉冲,存在脉冲为一个60~240uS的低电平信号。至此,通信双方已经达成了基本的协议,接下来将会是控制器与18B20间的数据通信。如果复位低电平的时间不足或是单总线的电路断路都不会接到存在脉冲,在设计时要注意意外情况的处理。
(3)控制器发送ROM指令:双方打完了招呼之后最要将进行交流了,ROM指令共有5条,每一个工作周期只能发一条,ROM指令分别是读ROM数据、指定匹配芯片、跳跃ROM、芯片搜索、报警芯片搜索。ROM指令为8位长度,功能是对片内的位光刻ROM进行操作。 其主要目的是为了分辨一条总线上挂接的多个器件并作处理。诚然,单总线上可以同时挂接多个器件,并通过每个器件上所独有的ID号来区别,一般只挂接单
⑷检测温度范围为–55 °C ~+125°C (–67°F~+257°F) ;
第 14 页 共 53 页 个18B20芯片时可以跳过ROM 指令(注意:此处指的跳过ROM指令并非不发送 ROM 指令,而是用特有的一条“跳过指令”)。ROM指令在下文有详细的介绍。
(4)控制器发送存储器操作指令:在ROM指令发送给18B20之后,紧接着(不间断)就是发送存储器操作指令了。操作指令同样为8位,共6条,存储器操作指令分别是写RAM数据、读RAM数据、将RAM数据复制到EEPROM、温度转换、将EEPROM中的报警值复制到RAM、工作方式切换。存储器操作指令的功能是命令18B20作什么样的工作,是芯片控制的关键。
(5)执行或数据读写:一个存储器操作指令结束后则将进行指令执行或数据的读写,这个操作要视存储器操作指令而定。如执行温度转换指令则控制器(单片机) 必须等待18B20执行其指令,一般转换时间为 500uS。如执行数据读写指令则需要严格遵循18B20的读写时序来操作。数据的读写方法将有下文有详细介绍。
DS28B20芯片ROM指令表:
Skip ROM(跳跃 ROM 指令)[CCH] 这条指令使芯片不对ROM编码做出反应,在单总线的情况之下,为了节省时间则可以选用此指令。如果在多芯片挂接时使用此指令将会出现数据冲突,导致错误出现。
DS28B20 芯片存储器操作指令:
Write Scratchpad (向 RAM 中写数据) [4EH] 这是向RAM中写入数据的指令, 随后写入的两个字节的数据将会被存到地址2(报警RAM之TH)和地址3(报警RAM之TL)。写入过程中可以用复位信号中止写入。
Read Scratchpad (从 RAM 中读数据) [BEH] 此指令将从RAM中读数据,读地址从地址0开始,一直可以读到地址9,完成整个RAM数据的读出。芯片允许在读过程中用复位信号中止读取,即可以不读后面不需要的字节以减少读取时间 。
Convert T (温度转换) [44H] 收到此指令后芯片将进行一次温度转换,将转换的温度值放入 RAM 的第1、2地址。此后由于芯片忙于温度转换处理。当控制器发一个读时间隙时,总线上输出“0”,当储存工作完成时,总线将输出“1”。在寄生工作方式时必须在发出此指令后立刻超用强上拉并至少保持500MS,来维持芯片工作。
DS18B20复位及应答关系示意图:
图3.12 DS18B20复位及应答关系示意图
第 15 页 共 53 页 每一次通信之前必须进行复位,复位的时间、等待时间、回应时间应严格按时序编程。
DS18B20 读写时间隙:DS18B20的数据读写是通过时间隙处理位和命令字来确认信息交换的。
图3.13 写时间隙
写时间隙分为写“0”和写“ 1”,时序如图图3.13。在写数据时间隙的前15uS总线需要是被控制器拉置低电平,而后则将是芯片对总线数据的采样时间,采样时间在 15~60uS ,采样时间内如果控制 器将总线拉高则表示写“1”,如果控制器将总线拉低则表示写“0”。每一位的发送都应该有一个至少15uS的低电平起始位,随后的数据“0”或“1”应该在45uS内完成。整个位的发送时间应该保持在60~120uS,否则不能保证通信的正常。
读时间隙时控制时的采样时间应该更加的精确才行,读时间隙时也是必须先由主机产生至少 1uS 的低电平,表示读时间的起始。随后在总线被释放后的15uS中 DS18B20会发送内部数据位,这时控制如果发现总线为高电平表示读出“1”,如果总线为低电平则表示读出数据“0”。每一位的读取之前都由控制器加一个起始信号。注意:如图3.14所示,必须在读间隙开始的15uS内读取数据位才可以保证通信的正确。在通信时是以8位“0”或“1”为一个字节,字节的读或写是从高位开始的,即A7到A0.字节的读写顺序也是自上而下的。
图3.14 读时间隙
第 16 页 共 53 页
图3.15 DS1302和DS18B20实际连接图
3.5 时钟电路DS1302 时钟电路工作原理是:
DS1302在每次进行读、写程序前都必须初始化,先把SCLK端置“0”,接着把RST端置“1”,最后才给予SCLK脉冲;读/写时序如下图3.17所示。考察DS1302的控制字,此控制字的位7必须置1,若为0则不能把对DS1302进行读写数据。对于位6,若对程序进行读/写时RAM=1,对时间进行读/写时,CK=0。位1至位5指操作单元的地址。位0是读/写操作位,进行读操作时,该位为1;该位为0则表示进行的是写操作。控制字节总是从最低位开始输入/输出的。表3.3为DS1302的日历、时间寄存器内容:“CH”是时钟暂停标志位,当该位为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位为0时,时钟开始运行。“WP”是写保护位,在任何的对时钟和RAM的写操作之前,WP必须为0。当“WP”为1时,写保护位防止对任一寄存器的写操作。
系统设计的时候,实现了时间和闹钟可以调节,并有闹钟提示功能。不仅有主电源,还添加了备用电源,备用电源实现了时钟的掉电正常运行功能,实现的原理是,备用电源使芯片的晶振在没有主电源供电时起振,时钟依然运行,所以时间没有停止,主电源开启时液晶显示出正确的时间和闹钟。
利用芯片本身的闰年补偿功能和月小与31天时可以自动调整功能,加上星期自动调整函数,实现时间的正确运行和显示。
把闹数据写入芯片中的RAM区,并实时读出当前的时间,若2者是想等的,则闹钟来临,驱动蜂鸣器发出提示声音。对RAM写入不同的闹钟数据,实现了闹钟的调节。
关于DS1302 :
DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加 31 字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和 RAM 数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.5 ~ 5.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后备电源进行涓细电流充电的能力。
第 17 页 共 53 页 各引脚的功能为:
Vcc1:主电源;Vcc2:备份电源。当Vcc2>Vcc1+0.2V 时,由Vcc2向DS1302供电,当 Vcc2< Vcc1时,由Vcc1向DS1302供电。
SCLK:串行时钟,输入,控制数据的输入与输出; I/O:三线接口时的双向数据线;
CE: 输入信号,在读、写数据期间,必须为高。该引脚有两个功能:第一,CE开始控制字访问移位寄存器的控制逻辑;其次,CE提供结束单字节或多字节数据传输的方法。
DS1302 有下列几组寄存器:
DS1302有关日历、时间的寄存器共有12个,其中有7个寄存器(读时81h~ 8Dh, 写时80h~8Ch),存放的数据格式为BCD码形式,如下表所示。
表3.3 DS1302寄存器
小时寄存器(85h 、84h)的位7用于定义DS1302是运行于12小时模式还是24小时模式。当为高时,选择12小时模式。在12小时模式时,位5是,当为1时,表示PM。在24小时模式时,位5是第二个10小时位。秒寄存器(81h、80h)的位7定义为时钟暂停标志(CH)。当该位置为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位置为0时,时钟开始运行。
控制寄存器(8Fh 、8Eh)的位7是写保护位(WP),其它7位均置为0。在任何的对时钟和RAM的写操作之前,WP位必须为0。当WP位为1时,写保护位防止对任一寄存器的写操作。
DS1302 ②有关RAM的地址
DS1302 中附加31字节静态 RAM 的地址如下表所示。
表3.4 DS1302RAM的地址 读地址 C1H C3H C5H 写地址 C0H C2H C4H 数据范围 00-FFh 00-FFh 00-FFh 第 18 页 共 53 页 … FDH … FCH …. 00-FFh 读写时序说明
DS1302是SPI总线驱动方式。它不仅要向寄存器写入控制字,还需要读取相应寄存器的数据。要想与DS1302通信,首先要先了解DS1302的控制字。DS1302的控制字如表3.5。控制字总是从最低位开始输出。在控制字指令输入后的下一个SCLK时钟的上升沿时, 数据被写入DS1302,数据输入从最低位(0位)开始。同样,在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据,读出的数据也是从最低位到最高位。数据读写时序如下图3.16。
表3.5 DS1302的控制字
图3.16 DS1302单字节读/写
电路原理图 :
电路原理图见附件原理图,DS1302与单片机的连接也仅需要3条线:CE引脚、SCLK 串行时钟引脚、I/O串行数据引脚,Vcc2为备用电源,外接32.768kHz晶振,为芯片提供计时脉冲。本系统的实际设计请看图3.15,对引脚进行如下定义,程序代码请看附件程序。
sbit T_CLK = P3^3; /*实时时钟时钟线引脚 */ sbit T_IO = P3^4; /*实时时钟数据线引脚 */
第 19 页 共 53 页 sbit T_RST = P3^5; /*实时时钟复位线引脚 */ 3.6 按键电路
本系统实际设计的单片机输入按键,连接P2口,在程序的设计中有如下定义: 修改键(也是左键):用于输入新的时间或新的闹钟时间; 报时键:按键播报当前时间和温度;
模式键:修改显示模式,通过上、下、左、右键对日期、时间、闹钟进行调节; 上、下、左、右键:调整时间和闹钟的时候使用; OK键:确定修改和输入的时间或闹钟的值; 取消键:取消修改和操作;
单片机检测按键原理是:单片机的I/O口既可以作为输出也可以作为输入使用,当检测按键的时候用的是它的输入功能,把按键的一端接地,另一端和单片机的P2口相连,开始的时候先给P2口赋一个高电平,然后让单片机不停的检测P2口(或P2口的某一位)是否变为低电平,当按键闭合时,即相当于P2口(或P2口的某一位)通过按键与地相连,变成低电平,程序一旦检测到P2口(或P2口的某一位)变低电平则说明按键按下,然后执行相应的按键处理程序。按键判断和按键处理程序都在程序附件中,在此处不详述。 3.7 蜂鸣器电路
蜂鸣器连接到单片机的P0口地7位,当闹钟到来时,送一个低电平到P07,蜂鸣器发出报警提示声音,按任意键退出报警。
4 电子万年历的软件设计
电子万年历系统设计使用单片机C语言来进行。作为一种结构化的程序设计语言,C语言的特点就是可以使你尽量少地对硬件进行操作,具有很强的功能性、结构性和可移植性,常常被优选作为单片机系统的编程语言。
用C 编写程序比汇编更符合人们的思考习惯,开发者可以摆脱与硬件无必要的接触,更专心的考虑功能和算法而不是考虑一些细节问题,这样就减少了开发和调试的时间。C语言具有良好的程序结构,适用于模块化程序设计,因此采用C语言设计单片机应用系统程序时,首先要尽可能地采用结构化的程序设计方法,将功能模块化,由不同的模块完成不同的功能,这样可使整个应用系统程序结构清晰,易于调试和维护。不同的功能模块,分别指定相应的入口参数和出口参数,对于一些要重复调用的程序一般把其编成函数,这样可以减少程序代码的长度,又便于整个程序的管理,还可增强可读性和移植性。
为了能更清楚的介绍本系统,本文将对主程序和重要的子程序进行介绍并附加对应的程序流程图。 4.1 主程序
单片机上电的时候,先初始化ISD176、液晶初始化,读DS1302是否运行,不运行
第 20 页 共 53 页 则设置默认时间运行它同时读出闹钟的数据,系统初始化。完成以上操作之后,让程序在以下的动作中循环:
读DS1302的时间,读DS18B20温度,扫描键盘,按键处理,实时报时标志置1的话就报时,整点报时判断整点就置标志位,整点报时位置1则执行整点报时程序,闹钟来临置闹钟标志(进行闹钟处理),夜晚判断若是夜晚则标志位置1(关闭LCD),Nokia5110液晶显示程序执行。
void main(void) {//此处省略了部分语句 while(1) { } }
Get1302(time_data_buff); /*读取当前时间*/ ReadTemperature();
getkeyvalue(); keydeal();
//获取当前温度
//获取按键值 //键盘处理 //调用报时函数
//调用整点判断函数 //调用闹钟判断函数 //调用显示函数 //调用整点报时函数 //调用夜晚判断函数
isd_key_report(); integerjudge(); integer_report(); alarm_clock(); night(); show();
第 21 页 共 53 页
开始ISD1760初始化液晶初始化读取1302时间NDS1302运行Y读取DS1302数据系统初始化设置默认时间,并运行读取1302时间,读取DS18B20温度扫描键盘,键值处理若实时标志置1,则报时整点判断,若为整点则整点标志置1若整点标志置1,则整点报时若闹钟时间到,闹钟标志置1若当前是夜晚则关闭LCDLCD显示数据
4.1主程序流程图
第 22 页 共 53 页
键值处理夜晚后,无键按下一段时间后则关闭LCD蜂鸣器响时,有键按下则取消蜂蜜器Y键值=模式键若模式值=1,则模式值=3;若模式值=3,则模式值=1;NY键值=报时键实时标志取反N按模式值处理模式值=1模式值=2Y左/右键N改变temp数组下标模式值=4模式3模式键按下,则模式值=2Y左/右键改变闹钟数组下标Y模式键按下,则模式值=4时间数据由BCD码转换成10进制数,并保存在temp数组中上/下键NOK键NY取消键NY根据下标改变temp数组元素NY上/下键NYOK键N根据下标改变闹钟数组元素星期调整,保存temp数组到ds1302保存闹钟数组元素到ds1302模式值=1取消键N键值处理结束Y闹钟数据由BCD码转换成10进制数,并保存在闹钟数组中模式值=3
图4.2键值处理流程图
第 23 页 共 53 页 4.2 按键处理程序
根据接收的键值做相应的程序处理。程序见附件程序。 ⑴夜晚后,没有键按下,过一段时间则关闭LCD; ⑵在蜂鸣器响时,有键按下则取消响声;
⑶模式键按下,若模式值=1,则3->模式值;若模式值=3,则1->模式值; ⑷模式1时按修改键,则显示模式2,可以对时间进行修改;模式3时按修改键,则显示模式4,可以对闹钟进行修改。以下是4钟模式下的键值处理:
在模式1下,液晶显示当前的日期、时间、温度、闹钟的个数,此时只有按下模式键和修改键才是有效键,按下模式键,则显示模式3;按下修改键则进入模式2显示。具体显示原理见液晶显示部分程序说明。
在模式2下,按左/右键则改变时间数据临时储存变量数组time_data_temp[7]数组下标的值,;按下上/下键则修改对应 time_data_temp[7]相应元素的值;按取消键则回到模式1;按OK键则把时间数据临时储存变量数组time_data_temp[7]的值给time_data_buff[7]同时星期调整,把数据送到DS1302中。
模式3下显示闹钟1、闹钟2、闹钟3的值和开关状态,只有修改键(左键)时有效的,按下则变为模式4。
模式4下显示闹钟的设置,闹钟时间变量 alarm_data_ascii[12],左/右键改变数组的下标,上/下键改变数组对应元素的值,按下取消键则回到模式3,按下OK键则把闹钟数据写到DS1302中,模式回到模式3. 4.3 整点报时程序
本系统设计时实现实时报时和整点报时功能,限于篇幅,仅对整点报时进行说明。按照语音芯片的工作原理,我先把语音录到芯片中,然后用软件分析出每一段语音的具体地址,建立数组code unsigned int voiceaddress[],数组中保存的是地址值。调用制定地址播放函数void isd_setplay(uint s,uint e),就可以播放指定地址声音。
整点报时播报内容是“滴滴声,现在时间xx点整”,程序设计如下,先判断整点标志位integerreportf置1则初始化语音芯片,整点报时切换变量integerturn置0, 使integerturn递增,控制播放流程的开始到结束。 4.4 液晶显示程序
Nokia5110液晶显示原理比较简单,先对它进行初始化之后,使其在4种模式下显示不同的内容,当模式切换时,显示的内容将改变。例如:当前为模式1,按下模式键,模式更改为模式3,显示内容变为模式3的内容。各个模式下的显示内容和例子请参看硬件部分Nokia5110液晶显示说明。程序见附件程序。
第 24 页 共 53 页 整点报时N整点报时标志位1YY变量integerturn=0初始好1760,integerturn++N变量integerturn=1Y播放滴滴声integerturn++播放“现在时间”,integerturn++播放小时值,integerturn++NY变量integerturn=21760可以接收新的命令YNNYY变量integerturn=31760可以接收新的命令NN变量integerturn=4
YN1760可以接收新的命令Y播放“点”,integerturn++播放“整”,integerturn++
NYNY变量integerturn=6播放结束1760可以接收新的命令Y变量integerturn=5NY整点报时标志置0,integerturn=0NN结束4.3整点报时流程图
第 25 页 共 53 页
LCD显示根据模式显示模式1模式2模式3模式4显示年、月、日、星期、时、分、秒、温度、闹钟个数显示“时间设置”显示“闹钟”第1个闹钟第2个闹钟第3个闹钟显示“闹钟设置”N闪烁标志位为1N闪烁标志位为1Y根据时间数组下标,在相应的位置显示空白Y根据闹钟数组下标,在相应的位置显示空白显示年、月、日、时、分、秒显示第1、2、3个闹钟显示结束
图4.4 液晶显示流程图
以下对液晶显示的操作进行说明,在主程序部分对液晶进行了初始化和清屏等操作。
在调用show()函数时,是显示内容的操作,是按当前的模式值显示的。各个模式显示时先设置显示的位置设置LCD坐标函数void LCD_set_XY(unsigned char X, unsigned
第 26 页 共 53 页 char Y),显示字符函数void LCD_write_char(unsigned char c),显示汉字函数void LCD_write_up(unsigned char n)、void LCD_write_down(unsigned char n),显示空格函数void LCD_write_sp(unsigned char n)。 4.5 按键报时程序
按键实时报时设计的原理是在现有硬件的基础上,报时按键按下,驱动报时程序。播报的内容是“现在时间xx点xx分xx秒当前问度xx点摄氏度”,例如“现在时间19点20分22秒当前温度22点5摄氏度”。当实时报时按键按下,实时标志位置1,变量reportturn从1~14控制报时的开始和结束。Reportturn=1时初始化语音芯片,reportturn=2时报“现在时间”,reportturn=3报“小时值”,依次类推,reportturn=14,实时报时结束。程序的流程图很类似整点报时的程序流程图,故不详细叙述,程序见附件程序。
4.6 夜晚关闭LCD显示程序
夜晚关闭LCD显示的设计也是基于现有的硬件基础。实现的原理是,调用void
night()读出当前时间值,判断其是否是晚上6点~次日早上6点,若是则夜晚标志位置1,调用按键处理函数keydeal(),对LCD进行关闭或打开的处理。若是夜晚标志位置1,无键按下,则nightcount++,若nightcount=240,则关闭LCD;若中途有键按下,则nightcount=0,打开LCD显示。
5 硬件和软件调试
5.1 硬件调试
本系统的硬件设计时,主要涉及到电源部分的设计和单片机和4个芯片的接口设计,以下一一做叙述。
电源部分单片机需要5V的电压,液晶显示还需要3V的电压。为了得到稳定的5V电压,我用了稳压芯片7805,使用时也可以直接从电脑的USB得到大约5V的电源。按照LM317和7805的典型电路练接,即可的到相应的5V和3V电压,实际测量出来的电压是在5V左右和3V左右。在安装元件的时候,要保证安装元件管脚的顺序准确,即可。
单片机和DS1302、DS18B20、ISD1760、液晶芯片的连接,主要是在画原理图的时候仔细检查管脚的连接是否是正确连接,网络标号有没有放置错误,元件的封装有没有选对。
做出电路板之后,首先观察是否有明显的断线和连接在一起的线,断线则使电路开路;要是腐蚀的不好,就可能有些连线不应该连接在一起的连在一起就会短路,我就会把他用小刀切断,这时候就要细心了。
之后是安装元件和做相应的电压测试,过程中我注意以下细节:
①通电前,把桌面清理干净,电路板下不允许有杂物,禁止把电路板放在元件盒上通电。
第 27 页 共 53 页 ②在电子类产品通电调试时,应先接好电路,检查无误后方可通电调试;调试结束或遇到故障,先断电后再拆电路,禁止带电操作。
③电路调试采取分块调试的原则,即每做完一块功能的电路,则对其调试,直到其功能完全正常。调试每块电路的同时,记录相应的数据。
④遇到问题先断电,用数字万用表检查电路连接是否正确,元器件型号,极性是否安装正确,如正确,再通电,通过所学电路知识及电原理图,分析、查换、排除故障。 5.2 软件调试
软件调试时候,主要是分模块进行的。
液晶显示模块,先用洗模软件得到字符“a”的值{ 0x00, 0x20, 0x54, 0x54, 0x54, 0x78 }, 对打开液晶的背光,初始化液晶,把字符“a”的值送进去显示,当“a”能够正常显示时,表示我可以在液晶上面显示我想要的任何汉字和字符。之后的显示,主要是用空格来调节字符和汉字显示的位置。
蜂鸣器的调试比较简单,单片机I/O送出一个低电平,发出响声,然后程序使电平变为高,则响声停止。
按键的调试,当有键按下的时候,我让程序使蜂鸣器发出响声,当我测试完8个按键之后,都能发出响声的话,说明我的按键都能正常使用。
语音芯片的调试是一个繁琐和重复的过程。我先用软件合成声音,比如“现在时间”、“当前温度”、“59”然后录成MP3格式,然后用1760系列语音芯片调试助手软件烧写到1760芯片中(烧写语音的过程在专用语音开发板完成)。1700系列语音芯片调试助手软件能够分析出具体的语音分段地址,我在程序中可以使分段的语音分段的播放出来。首先我先让程序播放播放一段语音“现在时间”,能正常播放的时,表明我可以播放任何的语音。之后在程序中我主要用到的是语音的按键报时很整点报时。按键报时,则置标志位reporttimef,报时控制变量reportturn递增和归0控制按键报时程序的执行过程,reportturn=14则按键报时结束。整点报时也有类似的调试过程,不再叙述。语音芯片的调试要注意的是,没进行一次播放操作,都需要对1760的寄存器进行状态读取判断是否可以进行下一个播放操作,还有就是要使用isd_clr_int()函数对EOM和INT中断。
对DS18B20操作的时候,发现温度偏高3-5度,曾怀疑是芯片损坏造成,更换芯片之后,发现还是这样的一个结果,后来在网络上找到答案,在显示的时候减去相应的偏离的值即可,比如减去3摄氏度,调整后的结果是比较接近实际温度的。
对于时间和闹钟的读取和设置是有比较多的例子的,只要芯片正常工作,就能读出相应的值和进行正确的设置。调试的时候要注意正确的读/写/复位操作时序,还要找到相应的地址才能进行正确的操作,因为读日期时间和写日期时间的地址是不同的,读闹钟和写闹钟的地址也是不同的。
第 28 页 共 53 页 6 结论
本文首先介绍了课题的研究意义,并说明本课题的主要工作。介绍并通过对MSC-51系列产品性能及价格对比,确定了电子万年历的核心芯片为STCS52型号。
本课题以单片机主控芯片,进行电子万年历的硬件电路设计,添加如温度检测模块,选择时钟芯片型号为DS1302,液晶显示芯片Nokia5110,语音芯片ISD1760,晶振选择11.0592M HZ ,以达到设计所需。
软件设计方面,程序由以下程序构成:主程序、扫描键盘程序、按键处理程序、实时报时程序、液晶显示程序。
在设计制作的时候,添加了创新功能:
⑴掉电存储功能,可存储掉电前用户时间和闹钟设置; ⑵夜间关闭液晶显示; ⑶按报时键报当前时间和温度。
在制作电路板和安装调试硬件的过程中,主要是要细心检查设计的稳压电源能不能达到准确的3V,只要安装没有错误,元件没有损坏,得出正确的电压是没有问题的。其他芯片就考连接的管脚是否有短路和断路的状况,要用万用表仔细检查。
软件设计的时候,是液晶显示模块比较难以调解,要计算出每行显示多少个字符或汉字,加入多少个空格才能显示在正确的位置上,必须反复的下载到液晶中才能确定自己要的效果。在软件设计中要多写才能够熟练,多参照别人的代码和设计,才能设计出高质量的代码。
在电子制作的过程中要多积累经验,多培养兴趣。对电路的设计、布局要先有一个好的构思,才显得电路板美观、大方。
由于时间有限,准备不够充分,本课题的完成存在很多缺陷,如对单片机的了解不够深入,未能够选择最佳的硬件型号及参数等。这些缺陷将在我日后的工作学习中进行改正。
桂林电子科技大学毕业设计(论文)报告用纸 第29页 共53页
谢 辞
我在***的悉心教导下,顺利地完成了完成了本课题的研究。在本课题研究的很多关键时候提供了很大的帮助和支持。我取得的任何进步,都与他的谆谆教诲与关心是分不开的。导师广博的学识和认真严谨的治学态度深刻的影响着我,让我受益匪浅。我衷心地感谢何对我的教诲,在此向恩师致以最诚挚的敬意。
感谢我的同学们和朋友们对我的关心和帮助,他们给了我最大的支持。遇到难题在与他们的讨论中,我学到了很多知识。
最后我还要特别感谢我的父母,感谢他们在生活上对我的关怀和精神上的支持,有了他们的关怀和支持,我能够顺利的完成学业。
桂林电子科技大学毕业设计(论文)报告用纸 第30页 共53页
参考文献
[1] 雷晓平.单片计算机及其应用[M].成都:高等教育出版社,2005. [2] 于海生.微型计算机控制技术[M].北京:清华大学出版社,1999. [3] .微机原理及应用技术[M].重庆:重庆大学出版社,2003. [4] 阎石.数字电子技术基础[M].北京:高等教育出版社,2005. [5] 康华光 .电子技术基础-模拟部分[M].北京:高等教育出版社,2005. [6] 强锡富.传感器[M].北京:机械工业出版社,2004.
[7] 陈学平.Protel2004电路设计与电路仿真[M].北京:清华大学出版社,2007. [8] 郭天祥.新概念51单片机C语言教程[M].北京:电子工业出版社,2009.3. [9] 姜灵芝.余健.C语言课程设计案例精编[M].北京:清华大学出版社,2008. [10] 杨欣等.电子设计从零开始[M]. 北京: 清华大学出版社,2005. [11] 楼然苗 .51系列单片机设计实例[M]. 北京航空航天出版社,2003 . [12] 李忠国. 陈钢. 单片机技能实训[M]. 北京:人民邮电出版社,2006.
[13] 马忠梅. 张凯. 单片机的C语言应用程序设计[M]. 北京:北京航空航天大学出版社,2003. [14] 沈红卫. 单片机应用系统设计实例与分析[M]. 北京:北京航空航天大学出版社, 2003. [15] 何力民. 单片机高级教程[M]. 北京:北京航空航天大学出版社, 2001. [16] 梅丽凤等. 单片机原理及接口技术[M]. 北京:清华大学出版社,2004. [17] 王宜怀,刘晓升. 嵌入式应用技术基础教程[M]. 北京:清华大学出版社,2005.
[18] 杨欣等. 电路设计与仿真——基于Multisim8与Protel 2004[M]. 北京:清华大学出版社,
2006.
[19] 胡汉才. 单片机原理及接口技术[M]. 北京:清华大学出版社,1996. [20] 贾伯年等. 传感器技术[M]. 南京:东南大学出版社,1992.
[21] Brokowskicj, Blalock TV. A new method of Johnson noise thermomeiry[J]. Rev. Sci. Instrum, 1974,
vo1.2.No.45.
[22] West Conshohocken, PA : ASTM, Sensory testing methdos [M]. 1996. [23] ATS51 Atmel Corp [M].2005.
桂林电子科技大学毕业设计(论文)报告用纸 第31页 共53页
附 录1 电路图
附图1 电源部分
附图2语音电路
桂林电子科技大学毕业设计(论文)报告用纸 第32页 共53页
附图3单片机电路
附图4时钟电路、温度传感器电路、按键电路、蜂鸣器电路
桂林电子科技大学毕业设计(论文)报告用纸 第33页 共53页
附图5系统PCB图
附表1 ISD1760管脚说明
管脚 名称 PDIP/SOIC 管脚 TSOP 管脚 功 能 VCCD 1 22 数字电路电源 /RESET 3 24 芯片复位 MISO 4 25 SPI接口的串行输出。ISD1760在SCLK 下降沿之前的半个周期将数据放置 MISO端。数据在SCLK的下降沿时移出 MOSI 5 26 SPI接口的数据输入端口。主控制芯片在SCLK上升沿之前的半个周期将数据 放置在MOSI端。数据在SCLK上升沿被锁存在芯片内。此管脚在空闲时,应该被拉高 /SS VSSA VSSP2 AGC VSSD SP+ 8 12 18 28 15 1 5 11 21 8 7 28 为低时,选择该芯片成为当前被控制设备并且开启 SPI 接口。空闲时,需要拉高 模拟地 负极PWM喇叭驱动器地 自动增益控制 数字地 喇叭输出 + 桂林电子科技大学毕业设计(论文)报告用纸 第34页 共53页
SP- ROSC 位 D0 D1 D2 13 20 6 13 喇叭输出 - 振荡电阻ROSC用一个电阻连接到地,决定芯片的采样频率 D3 D4 D5 D6 D7 D8 D9 D10 D11 附表2 APC( 模拟通道寄存器 ) 名称 描述 VOL0 音量控制 VOL1 音量控制 VOL2 音量控制,D2D1D0为111音量最大,为 000音量最小 Monitor_Input 录音时输入监听信号0=关闭监听,1 =开启监听 Mix_Input 混合输入。 SE_Editing 0=开启音效编辑, 1=关闭音效编辑 SPI_FT SPI 模式下,由此位控制直通功能。D6 为1,直通功能SPI模式下开启,为0关闭 Analog Output: 选择AUD输出或 AUX输出:0=AUD, AUD/AUX 1=AUX PWM SPK PWM输出:0=开启; 1=关闭 PU Analog Out 电源模拟输出:0 =ON ,1=OFF VAlert VAlert:0=ON ,1 =OFF EOM Enable 此位置1时,用指定地址播放 (SETPLAY),在遇到EOM标志时,放音停止。置0 时,则放音持续到直到结束地址
默认值 0 0 0 0 0 0 1 0 0 0 1 0
桂林电子科技大学毕业设计(论文)报告用纸 第35页 共53页
指令名称 命令字节 PU STOP RESET CLR_INT 0x01 0x02 0x03 0x04 附表3 1760SPI 部分指令 数据字节数据字节数据字节1 2或起始3或起始地址字节地址字节1 2 0x00 0x00 0x00 0x00 结束字节1/2/3 描述 RD_STATUS 0x05 0x00 0x00 RD_PLAY_PTR 0x06 0x00 0x00 0x00 WR_APC1 0x45 桂林电子科技大学毕业设计(论文)报告用纸 第36页 共53页 位 7 6 5 4 3 2 1 0 附表4 Status Register1 ( SR1 ) SR01 名称 描述 SE1 当音效1被录入后此位置 1,擦除后置0 SE2 当音效1被录入后此位置 1,擦除后置0 SE3 当音效1被录入后此位置 1,擦除后置0 SE4 当音效1被录入后此位置 1,擦除后置0 REC 此位置1表示正在录音 PLAY 此位置1表示正在放音 ERASE 此位置1表示正在删除 RDY RDY=1时表示空闲,可以接收SPI令;RDY=0时为忙,不接受新的命令,但除了RESETCLR_INT , RD_STATUS ,PD这些指令,当然在REC和PLAY 时,也可以接受STOP命令。当 其他命令发送时,会被忽略且CMD_ERR被置1 桂林电子科技大学毕业设计(论文)报告用纸 第37页 共53页 附表5 PCD8544指令集 附表 3.6 附表3.5中的符号说明 桂林电子科技大学毕业设计(论文)报告用纸 第38页 共53页 附 录2 程序设计 /**************************************** ISD1700.C ***********************************/ void integer_report() {//整点报时函数 uchar low ,high; if(integerreportf) { if(integerturn==0) { } if(integerturn==1) //播放滴滴声 { } else if(integerturn==2) { isd_rd_status(); if((sr1&0x01)==1) { isd_setplay(voiceaddress[60],voiceaddress[61]-1); //播放现在时间 reportturn=1; reporttimef=0; isd_rd_status(); if((sr1&0x01)==1) { } isd_setplay(voiceaddress[67],voiceaddress[68]-1); //播滴滴声 isd_clr_int(); integerturn++; isd_stop(); isd_init(2); integerturn++; //如果整点报时标志置1 桂林电子科技大学毕业设计(论文)报告用纸 第39页 共53页 } } isd_clr_int(); integerturn++; else if(integerturn==3) { } isd_rd_status(); if((sr1&0x01)==1) { } //播放小时值 //BCD码转ASCII码 low=time_data_buff[2]&0x0f; high=time_data_buff[2]>>4; high=high*10+low; //播小时值 isd_setplay(voiceaddress[high],voiceaddress[high+1]-1); integerturn++; else if(integerturn==4) //播放点 { } else if(integerturn==5) { isd_rd_status(); if((sr1&0x01)==1) { isd_setplay(voiceaddress[66],voiceaddress[67]-1); isd_clr_int(); integerturn++; //播放整 isd_rd_status(); if((sr1&0x01)==1) { } isd_setplay(voiceaddress[62],voiceaddress[63]-1); isd_clr_int(); integerturn++; 桂林电子科技大学毕业设计(论文)报告用纸 第40页 共53页 } } } } //等待结束 else if(integerturn==6) { } isd_rd_status(); { integerturn=0; integerreportf=0; } //读取状态 if((sr1&0x04)==0) //如果不是正在放音 /**************************************** //nokia_5110.c /*-------------------------------------------------------------------- void LCD_write_char(unsigned char c)// 显示字符 { unsigned char line; for (line=0; line<6; line++) } //显示空格 void LCD_write_sp(unsigned char n) { } //显示汉字的上半部分 void LCD_write_up(unsigned char n) { unsigned char i; for(i=0;i<12;i++) //汉字为12列,分12次写入 LCD_write_byte(write_weekup[n][i],1);//字模在write_weekup数组中 unsigned char i; for(i=0;i //显示n个空格 LCD_write_byte(font6x8[c][line], 1);//分6列字模赋值,字模在font6x8数组中 桂林电子科技大学毕业设计(论文)报告用纸 第41页 共53页 } //5110显示函数 void show() { LCD_write_char(time_data_buff[0]/0x10); //显示秒的十位 LCD_write_char(time_data_buff[0]%0x10); LCD_write_sp(18); //第三行 //显示秒的个位 //显示18个空格,补满第2行 LCD_write_char(time_data_buff[1]/0x10); //显示分的十位 LCD_write_char(time_data_buff[1]%0x10); LCD_write_char(11); //显示分的个位 //显示: //在模式1下的显示 if(moshi==1) { //第一行 LCD_set_XY(0,0); LCD_write_sp(12); LCD_write_char(2); LCD_write_char(0); //设置坐标0,0 //写12个空格 //显示2 //显示0 //显示年的个位 LCD_write_char(time_data_buff[6]/0x10); //显示年的十位 LCD_write_char(time_data_buff[6]%0x10); LCD_write_char(10); //显示- //显示月的个位 LCD_write_char(time_data_buff[4]/0x10); //显示月的十位 LCD_write_char(time_data_buff[4]%0x10); LCD_write_char(10); //显示- //显示日的个位 LCD_write_char(time_data_buff[3]/0x10); //显示日的十位 LCD_write_char(time_data_buff[3]%0x10); LCD_write_sp(12); //第二行 LCD_write_sp(18); //写18个空格 //显示小时的个位 LCD_write_char(time_data_buff[2]/0x10); //显示小时的十位 LCD_write_char(time_data_buff[2]%0x10); LCD_write_char(11); //显示: //写12个空格,使写满第1行 桂林电子科技大学毕业设计(论文)报告用纸 第42页 共53页 LCD_write_sp(16); LCD_write_up(8); LCD_write_sp(8); LCD_write_up(9); LCD_write_sp(8); LCD_write_sp(16); //显示16个空格 //显示 \"星\" 的上半部分 //显示 \"期\" 的上半部分 //显示星期几的上半部分 LCD_write_up(time_data_buff[5]); //第四行(省略,程序和显示星期上半部分类似) //第五行 LCD_write_sp(23); LCD_write_char(temper/100); LCD_write_char(12); LCD_write_sp(3); LCD_write_centi(); LCD_write_sp(24); //第六行 //temp LCD_write_sp(9); LCD_write_char(39); //显示a LCD_write_char(50); //显示l LCD_write_char(39); //显示a LCD_write_char(56); //显示r LCD_write_char(51); //显示m LCD_write_char(11); //显示: LCD_write_sp(6); if(alarmnumber) { LCD_write_char(alarmnumber); //显示多少个闹钟 LCD_write_sp(6); LCD_write_char(53); //显示o LCD_write_char(52); //显示n LCD_write_sp(9); //如果打开的闹钟个数超过1个 //显示摄氏度符号 //显示温度的十位 //显示温度的个位 //显示温度的十分位 LCD_write_char(temper%100/10); //显示 \".\" LCD_write_char(temper%100%10); 桂林电子科技大学毕业设计(论文)报告用纸 第43页 共53页 } } else { } LCD_write_char(53); //显示o LCD_write_char(44); //显示f LCD_write_char(44); //显示f LCD_write_sp(15); //如果没有打开闹钟 /**************************************************************** ds1302.c *****************************************************************/ void Set1302(uchar *pClock) {//设置初始时间, 先写地址,后读命令/数据 uchar i; uchar ucAddr = 0x80; EA = 0; W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/ for(i =7; i>0; i--) { W1302(ucAddr,*pClock); /* 秒 分 时 日 月 星期 年 */ pClock++; //7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B ucAddr +=2; } W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/ } void writealarm() {//设置闹钟 uchar i,n,low,high; //设置闹钟,直到设置正确为止,否则一直设置10次 n=10; while(n) { //先写入,再读出,判断读出的值与设置的值是否一样 EA = 1; 桂林电子科技大学毕业设计(论文)报告用纸 第44页 共53页 } } setalarm(); getalarm(alarm_data_bcd); for(i=0;i<12;i++) { } if(i==12)break; n--; //计算有多少个闹钟打开 alarmnumber=0; if(alarm_data_ascii[3])alarmnumber++; if(alarm_data_ascii[7])alarmnumber++; if(alarm_data_ascii[11])alarmnumber++; for(i=0;i<12;i++) { } low=alarm_data_ascii[i]%10; high=alarm_data_ascii[i]/10; high<<=4; alarm_data_bcd[i]=high|low; if(alarm_data_bcd[i]!=alarm_data_ascii[i]) break; //闹钟值ASCIII转BCD void readalarm() {//读取闹钟, 读取闹钟,直到读取正确为止,否则一直读取10次 uchar i,n,low,high; { //两次读取,检查两次结果是否一样 getalarm(alarm_data_bcd); getalarm(alarm_data_ascii); for(i=0;i<12;i++) { n=10; while(n) 桂林电子科技大学毕业设计(论文)报告用纸 第45页 共53页 } } } if(alarm_data_bcd[i]!=alarm_data_ascii[i]) break; if(i==12)break; n--; //如果10次,都不正确,则显示错误信息 if(n==0) { } else { } //闹钟数据 ASCIII转BCD for(i=0;i<12;i++) { } low=alarm_data_ascii[i]%10; high=alarm_data_ascii[i]/10; high<<=4; alarm_data_bcd[i]=high|low; //若读取正确,则计算有多少个闹钟打开 alarmnumber=0; if(alarm_data_ascii[3])alarmnumber++; if(alarm_data_ascii[7])alarmnumber++; if(alarm_data_ascii[11])alarmnumber++; LCD_set_XY(0,2); LCD_write_sp(30); //显示程序省略,显示内容是“闹钟error” while(1); void Get1302(uchar ucCurtime[]) {//读取DS1302当前时间 uchar i; uchar ucAddr = 0x81; EA = 0; 桂林电子科技大学毕业设计(论文)报告用纸 第46页 共53页 for (i=0; i<7; i++) {// ucCurtime: 保存当前时间地址。 ucCurtime[i] = R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B*/ ucAddr += 2; } } //DS18B20读取温度 void ReadTemperature(void) { } /**************************************************************** //main.c ****************************************************************/ //键盘处理函数 void keydeal() { float tt=0; EA = 0; //关中断 Init_DS18B20(); WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); a=ReadOneChar(); //读取低位 //读取高位 temper=ReadOneChar(); temper<<=8; temper=temper|a; tt=temper*0.0625; //将温度的高位与低位合并 temper= tt*10+0.5; //对结果进行4舍5入 EA = 1; //打开中断 unsigned char a=0; EA = 1; //读取温度寄存器等(共可读9个寄存器)前两个就是温度 桂林电子科技大学毕业设计(论文)报告用纸 第47页 共53页 uchar i,halflow,halfhigh; //夜晚一段时间后,没有键下则关LCD if((key_value==0)&&nightf) //没有键盘按下且是夜晚时,nightcount增1 { } else { } //在蜂鸣器响时,如果有按键按下,则取消蜂鸣 if((FQ==0)||alarmfqf) { } if(nightcount==240) { } if(key_value==KEY_MODE) { //如果键值等于模式键,则改变模式 nightcount=0; LCD_BLK=1; //关闭背光 //关闭5110 LCD_write_byte(0x24,0); //如果nightcount增到240,则关闭显示 if(key_value) { } key_value=0; alarmfqf=0; FQ=1; //闹钟标志改变 //关闭蜂鸣器 //有键按下 nightcount=0; { } key_value=0; LCD_BLK=0; // 使用基本命令 //按下键使LCD显示后,这次键值不再起作用。 //如果不是夜晚或有键盘按下,则nightcount归零。 if(LCD_BLK)//如果不是夜晚或有键盘按下,且已关闭显示时,则打开显示 nightcount++; LCD_write_byte(0x20, 0); 桂林电子科技大学毕业设计(论文)报告用纸 第48页 共53页 } key_value=0; if(moshi==1) moshi=3; else if(moshi==3) moshi=1; //如果不是整点报时,则按下报时键有效 //如果键值等于报时键 if(integerreportf==0) { } //报时 if(key_value==KEY_REPORT) { } key_value=0; reportturn=1; reporttimef=~reporttimef; //改变报时标志 //报时顺序变量变回1 //在模式1下的按键处理 if(moshi==1) { } //在模式2下的按键处理 else if(moshi==2) //如果是左键 if(key_value==KEY_LEFT) { } key_value=0; moshi=2; //模式1变为模式2 //切换变量变为5,time_data_temp[5]保存年份 timeturn=5; for(i=0;i<5;i++) { } halflow=time_data_buff[6]&0x0f; halfhigh=time_data_buff[6]>>4; time_data_temp[5]=halfhigh*10+halflow; halflow=time_data_buff[i]&0x0f; halfhigh=time_data_buff[i]>>4; time_data_temp[i]=halfhigh*10+halflow; //BCD码转ASCII 即time_data_buff数组转为time_data_temp数组 桂林电子科技大学毕业设计(论文)报告用纸 第49页 共53页 { if(key_value) { switch(key_value) {//左键 case KEY_LEFT: timeturn++; //时间切换变量加1 if(timeturn==6)timeturn=0; break; //右键 case KEY_RIGHT: timeturn--; break; //上键 case KEY_UP: time_data_temp[timeturn]++; ////时间切换变量减1 if(timeturn==0XFF)timeturn=5; //相应日期时间参数加1,由timeturn决定哪个参数 if(time_data_temp[timeturn]==time_up_limit[timeturn])time_data_temp[timeturn]=time_ break; //下键 case KEY_DOWN: time_data_temp[timeturn]--; down_limit[timeturn]+1; //如果达到上限,则变为下限 //相应日期时间参数减1,由timeturn决定哪个参数 if(time_data_temp[timeturn]==time_down_limit[timeturn])time_data_temp[timeturn]=ti break; //ok键 case KEY_OK: moshi=1; timeturn=5; me_up_limit[timeturn]-1; //如果达到下限,则变为上限 桂林电子科技大学毕业设计(论文)报告用纸 第50页 共53页 { } } } } //ASCII码转BCD码 for(i=0;i<5;i++) { } halflow=time_data_temp[5]%10; halfhigh=time_data_temp[5]/10; halfhigh<<=4; time_data_buff[6]=halfhigh|halflow week_adjust(); Set1302(time_data_buff); halflow=time_data_temp[i]%10; halfhigh=time_data_temp[i]/10; halfhigh<<=4; time_data_buff[i]=halfhigh|halflow; break; //cancel键 case KEY_CANCEL: moshi=1; timeturn=5; break; key_value=0; void systeminit() TMOD=0X11; EA=1; ET0=1; TR0=1; //定时1 //定时器初值 TH0=0; TL0=0; //开总中断 //开定时器0中断 //开始计数 //整点报时判断函数 void integerjudge() { 桂林电子科技大学毕业设计(论文)报告用纸 第51页 共53页 } if((time_data_buff[1]==0)&&(time_data_buff[0]==0)) //如果分为0,且秒为0 { } Get1302(time_data_buff); { } { } integerturn=0; //整点报时切换变量置0 integerreportf=1; //整点报时标志置1 if(integerreportf==0) //如果还没整点报时 //再读取一次时间 if((time_data_buff[1]==0)&&(time_data_buff[0]==0))//如果分为0,且秒为0 //闹钟判断函数 void alarm_clock() { //如果闹钟1打开,且当前秒等于闹钟1的秒,分钟等于闹钟1的分,小时等于闹钟1的小时 if((alarm_data_bcd[3])&&(time_data_buff[0]==alarm_data_bcd[2])&&(time_data_b{ Get1302(time_data_buff); //再读取一次时间 //如果闹钟1打开,且当前秒等于闹钟1的秒,分钟等于闹钟1的分,小时 uff[1]==alarm_data_bcd[1])&&(time_data_buff[2]==alarm_data_bcd[0])) 等于闹钟1的小时 if((alarm_data_bcd[3])&&(time_data_buff[0]==alarm_data_bcd[2])&&(time_data_b { if(alarmfqf==0) { EA=0; alarmfqf=1; fqcount=0; fqcountb=2; fqturn=1; FQ=0; EA=0; //闹钟标志置1 //闹钟计数置0 //闹钟计数比较置2 //闹钟长短变量置1 //打开蜂鸣器 //若没有闹铃 uff[1]==alarm_data_bcd[1])&&(time_data_buff[2]==alarm_data_bcd[0])) 桂林电子科技大学毕业设计(论文)报告用纸 第52页 共53页 } } } //修改日期,星期自动调整函数 void week_adjust() { } void night() { //夜晚判断函数 uchar low,high; low=time_data_buff[2]&0x0f; high=time_data_buff[2]>>4; high=high*10+low; if((high>17)||(high<7)) { nightf=1; else //high为转换成ASCII码后的小时 //如果为18:00--6:00,则是晚上,否则为白天 uchar i; uint days,week;//传入年,月,日期对应的天数! uchar code month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; //各个月的天数 week=time_data_temp[5]+6; //年 2000年1月1日 为星期六,每过一年,星期增week+=time_data_temp[5]/4; //闰年 如果是闰年,星期再增1 //计算当前年份当前日期已过的天数 days=0; for(i=1;i //日期对应的天数 //星期调整 //星期调整 days+=month[i]; //月份对应的天数,time_data_temp是时间 1,以本日期为基准。 数据临时储存变量 time_data_buff[5]=week%7; if(time_data_buff[5]==0) time_data_buff[5]=7; 桂林电子科技大学毕业设计(论文)报告用纸 第53页 共53页 } } nightcount=0; nightf=0; /*********************************************************************** void main(void) { delayms(500); LCD_BLK=0; //延时0.5S //打开显示背光 //ISD1760,初始化 //ISD1760清除int ,eom标志 //ISD1760停止操作 //初始化液晶 isd_init(100); isd_clr_int(); } delayms(5); isd_stop(); Get1302(time_data_buff); /*读取当前时间*/ LCD_init(); //液晶清屏 LCD_clear(); { } readalarm(); systeminit(); while(1) { } if((time_data_buff[0]&0x80)!=0) //如果DS1302没有运行,则启动DS1302 Set1302(time_reset_buff); /*如果时间没有激活,重新设置时间*/ //读取闹钟数据 //系统初始化 et1302(time_data_buff); /*读取当前时间*/ ReadTemperature(); getkeyvalue(); keydeal(); isd_key_report(); integerjudge(); integer_report(); alarm_clock(); night(); show(); //获取当前温度 //获取按键值 //键盘处理 //调用整点判断函数 //调用报时函数 //调用整点报时函数 //调用闹钟判断函数 //调用夜晚判断函数 //调用显示函数
因篇幅问题不能全部显示,请点此查看更多更全内容