|
//功能:复位1302 //输入: void reset_1302(void) { //*pdddr=0xff7f; *peddr|=RTC_DATA | RTC_RST | RTC_SCK ; //方向寄存器 0--输出 delly(50); *pedr&=~RTC_RST; //rst=0 *pedr&=~RTC_RST; *pedr&=~RTC_RST; *pedr&=~RTC_RST; *pedr&=~RTC_RST; delly(50); *pedr&=~RTC_SCK; //sck=0 *pedr&=~RTC_SCK; *pedr&=~RTC_SCK; *pedr&=~RTC_SCK; delly(50); *pedr|=RTC_RST; //RST=1 *pedr|=RTC_RST; //RST=1 *pedr|=RTC_RST; //RST=1 *pedr|=RTC_RST; //RST=1 *pedr|=RTC_RST; //RST=1 delly(50); }
//功能:往1302写入1 BYTE 数据 即命令又数据 //输入:in_data void input_1302(word in_data) { word i; word code_choice; // *pdddr=0xff7f; *peddr|=RTC_DATA; //方向寄存器 1--输出 *peddr|=RTC_SCK; //方向寄存器 1--输出 delly(50); code_choice=0x01; for(i=0;i<8;i++) //上升沿写数据 { *pedr&=~RTC_SCK; *pedr&=~RTC_SCK; *pedr&=~RTC_SCK; //0x20 *pedr&=~RTC_SCK; delly(20); if(in_data & code_choice){ *pedr|=RTC_DATA; *pedr|=RTC_DATA; //0x01 *pedr|=RTC_DATA; *pedr|=RTC_DATA; } else{ *pedr&=~RTC_DATA; *pedr&=~RTC_DATA; *pedr&=~RTC_DATA; *pedr&=~RTC_DATA; } delly(20); *pedr|=RTC_SCK; *pedr|=RTC_SCK; *pedr|=RTC_SCK; *pedr|=RTC_SCK; delly(20); code_choice=code_choice*2; } }
//功能:从1302读出1 BYTE 数据 //输出:从1302读出的数据 word output_1302() { word i; word code_choice; word out_data;
// *pddr|= RTC_DATA; // *pdddr=(~RTC_DATA)&0xff7f; *peddr&=~RTC_DATA; //方向寄存器 0--输入 delly(50); *pedr|=RTC_SCK; *pedr|=RTC_SCK; *pedr|=RTC_SCK; *pedr|=RTC_SCK; delly(50); out_data=0; for(i=0;i<8;i++) //下降沿输出数据 { *pedr&=~RTC_SCK; *pedr&=~RTC_SCK; *pedr&=~RTC_SCK; *pedr&=~RTC_SCK; delly(30); code_choice=*pedr; *pedr|=RTC_SCK; *pedr|=RTC_SCK; *pedr|=RTC_SCK; *pedr|=RTC_SCK; delly(30); out_data=out_data/2; if(code_choice & RTC_DATA){ out_data=out_data | 0x80; } } *peddr|=RTC_DATA; //方向寄存器 1--输出 return out_data; }
//让DS1302时钟芯片写使能 void time_wr_en(void) {
reset_1302(); input_1302(0x8e); //打开写保护 input_1302(0x00); reset_1302(); input_1302(0x90); //R1=2K,一个二极管 input_1302(0xab); reset_1302(); input_1302(0x80); //启动实时时钟 input_1302(0x00); }
//对DS1302串读 //功能:读取当前时间,依序为:秒分时日月年, //输出:全局变量time_str--时间变量 //耗时:1.23730ms void time_str_rd() { word i; word time_temp[7];
reset_1302(); input_1302(0xbf); //串读命令 for(i=0;i<7;i++){ time_temp[i]=output_1302(); } time_temp[0]= time_temp[0] & 0x7f; time_str[1]=(time_temp[0]/0x10)*10+(time_temp[0]%0x10); //秒 time_temp[1]=time_temp[1] & 0x7f; time_str[2]=(time_temp[1]/0x10)*10+(time_temp[1]%0x10); //分 time_temp[2]=time_temp[2] & 0x3f; time_str[3]=(time_temp[2]/0x10)*10+(time_temp[2]%0x10); //时 time_temp[3]=time_temp[3] & 0x3f; time_str[4]=(time_temp[3]/0x10)*10+(time_temp[3]%0x10); //日 time_temp[4]=time_temp[4] & 0x1f; time_str[5]=(time_temp[4]/0x10)*10+(time_temp[4]%0x10); //月 time_temp[6]=time_temp[6] & 0x1f; time_str[6]=(time_temp[6]/0x10)*10+(time_temp[6]%0x10); //年 }
//对DS1302串写 //修改当前时间,依序为:秒分时日月年 void time_str_wr(word *tdata) { word i; if((tdata[5]-0)>(0x99-0))tdata[5]=0; //年 if((tdata[4]-1)>(0x12-1))tdata[4]=1; //月 if((tdata[3]-1)>(0x31-1))tdata[3]=1; //日 if((tdata[2]-0)>(0x23-0))tdata[2]=0; //时 if((tdata[1]-0)>(0x59-0))tdata[1]=0; //分 if((tdata[0]-0)>(0x59-0))tdata[0]=0; //秒 tdata[6]=tdata[5]; //年变换位置 tdata[5]=4; //星期 reset_1302(); input_1302(0xbe); //串读命令 for(i=0;i<7;i++){ input_1302(tdata[i]); } input_1302(00); //写使能 input_1302(0xab); //充电模式
}
|