|
发表于 2012-12-4 17:56:02
|
显示全部楼层
本帖最后由 wsy2012 于 2012-12-5 17:27 编辑
DS1302驱动及读取时间代码:
注:
clock_dat为DS1302数据引脚
clock_clk为DS1302时钟引脚
clock_Rst为DS1302复位引脚- /*************************************************************************************************************************************************************
- 模块名:DS1302驱动
- 函 数:6
- 作 用:读写DS1302
- 分 类:硬件层
- /*************************************************************************************************************************************************************/
- /*********************************************************************************************
- 函数名:向DS1302写信息(不可直接调用)
- 调 用:clock_out(dd);
- 参 数:dd:要写入的数据或地址
- 返回值:无
- 结 果:向DS1302写入一字节
- 分 类:第一硬件层
- /**********************************************************************************************/
- void clock_out(unsigned char dd){
- unsigned char i;
- for(i=0;i<8;i++){
- clock_dat=dd&0x01; //向DS1302写入一字节数据
- _nop_(); //延时一指令周期
- clock_clk=1; //拉高时钟脉冲
- dd>>=1; //右移一位
- clock_clk=0; //拉低时钟脉冲
- }
- }
- /**********************************************************************************************/
- /*********************************************************************************************
- 函数名:从DS1302读出数据(不可直接调用)
- 调 用:某变量=clock_in();
- 参 数:无
- 返回值:从DS1302读出的数据
- 结 果:从DS1302读出一字节
- 分 类:第一硬件层
- /**********************************************************************************************/
- unsigned char clock_in(){
- unsigned char i,j=0;
- clock_dat=1;
- for(i=0;i<8;i++){
- j>>=1; //右移一位
- _nop_(); //延时一指令周期
- clock_clk=0; //拉低时钟脉冲
- _nop_(); //延时一指令周期
- if(clock_dat){ //判断接收该位数据是否为1
- j+=0x80;
- }
- _nop_(); //延时一指令周期
- clock_clk=1; //拉高时钟脉冲
- }
- return(j); //返回数值
- }
- /**********************************************************************************************/
- /*********************************************************************************************
- 函数名:从DS1302读出数据
- 调 用:某变量=read_clock();
- 参 数:ord:要读的数据的地址
- 返回值:从DS1302读出的数据
- 结 果:从DS1302读出一字节
- 分 类:第二硬件层
- /**********************************************************************************************/
- unsigned char read_clock(unsigned char ord){ //-DS1302读数据(DS1302驱动)
- unsigned char dd=0;
- clock_Rst=0;
- clock_clk=0;
- clock_Rst=1;
- clock_out(ord|0x01);
- dd=clock_in();
- clock_clk=1;
- clock_Rst=0;
- return(dd);
- }
- /**********************************************************************************************/
- /*********************************************************************************************
- 函数名:向DS1302写信息(不可直接调用)
- 调 用:write_clock(ord,dd);
- 参 数:ord:要写入的地址;dd:要写入的数据
- 返回值:无
- 结 果:向DS1302写入一字节
- 分 类:第二硬件层
- /**********************************************************************************************/
- void write_clock(unsigned char ord, unsigned char dd){ //-DS1302写数据(DS1302驱动)
- clock_Rst=0;
- clock_clk=0;
- clock_Rst=1;
- clock_out(ord);
- clock_out(dd);
- clock_clk=1;
- clock_Rst=0;
- }
- /**********************************************************************************************
- /*********************************************************************************************
- 函数名:初始化DS1302
- 调 用:Init_1302();
- 参 数:无
- 返回值:无
- 结 果:自动判断DS1302是否初始化,未初始化则进行初始化
- 分 类:第三硬件层
- /**********************************************************************************************/
- void Init_1302(void){
- unsigned char f;
- if(read_clock(0xc1) != 0xaa){//&&TIME_SS==80
- write_clock(0x80,0x00);//秒
- write_clock(0x90,0xa5);//充电
- write_clock(0xc1,0xaa);//写入初始化标志RAM(第00个RAM位置)
- for(f=0;f<60;f=f+2){//清除闹钟RAM位为0
- write_clock(0xc2+f,0x00);
- }
- write_clock(0x8e,0x80);//禁止写操作
- }
- }
- /**********************************************************************************************/
- /*********************************************************************************************
- 函数名:DS1302写入时间数据
- 调 用:SET_1302_TIME();
- 参 数:无
- 返回值:无
- 结 果:将时间变量写入DS1302
- 分 类:第三硬件层
- /**********************************************************************************************/
- void SET_1302_TIME (void){
- write_clock(0x8e,0x00);//允许写操作
- write_clock(0x8c,TIME_YY/10*16+TIME_YY%10);//TIME_YY为时间年变量
- write_clock(0x88,TIME_MO/10*16+TIME_MO%10);//TIME_MO为时间月变量
- write_clock(0x86,TIME_DD/10*16+TIME_DD%10);//TIME_DD为时间天变量
- write_clock(0x8a,TIME_WW/10*16+TIME_WW%10);//TIME_WW为时间星期变量
- write_clock(0x84,TIME_HH/10*16+TIME_HH%10);//TIME_HH为时间小时变量
- write_clock(0x82,TIME_MM/10*16+TIME_MM%10);//TIME_MM为时间分钟变量
- write_clock(0x80,TIME_SS/10*16+TIME_SS%10);//TIME_SS为时间秒变量
- write_clock(0x90,0xa5);//充电
- write_clock(0x8e,0x80);//写保护,禁止写操作
- }
- /**********************************************************************************************/
- /*************************************************************************************************************************************************************/
- /*
- 读取DS1302数据示范
-
- TIME_YY=read_clock(0x8c)/16*10+read_clock(0x8c)%16;
- TIME_MO=read_clock(0x88)/16*10+read_clock(0x88)%16;
- TIME_DD=read_clock(0x86)/16*10+read_clock(0x86)%16;
- TIME_WW=read_clock(0x8a)/16*10+read_clock(0x8a)%16;
- TIME_HH=read_clock(0x84)/16*10+read_clock(0x84)%16;
- TIME_MM=read_clock(0x82)/16*10+read_clock(0x82)%16;
- TIME_SS=read_clock(0x80)/16*10+read_clock(0x80)%16;
- */
复制代码 |
|