基于 MCS-51单片机的万年历设计

(整期优先)网络出版时间:2019-12-04
/ 2

基于 MCS-51单片机的万年历设计

汤泽容

重庆工贸职业技术学院

【摘要】:基于MCS-51单片机的万年历设计,利用时钟芯片DS1302,单片机的I/O口外接液晶12864,通过软件模拟的方法,从而使得液晶12864显示所需的字符。

【关键词】 单片机 时钟芯片DS1302 液晶12864

1、引言

单片机是一种可通过编程控制的微处理器,单片机芯片自身不能单独运用于某项工程或者产品上,它必须要依靠外围数字器件或模拟器件的协调才可以发挥其自身的强大功能,本文介绍如何使用DS1302,实现显示万年历的效果。

2、硬件组成

液晶12864显示系统实际是由51单片机最小系统、液晶12864、DS1302等构成,如下图1所示。

5de74ef2d08d8_html_0.gif5de74ef2d08d8_html_e774d014bc319665.jpg

图1 电路图

3、程序设计

#include

#define uint unsigned int

#define uchar unsigned char

sbit clk=P3^5; //7

sbit io=P3^7; //6

sbit rst=P3^6; //5

sbit cs=P2^0; //4脚

sbit sid=P2^1; //5脚

sbit sclk=P2^2; //6脚

void read_time()//读1302全部时间

{ uchar temp;

temp=read_1302(0x81);//读秒.bcd编码

curr.sec=(((temp>>4)&0x07)*10+(temp&0x0f));

temp=read_1302(0x83);//读分.bcd编码

curr.min=((temp>>4)&0x07)*10+(temp&0x0f);//秒钟显示

temp=read_1302(0x85);//读时.bcd编码24小时

curr.hr=((temp>>4)&0x03)*10+ (temp&0x0f);

temp=read_1302(0x87);//读日.bcd编码24小时

curr.date=((temp>>4)&0x03)*10+ (temp&0x0f);

temp=read_1302(0x89);//读月.bcd编码24小时

curr.mon=((temp>>4)&0x01)*10+ (temp&0x0f);

temp=read_1302(0x8b);//读周.bcd编码24小时

curr.week= (temp&0x0f);

temp=read_1302(0x8d);//读年.bcd编码24小时

curr.year=((temp>>4))*10+ (temp&0x0f);

}

void show_time()

{ uchar buf[9];

LCD_drive(0,0x91); //年

LCD_drive(1,(curr.year)/10+48);

LCD_drive(1,(curr.year)%10+48);

LCD_drive(0,0x93);//月

LCD_drive(1,(curr.mon)/10+48);

LCD_drive(1,(curr.mon)%10+48);

LCD_drive(0,0x95); //日

LCD_drive(1,(curr.date)/10+48);

LCD_drive(1,(curr.date)%10+48);

//LCD_drive(0,0x87); //小时,分中,秒钟

buf[0]=(curr.hr)/10+48;

buf[1]=(curr.hr)%10+48;

buf[2]=':';

buf[3]=(curr.min)/10+48;

buf[4]=(curr.min)%10+48;

buf[5]=':';

buf[6]=(curr.sec)/10+48;

buf[7]=(curr.sec)%10+48;

buf[8]=0;

show_string(0x88,buf); //???

LCD_drive(0,0x9a);

LCD_drive(1,(curr.week)+48); //星期

}

void show_static()//静态部分显示

{ show_string(0x80,"实时时钟");

show_string(0x90,"20 年 月 日");

show_string(0x98,"星期");

}

void main()

{ uchar temp;

uchar sec;//真正的秒钟

LCD_init();

show_string(0x80,"DS1302时钟");

spi_portinit();//端口初始化

write_1302(0x8e,0);//取消DS1302的写保护

write_1302(0x80,0x12);//秒钟初值

show_static();

while(1)

{ read_time();

show_time();

}

}

4、结束

当上述程序编写好之后,我们需要使用编译软件对其编译,得到单片机能识别的二进制代码,然后再用编程器将二进制代码烧写到单片机中,就能看到液晶12864的显示万年历。

参考文献:

[1] 谭浩强.C程序设计,北京:清华大学出版社,1991

[2] 郭天祥.51单片机C语言教程,北京:电子工业出版社,2010

[3] 余锡存等.单片机原理及接口技术,西安:西安电子科技大学出版社,2000