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