APP下载

基于单片机的DS1302日历时钟的设计和实现

2019-02-24

石家庄职业技术学院学报 2019年6期
关键词:光标寄存器字符

严 敏

(江苏旅游职业学院 信息工程学院,江苏 扬州 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].

猜你喜欢

光标寄存器字符
STM32和51单片机寄存器映射原理异同分析
Lite寄存器模型的设计与实现
字符代表几
一种USB接口字符液晶控制器设计
图片轻松变身ASCⅡ艺术画
HBM电子称与西门子S7-200系列PLC自由口通讯
移位寄存器及算术运算应用
陈光标吃剩饭倒了谁的胃口
Lx5280模拟器移植设计及实施
陈光标:巴菲特先生,我要裸捐!