📄 sd2000的c51程序.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 + -