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

📄 ds1302.c

📁 ds1302和ds18b20驱动程序.完全是可以用的程序.
💻 C
字号:
/*DS1302驱动程序 **********************************************/
/*版本  V1.1     **********************************************/
/*2007-11-15      **********************************************/
/*吾人           **********************************************/
/*DS1302控制寄存器*******************************************/
/*寄存器名--写--读--取值范围  --[7-----6--5---4--3--2--1--0]*/
/*秒      --80--81---00-59    --[CH----{10SEC }--{--SEC-- }]*/
/*分钟   --82--83---00-59    --[0 ----{10MIN }--{--MIN-- }]*/  
/*小时    --84--85---0-12/23  --[12/24-0-10AP-HR-{ --HR-- }]*/ 
/*日期    --86--87---1-28/29/30-[0 ----0-{10DAT}-{-DATAE- }]*/ 
/*月份    --88--89---01-12    --[0-----0--0--10M-{-MONTH- }]*/ 
/*周日    --8A--8B---01-07    --[0-----0--0---0--0-{-DAY- }]*/ 
/*年份    --8C--8D---00-99    --[{  -10YEAR-   }-{-YEAR-  }]*/ 
/************************************************************/

#include	<reg52.h>
#include	<intrins.h>
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint  unsigned int
#endif
#define ds1302_set0(x) x=0
#define ds1302_set1(x) x=1
sbit ds1302_rst=P3^7;
sbit ds1302_sclk=P3^5;
sbit ds1302_io=P3^6;
void  ds1302_initial();
void  ds1302_senddata(uchar dsend);
uchar  ds1302_receivedata(void);
/*******************寄存器********************/
char Ds1302Reg[7]={0};   //ds1302内部日期寄存器 (00-06)
char Date[14]={0};
/*********************************************/
void ds1302_senddata(uchar dsend)
{ 
 uchar i;
 for(i=0;i<8;i++)
 {    
  ds1302_io=(bit)(dsend&0x01);
  ds1302_set1(ds1302_sclk);
  dsend=dsend>>1; 
  ds1302_set0(ds1302_sclk);    
 }
}
uchar ds1302_receivedata(void)
{
 uchar i,dat=0;
 for(i=0;i<7;i++)
 {
  if(ds1302_io) dat=dat|0x80;
  else   dat=dat&0x7f;
  ds1302_set1(ds1302_sclk);
  dat=dat>>1;  
  ds1302_set0(ds1302_sclk); 
 }
  if(ds1302_io) dat=dat|0x80;
  else   dat=dat&0x7f;
 return dat;
}

void Ds1302Write(char data1,char data2)
{
 ds1302_set1(ds1302_rst);
 ds1302_senddata(data1);
 ds1302_senddata(data2);
 ds1302_set0(ds1302_rst);
}
char Ds1302Read(char Addr)
{
 char DataReturn;
 ds1302_set1(ds1302_rst);
 ds1302_senddata(Addr);
 DataReturn=ds1302_receivedata();
 ds1302_set0(ds1302_rst);
 return DataReturn;
}
void Ds1302ReadAll()
{
 char i;
 for(i=0;i<7;i++)
 {
  Ds1302Reg[i]=Ds1302Read(0x81|((i<<1)&0xfe));
 }
}
void Ds1302DataConver()
{
 char Counter=0; 
 Ds1302ReadAll();
 //秒 分 时
 Date[5]=Ds1302Reg[0]%0x10;
 Date[4]=((Ds1302Reg[0]>>4)&0x07);
 Date[3]=Ds1302Reg[1]%0x10;
 Date[2]=(Ds1302Reg[1]>>4);
 Date[1]=Ds1302Reg[2]%0x10;
 Date[0]=((Ds1302Reg[2]>>4)&0x01);
 //日 月
 Date[9]=Ds1302Reg[3]%0x10;
 Date[8]=((Ds1302Reg[3]>>4)&0x03);
 Date[7]=Ds1302Reg[4]%0x10;
 Date[6]=((Ds1302Reg[4]>>4)&0x01);
 //星期
 Date[10]=Ds1302Reg[5];
 //年 基数 2000
 Date[11]=Ds1302Reg[6]%0x10;
 Date[12]=((Ds1302Reg[6]>>4)&0x0f);
 for(Counter=0;Counter<13;Counter++)
 Date[Counter]+='0';
}

void ds1302_initial()
{
 ds1302_set0(ds1302_sclk);
 ds1302_set0(ds1302_rst);
 ds1302_set0(ds1302_io);
 Ds1302Write(0x8e,0x00);
 Ds1302Write(0x80,0x01);
 Ds1302Write(0x82,0x00);
 Ds1302Write(0x84,0x00);
 Ds1302Write(0x86,0x00);
 Ds1302Write(0x90,0xa9);
}
/*DS1302驱动结束******************************************/

/*先前版本存在一个小问题 说声抱歉了 这个已经在实际中通过*/

⌨️ 快捷键说明

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