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

📄 ds1302时钟芯片程序1.c

📁 KEIL C环境下的DS1302时钟芯片的源代码!
💻 C
字号:
#include "c8051F020.h"
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit T_CLK = P0^1; /*实时时钟时钟线引脚 */
sbit T_IO = P0^0; /*实时时钟数据线引脚 */
sbit T_RST = P1^7; /*实时时钟复位线引脚 */
#define uint unsigned int
#define uchar unsigned char
//#define SCLK 1000
uchar bdata ADD;     //定义成可位操作字节
sbit ADD0=ADD^0;
sbit ADD7=ADD^7;


void SYDS1302_SCLK_Init (void);
void PORT_Init (void);
void delay2us(void);

void PORT_Init(void)
{
	XBR0    = 0x00;                                     // Enable SMBus, SPI0, and UART0
	XBR2    = 0x40;
	P0		=0xff;
	P1		=0xff;
	P1MDOUT	=0x00;
	P0MDOUT	=0x00;
}

void SCLK_Init (void)
{

	OSCICN = 0x04;   //interal 12MHZ
}

void delay2us(void)
    { uchar T=2;
	  while(T)
	  { _nop_();_nop_();_nop_();_nop_();_nop_();
	    T--;
	   }
     }

/******************************************************************** 
*
* 名称: v_RTInputByte
* 说明: 
* 功能: 往DS1302写入1Byte数据
* 调用:
* 输入: ucDa 写入的数据 
* 返回值: 无
***********************************************************************/
void v_RTInputByte(uchar ucDa) 
{ 
  uchar i;
  ADD = ucDa;
  for(i=8; i>0; i--)
 {
      T_IO = ADD0; /*相当于汇编中的 RRC */
   //delay2us();
   T_CLK = 0;
   T_CLK = 1;
   ADD = ADD >> 1; 
  } 
 }
/******************************************************************** 
*
* 名称: uchar uc_RTOutputByte
* 说明: 
* 功能: 从DS1302读取1Byte数据
* 调用: 
* 输入: 
* 返回值: ACC
***********************************************************************/
uchar uc_RTOutputByte(void) 
{  
   
   uchar i;
   T_CLK = 0;
  for(i=8; i>0; i--)
  {
   ADD = ADD >>1;               /*相当于汇编中的 RRC */
   ADD7 = T_IO;
  // delay2us();
   T_CLK = 1;
   T_CLK = 0;
   //ADD7 = T_IO;
   } 
  return(ADD); 
}
/******************************************************************** 
*
* 名称: v_W1302
* 说明: 先写地址,后写命令/数据
* 功能: 往DS1302写入数据
* 调用: v_RTInputByte() 
* 输入: ucAddr: DS1302地址, ucDa: 要写的数据
* 返回值: 无
***********************************************************************/
void v_W1302(uchar ucAddr, uchar ucDa)
{
   T_RST = 0;
   T_CLK = 0;
   T_RST = 1;
   v_RTInputByte(ucAddr); /* 地址,命令 */
   v_RTInputByte(ucDa); /* 写1Byte数据*/
   T_CLK = 1;
   T_RST =0;
} 
/******************************************************************** 
*
* 名称: uc_R1302
* 说明: 先写地址,后读命令/数据
* 功能: 读取DS1302某地址的数据
* 调用: v_RTInputByte() , uc_RTOutputByte()
* 输入: ucAddr: DS1302地址
* 返回值: ucDa :读取的数据
***********************************************************************/
uchar uc_R1302(uchar ucAddr)
{
   uchar ucDa;
   T_RST = 0;
   T_CLK = 0;
   T_RST = 1;
   v_RTInputByte(ucAddr);    /* 地址,命令 */
   ucDa = uc_RTOutputByte(); /* 读1Byte数据 */
   T_CLK = 1;
    T_RST =0;
   return(ucDa);
}
/********************************************************************
/******************************************************************** 
*
* 名称: v_Set1302
* 说明: 
* 功能: 设置初始时间
* 调用: v_W1302() 
* 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年 
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
void v_Set1302(uchar *pSecDa) 
{
  uchar i;
  uchar ucAddr = 0x80; 
  v_W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
 for(i =7;i>0;i--)
  { 
   v_W1302(ucAddr,*pSecDa); /* 秒 分 时 日 月 星期 年 */

  pSecDa++;
  ucAddr +=2;
  }
  v_W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
}
/******************************************************************** 
*
* 名称: v_Get1302
* 说明: 
* 功能: 读取DS1302当前时间
* 调用: uc_R1302() 
* 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年 
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
void v_Get1302(uchar *ucCurtime) 
{
  uchar i;
  uchar ucAddr = 0x81;
 for (i=0;i<7;i++)
  {
  *ucCurtime = uc_R1302(ucAddr);/*格式为: 秒 分 时 日 月 
  星期 年 */
   ucCurtime++;
  ucAddr += 2;
  }
} 
main()
 {  uchar m,n,miao,fen;
    uchar bdata Date[3];
	uchar DaTime[7]={0x47,0x11,0x12,0x02,0x12,0x04,0x04};//second is 0x50
	uchar DaTime1[7]={0x00,0x00,0x00,0x00,0x00,0x00,0x00};
	miao=DaTime[5];
    WDTCN = 0xde;
	WDTCN = 0xad;                       //关看门狗
	SCLK_Init ();
//	PORT_Init();       //关看门狗
	//SCLK_Init ();         //初始化时钟
//	Timer0_Init();			//初始化定时器
	PORT_Init ();           //初始化DS1302_IO口
//	SPI0_Init ();           //初始化SPI
//	EA=1;
	 
    v_Set1302(DaTime);
/*	v_W1302(0x8e,0x01);
	v_W1302(0x80,0x3);
	v_W1302(0x8e,0x80);
	m =uc_R1302(0x81);
    
	v_W1302(0x8e,0x00);
	v_W1302(0x86,0x17);
	v_W1302(0x8e,0x80);
	n= uc_R1302(0x87);*/
   
 while(1)
{
   v_Get1302(DaTime1);
 }
  /*v_W1302(0x8E,0x00);//控制命令,WP=0写操作    
  v_W1302(0x90,0x06);  //禁止充电
  v_W1302(0x8C,0x05);  //初始化年,并启动时钟 05年
  v_W1302(0x8A,0x02);  //初始化周,并启动时钟 周2
  v_W1302(0x88,0x07);  //初始化月,并启动时钟 7月
  v_W1302(0x86,0x27);  //初始化日,并启动时钟 27号
  v_W1302(0x84,0x02);  //初始化时,并启动时钟 2点
  v_W1302(0x82,0x55);  //初始化分,并启动时钟 55分
  v_W1302(0x80,0x50);  //初始化秒,并启动时钟 50秒
   */         				 
 while(1)
 { //v_Set1302(DaTime);  
   v_Get1302(DaTime1);                                                            	//开中断
 // Date[2]=uc_R1302(0x87);
  
  //Date[2]=dat;
  //Date[0]=Date[2]&0x0f;
  //Date[1]=Date[2]&0xf0;
  /*DS1302RD(0x85);
  Hor[0]=dat&0x0f;
  Hor[1]=dat&0xf0;
  DS1302RD(0x83);
  Min[0]=dat&0x0f;
  Min[1]=dat&0xf0;
  */ 
  }
 } 

⌨️ 快捷键说明

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