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

📄 sd2000的c51程序.c

📁 51单片机控制实时时钟SD2000的原码
💻 C
字号:
#pragma small
#include<reg52.h>
#include<math.h>
#include<absacc.h>
#include<stdio.h>
#define uchar unsigned char
#define uint  unsigned int

//----------------------------------//SD2000IIC总线管脚定义
sbit SDA=P1^0;
sbit SCL=P1^1;

//----------------------------------//SD2000操作时使用的变量定义
uchar bdata bitbyte;
sbit bitbyte_7=bitbyte^7;
sbit bitbyte_6=bitbyte^6;
sbit bitbyte_5=bitbyte^5;
sbit bitbyte_4=bitbyte^4;
sbit bitbyte_3=bitbyte^3;
sbit bitbyte_2=bitbyte^2;
sbit bitbyte_1=bitbyte^1;
sbit bitbyte_0=bitbyte^0;
uchar year;  //年
uchar month; //月
uchar date;  //日
uchar week;  //星期
uchar hour;  //时
uchar minute;//分
uchar second;//秒

//===================================================
//         以下是与SD2000时钟芯片有关的子程序          |
/*===================================================
命令格式: 0 1 1 0   c2 c1 c0    r/w
          器件地址   命令分类    1读、0写

C2 C1 C0  操作                                  ACK数目
0  0   0  复位:00年/01月/01天/0星期/00分/00秒    1
0  0   1  状态寄存器存取	                      2
0  1   0  实时数据1(从年数据开始)存取	          8
0  1   1  实时数据2(从小时数据开始)存取         4
1  0   0  频率事件设置1(INT1脚)                 3
1  0   1  频率事件2(INT2脚)                     3
1  1   0  测试模式开始(*2)                      1
1  1   1  测试模式结束(*2)                      1 */
//------------------延时程序
void delay(uint i)
{ uint j;
  for(j=0;j<=i;j++);
}
//------------------启用IIC总线
void i2cstart(void)
{ SCL=0;
  SDA=1;
  delay(1);
  SCL=1;
  delay(1);
  SDA=0;
  delay(1);
  SCL=0;
}
//关闭IIC总线
void i2cstop(void)
{ SDA=0;
  SCL=0;
  delay(1);
  SCL=1;
  delay(1);
  SDA=1;
  delay(1);
  SCL=0;
}
//从MCU发送一位数给SD2000A
void i2cbitout(bit bitout)
{ SDA=0;
  SCL=0;
  SDA=bitout;
  delay(1);
  SCL=1;
  delay(1);
  SCL=0;
}
//MCU从SD2000A接收一位数
bit i2cbitin(void)
{ bit bitin;
  SDA=1;
  SCL=0;
  delay(1);
  bitin=SDA;
  delay(1);
  SCL=1;
  delay(1);
  SCL=0;
  return bitin;
}
//从MCU发送一个字节给SD2000A,由低位到高位发送
void i2cbyteout_lh(uchar shu)
{ uchar i;
  for(i=1;i<=8;i++)
    {i2cbitout((bit)(shu&0x01));
     shu=shu>>1;
    }
  i2cbitin();
}
//从MCU发送一个字节给SD2000A,由高位到低位发送
void i2cbyteout_hl(uchar shu)
{ uchar i;
  for(i=1;i<=8;i++)
    {i2cbitout((bit)(shu&0x80));
     shu=shu<<1;
    }
  i2cbitin();
}
//MCU从SD2000A接收一个字节
uchar i2cbytein(void)
{ bitbyte_0=i2cbitin();
  bitbyte_1=i2cbitin();
  bitbyte_2=i2cbitin();
  bitbyte_3=i2cbitin();
  bitbyte_4=i2cbitin();
  bitbyte_5=i2cbitin();
  bitbyte_6=i2cbitin();
  bitbyte_7=i2cbitin();
  i2cbitout(0);
  return bitbyte;
}
//写SD2000A内部实时数据寄存器程序
//将设定年、月、日、星期、时、分、秒数据写入SD2000A
void writesd2000(void)
{ year=0x04;//输入时间的具体数值,BCD码(根据真实时间设定)
  month=0x02;
  date=0x21;
  week=0x06;
  hour=0x15;
  minute=0x04;
  second=0x00;
  i2cstart();
  i2cbyteout_hl(0x64);//发送写实时数据1命令
  i2cbyteout_lh(year);
  i2cbyteout_lh(month);
  i2cbyteout_lh(date);
  i2cbyteout_lh(week);
  i2cbyteout_lh(hour);
  i2cbyteout_lh(minute);
  i2cbyteout_lh(second);
  i2cstop();
}
//读、写SD2000A状态寄存器,对SD2000A进行设置
void setsd2000(void)
{ i2cstart();
  i2cbyteout_hl(0x60);//发送SD2000A复位命令
  i2cstop();
  i2cstart();
  i2cbyteout_hl(0x62);//发送写SD2000A状态寄存器命令
  i2cbyteout_lh(0xc0);//24小时进制,关所有中断输出
  i2cstop();
}
//从SD2000A读入当前时间数据
//接收数据放在年、月、日、星期、时、分、秒各寄存器
void readsd2000(void)
{ i2cstart();
  i2cbyteout_hl(0x65);//发送读数据命令
  year=i2cbytein();
  month=i2cbytein();
  date=i2cbytein();
  week=i2cbytein();
  hour=i2cbytein()&0x7f;//调整hour数据(个人认为是芯片的故障)
  minute=i2cbytein();
  second=i2cbytein();
  i2cstop();
}

//--------------------------------------------//主程序
void main()
{      
   setsd2000();   //设置SD2000的工作模式
   writesd2000(); //写入时间
   readsd2000();  //读取的时间数据在变量year/month/day/week/hour/minute/second中

}

⌨️ 快捷键说明

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