基于单片机设计课程设计论文 - 图文 下载本文

3.4 DS12C887的内存空间

DS12C887的内存空间共128个字节,其中11个字节专门用于存储时间、星期、日历和闹钟信息;4个字节专门用于控制和存放状态信息;其余113个字节为用户可以使用的普通RAM空间。图11为日历时钟芯片DS12C887的内存空间映射示意图。[

21

图11 日历时钟芯片DS12C887内存空间映射示意图

地址0x00-0x09共10个寄存器分别存放的是秒、秒闹钟、分钟、分闹钟、小时、时闹钟、星期、日、月和年信息,地址0x32为世纪信息寄存器(解决了“两千年问题”)地址0x0A~0x0D四个寄存器分别为寄存器A、B、C、D,它们用于控制和存放某些状态信息;其余的113字节地址空间是留给用户使用的普通内存空间。

根据此地址映射关系(见图11)和芯片选的设置(由单片机的P2.0端口反相后提供)可以得到每个特定寄存器在程序中的地址,即为0x0100加上图11中的地址偏移。比如,日信息寄存器的地址为0x0107,控制寄存器B的地址为0x010B等。

在所有的128字节中,寄存器C和D为只读寄存器,寄存器A的第7位属于只读位,秒字节的高阶位也是只读的,其余字节均为可直接读写字节。

时钟、日历信息可以通过读取合适的内存字节获得;时钟、日历和闹钟可以通过写合适的内存字节进行设置或初始化。对应时钟、日历和闹钟的10个寄存器字节可以是二进制形式或者BCD码形式,在写这些寄存器时,寄存器B的SET位必须置1。

寄存器A字节的内容如下:

MSB LSB UIP DV2 DV1 DV0 RS3 RS2 RS1 RS0 ·UIP: 更新(UIP)位用来标志芯片是否即将进行更新。当UIP位为l时,更新即将开始;当它为0时,表示在至少244μs内芯片不会更新,此时,时钟、日历和闹钟信息可以通过读写相应的字节获得和设置。UIP位为只读位并且不受复位信号(RESET)的影响。通过把寄存器B中的SET位设置为1可以禁止更新并将UIP位清0。

·DV0,DV1,DV2:

这3位是用来开关晶体振荡器和复位分频器。当[DV0 DV1 DV2]=[010]时,晶体振荡器开启并且保持时钟运行;当[DV0 DV1 DV2]=[11X]时,晶体振荡器开

22

启,但分频器保持复位状态。

·RS3、RS2、RS1.、RS0:

作用:1)设置周期中断允许位(PIE);2)设置方波输出允许位(SQWE);3)两位同时设置为有效并且设置频率;4)全部禁止。

寄存器B字节的内容如下:

MSB LSB SET ·SET

PIE AIE UIE SQWE DM 24/12 DSE 当SET=0,芯片更新正常进行;当SET=1,芯片更新被禁止。SET位可读写,并不会受复位信号的影响。

·PIE:

当PIE=0,禁止周期中断输出到IRQ;当PIE=1,允许周期中断输出到IRQ。 ·AIE:

当AIE=0,禁止闹钟中断输出到IRQ;当AIE=1,允许闹钟中断输出到IRQ。 ·UIE:

当UIE=0,禁止更新结束中断输出到IRQ;当UIE=1,允许更新结束中断输出到IRQ。

此位在复位或设置SET为高时清0。 ·SQWE:

当SQWE=0,SQW脚为低;当SQWE=1,SQW输出设定频率的方波。 ·DM:

DM=0,二进制;DM=1,BCD。此位不受复位信号影响。 ·24/12:

此位为1时,24时制;为0时,12小时制。 ·DSE:

夏令时允许标志。在四月的第一个星期日的1∶59∶59AM,时钟调到3∶00∶00AM;在十月的最后一个星期日的1∶59∶59AM,时钟调到1∶00∶00AM。

寄存器C字节的内容如下:

MSB LSB IRQF ·IRQF

PF AF UF 0 0 0 0 当有以下情况中的一种或几种发生时,中断请求标志位(IRQF)置高: PF=PIE=lAF=AIE=lUF=UIE=1

IRQF?PF?PIE?AF?AIE?UF?UIE

IRQF一旦为高IRQ脚输出低。

所有标志位在读寄存器C或复位后清0。 ·PF:周期中断标志。·AF:闹钟中断标志。·UF:更新中断标志。·BIT0~BIT3 第0位到第3位无用,不能写入,只读,且读出的值恒为0。 寄存器D字节的内容如下:

MSB LSB

23

VRT 0 0 0 0 0 0 0 ·VRT 当VRT=0时表示内置电池能量耗尽,此时RAM中的数据的正确性就不能保证了。

·BIT6~ BIT0

第0位到第6位无用,只读,且读出的值恒为0。芯片DS12C887的113字节普通RAM空间为非易失性RAM空间,它不专门用于某些特别功能,而是可以在微处理器程序中作为非易失性内存空间使用。[14]

4 软件设计

4.1软件设计分两部分:时钟部分以及显示部分。

Lcd.h

#ifndef __char_lcd_h__ #define __char_lcd_h__

//----------------------------------------------------------------- // 数据类型宏定义

//----------------------------------------------------------------- #define uchar unsigned char #define uint unsigned int

//----------------------------------------------------------------- // I/O口定义:控制/数据线接口

//----------------------------------------------------------------- sbit rs=P2^2; //寄存器选择端口 sbit rw=P2^1; //读写选择端口 sbit ep=P2^0; //使能信号端口

//----------------------------------------------------------------- // 外部变量声明

//-----------------------------------------------------------------

//----------------------------------------------------------------- // 外部函数声明

//----------------------------------------------------------------- extern void lcd_init(void); // LCD初始化

extern bit lcd_bz(void); // 检测LCD BF的状态 extern void lcd_wcmd(uchar cmd); // 写LCD的指令代码 extern void lcd_wdat(uchar dat); // 写LCD显示的数据

extern void lcd_pos(uchar pos); // 写LCD的指令代码地址 //extern void CG_Write (void);

extern void delay(uchar ms); // 延时

24