📄 sd2kdrv.c.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 + -