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

📄 ds1302.c

📁 基于AVRGCC的时钟DS1302的完整应用源代码
💻 C
字号:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
#include "bcd.h"
#include "ds1302.h"

void DS1302_Init(void)
{
	sbi(DS1302_DDR, DS1302_SCLK);
	sbi(DS1302_DDR, DS1302_IO);	sbi(DS1302_DDR, DS1302_RST);
}

// 高 12 个机器周期  低 10 个机器周期
unsigned char _DS1302_RD_Byte(void)
{
	unsigned char i, result = 0;

    for(i = 0; i < 8; i++)
    {
        result >>= 1;
		if (bit_is_set(DS1302_PIN, DS1302_IO))
		{
			result |= 0x80;
			_delay_loop_1(1);
		}
		else
		{
			_delay_loop_1(2);
		}
        sbi(DS1302_PORT, DS1302_SCLK);
		_delay_loop_1(4);
        cbi(DS1302_PORT, DS1302_SCLK);
    } 
    return (result); 
}

// 高 12 个机器周期  低 10 个机器周期
void _DS1302_WR_Byte(unsigned char c)
{
	unsigned char i;

    for(i = 0; i < 8; i++)
    {
		if (c & 0x01)
		{
			sbi(DS1302_PORT, DS1302_IO);
		}
		else
		{
			cbi(DS1302_PORT, DS1302_IO);
		}
		sbi(DS1302_PORT, DS1302_SCLK);
		_delay_loop_1(4);
		cbi(DS1302_PORT, DS1302_SCLK);
        c >>= 1;
    } 
}

unsigned char DS1302_Read(unsigned char addr)
{
	unsigned char result;

	cbi(DS1302_PORT, DS1302_RST);
	cbi(DS1302_PORT, DS1302_SCLK);
	sbi(DS1302_PORT, DS1302_RST);
	cli();
	_DS1302_WR_Byte(addr);
	result = _DS1302_RD_Byte();
	sei();
	cbi(DS1302_PORT, DS1302_RST);
	return result;
}

void DS1302_Write(unsigned char addr, unsigned char value)
{
	cbi(DS1302_PORT, DS1302_RST);
	cbi(DS1302_PORT, DS1302_SCLK);
	sbi(DS1302_PORT, DS1302_RST);
	cli();
    _DS1302_WR_Byte(addr);       
    _DS1302_WR_Byte(value);      
	sei();
	cbi(DS1302_PORT, DS1302_RST);
}

void DS1302_Get_Time(unsigned char *hour, unsigned char *min, unsigned char *sec)
{
	*hour = bcd2bin(DS1302_Read(DS1302_RD_HOUR));
	*min  = bcd2bin(DS1302_Read(DS1302_RD_MINUTE));
	*sec  = bcd2bin(DS1302_Read(DS1302_RD_SECOND));
}

void DS1302_Set_Time(unsigned char hour, unsigned char min, unsigned char sec)
{
	DS1302_Write(DS1302_WR_CTRL, 0x00);
	DS1302_Write(DS1302_WR_HOUR, bin2bcd(hour));

	DS1302_Write(DS1302_WR_CTRL, 0x00);
	DS1302_Write(DS1302_WR_MINUTE, bin2bcd(min));

	DS1302_Write(DS1302_WR_CTRL, 0x00);
	DS1302_Write(DS1302_WR_SECOND, bin2bcd(sec));
}

void DS1302_Get_Date(unsigned char *year, unsigned char *month, unsigned char *day, unsigned char *week)
{
	*year  = bcd2bin(DS1302_Read(DS1302_RD_YEAR));
	*month = bcd2bin(DS1302_Read(DS1302_RD_MONTH));
	*day   = bcd2bin(DS1302_Read(DS1302_RD_DAY));
	*week  = bcd2bin(DS1302_Read(DS1302_RD_WEEK));
}

void DS1302_Set_Date(unsigned char year, unsigned char month, unsigned char day, unsigned char week)
{
	DS1302_Write(DS1302_WR_CTRL, 0x00);
	DS1302_Write(DS1302_WR_YEAR, bin2bcd(year));

	DS1302_Write(DS1302_WR_CTRL, 0x00);
	DS1302_Write(DS1302_WR_MONTH, bin2bcd(month));

	DS1302_Write(DS1302_WR_CTRL, 0x00);
	DS1302_Write(DS1302_WR_DAY, bin2bcd(day));

	DS1302_Write(DS1302_WR_CTRL, 0x00);
	DS1302_Write(DS1302_WR_WEEK, bin2bcd(week));
}

⌨️ 快捷键说明

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