⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 s.c

📁 ds1302的驱动
💻 C
字号:

#include<reg51.h>
#include<intrins.h>
sbit SCLK=P0^0;  //时钟线
sbit IO=P0^1;    //数据线
sbit RST=P0^2;   //RST线
unsigned char bdata ds1302_data;//bdata型变量可以进行位寻址
sbit bit_data0=ds1302_data^0;
sbit bit_data7=ds1302_data^7;

void delay(unsigned int t)  //延时
{
 unsigned int m,n;
 for(m=0;m<t;m++)
 for(n=0;n<10;n++);
}





void write_byte(unsigned char d)  //写一个字节操作
{
unsigned char i;
ds1302_data=d;
for(i=8;i>0;i--)
{
IO=bit_data0;  //从数据的地位开始发
SCLK=1;       //写入每位数据操作是在时钟的上升沿
_nop_();
SCLK=0;
ds1302_data=ds1302_data>>1;  //每位右移一位
}
}




unsigned char read_byte(void)  //读一个字节操作
{unsigned char i;
for(i=8;i>0;i--){ds1302_data=ds1302_data>>1;//先进行右移一位操作
                 bit_data7=IO;//从高位开始读入数据
                 SCLK=1; //读操作是在时钟线的下降沿 
                 _nop_();
                 SCLK=0;}
return(ds1302_data);
}





/*向一个寄存器写数据操作,address为地址,dsdata为数据*/
void write_ds1302(unsigned char address,unsigned char dsdata)
{
RST=0;	 
SCLK=0;
RST=1;//在写操作中,RST始终要为1
write_byte(address);//先写入地址
_nop_();
write_byte(dsdata);//再写入数据
SCLK=1;
RST=0;
}




/*向一个寄存器读操作,address为地址*/
unsigned char read_ds1302(unsigned char address)
{unsigned char ucdata;
RST=0;
SCLK=0;
RST=1;   //读操作中RST始终为1
write_byte(address);//先写入地址
_nop_();
ucdata=read_byte();//再读出数据
SCLK=1;
RST=0;
return(ucdata);
}



/******************************BCD转十进制************************/
uchar time_change[14];     //转成十进制的时间
  
void bcd_change(uchar *p)
{uchar i;

   for(i=0;i<7;i++)
         {  time_change[2*i+1]=(p[i]&0x0f);   //转低四位  
            p[i]>>=4;
            time_change[2*i]=p[i];//转高四位
		                 
          }

}







/*readtime为读出的时间,从0-14位,每一对分别为秒 分 时 日 月 周 年,而每低高两位分别为十位和个位*/
main()
{unsigned char readtime[7],i;
TMOD=0x20;
SCON=0x50;
TH1=0xfd;
TL1=0xfd;
TR1=1;
write_ds1302(0x8e,0x00);_nop_();//先使写保护寄存器能写
write_ds1302(0x90,0x06);_nop_();//向慢速充电寄存器写
write_ds1302(0x8c,0x05);_nop_();//向年寄存器写数据
write_ds1302(0x8a,0x03);_nop_();//向周寄存器写数据
write_ds1302(0x88,0x08);_nop_();//向月寄存器写数据
write_ds1302(0x86,0x02);_nop_();//向日寄存器写数据
write_ds1302(0x84,0x08);_nop_();//向时寄存器写数据
write_ds1302(0x82,0x05);_nop_();//向分寄存器写数据
write_ds1302(0x80,0x00);_nop_();//向秒寄存器写数据
write_ds1302(0x8e,0x80);_nop_();//使写保护寄存器禁止写
while(1)
  { for(i=0;i<7;i++){readtime[i]=read_ds1302(0x81+i+i);}//读出时间,格式为BCD码,个位和十位都一个字节中
    for(i=0;i<7;i++){SBUF=readtime[i];while(TI==0);TI=0;}//串口发出数据
    delay(5000);
  }
}
 


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -