数据位为BCD码形式。其日历、时间寄存器及其控制字如上表所示,其中奇数为读操作,偶数为写操作。
时钟暂停:秒寄存器的位7定义位时钟暂停位。当它为1时,DS1302停止振荡,进入低功耗的备份方式,通常在对DS1302进行写操作时(如进入时钟调整程序),停止振荡。当它为0时,时钟将开始启动。
AM-PM/12-24小时方式:小时寄存器的位7定义为12或24小时方式选择位。它为高电平时,选择12小时方式。在此方式下,位5为第二个10小时位(20~23h)。
DS1302的晶振选用32768Hz,电容推荐值为6pF。因为振荡频率较低,也可以不接电容,对计时精度影响不大。
2.2.3 OLED显示模块
OLED 模块采用 4 线 SPI 操作,黄蓝双色屏和蓝色屏操作相同。
管脚从左到右定义为: GND: 电源地
VCC: 供电电源 3.3V、5V 都可以 D0: CLK 时钟 D1: MOSI 数据 RES: 复位 DC: 数据/命
第3章 系统的软件设计
3.1 程序设计
电子时钟的程序主要包括3个方面的内容:一是DS1302从单片机中读取数据进行计数,二是利用按键进行时间的调整,三是单片机中读取DS1302中的数据驱动OLED数码管显示时间。STC89C52RC单片机主要I/O口的分配:P10、P11、P12分别接时钟芯片的SCLK、I/O、RST引脚,P13、P14、P15、P16接四个独立按键。
开始OLED初始化DS1302初始化从DS1302读取时间时间送OLED显示
第4章 结束语
2013年10月,我开始了我的毕业论文工作,时至今日,论文基本完成。从最初的茫然,到慢慢的进入状态,再到对思路逐渐的清晰,整个写作过程难以用语言来表达。历经了一个多月的奋战,紧张而又充实的毕业设计终于落下了帷幕。回想这段日子的经历和感受,我感慨万千,在这次毕业设计的过程中,我拥有了无数难忘的回忆和收获。当我终于完成了所有打字、绘图、排版、校对的任务后整个人都很累,但同时看着电脑荧屏上的毕业设计稿件我的心里是甜的,我觉得这一切都值了。这次毕业论文的制作过程是我的一次再学习,再提高的过程。在论文中我充分地运用了大学期间所学到的知识。
我不会忘记这难忘的几个月的时间。毕业论文的制作给了我难忘的回忆。在我徜徉书海查找资料的日子里,面对无数书本的罗列,最难忘的是每次找到资料时的激动和兴奋;亲手用Protel DXP设计电路图的时间里,记忆最深的是每一步小小思路实现时那幸福的心情;为了论文我曾赶稿到深夜,但看着亲手打出的一字一句,心里满满的只有喜悦毫无疲惫。这段旅程看似荆棘密布,实则蕴藏着无尽的宝藏。我从资料的收集中,掌握了很多单片机及其接口应用的知识,让我对我所学过的知识有所巩固和提高,并且让我对当今单片机的最新发展技术有所了解。在整个过程中,我学到了新知识,增长了见识。在今后的日子里,我仍然要不断地充实自己,争取在所学领域有所作为。
脚踏实地,认真严谨,实事求是的学习态度,不怕困难、坚持不懈、吃苦耐劳的精神是我在这次设计中最大的收益。我想这是一次意志的磨练,是对我实际能力的一次提升,也会对我未来的学习和工作有很大的帮助。在这次毕业设计中也使我们的同学关系更进一步了,同学之间互相帮助,有什么不懂的大家在一起商量,听听不同的看法对我们更好的理解知识,所以在这里非常感谢帮助我的同学。
在此更要感谢我的指导老师和同学,是你们的细心指导和关怀,使我能够顺利的完成毕业论文。在此我要向石老师致以最衷心的感谢和敬意。
程序
//main.c//
#include \#include \#include \
#define uchar unsigned char #define uint unsigned int uchar
hour,minute,second,year,mooth,day,week; VOID
MAIN_OLED_Display(VOID);
//OLED显示函数 VOID
TIME_OLED_Display(VOID);
//OLED显示时间函数
VOID DAY_OLED_Display(VOID); //OLED显示日期函数 VOID
MAIN_TIME_Delay(USHORT16
usTime); //延时函数 VOID main(void) {
OLED_Init();
//ModifyTime(13,11,3,10,42,10); //
初
始
化
DS3231
时
钟,2013/11/2,09/20/30 InitDS1302(); //烧写一次时间初值即可,以后只要读出时间
MAIN_OLED_Display();//每次开机先用汉字显示设计者信息
while(1)
{
GetTime_DS1302(); //调
用后能一次读出DS3231中数据放在数组DS3231_buf[]中
TIME_OLED_Display();//显示当前时间
DAY_OLED_Display(); //OLED在指定位置显示当前日期 } return; }
//OLED显示时间函数
VOID TIME_OLED_Display(VOID) {
hour=TableDs1302[2];
//GPS或时钟芯片读取时间放在此变量中
minute=TableDs1302[1];
//GPS或时钟芯片读取时间放在此变量
中
second=TableDs1302[0];
//GPS或时钟芯片读取时间放在此变量
中 OLED_P16x32Image(0, 0,
hour/10);//大字体显示小时十位值
OLED_P16x32Image(16,
0,
hour);//大字体显示小时个位值
OLED_P16x32Image(32, 0, 10);
//显示大字体冒号
OLED_P16x32Image(48,
0,
OLED_P8x16char(40,
5,
minute/10);//大字体显示分钟十位值
OLED_P16x32Image(64,
0,
mooth/10+'0');
OLED_P8x16char(48,
5,
minute);//大字体显示分钟个位值
OLED_P6x8Char(80,3,second/10+'
mooth+'0');//显示月 OLED_P8x16char(56, 5, '-');
0');//小字体显示秒钟十位值
OLED_P6x8Char(88,3,second+'
0');//小字体显示秒钟个位值 }
//OLED显示日期函数
VOID DAY_OLED_Display(VOID) {
year=TableDs1302[6]; //GPS或时钟芯片读取时间放在此变量中
mooth=TableDs1302[4]; //GPS或时钟芯片读取时间放在此变量中
day=TableDs1302[3]; //GPS或时钟芯片读取时间放在此变量中 OLED_P8x16char(0, 5, 2+'0'); OLED_P8x16char(8, 5, 0+'0');
OLED_P8x16char(16,
5,
year/10+'0');
OLED_P8x16char(24,
5,
year+'0');//显示20**年
OLED_P8x16char(32, 5, '-'); //分隔标记
//
OLED_P8x16char(64,
5,
day/10+'0');//显示日期
OLED_P8x16char(72,
5,
day+'0'); }
VOID MAIN_OLED_Display(VOID)
{
USHORT16 i; OLED_P14x16Str(32,
0,
(UCHAR8*)\景德镇学院\
OLED_P14x16Str(16,
1, (UCHAR8*)\机械电子工程系\
for (i = 0; i <= 100; i++)
{
MAIN_TIME_Delay(40);
OLED_PrintChar(58, 5,
(CHAR8)i); }
MAIN_TIME_Delay(500);
OLED_Fill(0x00); //清屏
return;
}
VOID
MAIN_TIME_Delay(USHORT16