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

📄 ds1305c3.c

📁 单片机C语言教程
💻 C
字号:
/*******************************************************************/
/* 这是用C51高级语言编写的DS1305时钟和RAM读写程序-没有调用汇编语言,*/
/* 文件名 DS1305C3.C                                                */
/* 功能:本程序主要是读DS1305的日历时钟值(共7个字节)、置DS1305    */
/*       的日历时钟值、读DS1305的RAM区特定单元(共96个字节)的内    */
/*       容和写DS1305的RAM区特定单元。本程序中对DS1305 RAM区的读    */
/*       写均为16个字节。                                           */
/********************************************************************/
#include <stdio.h>
#include <reg52.h>
#define uchar unsigned char

void	reset_3w(void);
void	wbyte_3w(uchar w_byte);
uchar	rbyte_3w(void);
void	Initialize();
void   	TimeWrite();
void	BurstReadTime();
void	BurstRamRead(void);
void	BurstRamWrite(void);
void	writebyte1305();
void	readbyte1305();

sbit	CE        = P1^2;
sbit	SCLK      = P1^1;
sbit	SDI_IO    = P1^0;
sbit	INT0b     = P3^2;	/* INT0b脚与单片机的P3.2连接*/
uchar mid1[16];
uchar CPOL = 0;

void reset_3w()               // DS1305复位
{
	SCLK  = 0;
	CE    = 0;
	CE    = 1;
}
void wbyte_3w(uchar w_byte)	/*把w_byte中的数据从高位开始送入ds1305 */
{
    uchar i;
 	for(i = 0; i < 8; ++i)
	{
	   SDI_IO = 0;
	   if(w_byte & 0x01)
	   {
	     SDI_IO = 1;
	   }
	   SCLK = 0;
	   SCLK = 1;
	   w_byte >>= 1;
	}
}
uchar rbyte_3w()	          /*对DS1305进行读操作程序 */
{
    uchar i, R_Byte, TmpByte;
    R_Byte = 0x00;
	SDI_IO = 1;
	for(i = 0; i < 8; ++i)
	{
		SCLK = 1;
		SCLK = 0;
		TmpByte = (uchar)SDI_IO;
		TmpByte <<= 7;
		R_Byte >>= 1;
		R_Byte |= TmpByte;
	}
	return R_Byte;
}
void readbyte1305()	/* 从DS1305中指定单元读出一个字节 */
{
        uchar Add;
        uchar Data;
        Add=0x06;          /* 指定待读出单元的地址 */
	    reset_3w();
	    wbyte_3w(Add);
        Data=rbyte_3w();   /* 读出的结果放在Data中 */
	    reset_3w();
}
void writebyte1305()	/* 向DS1305中指定单元写入一个字节 */
{
        uchar Add, Data;
        Add= 0x06;          /* 指定待写入单元的地址 */
        Data= 0x07;         /* 指定待写入的内容     */
    	/* User enters read address. Must convert to write address. */
	    Add |= 0x80;
	    reset_3w();
	    wbyte_3w(Add);
	    wbyte_3w(Data);
	    reset_3w();
}
void TimeWrite()	/*  日历时钟值写入 */
{
    uchar	yr, mn, dt, dy, hr, min, sec;
	reset_3w();	  //清时钟写保护位。在写时钟之前,必须清时钟写保护位,否则写不进去。
	wbyte_3w(0x8F);
	wbyte_3w(0);
	reset_3w();
	yr=06;       /* 置待写入的年、月、日、时、分和秒的压缩的BCD码值 */
    mn=0x11;
    dt=0x26;
    dy=7;
    hr=9;
    hr = hr & 0x3f;
    min=9;
    sec=9;
	reset_3w();
	wbyte_3w(0x80);	
	wbyte_3w(sec);
	wbyte_3w(min);
	wbyte_3w(hr);
	wbyte_3w(dy);
	wbyte_3w(dt);
	wbyte_3w(mn);
	wbyte_3w(yr);
	reset_3w();
}
void BurstReadTime()	 /*  突发模式时钟读 */
{
    uchar Sec, Min, Hrs, Day, Dte, Mon, Yr;
	reset_3w();
	wbyte_3w(0x00);
	Sec = rbyte_3w();
	Min = rbyte_3w();
	Hrs = rbyte_3w();
	Day = rbyte_3w();
	Dte = rbyte_3w();
	Mon = rbyte_3w();
	Yr  = rbyte_3w();
	reset_3w();
}
void BurstRamRead()	/*  突发模式RAM读 */
{
      uchar i;
      reset_3w();
      wbyte_3w(0x20);
      for (i = 0; i < 16; ++i)
       {
         mid1[i]=rbyte_3w() ; //数组mid1[i]中放读出内容
       }
      reset_3w();
}
void BurstRamWrite()	/*  突发模式RAM写 */
{
    uchar i, dat;
    dat=0x55;     	   //  dat中放待写入内容
	reset_3w();
	wbyte_3w(0xA0);
	for (i = 0; i < 16; ++i)
	{
	  wbyte_3w(dat);
	}
	reset_3w();
}
void	Initialize()	/*  DS1305初始化 */
{
	reset_3w();
	wbyte_3w(0x8f);	
	wbyte_3w(0x05);	  /* 往控制寄存器写0x05*/
	reset_3w();
    wbyte_3w(0x90);	
	wbyte_3w(0x01);	  /* 往状态制寄存器写0x01*/
    reset_3w();
	wbyte_3w(0x91);	
	wbyte_3w(0xa5);   /* 往涓流充电寄存器写0xa5*/
	reset_3w();
}
              
void	main()	  //主程序
{
	while (1)
	{

	    // 	writebyte1305();
        //  readbyte1305();
        Initialize();      /* 调DS1305初始化 */
		TimeWrite();       /* 调日历时钟值写入*/
		BurstReadTime();   /*  突发模式时钟读 */
		BurstRamWrite();   /*  突发模式RAM写  */ 
		BurstRamRead();    /*  突发模式RAM读  */
 }
}

⌨️ 快捷键说明

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