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

📄 sd2k3drv.c.bak

📁 压缩包中包括多个常用的汇编
💻 BAK
字号:
/****************************************************************************/
/*                                                                          */
/*               Copyright (c) 2005, 老树工作室                             */
/*                   All rights reserved.                                   */
/*                                                                          */
/*      http://www.saintone.net      Email:hxm0902@163.com                  */
/*      QQ:112431149                 Tel:010-62966630                       */
/*                                                                          */
/****************************************************************************/
/****************************************************************************/
/* 文件名:sd2300drv.c                                                      */
/* 版  本:Version 1.0                                                      */
/* 描  述:sd2300驱动代码                                                   */
/* 作  者:spot                                                             */
/* 函  数:                                                                 */
/*         sd2300_wait                                                      */
/*         sd2300_start                                                     */
/*         sd2300_stop                                                      */
/*         sd2300_ack                                                       */
/*         sd2300_no_ack                                                    */
/*         sd2300_wait_ack                                                  */
/*         sd2300_send_byte                                                 */
/*         sd2300_receive_byte                                              */
/*         sd2300_read_date                                                 */
/*         sd2300_write_config                                              */
/*                                                                          */
/* 参考资料:     http://www.whwave.com.cn                                  */
/*                                                                          */
/* 历史记录:                                                               */
/*  spot          2005-10-05     Creat Inital version. (Version 1.0)        */
/****************************************************************************/
#include <reg52.h>
#include <absacc.h>
#include <intrins.h>
#include "../includes/types.h"

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

/* 函数声明 */
void sd2300_wait(void);                /* sd2300延时              */
void sd2300_start(void);               /* 开启sd2300总线          */
void sd2300_stop(void);                /* 关闭sd2300总线          */
void sd2300_ack(void);                 /* 发送ACK信号             */
void sd2300_no_ack(void);              /* 发送NOACK信号           */
bit sd2300_wait_ack(void);             /* 等待ACK信号             */
void sd2300_send_byte(u_char demand);  /* MCU向sd2300发送一个字节 */
u_char sd2300_receive_byte(void);      /* MCU从sd2300接收一个字节 */
void sd2300_read_date(void);           /* 读取sd2300时钟数据      */
void sd2300_write_config(void);        /* 写sd2300控制寄存器      */

void display_time(u_char current_time[2]);/* 在数码管上显示当前时间 */

extern void load_number(u_char number, bit dp);
extern void send_latch_clock(void);
extern void clear_led(void);
/* 声明结束 */

u_char date[7];

/* sd2300延时       */
void sd2300_wait(void)
{
    _nop_();
    _nop_();
    _nop_();
    _nop_();
}

/* 开启sd2300总线   */
void sd2300_start(void)
{
    SDA = 1;
    SCL = 1;
    sd2300_wait();
    SDA = 0;
    sd2300_wait();
    SCL = 0;
}

/* 关闭sd2300总线   */
void sd2300_stop(void)
{
    SDA=0;
    SCL=0;
    sd2300_wait();
    SCL=1;
    sd2300_wait();
    SDA=1;
}

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

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

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

    SCL=0;
    SDA=1;
    sd2300_wait();
    SCL=1;
    sd2300_wait();

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

    SCL=0;
    return 1;
}

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

    while(i--)
    {
        SCL = 0;
        _nop_();
        SDA = (bit)(demand&0x80);
        demand <<= 1;
        sd2300_wait();
        SCL = 1;
        sd2300_wait();
    }
    SCL=0;   
}

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

    SDA=1;
    while(i--)
    {
        ddata <<= 1;
        SCL=0;
        sd2300_wait();
        SCL=1;
        sd2300_wait();
        if(SDA)
        {
            ddata |= 0x01;
        }

    }
    SCL=0;
    return ddata;
}

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

    sd2300_start();
    sd2300_send_byte(0x64);
    sd2300_wait_ack();
    sd2300_send_byte(0x00); /* 从秒开始读取数据   */
    sd2300_wait_ack();

    sd2300_start();
    sd2300_send_byte(0x65); 
    sd2300_wait_ack();

    for (i=0; i<7; i++)
    {
    	date[6-i] = sd2300_receive_byte();

    	if (i != 6)         /* 最后一个数据不应答 */
    	{
    	    sd2300_ack();
    	}
    }
    
    sd2300_no_ack();
    sd2300_stop();
}

/****************************************************************************/
/* 函数名:sd2300_write_config                                              */
/* 功  能:写sd2300控制寄存器                                               */
/* 作  者:spot                                                             */
/* 输  入:无                                                               */
/* 输  出:无                                                               */
/*                                                                          */
/* 历史记录:                                                               */
/*  spot          2005-10-05     Creat Inital version. (Version 1.0)        */
/****************************************************************************/
void sd2300_write_config(void)
{
    sd2300_start();
    sd2300_send_byte(0x64);  
    sd2300_wait_ack();
    sd2300_send_byte(0xf0);  /* 写控制寄存器2    */
    sd2300_wait_ack();
    sd2300_send_byte(0x20);  /* 24小时制,关中断 */
    sd2300_wait_ack();
    sd2300_stop();
}

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

/* 在数码管上显示当前湿度 */
void display_time(u_char current_time[2])
{
    u_char second = 0;
    u_char hour   = 0;

    hour   = ( ((current_time[0] & 0xf0) >> 4) * 10) + (current_time[0] & 0x0f);
    second = ( ((current_time[1] & 0xf0) >> 4) * 10) + (current_time[1] & 0x0f);

    load_number( (second %10), 0);
    load_number( (second /10), 0);

    load_number( (hour %10), 1);
    load_number( (hour /10), 0);
    send_latch_clock();
}

main()
{

    sd2300_write_config();

    while(1)
    {
        sd2300_read_date();
        clear_led();
        display_time(&date[4]);
    }
}

⌨️ 快捷键说明

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