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

📄 ds1302.c

📁 DS1302原程序,经反复测试,没有任何问题,完全可以用
💻 C
字号:
#include	<stdio.h>
#include	<reg5000.h>		
#define uchar unsigned char
sbit SCLK = P1^3;
sbit IO   = P1^4;
sbit RSTB = P1^5;
/**************************** 函数原型说明 ****************************/
void	clkwritebyte();			// 时钟字节写入函数
void	ramwritebyte();			// RAM字节写入函数
uchar	rbyte_3w();				// 字节读取函数
void	reset_3w();				// 复位函数
void	wbyte_3w(uchar); 		// 字节写入函数
void	initialize_DS1302();	// DS1302初始化函数
void	disp_clk_regs(uchar);	// 显示时钟寄存器内容函数
void	burstramrd();			// 多字节突发方式读取RAM函数
void	burstramwr();			// 多字节突发方式写入RAM函数
/***************************** 复位函数 ******************************/
void reset_3w() {
   SCLK = 0;
   RSTB = 0;
   RSTB = 1;
}

/****************************** 字节写入函数 ***************************/
void wbyte_3w(uchar W_Byte) {
uchar i;
	for(i = 0; i < 8; ++i) {
		IO = 0;
		if(W_Byte & 0x01) IO = 1;
		SCLK = 0;
		SCLK = 1;
		W_Byte >>= 1;
    }
}

/****************************** 字节读取函数 ****************************/
uchar rbyte_3w() {
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 clkwritebyte() {
uchar ClkAdd;
uchar ClkData;	

	printf("\nWrite Clock ADDRESS:");  
	scanf("%bu", &ClkAdd); 				// 输入时钟地址
	printf("\nWrite Clock DATA:");
	scanf("%bx", &ClkData); 			// 输入时钟数据
	
	ClkAdd = ((ClkAdd * 2) | 0x80); 	// 时钟数据写入命令
	reset_3w();
	wbyte_3w(ClkAdd);
	wbyte_3w(ClkData);
	reset_3w();
}

/* ************************** RAM字节写入函数 **************************/
void ramwritebyte() {
uchar ramadd;
uchar ramdata;

	printf("\nWrite Ram ADDRESS (HEX):");
	scanf("%bx", &ramadd);					// 输入RAM地址
	printf("\nWrite Ram DATA (HEX):");
	scanf("%bx", &ramdata); 				// 输入RAM数据

	ramadd = ((ramadd * 2) | 0xC0);			// RAM数据写入命令
	reset_3w();
	wbyte_3w(ramadd);
	wbyte_3w(ramdata);
	reset_3w();
}

/************************* 显示时钟寄存器内容函数 ***********************/
void disp_clk_regs(uchar loop) {
uchar lsec = 99, sec, min, hrs, dte, mon, day, yr;

do	{					// 读取并显示时钟寄存器的内容
		reset_3w();
		wbyte_3w(0xBF);		// 以多字节突发方式读取时钟数据
		sec = rbyte_3w();	// 秒
		min = rbyte_3w();	// 分
		hrs = rbyte_3w();	// 小时
		dte = rbyte_3w();	// 日期
		mon = rbyte_3w();	// 月份
		day = rbyte_3w();	// 星期
		yr  = rbyte_3w();	// 年
		reset_3w();
		if(sec != lsec || !loop) {	// 每秒显示一次		
			printf("\nYr   Day  Mon  Dte  Hrs  Min  Sec");
			printf("\n%2.bX   %2.bX   %2.bX   %2.bX", yr, day, mon, dte);
			printf("   %2.bX   %2.bX   %2.bX", hrs, min, sec);
			lsec = sec;
		}
		if(!loop)	break;
	}	while(!RI);
	if(loop)   _getkey();
}

/************************ 多字节突发方式读取RAM函数 *********************/
void burstramrd() {
uchar rmary[31];
uchar i;

	reset_3w();
	wbyte_3w(0xFF);			// 以多字节突发方式读取RAM
	for (i=0; i<31; ++i) {
		rmary[i] = rbyte_3w();
	}
	reset_3w();

	printf("\nDS1302 Ram");

	printf("\n%2.bX %2.bX %2.bX %2.bX %2.bX %2.bX %2.bX %2.bX",
						rmary[0], rmary[1], rmary[2], rmary[3], 
rmary[4], rmary[5], rmary[6], rmary[7]);
	printf("\n%2.bX %2.bX %2.bX %2.bX %2.bX %2.bX %2.bX %2.bX",
	rmary[8], rmary[9], rmary[10], rmary[11],
rmary[12], rmary[13], rmary[14], rmary[15]);
	printf("\n%2.bX %2.bX %2.bX %2.bX %2.bX %2.bX %2.bX %2.bX",
rmary[16], rmary[17], rmary[18], rmary[19],
rmary[20], rmary[21], rmary[22], rmary[23]);
	printf("\n%2.bX %2.bX %2.bX %2.bX %2.bX %2.bX %2.bX",
rmary[24], rmary[25], rmary[26], rmary[27], 
rmary[28], rmary[29], rmary[30]);
}

/************************ 多字节突发方式写入RAM函数 *********************/
void burstramwr() {
uchar ramdata;
uchar	i;

	printf("\nWrite Ram DATA (HEX):");
	scanf("%bx", &ramdata);				// 输入RAM数据

	reset_3w();
	wbyte_3w(0xfe);						// 以多字节突发方式写入RAM 
	for (i=0; i<31; ++i) {
		wbyte_3w(ramdata);
	}
	reset_3w();
}

/**************************** DS1302初始化函数 **************************/
void initialize_DS1302() {
uchar	yr, mn, date, dy, hr, min, sec;

	printf("\nEnter the year (0-99): ");
	scanf("%bx", &yr);
	printf("\nEnter the month (1-12): ");
	scanf("%bx", &mn);
	printf("\nEnter the date (1-31): ");
	scanf("%bx", &date);
	printf("\nEnter the day (1-7): ");
	scanf("%bx", &dy);
	printf("\nEnter the hour (1-24): ");
	scanf("%bx", &hr);
	hr = hr & 0x3f;				// 设置时钟为24小时方式
	printf("\nEnter the minute (0-59): ");
	scanf("%bx", &min);
	printf("\nEnter the second (0-59): ");
	scanf("%bx", &sec);

	reset_3w();
	wbyte_3w(0x8e);				// 写保护控制寄存器
	wbyte_3w(0);				// 允许写入
	reset_3w();
	wbyte_3w(0x90);				// 涓流充电控制寄存器
	wbyte_3w(0xab);				// 允许充电, 双二极管, 8K 电阻
	reset_3w();
	wbyte_3w(0xbe);				// 以多字节突发方式写入时钟数据(8个字节)
	wbyte_3w(sec);
	wbyte_3w(min);
	wbyte_3w(hr);
	wbyte_3w(date);
	wbyte_3w(mn);
	wbyte_3w(dy);
	wbyte_3w(yr);
	wbyte_3w(0);				// 以多字节突发方式写入时钟数据时
// 必须对写保护控制寄存器写入0值
	reset_3w();
}

/****************************** 主函数 *********************************/
main (void)	{
uchar M, M1;
    SCON  = 0x50;		// 设置串行口: 方式 1, 8位UART, 允许接收
    TMOD |= 0x20;       // 设置定时器T1, 方式 2, 8位自动重装
    TH1   = 221;        // 设置串行口波特率:  1200 @ 16MHz 
    TR1   = 1;          
    TI    = 1;          

	while (1) { 
	printf("***********C51 PROGRAM FOR DS1302***********\n\n");
	printf("I. initialize DS1302\n");
	printf("CW. Write Byte  CR. Read Time\n");
	printf("RW. Write RAM   RR. Read RAM\n");
	printf("\nEnter Menu Selection:");

	M = _getkey();
	switch(M) {
		case 'C':
		case 'c':
		printf("\rEnter Clock Routine to run:C");

		M1 = _getkey();
		switch(M1) {
			case 'R':
			case 'r':	disp_clk_regs(1);	break;
            case 'W':
      case 'w':	clkwritebyte();	break;
		}
		break;

		case 'I':
		case 'i':	initialize_DS1302();	break;

		case 'R':
		case 'r':
		printf("\rEnter Ram Routine to run:R");

		M1 = _getkey();
		switch(M1) {
		case 'B':
		case 'b':	ramwritebyte();	break;
		case 'R':
		case 'r':	burstramrd();	break;
			case 'W':
			case 'w':	burstramwr();	break;
		}
		break;
	}
   }
}

⌨️ 快捷键说明

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