单片机电子时钟的设计.doc

上传人:白大夫 文档编号:3398418 上传时间:2019-08-21 格式:DOC 页数:6 大小:27KB
返回 下载 相关 举报
单片机电子时钟的设计.doc_第1页
第1页 / 共6页
亲,该文档总共6页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《单片机电子时钟的设计.doc》由会员分享,可在线阅读,更多相关《单片机电子时钟的设计.doc(6页珍藏版)》请在三一文库上搜索。

1、单片机电子时钟的设计本例直接忽略了星期这项内容,通过上、下、左、右、回车、ESC 这 6 个按键可以调整时间。这也是一个具有综合练习性质的实例,虽然在功能实现上没有多少难度,但要进行的操作却比较多而且烦琐,同学们可以从中体会到把繁杂的功能实现分解为一步步函数操作的必要性以及方便灵活性。简单说一下这个程序的几个要点,方便大家阅读理解程序。把 DS1302 的底层操作封装为一个 DS1302.c 文件,对上层应用提供基本的实时时间的操作接口,这个文件也是我们的又一个功能模块了,我们的积累也越来越多了。定义一个结构体类型 sTime 用来封装日期时间的各个元素,又用该结构体定义了一个时间缓冲区变量

2、bufTIme 来暂存从 DS1302 读出的时间和设置时间时的设定值。需要注意的是在其它文件中要使用这个结构体变量时,必须首先再声明一次 sTIme 类型;定义一个变量 seTIndex 来控制当前是否处于设置时间的状态,以及设置时间的哪一位,该值为 0 就表示正常运行,112 分别代表可以修改日期时间的 12 个位;由于这节课的程序功能要进行时间调整,用到了 1602 液晶的光标功能,添加了设置光标的函数,我们要改变哪一位的数字,就在 1602 对应位置上进行光标闪烁,所以 Lcd1602.c在之前文件的基础上添加了两个控制光标的函数;时间的显示、增减、设置移位等上层功能函数都放在 mai

3、n.c 中来实现,当按键需要这些函数时则在按键文件中做外部声明,这样做是为了避免一组功能函数分散在不同的文件内而使程序显得凌乱。/*DS1302.c 文件程序源代码*/#includesbit DS1302_CE = P1;sbit DS1302_CK = P3;sbit DS1302_IO = P3;struct sTIme /日期时间结构体定义unsigned int year; /年unsigned char mon; /月unsigned char day; /日unsigned char hour; /时unsigned char min; /分unsigned char sec;

4、/秒unsigned char week; /星期;/* 发送一个字节到 DS1302 通信总线上 */void DS1302ByteWrite(unsigned char dat)unsigned char mask;for (mask=0x01; mask!=0; mask=1) /低位在前,逐位移出if (maskDS1302_IO = 1;elseDS1302_IO = 0;DS1302_CK = 1; /然后拉高时钟DS1302_CK = 0; /再拉低时钟,完成一个位的操作DS1302_IO = 1; /最后确保释放 IO 引脚/* 由 DS1302 通信总线上读取一个字节 */u

5、nsigned char DS1302ByteRead()unsigned char mask;unsigned char dat = 0;for (mask=0x01; mask!=0; mask=1) /低位在前,逐位读取if (DS1302_IO != 0) /首先读取此时的 IO 引脚,并设置 dat 中的对应位dat |= mask;DS1302_CK = 1; /然后拉高时钟DS1302_CK = 0; /再拉低时钟,完成一个位的操作return dat; /最后返回读到的字节数据/* 用单次写操作向某一寄存器写入一个字节,reg-寄存器地址,dat-待写入字节 */void DS

6、1302SingleWrite(unsigned char reg, unsigned char dat)DS1302_CE = 1; /使能片选信号DS1302ByteWrite(reg1)|0x80); /发送写寄存器指令DS1302ByteWrite(dat); /写入字节数据DS1302_CE = 0; /除能片选信号/* 用单次读操作从某一寄存器读取一个字节,reg-寄存器地址,返回值-读到的字节 */unsigned char DS1302SingleRead(unsigned char reg)unsigned char dat;DS1302_CE = 1; /使能片选信号DS1

7、302ByteWrite(reg1)|0x81); /发送读寄存器指令dat = DS1302ByteRead(); /读取字节数据DS1302_CE = 0; /除能片选信号return dat;/* 用突发模式连续写入 8 个寄存器数据,dat-待写入数据指针 */void DS1302BurstWrite(unsigned char *dat)unsigned char i;DS1302_CE = 1;DS1302ByteWrite(0xBE); /发送突发写寄存器指令for (i=0; i8; i+) /连续写入 8 字节数据DS1302ByteWrite(dati);DS1302_C

8、E = 0;/* 用突发模式连续读取 8 个寄存器的数据,dat-读取数据的接收指针 */void DS1302BurstRead(unsigned char *dat)unsigned char i;DS1302_CE = 1;DS1302ByteWrite(0xBF); /发送突发读寄存器指令for (i=0; i8; i+) /连续读取 8 个字节dati = DS1302ByteRead();DS1302_CE = 0;/* 获取实时时间,即读取 DS1302 当前时间并转换为时间结构体格式 */void GetRealTime(struct sTime *time)unsigned

9、char buf8;DS1302BurstRead(buf);time-year = buf6 + 0x2000;time-mon = buf4;time-day = buf3;time-hour = buf2;time-min = buf1;time-sec = buf0;time-week = buf5;/* 设定实时时间,时间结构体格式的设定时间转换为数组并写入 DS1302 */void SetRealTime(struct sTime *time)unsigned char buf8;buf7 = 0;buf6 = time-year;buf5 = time-week;buf4 =

10、time-mon;buf3 = time-day;buf2 = time-hour;buf1 = time-min;buf0 = time-sec;DS1302BurstWrite(buf);/* DS1302 初始化,如发生掉电则重新设置初始时间 */void InitDS1302()unsigned char dat;struct sTime code InitTime = /2013 年 10 月 8 日 12:30:00 星期二0x2013,0x10,0x08, 0x12,0x30,0x00, 0x02;DS1302_CE = 0; /初始化 DS1302 通信引脚DS1302_CK

11、= 0;dat = DS1302SingleRead(0); /读取秒寄存器if (dat DS1302SingleWrite(7, 0x00); /撤销写保护以允许写入数据SetRealTime( /设置 DS1302 为默认的初始时间DS1302.c 最终向外提供出与具体时钟芯片寄存器位置无关的、由时间结构类型 sTime 作为接口的实时时间的读取和设置函数,如此处理体现了我们前面提到过的层次化编程的思想。应用层可以不关心底层实现细节,底层实现的改变也不会对应用层造成影响,比如说日后你可能需要换一款时钟芯片,而它与 DS1302 的操作和时间寄存器顺序是不同的,那么你需要做的也仅是针对这款新的时钟芯片设计出底层操作函数,最终提供出同样的以 sTime 为接口的操作函数即可,应用层无需做任何的改动。/*Lcd1602.c 文件程序源代码*/#include#define LCD1602_DB P0sbit LCD1602_RS = P1

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1