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

📄 ds1302.c

📁 用51写的实时时钟,DS1302做时钟,LCM1602做显示,4个按键,带闹钟.
💻 C
字号:
#include "reg51.h"
#include "typedef.h"
#include "lcd.h"
#include "ds1302.h"
#include "key.h"

void	reset_3w();
void	wbyte_3w(uchar);
uchar	rbyte_3w();
void	write_byte(uchar Clock_Add,uchar Clock_Data);
uchar read_byte(uchar);
void write_clock_burst();
void	ds1302_init();
void  ds1302_task();

void reset_3w()	/* ----- reset and enable the 3-wire interface ------ */
{
   SCLK = 0;
   RST = 0;
   RST = 1;
}


void wbyte_3w(uchar W_Byte)	/* ------ write one byte to the device ------- */
{
	uchar i;

	for(i = 0; i < 8; ++i)
	{
		IO = 0;
		if(W_Byte & 0x01)
		{
			IO = 1;	/* set port pin high to read data */
		}
		SCLK = 0;
		SCLK = 1;
		W_Byte >>= 1;
  }
}


uchar	rbyte_3w()	//read one byte from the device 
{
	uchar i;
	uchar R_Byte;
	uchar TmpByte;

	R_Byte = 0x00;
	IO = 1;
	for(i = 0; i < 8; i++)
	{
		SCLK = 1;
		SCLK = 0;
		TmpByte = (uchar)IO;
		TmpByte <<= 7;
		R_Byte >>= 1;
		R_Byte |= TmpByte; 
	}
	return R_Byte;
}


void	write_byte(uchar Clock_Add,uchar Clock_Data)	//write one byte using values entered by user
{
	reset_3w();
	wbyte_3w(Clock_Add);
	wbyte_3w(Clock_Data);
	reset_3w();
}

void write_clock_burst()
{
	reset_3w();
	wbyte_3w(CLOCK_BURST_ADD);	/* clock burst write (eight registers) */
	wbyte_3w(hex2bcd[sec]);
	wbyte_3w(hex2bcd[min]);
	wbyte_3w(hex2bcd[hour]);
	wbyte_3w(hex2bcd[date]);
	wbyte_3w(hex2bcd[month]);
	wbyte_3w(hex2bcd[day_of_week]);
	wbyte_3w(hex2bcd[year]);
	wbyte_3w(0);		/* must write control register in burst mode */
	reset_3w();
}

uchar	read_byte(uchar Clock_Add)	// Read one byte from DS1302
{
	uchar Clock_Data;
	reset_3w();
	wbyte_3w(Clock_Add);
	Clock_Data = rbyte_3w();
	reset_3w();
	return(Clock_Data);
}

void	ds1302_init()	/* --- initialize time & date for default value --- */
/* Note: NO error checking is done on the user entries! */
{
	reset_3w();
	wbyte_3w(0x8e);	// control register
	wbyte_3w(0);		// disable write protect
	reset_3w();
	wbyte_3w(0x90);	// trickle charger register
	wbyte_3w(0xa4);	//enable, 2 diodes, 8K resistor 
	write_clock_burst();   //写入初始化时间
}

void ds1302_task()
{
	//if(!key_enable)
	//{
  	sec = bcd2hex[read_byte(READ_SEC_ADD)];       //读DS1302 sec
		min = bcd2hex[read_byte(READ_MIN_ADD)];     //读DS1302 min
		hour = bcd2hex[read_byte(READ_HOUR_ADD)];   //读DS1302 hour
		date = bcd2hex[read_byte(READ_DATE_ADD)];     //读DS1302 day和day_of_week
		//day_of_week = bcd2hex[read_byte(READ_DOW_ADD)];
		month = bcd2hex[read_byte(READ_MONTH_ADD)];   //读DS1302 month
		year = bcd2hex[read_byte(READ_YEAR_ADD)];    //读DS1302 year
  //}
}

⌨️ 快捷键说明

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