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

📄 sd2kdrv.c.bak

📁 SD2KDRV sd2000驱动代码 在程序上设置断点
💻 BAK
字号:
/****************************************************************************/
/*                                                                          */
/*               Copyright (c) 2005, 老树工作室                             */
/*                   All rights reserved.                                   */
/*                                                                          */
/*      http://www.saintone.net      Email:hxm0902@163.com                  */
/*      QQ:112431149                 Tel:010-62966630                       */
/*                                                                          */
/****************************************************************************/
/****************************************************************************/
/* 文件名:sd2000drv.c                                                      */
/* 版  本:Version 1.0                                                      */
/* 描  述:sd2000驱动代码                                                   */
/* 作  者:spot                                                             */
/* 函  数:                                                                 */
/*         sd2000_wait                                                      */
/*         sd2000_start                                                     */
/*         sd2000_stop                                                      */
/*         sd2000_ack                                                       */
/*         sd2000_no_ack                                                    */
/*         sd2000_wait_ack                                                  */
/*         sd2000_send_byte                                                 */
/*         sd2000_receive_byte                                              */
/*                                                                          */
/* 历史记录:                                                               */
/*  spot          2005-06-20     Creat Inital version. (Version 1.0)        */
/****************************************************************************/
#include <reg52.h>
#include <absacc.h>
#include <intrins.h>
#include "../includes/types.h"

sbit SDA = P0^6;              /* sd2000数据传送位 */
sbit SCL = P0^7;              /* sd2000时钟控制位 */

/* 函数声明 */
void sd2000_wait(void);       /* sd2000延时       */
void sd2000_start(void);      /* 开启sd2000总线   */
void sd2000_stop(void);       /* 关闭sd2000总线   */
void sd2000_ack(void);        /* 发送ACK信号      */
void sd2000_no_ack(void);     /* 发送NOACK信号    */
bit sd2000_wait_ack(void);    /* 等待ACK信号      */
void sd2000_send_byte(u_char demand, bit order);    /* MCU向sd2000发送一个字节 */
u_char sd2000_receive_byte(void);                   /* MCU从sd2000接收一个字节 */
/* 声明结束 */

u_char read_date[7];
u_char write_date1[7] = {0x05, 0x09, 0x11, 0x01, 0x13, 0x01, 0x01};
u_char write_date[7] = {0x05, 0x08, 0x08, 0x01, 0x16, 0x12, 0x00};
/* sd2000延时       */
void sd2000_wait(void)
{
    _nop_();
    _nop_();
    _nop_();
    _nop_();
}

/* 开启sd2000总线   */
void sd2000_start(void)
{
    SDA = 1;
    SCL = 1;
    sd2000_wait();
    SDA = 0;
    sd2000_wait();
    SCL = 0;
}

/* 关闭sd2000总线   */
void sd2000_stop(void)
{
    SDA=0;
    SCL=0;
    sd2000_wait();
    SCL=1;
    sd2000_wait();
    SDA=1;
}

/* 发送ACK信号   */
void sd2000_ack(void)
{
    SDA=0;
    sd2000_wait();
    SCL=1;
    sd2000_wait();
    SCL=0;
}

/* 发送NOACK信号 */
void sd2000_no_ack(void)
{
    SDA=1;
    sd2000_wait();
    SCL=1;
    sd2000_wait();
    SCL=0;
}

/****************************************************************************/
/* 函数名:sd2000_wait_ack                                                  */
/* 功  能:等待ACK信号                                                      */
/* 作  者:spot                                                             */
/* 输  入:无                                                               */
/* 输  出:1-ACK         0-ERROR                                            */
/*                                                                          */
/* 历史记录:                                                               */
/*  spot          2005-06-20     Creat Inital version. (Version 1.0)        */
/****************************************************************************/
bit sd2000_wait_ack(void)
{
    u_char errtime=255;

    SDA=1;
    sd2000_wait();
    SCL=1;
    sd2000_wait();

    while(SDA)
    {
        errtime--;
        if(!errtime)
            return 0;
    }

    SCL=0;
    return 1;
}

/****************************************************************************/
/* 函数名:sd2000_send_byte                                                 */
/* 功  能:MCU向sd2000设备发送一个字节                                      */
/* 作  者:spot                                                             */
/* 输  入:                                                                 */
/*         demand                  待发送命令或数据                         */
/*         order                   1,发送命令;  0,发送数据                  */
/*                                                                          */
/* 输  出:无                                                               */
/*                                                                          */
/* 历史记录:                                                               */
/*  spot          2005-06-20     Creat Inital version. (Version 1.0)        */
/****************************************************************************/
void sd2000_send_byte(u_char demand, bit order)
{
    u_char i = 8;

    if (order)
    {
        while(i--)
        {
            SCL = 0;
            _nop_();
            SDA = (bit)(demand&0x80);
            demand <<= 1;
            sd2000_wait();
            SCL = 1;
            sd2000_wait();
        }
        SCL=0;
    }
    else
    {
        while(i--)
        {
            SCL = 0;
            _nop_();
            SDA = (bit)(demand&0x01);
            demand >>= 1;
            sd2000_wait();
            SCL = 1;
            sd2000_wait();
        }
        SCL=0;
    }

}

/****************************************************************************/
/* 函数名:sd2000_receive_byte                                              */
/* 功  能:MCU从sd2000设备接收一个字节                                      */
/* 作  者:spot                                                             */
/* 输  入:无                                                               */
/* 输  出:ddata   接收数据                                                 */
/*                                                                          */
/* 历史记录:                                                               */
/*  spot          2005-06-20     Creat Inital version. (Version 1.0)        */
/****************************************************************************/
u_char sd2000_receive_byte(void)
{
    u_char i=8;
    u_char ddata=0;

    SDA=1;
    while(i--)
    {
        ddata >>= 1;
        SCL=0;
        sd2000_wait();
        SCL=1;
        sd2000_wait();
        if(SDA)
        {
            ddata |= 0x80;
        }

    }
    SCL=0;
    return ddata;
}

/****************************************************************************/
/* 函数名:sd2000_read_date                                                 */
/* 功  能:读取sd2000时钟数据                                               */
/* 作  者:spot                                                             */
/* 输  入:无                                                               */
/* 输  出:无                                                               */
/*                                                                          */
/* 历史记录:                                                               */
/*  spot          2005-06-20     Creat Inital version. (Version 1.0)        */
/****************************************************************************/
void sd2000_read_date(void)
{
    u_char i;

    sd2000_start();
    sd2000_send_byte(0x65,1); /* 从年开始读取数据   */
    sd2000_wait_ack();

    for (i=0; i<7; i++)
    {
    	read_date[i] = sd2000_receive_byte();

    	if (i != 6)           /* 最后一个数据不应答 */
    	{
    	    sd2000_ack();
    	}
    }
    read_date[4] &= 0x7F;
    sd2000_no_ack();
    sd2000_stop();
}

/****************************************************************************/
/* 函数名:sd2000_write_date                                                */
/* 功  能:写入sd2000时钟数据                                               */
/* 作  者:spot                                                             */
/* 输  入:无                                                               */
/* 输  出:无                                                               */
/*                                                                          */
/* 历史记录:                                                               */
/*  spot          2005-06-20     Creat Inital version. (Version 1.0)        */
/****************************************************************************/
void sd2000_write_date(void)
{
   u_char i;

   sd2000_start();
   sd2000_send_byte(0x64,1); /* 从年开始写入数据   */
   sd2000_wait_ack();

   for(i=0; i<7; i++)
   {
       sd2000_send_byte(write_date[i],0);
       sd2000_wait_ack();
   }
   sd2000_stop();
}

/****************************************************************************/
/* 函数名:sd2000_write_status                                              */
/* 功  能:写sd2000状态寄存器                                               */
/* 作  者:spot                                                             */
/* 输  入:无                                                               */
/* 输  出:无                                                               */
/*                                                                          */
/* 历史记录:                                                               */
/*  spot          2005-06-20     Creat Inital version. (Version 1.0)        */
/****************************************************************************/
void sd2000_write_status(void)
{
    sd2000_start();
    sd2000_send_byte(0x62,1);  /* 发送SD20001C状态寄存器命令 */
    sd2000_wait_ack();
    sd2000_send_byte(0xc0,0);  /* 24小时制,关所有中断       */
    sd2000_wait_ack();
    sd2000_stop();
}

void delay(void)
{
    u_char i;
    for (i=0; i<200; i++);
}

main()
{

    sd2000_write_status();

    while(1)
    {
        sd2000_read_date();
        delay();
        sd2000_write_date();
    }
}

⌨️ 快捷键说明

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