📄 sbjj.c
字号:
#include<c8051F040.h>
#include<absacc.h>
#include<intrins.h>
#define u_char unsigned char
#define uint unsigned int
sbit SDA = P5^3; /* 数据传送位 */
sbit SCL = P5^4; /* 时钟控制位 */
/* 函数声明 */
void s3530a_wait(void); /* 延时 */
void s3530a_start(void); /* 开启总线 */
void s3530a_stop(void); /* 关闭总线 */
void s3530a_ack(void); /* 发送ACK信号 */
void s3530a_no_ack(void); /* 发送NOACK信号 */
bit s3530a_wait_ack(void); /* 等待ACK信号 */
void s3530a_send_byte(u_char demand, bit order); /* MCU发送一个字节 */
u_char s3530a_receive_byte(void); /* MCU接收一个字节 */
void s3530a_read_date(void); /* 读取时钟数据 */
void s3530a_write_date(void); /* 写入时钟数据 */
void s3530a_write_status(void); /* 写状态寄存器 */
/* 声明结束 */
u_char read_date[7],dis_date[14];
u_char write_date[7] = {0x07, 0x08, 0x17, 0x05, 0x09, 0x09, 0x58};
/* 延时 */
void s3530a_wait(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
/* 开启总线 */
void s3530a_start(void)
{
SDA = 1;
SCL = 1;
s3530a_wait();
SDA=0;
s3530a_wait();
SCL = 0;
s3530a_wait();
}
/* 关闭总线 */
void s3530a_stop(void)
{
SDA=0;
SCL=0;
s3530a_wait();
SCL=1;
s3530a_wait();
SDA=1;
}
/* 发送ACK信号 */
void s3530a_ack(void)
{
SDA=0;
SCL=0;
s3530a_wait();
SCL=1;
s3530a_wait();
SCL=0;
}
/* 发送NOACK信号 */
void s3530a_no_ack(void)
{
SDA=1;
SCL=0;
s3530a_wait();
SCL=1;
s3530a_wait();
SCL=0;
}
/****************************************************************************/
/* 函数名:s3530a_wait_ack */
/* 功 能:等待ACK信号 */
/****************************************************************************/
bit s3530a_wait_ack(void)
{
u_char errtime=255;
SDA=1;
SCL=0;
s3530a_wait();
SCL=1;
s3530a_wait();
while(SDA)
{
errtime--;
if(!errtime)
SCL=0;
return 0;
}
SCL=0;
return 1;
}
/****************************************************************************/
/* 函数名:s3530a_send_byte */
/* 功 能:向s3530a设备发送一个字节 */
/****************************************************************************/
void s3530a_send_byte(u_char demand, bit order)
{
u_char i = 8;
if (order)
{
while(i--)
{
SCL = 0;
_nop_();
SDA = (bit)(demand&0x80);
demand <<= 1;
s3530a_wait();
SCL = 1;
s3530a_wait();
}
SCL=0;
}
else
{
while(i--)
{
SCL = 0;
_nop_();
SDA = (bit)(demand&0x01);
demand >>= 1;
s3530a_wait();
SCL = 1;
s3530a_wait();
}
SCL=0;
}
}
/*void s3530a_send_byte2(u_char demand, bit order)
{
u_char i = 16;
if (order)
{
while(i--)
{
SCL = 0;
_nop_();
SDA = (bit)(demand&0x0001);
demand <<= 1;
s3530a_wait();
SCL = 1;
s3530a_wait();
}
SCL=0;
}
else
{
while(i--)
{
SCL = 0;
_nop_();
SDA = (bit)(demand&0x01);
demand >>= 1;
s3530a_wait();
SCL = 1;
s3530a_wait();
}
SCL=0;
}
}*/
/****************************************************************************/
/* 函数名:s3530a_receive_byte */
/* 功 能:从s3530a设备接收一个字节 */
/****************************************************************************/
u_char s3530a_receive_byte(void)
{
u_char i=8;
u_char ddata=0;
SDA=1;
while(i--)
{
ddata >>= 1;
SCL=0;
s3530a_wait();
SCL=1;
s3530a_wait();
if(SDA)
{
ddata |= 0x80;
}
}
SCL=0;
return ddata;
}
/****************************************************************************/
/* 函数名:s3530a_read_date */
/* 功 能:读取s3530a时钟数据 */
/****************************************************************************/
void s3530a_read_date(void)
{
u_char i;
s3530a_start();
s3530a_send_byte(0x65,1); /* 从年开始读取数据 */
s3530a_wait_ack();
for (i=0; i<7; i++)
{
read_date[i] = s3530a_receive_byte();
if (i != 6) /* 最后一个数据不应答 */
{
s3530a_ack();
}
}
read_date[4] &= 0x7F;
s3530a_no_ack();
s3530a_stop();
}
/****************************************************************************/
/* 函数名:s3530a_write_date */
/* 功 能:写入s3530a时钟数据 */
/****************************************************************************/
void s3530a_write_date(void)
{
u_char i;
s3530a_start();
s3530a_send_byte(0x64,1); /* 从年开始写入数据 */
s3530a_wait_ack();
for(i=0; i<7; i++)
{
s3530a_send_byte(write_date[i],0);
s3530a_wait_ack();
}
s3530a_stop();
}
/****************************************************************************/
/* 函数名:s3530a_write_status */
/* 功 能:写s3530a状态寄存器 */
/****************************************************************************/
void s3530a_write_status(void)
{
s3530a_start();
s3530a_send_byte(0x62,1); /* 发送s3530a状态寄存器命令 */
s3530a_wait_ack();
s3530a_send_byte(0xC8,0); /* 24小时制,打开中断 */
s3530a_wait_ack();
s3530a_stop();
}
void s3530a_write_status2(void)
{
s3530a_start();
s3530a_send_byte(0x62,1); /* 发送s3530a状态寄存器命令 */
s3530a_wait_ack();
s3530a_send_byte(0xC0,0); /* 24小时制,打开中断 */
s3530a_wait_ack();
s3530a_stop();
}
/****************************************************************************/
/* 函数名:s3530a_write_int1 */
/* 功 能:写s3530ajint1寄存器 */
/****************************************************************************/
/* void s3530a_write_int1(void)
{
s3530a_start();
s3530a_send_byte(0x68,1); 发送s3530a状态寄存器命令
s3530a_wait_ack();
s3530a_send_byte2(0x8000,1);
s3530a_wait_ack();
s3530a_stop();
}*/
void delay(void)
{
u_char i;
for (i=0; i<200; i++);
}
void config(){
//看门狗禁止
WDTCN = 0x07;
WDTCN = 0xDE;
WDTCN = 0xAD;
SFRPAGE = 0x0F;
//交叉开关使能,但没有进行外围设备配置
XBR0 = 0x00;
XBR1 = 0x14;
XBR2 = 0x02;
//XBR3 = 0x01;
//管脚输出配置
SFRPAGE = 0x0F;
P1MDIN = 0xE3;
XBR2=0x40;
P1MDOUT &= 0xE3;
P1 |= 0x1C;
//晶振配置,采用内部晶振8分频
SFRPAGE = 0x0F;
CLKSEL = 0x00;
OSCXCN = 0x00;
OSCICN = 0x84;
}
main()
{
delay();
config();
EA = 1;
EX1=1;
P3=0xff;
s3530a_start();
delay();
s3530a_send_byte(0x60,1); /* 发送s3530a复位命令 */
s3530a_wait_ack();
s3530a_stop();
s3530a_read_date();
delay();
s3530a_write_status();
delay();
// s3530a_write_int1();
// delay();
s3530a_write_date();
delay();
while(1)
{
s3530a_read_date();
delay();
delay();
delay();
s3530a_write_status();
}
}
void s3530a_ISR () interrupt 2
{
dis_date[0]=read_date[0] & 0xF0;
dis_date[1]=read_date[0] & 0x0F;//year
dis_date[2]=0x10;//-
dis_date[3]=read_date[1] & 0xF0;
dis_date[4]=read_date[1] & 0x0F;//month
dis_date[5]=0x10;//-
dis_date[6]=read_date[2] & 0xF0;
dis_date[7]=read_date[2] & 0x0F;//day
dis_date[8]=0x10;//kongge
dis_date[9]=read_date[4] & 0x70;
dis_date[10]=read_date[4] & 0x0F;//hour
dis_date[11]=0x10;//:
dis_date[12]=read_date[5] & 0xF0;
dis_date[13]=read_date[5] & 0x0F;//minute
s3530a_write_status2();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -