基于单片机的DS1302日历时钟的设计和实现
2019-02-24严敏
严 敏
(江苏旅游职业学院 信息工程学院,江苏 扬州 225127)
在日常生活中,日历时钟应用于各种场所,如商场、超市、办公室、家庭、学校等.与传统的机械时钟相比,数字日历时钟具有精度高,显示直观,寿命长等一系列优点.本文即以AT89C51单片机为主控制器,利用DS1302时钟芯片设计日历时钟,在Proteus仿真平台中进行系统的硬件设计,在MedWin V3.0开发环境中进行系统的软件设计.
1 系统硬件设计
1.1 总体结构
以AT89C51单片机为主控制器,利用DS1302时钟芯片设计日历时钟,其总体结构如图1所示.
图1 系统的总体结构
设计的日历时钟不仅要具有小时、分钟和秒的时间显示功能,还要具有年、月、日和星期的显示功能.系统的控制核心是AT89C51单片机,通过单片机控制DS1302显示日历和时间,并在LCD1602液晶屏上显示输出结果.
1.2 DS1302时钟模块
DS1302是DALLAS公司生产的时钟芯片,具有低功耗、高性能的特点,可以通过简单的同步串行模式与微控制器进行通信联络,且只需要三根I/O线,即复位(RST)、I/O数据线和串行时钟(SCLK).
1.2.1 DS1302的外部引脚及内部结构
DS1302的外部引脚及功能说明如图2所示.
VCC2-主电源引脚;X1,X2-32.768 kHz晶振引脚;GND-地;
VCC1-电池引脚;SCLK-串行时钟;I/O-数据输入/输出;RST-复位.
图2 DS1302引脚图
DS1302的内部结构如图3所示,主要有实时时钟、数据存储器RAM、振荡电路与分频器、输入移位寄存器、命令与控制逻辑等组成.
图3 DS1302的内部结构
1.2.2 DS1302的寄存器和控制命令
DS1302时钟芯片有7个与日历时钟相关的寄存器,如表1所示.
表1 DS1302内部主要寄存器
DS1302和单片机之间的联络信号通过简单的同步串行通信实现.根据DS1302的工作时序要求,不管是单片机从DS1302进行读操作通信还是单片机向DS1302进行写操作通信,每次通信都由单片机先发起.也就是说,在执行相应的读或写操作之前,单片机必须向DS1302写入一个字节的命令字,字节命令字的八位数据如图4所示.
图4 DS1302的命令字结构
1.3 LCD1602液晶显示模块
LCD1602屏幕可以显示两行字符,每行16个,总共32个字符.LCD1602内部有一个80*8位的显示数据存储器DDRAM缓冲区,字符显示位与DDRAM地址的对应关系见表2.
表2 字符显示位与DDRAM的对应关系
DDRAM第一行的地址从00H开始到27H结束,第二行的地址从40H开始到67H结束,每行40个地址,而LCD1602每行显示16个字符,因此在编写程序时,选用DDRAM的前16个地址即可,需要特别注意的是第二行地址从40H开始.如果要在LCD1602屏幕的某行某列显示一个字符,就将这个字符对应的ASCII码写入某行某列相对应的DDRAM地址,这时会发现液晶屏幕上并不能正常显示出这个字符,原因是必须在该地址的基础上加上80H.比如,要在第二行第二列显示电压单位伏特的符号“V”,就要先将第二行第二列对应的DDRAM地址41H加上80H,即C1H,然后在C1H地址写入“V”字符对应的ASCII码0x56,这样才能正常显示.其他字符的显示依此类推,不再赘述.
2 系统软件设计
软件程序主要完成日历时钟的数据读取、转换及液晶显示等功能.
2.1 DS1302时钟子程序设计
sbit RST=P1^0;//DS1302复位端口定义在P1.0引脚
sbit SCLK=P1^1;// DS1302时钟输出端口定义在P1.1引脚
sbit DATA=P1^2;// DS1302数据输出端口定义在P1.2引脚
(1)单片机向DS1302写一个字节数据的程序
void write1302(unsigned char dat)
{unsigned char i;
SCLK=0;//为上升沿写入数据做好准备
delaynus(2);
for (i=0;i<8;i++)//连续写入八位数据
{DATA=dat&0x01;//将dat的bit0数据写入DS1302
delaynus(2);
SCLK=1;//上升沿写入数据
delaynus(2);
SCLK=0;//
dat>>=1;//向右移一位}}
(2)单片机从DS1302读一个字节数据的程序
unsigned char read1302(void)
{unsigned char i,dat;
delaynus(2);
for (i=0;i<8;i++)//连续读取八位数据
{dat>>=1;//右移一位
if (DATA==1)//如果读出的数据是1
dat|=0x80;//将1取出,写在dat的最高位
SCLK=1;//将SCLK置于高电平,为下降沿读出
delaynus(2);
SCLK=0;//拉低SCLK,形成脉冲下降沿
delaynus(2);}
return dat;//将读出的数据返回}
2.2 LCD1602液晶显示子程序设计
LCD1602液晶屏的驱动程序编写相对复杂,一定要弄清楚1602的各个操作指令的用法和意义,主要包括显示模式设置,显示开关控制,输入模式控制,从DDRAM中读取数据,对DDRAM进行写数据,清屏、光标归位设定,数据地址指针设置,LCD目前的忙碌工作标志等[1],其部分代码设计如下:
……
void Lcd_initial() //初始化LCD
{ E=0;
Lcd_writecmd(0x38); //16*2显示,5*7点阵
msdelay (1);
Lcd_writecmd(0x08); //显示关闭
msdelay (2);
Lcd_writecmd(0x01); //显示清屏
msdelay (2);
Lcd_writecmd(0x06); //设置光标,读写一个字符后,光标加1
msdelay (1);
Lcd_writecmd (0x0c); //显示打开,不显示光标
msdelay (1); }
3 仿真与结果分析
在Proteus平台上绘制日历时钟的硬件电路图,如图5所示.
图5 日历时钟的硬件电路图
在Medwin V3.0开发环境中使用C51语言编写好系统程序,编译调试,并将编译生成的HEX十六进制文件加载到单片机芯片中,启动仿真就可以看到基于1602LCD显示的DS1302日历时钟设计系统的仿真运行效果.当前北京时间为2019年5月28日11点42分25秒,仿真结果如图6所示.
图6 日历时钟的仿真运行结果
由图6可以看出,液晶屏上能够实时、准确地显示当前的日期和时间.
4 结语
日历时钟在我们的生活中无处不在.本文以AT89C51单片机为主控制器,利用DS1302实时时钟芯片设计日历时钟系统,在Proteus仿真软件中设计了硬件电路,在Medwin V3.0开发环境中编写相应的C51程序.Proteus和MedWin V3.0这两款软件的联合使用,极大地提高了单片机系统设计的效率,降低了成本,缩短了开发周期[2-5].