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

📄 sd2300api.c

📁 这是铁路各工区
💻 C
字号:
#include "fun.h"
#include "var.h"
//SD2300API.C
/*功能:提供I2C总线工作时序中的起始位*/
void I2C_start(void)
{SCLK=1;
 delay(1);
 SDAT=0;
 delay(1);
 SCLK=0;
 delay(1);}

/*功能:提供I2C总线工作时序中的停止位*/
void I2C_stop(void)
{SDAT=0;
 delay(1);
 SCLK=1;
 delay(1);
 SDAT=1;
 delay(1);
 SCLK=0;
 delay(1);
}

/*功能:I2C总线初始化。在MAIN()函数中应先调用本函数,然后再调用其他函数。*/
void I2C_init(void)
{SCLK=0;
 I2C_stop();}

/*功能:提供I2C的时钟信号,并返回在时钟电平为高期间SDAT信号线上状态。
 *本函数可用于数据接收。*/
bit I2C_clock(void)
{bit sample;
 SCLK=1;
 delay(1);
 sample=SDAT;
 SCLK=0;
 delay(1);
 return(sample);}

/*功能:向I2C总线发送8位数据,并请求一个应答信号ACK。
 *如果收到ACK应答则返回1,否则返回0*/
bit I2C_send(uchar I_data)
{uchar i;
 /*发送8位数据*/
 for (i=0;i<8;i++)
 {SDAT=(bit)(I_data&0x80);
  I_data=I_data<<1;
  I2C_clock();}
 /*请求应答信号ACK*/
 SDAT=1;
 return(~I2C_clock());}

/*功能:从I2C总线上接收8位数据信号,并将接收到8位数据作为一个
 *字节返回,不回送应答信号ACK。主函数在调用本函数之前应保证SDA
 *信号线处于浮置状态,即SDA置1。*/
uchar I2C_receive(void)
{uchar I_data=0;
 uchar i;
 for(i=0;i<8;i++)
 {I_data<<=1;
  if(I2C_clock())I_data++;}
 return(I_data);
}

/*功能:向I2C总线发送一个应答信号ACK,一般用于连续数据读取时。*/
void I2C_Ack(void)
{SDAT=0;
 I2C_clock();
 SDAT=1;}



/*功能:向SD2300API写入器件地址和一个指定的字节地址*/
bit wr_address(uchar Address)
{I2C_start();
 if(I2C_send(I2C_SD2300API_WR))return(I2C_send(Address));
 else return(FALSE);
}

//初始化SD2300API
bit init_sd2300api(void)
{I2C_init();
 if(wr_address(ADDR_ADJUST))   //从时间调整寄存器地址开始
 {//时间调整寄存器
  if(!I2C_send(ADJUST)){I2C_stop();return(FALSE);}
  //ALARM-A定时:每天18点00分
  if(!I2C_send(MINUTE_A)){I2C_stop();return(FALSE);}
  if(!I2C_send(HOUR_A)){I2C_stop();return(FALSE);}
  if(!I2C_send(WEEK_A)){I2C_stop();return(FALSE);}
  //ALARM-B定时:每天18点00分
  if(!I2C_send(MINUTE_B)){I2C_stop();return(FALSE);}
  if(!I2C_send(HOUR_B)){I2C_stop();return(FALSE);}
  if(!I2C_send(WEEK_B)){I2C_stop();return(FALSE);}
  //控制寄存器1设置
  if(!I2C_send(CONTROL1)){I2C_stop();return(FALSE);}
  //控制寄存器2设置
  if(!I2C_send(CONTROL2)){I2C_stop();return(FALSE);}
  I2C_stop();delay(600); return(TRUE);
 }
 else {I2C_stop();return(FALSE);}
}

//读时间日期
bit rd_date(void)
{EA=0;
 I2C_init();
 if(wr_address(ADDR_SECOND))/*发送重复启动信号*/
 {I2C_start();
  if(I2C_send(I2C_SD2300API_RD))
  {bcd1_realtime.second=I2C_receive();I2C_Ack();
   bcd1_realtime.minute=I2C_receive();I2C_Ack();
   bcd1_realtime.hour  =I2C_receive();I2C_Ack();
   bcd1_realtime.week  =I2C_receive();I2C_Ack();
   bcd1_realtime.day   =I2C_receive();I2C_Ack();
   bcd1_realtime.month =I2C_receive();I2C_Ack();
   bcd1_realtime.year  =I2C_receive();I2C_Ack();
   I2C_stop();EA=1;return(TRUE);
  }
  else{I2C_stop();EA=1;return(FALSE);}
 }
 else {I2C_stop();EA=1;return(FALSE);}
 EA=1;
}

//写时间日期
bit wr_date(void)
{EA=0;
 I2C_init();
 if(wr_address(ADDR_SECOND))   //从秒地址开始
 {//秒,分,时,周,日,月,年
  if(!I2C_send(bcd1_realtime.second)){I2C_stop();EA=1;return(FALSE);}
  if(!I2C_send(bcd1_realtime.minute)){I2C_stop();EA=1;return(FALSE);}
  if(!I2C_send(bcd1_realtime.hour))  {I2C_stop();EA=1;return(FALSE);}
  if(!I2C_send(bcd1_realtime.week))  {I2C_stop();EA=1;return(FALSE);}
  if(!I2C_send(bcd1_realtime.day))   {I2C_stop();EA=1;return(FALSE);}
  if(!I2C_send(bcd1_realtime.month)) {I2C_stop();EA=1;return(FALSE);}
  if(!I2C_send(bcd1_realtime.year))  {I2C_stop();EA=1;return(FALSE);}
  //时间调整寄存器
  if(!I2C_send(ADJUST)){I2C_stop();EA=1;return(FALSE);}
  I2C_stop();delay(600);EA=1;return(TRUE);
 }
 else {I2C_stop();EA=1;return(FALSE);}
}
/*
//查中断标记,返回
uchar rd_control2(void)
{uchar i;
 I2C_init();
 if(wr_address(ADDR_CONTROL2))//发送重复启动信号
 {I2C_start();
  if(I2C_send(I2C_SD2300API_RD))
  {i=I2C_receive();
   I2C_Ack();
   I2C_stop();
   return(i);
  }
  else{I2C_stop();return(FALSE);}
 }
 else {I2C_stop();return(FALSE);}
} */

//清中断标记
uchar wr_control2(void)
{I2C_init();
 if(wr_address(ADDR_CONTROL2))
 {//清除中断标记
  if(!I2C_send(CONTROL2)){I2C_stop();return(FALSE);}
  I2C_stop();delay(600); return(TRUE);
 }
 else {I2C_stop();return(FALSE);}
}
/********************中断************************/
/*外部中断INT0初始化函数*/
/*
void init_int0(void)
{INT0=1;
 PX0=0;        //高优先级
 IT0=1;        //边沿触发
 EX0=1;
 EA=1;
}

/*外部中断INT0中断函数*/
/*
void interrupt_int0(void) interrupt 0   using 2
{flag_int0=TRUE;
 //EX0=1;
}
 */

⌨️ 快捷键说明

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