Arduino和C51开发DS1302时钟
技术:51单片机、Arduino、DS1302时钟、串口通信
概述
本文实现51单片机和Arduino串口实时显示时钟功能,让读者对DS1302能够更好的理解,这次功能也和上节课学到的串口通信运用在一起
详细
一、DS1302时钟
DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.0V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。
二、51单片机串口显示时钟
硬件连接:
初始化DS1302时钟后,DS1302内部会进行计时,这里我们通过datapros()把当前时间放入Data字符串中,代码如下:
void datapros() //时间读取处理转换函数 { Ds1302ReadTime(); Data[0] = '0'+(TIME[2]/16); //时 Data[1] = '0'+(TIME[2]&0x0f); Data[2] = ':'; Data[3] = '0'+(TIME[1]/16); //分 Data[4] = '0'+(TIME[1]&0x0f); Data[5] = ':'; Data[6] = '0'+(TIME[0]/16); //秒 Data[7] = '0'+(TIME[0]&0x0f); }
主函数只要每1s打印一次数据到串口就实现时钟功能了,代码如下:
void main() { int i; Ds1302Init(); //Ds1302初始化 UsartInit(); //串口初始化 while(1) { datapros(); sprintf(time_data,"%c%c%c%c%c%c%c%c",Data[0],Data[1],Data[2],Data[3],Data[4],Data[5],Data[6],Data[7]); //合成字符串函数 printf(time_data); printf("\n"); delay1s(); //1s打印一次时间 } }
时钟功能如下图:
注:如果加了其他功能,代码量多了,不能每1s打印出时间了,那你可以试试用中断
三、Arduino串口显示时钟
硬件连接:
编译烧写前,你还需要:
1. 右击Arduino软件->打开文件所在的位置
2. 将本项目代码文件夹中的DS1302文件夹复制到libraries文件夹中
这样我们代码中才能使用DS1302这个头文件,代码如下:
#include <stdio.h> #include <string.h> #include "DS1302.h" uint8_t RST = 5; uint8_t DAT = 6; uint8_t CLK = 7; /* 日期变量缓存 */ char buf[50]; char day[10]; /* 定义DS1302对象 */ DS1302 rtc(RST, DAT, CLK); void print_time() { Time t = rtc.time(); /* 星期转换成字符串 */ memset(day, 0, sizeof(day)); switch (t.day) { case 1: strcpy(day, "Sunday"); break; case 2: strcpy(day, "Monday"); break; case 3: strcpy(day, "Tuesday"); break; case 4: strcpy(day, "Wednesday"); break; case 5: strcpy(day, "Thursday"); break; case 6: strcpy(day, "Friday"); break; case 7: strcpy(day, "Saturday"); break; } /* 日期格式化 */ snprintf(buf, sizeof(buf), "%04d-%02d-%02d %02d:%02d:%02d %s", t.yr, t.mon, t.date, t.hr, t.min, t.sec, day); /* 打印输出 */ Serial.println(buf); } void setup() { Serial.begin(9600); rtc.writeProtect(false);//关闭写保护 rtc.halt(false); /* 初始化时间 */ Time t(2018, 12, 19, 12, 0, 0, 4);//最后一个为星期x,日:1、一:2、二:3..... rtc.time(t); rtc.writeProtect(true);//开启写保护 } void loop() { /* 串口显示时间 */ print_time(); delay(1000); }
时钟功能如下图:
四、总结
本文实现51单片机和Arduino串口显示时钟功能,让读者对DS1302能够更好的理解,如果想深入了解DS1302具体实现和其他的功能,大家可以自行上网搜索资料,相信付出就会有收获。