直接发代码好了,硬件连接已经写在里面了数码管是用595驱动的6级串联。- /*Arduino 连接 DS1302
- 代码来源:http://quadpoint.org/projects/arduino-ds1302
- 增加了串口调整时间代码*/
- #include <stdio.h>
- #include <string.h>
- #include <DS1302.h>
- /* 接口定义
- CE(DS1302 pin5) -> Arduino D5
- IO(DS1302 pin6) -> Arduino D6
- SCLK(DS1302 pin7) -> Arduino D7*/
- uint8_t CE_PIN = 5;
- uint8_t IO_PIN = 6;
- uint8_t SCLK_PIN = 7;
- /**************************************************************
- GND(pin 8) to ground,
- VCC(pin 16) to 5V
- OE (pin 13) to ground
- MR (pin 10) to 5V
- latchPin = 13; to 595 pin 12
- clockPin = 12; to 595 pin 11
- dataPin = 11; to 595 pin 14
- ****************************************************************/
- char latchPin = 13;//Pin connected to ST_CP of 74HC595
- char clockPin = 12;//Pin connected to SH_CP of 74HC595
- char dataPin = 11;//Pin connected to DS of 74HC595
- int FIR,SEC,THI,FOR,FIF,SIX;
- ///////////////////0////1///2////3/////4////5////6/////7////8///9////
- byte segcode[10]={0X40,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X00,0X10};
- /* 日期变量缓存 */
- char buf[50];
- char day[10];
- /* 串口数据缓存 */
- String comdata = "";
- int numdata[7] ={0}, j = 0, mark = 0;
- /* 创建 DS1302 对象 */
- DS1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);
- void print_time()
- {
- /* 从 DS1302 获取当前时间 */
- 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;
- }
- FIR = t.hr/10;
- SEC = t.hr%10;
- THI = t.min/10;
- FOR = t.min%10;
- FIF = t.sec/10;
- SIX = t.sec%10;
- /* 将日期代码格式化凑成buf等待输出 */
- snprintf(buf, sizeof(buf), "%s %04d-%02d-%02d %02d:%02d:%02d", day, t.yr, t.mon, t.date, t.hr, t.min, t.sec);
- /* 输出日期到串口 */
- Serial.println(buf);
- }
- void setup()
- {
- pinMode(latchPin, OUTPUT);
- pinMode(clockPin, OUTPUT);
- pinMode(dataPin, OUTPUT);
- Serial.begin(9600);
- rtc.write_protect(false);
- rtc.halt(false);
- }
- void loop()
- {
- /* 当串口有数据的时候,将数据拼接到变量comdata */
- while (Serial.available() > 0)
- {
- comdata += char(Serial.read());
- delay(2);
- mark = 1;
- }
- /* 以逗号分隔分解comdata的字符串,分解结果变成转换成数字到numdata[]数组 */
- if(mark == 1)
- {
- Serial.print("You inputed : ");
- Serial.println(comdata);
- for(int i = 0; i < comdata.length() ; i++)
- {
- if(comdata[i] == ',' || comdata[i] == 0x10 || comdata[i] == 0x13)
- {
- j++;
- }
- else
- {
- numdata[j] = numdata[j] * 10 + (comdata[i] - '0');
- }
- }
- /* 将转换好的numdata凑成时间格式,写入DS1302 */
- Time t(numdata[0], numdata[1], numdata[2], numdata[3], numdata[4], numdata[5], numdata[6]);
- rtc.time(t);
- mark = 0;j=0;
- /* 清空 comdata 变量,以便等待下一次输入 */
- comdata = String("");
- /* 清空 numdata */
- for(int i = 0; i < 7 ; i++) numdata[i]=0;
- }
- digitalWrite(latchPin, LOW);
- shiftOut(dataPin, clockPin, MSBFIRST,segcode[FIR]);
- shiftOut(dataPin, clockPin, MSBFIRST,segcode[SEC]);
- shiftOut(dataPin, clockPin, MSBFIRST,segcode[THI]);
- shiftOut(dataPin, clockPin, MSBFIRST,segcode[FOR]);
- shiftOut(dataPin, clockPin, MSBFIRST,segcode[FIF]);
- shiftOut(dataPin, clockPin, MSBFIRST,segcode[SIX]);
- digitalWrite(latchPin, HIGH);
- /* 打印当前时间 */
- print_time();
- delay(1000);//refresh time
- }
复制代码 |