图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