1334479405 发表于 2020-4-14 13:17 把这个程序加到你那个程序里面,然后在你这里 if(digitalRead(min_up) == 0){ }这样写 if(digitalRead(min_up) == 0) { for(n=0;n<7;n++) { TIME[n]=readData(READ_RTC_ADDR[n]); } //读取DS1302里当前时间 TIME[1]=TIME[1]+1; //分钟增加1,秒分时日月周年,分在TIME[1]里 时在TIME[2] for(n=0;n<7;n++) { writeData(WRITE_RTC_ADDR[n],TIME[n]); } //把更改的时间写入DS1302 } |
wudidewrf 发表于 2020-4-14 10:50 谢谢。。但是我看不怎么懂这个程序。。就是你写的这个程序是直接加到我的程序里还是单独的啊?如果可以的话可以麻烦你直接在我的程序上面改动一下吗? |
| 建议用DS321,你这个没有温度补偿,时差可能较大 |
|
下面是从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_PIN,LOW); //下拉低,再拉高 digitalWrite(SCLK_PIN,LOW) ; //SCLK的上升沿, 芯片会读取IO端口 delayMicroseconds(1); digitalWrite(CE_PIN,HIGH); int i; for(i =0;i<8;i++){ digitalWrite(SCLK_PIN,LOW); digitalWrite(IO_PIN, addr&1); addr =addr>>1; digitalWrite(SCLK_PIN,HIGH); delayMicroseconds(1); } for(i =0;i<8;i++){ digitalWrite(SCLK_PIN,LOW); digitalWrite(IO_PIN, dat&1); dat =dat>>1; digitalWrite(SCLK_PIN,HIGH); delayMicroseconds(1); } digitalWrite(CE_PIN,LOW); } char readData(char addr){ //从芯片里去读源数据,但是数据还是要经过一定的格式化才行啊 addr = addr | 1; //读操作最低位置为1 要看懂这些就需要查看芯片的手册才是呀 pinMode(IO_PIN,OUTPUT); digitalWrite(CE_PIN,LOW); //下拉低,再拉高 digitalWrite(SCLK_PIN,LOW) ; //SCLK的上升沿, 芯片会读取IO端口 delayMicroseconds(1); digitalWrite(CE_PIN,HIGH); int i; for(i =0;i<8;i++){ //读取命令是先要写一些命令代码,根据代码,芯片会吐出相应的元素. digitalWrite(SCLK_PIN,LOW); digitalWrite(IO_PIN, addr&1); addr =addr>>1; digitalWrite(SCLK_PIN,HIGH); delayMicroseconds(1); } pinMode(IO_PIN,INPUT); //设置io口为向内读入.这样这个引脚就可以读取数据了. int dat = 0; for(i =0;i<8;i++){ digitalWrite(SCLK_PIN,LOW); delayMicroseconds(10); char b = digitalRead(IO_PIN); dat = dat >>1; //先向右平移 dat = dat | (b<<7); //将所得放入最高位 digitalWrite(SCLK_PIN,HIGH); delayMicroseconds(1); } digitalWrite(CE_PIN,LOW); return dat ; } |