|
40黑幣
想利用arduino+DS1302制作時鐘,按鍵可以更改時間,并且可以用串口改變時間。在寫按鍵更改時間的地方搞不懂。沒有辦法把時間寫進DS1302中。求助各位大神幫幫忙。。
Arduino源程序如下:
- #include <stdio.h>
- #include <string.h>
- #include "DS1302.h"
- uint8_t CE_PIN = 5;
- uint8_t IO_PIN = 6;
- uint8_t SCLK_PIN = 7;
- int stopped = A5;
- int min_up = A4;
- int min_down = A3;
- int hour_up = A2;
- int hour_down = A1;
- int flag = 1;
- /* 日期變量緩存 */
- 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;
- }
- /* 將日期代碼格式化湊成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()
- {
- Serial.begin(9600);
- rtc.write_protect(false);
- rtc.halt(false);
- pinMode(stopped, INPUT_PULLUP);
- pinMode(min_up, INPUT_PULLUP);
- pinMode(min_down, INPUT_PULLUP);
- pinMode(hour_up, INPUT_PULLUP);
- pinMode(hour_down, INPUT_PULLUP);
- }
- void loop()
- {
- if (digitalRead(stopped) == 0) {
- flag = !flag;
- if (flag == 0) {
- Serial.end();
- }
- if (flag == 1) {
- Serial.begin(9600);
- }
- }
- if(digitalRead(min_up) == 0){
-
- }
- /* 當串口有數據的時候,將數據拼接到變量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;
- }
- /* 打印當前時間 */
- print_time();
- delay(1000);
- }
復制代碼
|
最佳答案
查看完整內容
下面是從DS1302讀取時間和寫入時間的程序,編個按鍵就可以實現 按鍵更改時間了
char READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
char WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
char TIME[7] = {0};//秒分時日月周年,存儲格式是用BCD碼
void writeData(unsigned char addr,unsigned char dat){ //向芯片里面寫數據,
pinMode(IO_PIN,OUTPUT);
digitalWrite(CE_PI ...
|