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

📄 ds1302.h

📁 这是本人花了200元买的51开发板上的所有程序资料
💻 H
字号:
#include <AT89x51.h>
#include <string.h>
#include <intrins.h>




//*********** DS1302 时间显示定义部分
sbit T_CLK=P3^5;
sbit T_IO =P3^6;
sbit T_RST=P3^7;      //以上是实验板的接口定义

sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
//void   Set(uchar,uchar);     //根据选择调整相应项目
//void   RTInputByte(uchar);       /* 输入 1Byte */
//uchar  RTOutputByte(void);       /* 输出 1Byte */
//void   W1302(uchar, uchar);   // 向DS1302写入一个字节
//uchar  R1302(uchar);          // 从DS1302读出一个字节
//void   Set1302(unsigned char * ); //  设置时间 
bit sec,min,hour,year,mon,day,weekk; //闪烁标志位
//初始化后设置为:05年12月31日星期6 0点0分0秒
unsigned char inittime[7]={0x00,0x00,0x00,0x31,0x12,0x05,0x06};
//                          秒  分钟 小时  日   月   年  星期



//********DS1302读写程序***************
/******************************************************************** 
 函 数 名:RTInputByte()
 功    能:实时时钟写入一字节
 说    明:往DS1302写入1Byte数据 (内部函数)
 入口参数:d 写入的数据 
 返 回 值:无  
 ***********************************************************************/
void RTInputByte(unsigned char d) 
{ 
    unsigned char i;
    ACC = d;
    for(i=8; i>0; i--)
    {
        T_IO = ACC0;           /*相当于汇编中的 RRC */
        T_CLK = 1;
        T_CLK = 0;
        ACC = ACC >> 1; 
    } 
}
/******************************************************************** 
 函 数 名:RTOutputByte()
 功    能:实时时钟读取一字节
 说    明:从DS1302读取1Byte数据 (内部函数)
 入口参数:无  
 返 回 值:ACC
 设    计:zhaojunjie           日    期:2002-03-19
 修    改:                     日    期: 
***********************************************************************/
unsigned char RTOutputByte(void) 
{ 
    unsigned char i;
    for(i=8; i>0; i--)
    {
        ACC = ACC >>1;         /*相当于汇编中的 RRC */
        ACC7 = T_IO;
        T_CLK = 1;
        T_CLK = 0;
    } 
    return(ACC); 
}
/******************************************************************** 
 函 数 名:W1302()
 功    能:往DS1302写入数据
 说    明:先写地址,后写命令/数据 (内部函数)
 调    用:RTInputByte() , RTOutputByte()
 入口参数:ucAddr: DS1302地址, ucData: 要写的数据
 返 回 值:无
 ***********************************************************************/
void W1302(unsigned char ucAddr, unsigned char ucDa)
{
    T_RST = 0;
    T_CLK = 0;
    T_RST = 1;
    RTInputByte(ucAddr);       /* 地址,命令 */
    RTInputByte(ucDa);       /* 写1Byte数据*/
    T_CLK = 1;
    T_RST = 0;
}
/******************************************************************** 
 函 数 名:R1302()
 功    能:读取DS1302某地址的数据
 说    明:先写地址,后读命令/数据 (内部函数)
 调    用:RTInputByte() , RTOutputByte()
 入口参数:ucAddr: DS1302地址
 返 回 值:ucData :读取的数据
***********************************************************************/
unsigned char R1302(unsigned char ucAddr)
{
    unsigned char ucData;
    T_RST = 0;
    T_CLK = 0;
    T_RST = 1;
    RTInputByte(ucAddr);             /* 地址,命令 */
    ucData = RTOutputByte();         /* 读1Byte数据 */
    T_CLK = 1;
    T_RST = 0;
    return(ucData);
}

/******************************************************************** 
 函 数 名:Set1302()
 功    能:设置初始时间
 说    明:先写地址,后读命令/数据(寄存器多字节方式)
 调    用:W1302()
 入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年
                               7Byte (BCD码)1B 1B 1B 1B 1B  1B  1B
 返 回 值:无
***********************************************************************/
void Set1302(unsigned char *pClock) 
{
    unsigned char i;
    unsigned char ucAddr = 0x80; 
    W1302(0x8e,0x00);           /* 控制命令,WP=0,写操作?*/
    for(i =7; i>0; i--)
    { 
        W1302(ucAddr,*pClock);  /* 秒 分 时 日 月 星期 年 */ 
        pClock++;
        ucAddr +=2;
    }
    W1302(0x8e,0x80);           /* 控制命令,WP=1,写保护?*/
}

//根据选择调整相应项目并写入DS1302
void Set(unsigned char sel,unsigned char sel_1) 
{
  signed char address,item;
  signed char max,mini;
  if(sel==7)  {address=0x80; max=0; mini=0;}    //秒
  if(sel==6)  {address=0x82; max=59;mini=0;}    //分钟
  if(sel==5)  {address=0x84; max=23;mini=0;}    //小时
  if(sel==3)  {address=0x86; max=31;mini=1;}    //日
  if(sel==2)  {address=0x88; max=12;mini=1;}    //月
  if(sel==1)  {address=0x8c; max=99;mini=0;}    //年
  if(sel==4)  {address=0x8a; max=7; mini=1;}    //星期
  
  item=R1302(address+1)/16*10+R1302(address+1)%16;
  if (sel_1==0) item++;  else item--;
  if(item>max) item=mini;   
  if(item<mini) item=max;
           					  
  W1302(0x8e,0x00);//允许写操作
  W1302(address,item/10*16+item%10);
  W1302(0x8e,0x80);//写保护,禁止写操作  
}

⌨️ 快捷键说明

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