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

📄 sbjj.c

📁 测试完全通过的3530与C8051f040的通信程序
💻 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 + -