正文

DS1302C51源代码 2006-11-09 20:29:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/embed/20144.html

分享到:

DS1302C51源代码

 

#include
#include

#define mcuport2 P2
#define mcuport1 P1

unsigned char pd;
/*********************************************************************/
sbit T_CLK="P0"^7; /*实时时钟时钟线引脚 */
sbit T_IO="P0"^6; /*实时时钟数据线引脚 */
sbit T_RST="P0"^5; /*实时时钟复位线引脚 */
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
//lcd引脚声明
/**************************************************/
sbit rs="P0"^0;
sbit rw="P0"^1;
sbit e="P0"^3;
/********************************************************************
*
* 名称: v_RTInputByte
* 说明:
* 功能: 往DS1302写入1Byte数据
* 调用:
* 输入: ucDa 写入的数据
* 返回值: 无
***********************************************************************/
void v_RTInputByte(unsigned char ucDa)
{
unsigned char i;
ACC = ucDa;
for(i="8"; i>0; i--)
{
T_IO = ACC0; /*相当于汇编中的 RRC */
T_CLK = 1;
T_CLK = 0;
ACC = ACC >> 1;
}
}
/********************************************************************
*
* 名称: uchar uc_RTOutputByte
* 说明:
* 功能: 从DS1302读取1Byte数据
* 调用:
* 输入:
* 返回值: ACC
***********************************************************************/
unsigned char uc_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);
}
/********************************************************************
*
* 名称: v_W1302
* 说明: 先写地址,后写命令/数据
* 功能: 往DS1302写入数据
* 调用: v_RTInputByte()
* 输入: ucAddr: DS1302地址, ucDa: 要写的数据
* 返回值: 无
***********************************************************************/
void v_W1302(unsigned char ucAddr, unsigned char 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 :读取的数据
***********************************************************************/
unsigned char uc_R1302(unsigned char ucAddr)
{
unsigned char 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_BurstW1302T
* 说明: 先写地址,后写数据(时钟多字节方式)
* 功能: 往DS1302写入时钟数据(多字节方式)
* 调用: v_RTInputByte()
* 输入: pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
* 8Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
void v_BurstW1302T(unsigned char *pSecDa)
{
unsigned char i;
v_W1302(0x8e,0x00); /* 控制命令,WP="0",写操作?*/
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(0xbe); /* 0xbe:时钟多字节写命令 */
for (i="8";i>0;i--) /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/
{
v_RTInputByte(*pSecDa);/* 写1Byte数据*/
pSecDa++;
}
T_CLK = 1;
T_RST =0;
}
/********************************************************************
*
* 名称: v_BurstR1302T
* 说明: 先写地址,后读命令/数据(时钟多字节方式)
* 功能: 读取DS1302时钟数据
* 调用: v_RTInputByte() , uc_RTOutputByte()
* 输入: pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: ucDa :读取的数据
***********************************************************************/
void v_BurstR1302T(unsigned char *pSecDa)
{
unsigned char i;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(0xbf); /* 0xbf:时钟多字节读命令 */
for (i="8"; i>0; i--)
{
*pSecDa = uc_RTOutputByte(); /* 读1Byte数据 */
pSecDa++;
}
T_CLK = 1;
T_RST =0;
}
/********************************************************************
*
* 名称: v_BurstW1302R
* 说明: 先写地址,后写数据(寄存器多字节方式)
* 功能: 往DS1302寄存器数写入数据(多字节方式)
* 调用: v_RTInputByte()
* 输入: pReDa: 寄存器数据地址
* 返回值: 无
***********************************************************************/
void v_BurstW1302R(unsigned char *pReDa)
{
unsigned char i;
v_W1302(0x8e,0x00); /* 控制命令,WP="0",写操作?*/
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(0xfe); /* 0xbe:时钟多字节写命令 */
for (i="31";i>0;i--) /*31Byte 寄存器数据 */
{
v_RTInputByte(*pReDa); /* 写1Byte数据*/
pReDa++;
}
T_CLK = 1;
T_RST =0;
}
/********************************************************************
*
* 名称: uc_BurstR1302R
* 说明: 先写地址,后读命令/数据(寄存器多字节方式)
* 功能: 读取DS1302寄存器数据
* 调用: v_RTInputByte() , uc_RTOutputByte()
* 输入: pReDa: 寄存器数据地址
* 返回值: 无
***********************************************************************/
void v_BurstR1302R(unsigned char *pReDa)
{
unsigned char i;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
v_RTInputByte(0xff); /* 0xbf:时钟多字节读命令 */
for (i="31"; i>0; i--) /*31Byte 寄存器数据 */
{
*pReDa = uc_RTOutputByte(); /* 读1Byte数据 */
pReDa++;
}
T_CLK = 1;
T_RST =0;
}
/********************************************************************
*
* 名称: v_Set1302
* 说明:
* 功能: 设置初始时间
* 调用: v_W1302()
* 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
void v_Set1302(unsigned char *pSecDa)
{
unsigned char i;

unsigned char 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(unsigned char  ucCurtime[])
{
unsigned char i;
unsigned char ucAddr = 0x81;
for (i="0";i<7;i++)
{
ucCurtime[i] = uc_R1302(ucAddr);/*格式为: 秒 分 时 日 月
星期 年 */
ucAddr += 2;
}
}
/********************************************************************************/
//lcd写命令使能
/********************************************************************************/
void enable(void)
{
  unsigned char j,k;
 
  rs="0";
  rw="0";
  _nop_();
  e="0";
  for(k="10";k>0;k--)
  for(j="245";j>0;j--);
  e="1";
                 
}


/*******************************************************************************/
//lcd写数据使能
/*******************************************************************************/
void writer(void)
 {
      unsigned char j,k;
     
      rs="1";
      rw="0";
      _nop_();
      e="0";
      for(k="10";k>0;k--)
      for(j="245";j>0;j--);
      e="1";
   
    
  }

/******************************************************************************/
//初始化
/******************************************************************************/
void start(void)
{
   mcuport2=0x01;   //
   enable();
   mcuport2=0x01;   //
   enable(); 
   mcuport2=0x38;
   enable();
   mcuport2=0x0f;
   enable();
   mcuport2=0x06;
   enable();
   }
/***************************************************************************
延时40MS
****************************************************************************/
void delay40ms(void)
{
  unsigned char i,j;
  for(i="40";i>0;i--)
  for(j="248";j>0;j--);
}

/***************************************************************************/
unsigned char  key4x4()
{

     unsigned char temp;
     unsigned char key,keydata;
    
keydata="0xff";   
while(keydata==0xff)
  {
     keydata="0xff";
      mcuport1=0xff;
      mcuport1=mcuport1&0xef;
      temp="mcuport1";
      temp="temp"&0x0f;
      if (temp!=0x0f)
        {
          delay40ms();
          temp="mcuport1";
          temp="temp"&0x0f;
          if (temp!=0x0f)
            {
              temp="mcuport1";
              temp="temp"&0x0f;            
              switch(temp)
                {
                  case 0x0e:
                   key="0";
                    break;
                  case 0x0d:
                    key="1";
                    break;
                  case 0x0b:
                   key="2";
                    break;
                  case 0x07:
                    key="3";
                    break;
                }
                keydata="key";
               
             

            }

        }

 

      mcuport1=0xff;
      mcuport1=mcuport1&0xdf;
      temp="mcuport1";
      temp="temp"&0x0f;
      if (temp!=0x0f)
        {
          delay40ms();
          temp="mcuport1";
          temp="temp"&0x0f;
          if (temp!=0x0f)
            {
              temp="mcuport1";
              temp="temp"&0x0f;            
              switch(temp)
                {
                  case 0x0e:
                    key="4";
                    break;
                  case 0x0d:
                    key="5";
                    break;
                  case 0x0b:
                    key="6";
                    break;
                  case 0x07:
                    key="7";
                    break;
                }
                keydata="key";

             

            }

        }

 

      mcuport1=0xff;
      mcuport1=mcuport1&0xbf;
      temp="mcuport1";
      temp="temp"&0x0f;
      if (temp!=0x0f)
        {
          delay40ms();
          temp="P3";
         temp="temp"&0x0f;
          if (temp!=0x0f)
            {
              temp="mcuport1";
              temp="temp"&0x0f;            
              switch(temp)
                {
                  case 0x0e:
                    key="8";
                    break;
                  case 0x0d:
                    key="9";
                    break;
                  case 0x0b:
                    key="10";
                    break;
                  case 0x07:
                    key="11";
                    break;
                }
                keydata="key";

            

            }

        }

 

      mcuport1=0xff;
      mcuport1=mcuport1&0x7f;
      temp="mcuport1";
      temp="temp"&0x0f;
      if (temp!=0x0f)
        {
          delay40ms();
          temp="mcuport1";
          temp="temp"&0x0f;
          if (temp!=0x0f)
            {
              temp="mcuport1";
              temp="temp"&0x0f;            
              switch(temp)
                {
                  case 0x0e:
                    key="12";
                    break;
                  case 0x0d:
                    key="13";
                    break;
                  case 0x0b:
                    key="14";
                    break;
                  case 0x07:
                    key="15";
                    break;
                }
                keydata="key";          
            }
        }
 
    
}
  
return(keydata);
}
void main(void)
{
  unsigned char  modify[]={0x8a,0x8b,0x8d,0x8e,0xc5,0xc6,0xc8,0xc9,0xcb,0xcc};
  unsigned char   ts1302[]={0x00,0x00,0x00,0x18,0x07,0x03,0x05};//初始话码表
  unsigned char  table[]={'0','1','2','3','4','5','6','7','8','9'};//数字ASCII码表
  unsigned char  get1302[7];
  unsigned char  appear[]={'D','A','T','A',':','2','0','0','0','/','0','0',
                           '/','0','0','!','T','I','M','E',':','0','0','/','0','0','/',
                           '0','0'};   //显示码表
  unsigned char data i,j;
  char data n;
  unsigned char data ii,ts,keydata1;                        //循环显示计数值
 
  EA="1";
  EX0=1;
  v_Set1302(&ts1302[0]);
  start();
 while(1)
{
  mcuport1=0x7f;
  if(pd==1)
   {
   
     keydata1=0x00;
     EA="0";
     while(keydata1!=15)
      {
       
        keydata1=key4x4();
        switch(keydata1)
         {
            case 0:
            case 1:
            case 2:
            case 3:
            case 4:
            case 5:
            case 6:
            case 7:
            case 8:
            case 9:  switch(ii)                                          //检测到1-9,执行相同的命令
                      {
                        case 0:  if(keydata1<2)                           //对月份的高位进行修改
                                 {
                                   mcuport2=modify[ii];enable();
                                   mcuport2=table[keydata1];writer();
                                   ts1302[4]=(ts1302[4]&0x0f)+(keydata1*16);
                                   v_Set1302(&ts1302[0]);
                                   mcuport2=modify[ii];enable();
                                  }
                                 break;
                        case 1:ts=(ts1302[4]&0xf0)+keydata1;              //对月份的低位进行修改
                               if(ts<0x13)
                                  {
                                    mcuport2=modify[ii];enable();
                                    mcuport2=table[keydata1];writer();
                                    ts1302[4]=ts;
                                    v_Set1302(&ts1302[0]);
                                    mcuport2=modify[ii];enable();
                                   }
                                break;                                  
                        case 2:                                           //对日的高位进行修改
                                if(keydata1<4)
                                 {
                                   mcuport2=modify[ii];enable();
                                   mcuport2=table[keydata1];writer();
                                   ts1302[3]=(ts1302[3]&0x0f)+(keydata1*16);
                                   v_Set1302(&ts1302[0]);
                                   mcuport2=modify[ii];enable();
                                 }
                                 break;
                        case 3:ts=(ts1302[3]&0xf0)+keydata1;                //对日的低位进行修改
                               if(ts<0x32)
                                  {
                                    mcuport2=modify[ii];enable();
                                    mcuport2=table[keydata1];writer();
                                    ts1302[3]=ts;
                                    v_Set1302(&ts1302[0]);
                                    mcuport2=modify[ii];enable();
                                   }
                                break;    
                        case 4:                                            //对小时的高位进行修改
                                if(keydata1<3)
                                 {
                                   mcuport2=modify[ii];enable();
                                   mcuport2=table[keydata1];writer();
                                   ts1302[2]=(ts1302[2]&0x0f)+(keydata1*16);
                                   v_Set1302(&ts1302[0]);
                                   mcuport2=modify[ii];enable();
                                 }
                                 break;
                        case 5:ts=(ts1302[2]&0xf0)+keydata1;                  //对小时的低位进行修改
                               if(ts<0x25)
                                  {
                                    mcuport2=modify[ii];enable();
                                    mcuport2=table[keydata1];writer();
                                   
                                    ts1302[2]=ts;
                                    v_Set1302(&ts1302[0]);
                                    mcuport2=modify[ii];enable();
                                   }
                                break;    
                        case 6:if(keydata1<7)                                 //对分的高位进行修改
                                 {
                                   mcuport2=modify[ii];enable();
                                   mcuport2=table[keydata1];writer();
                                   ts1302[1]=(ts1302[1]&0x0f)+(keydata1*16);
                                   v_Set1302(&ts1302[0]);
                                   mcuport2=modify[ii];enable();
                                 }
                                 break;
                        case 7:ts=(ts1302[1]&0xf0)+keydata1;                  //对分的低位进行修改
                               if(ts<0x61)
                                  {
                                    mcuport2=modify[ii];enable();
                                    mcuport2=table[keydata1];writer();
                                    ts1302[1]=ts;
                                    v_Set1302(&ts1302[0]);
                                    mcuport2=modify[ii];enable();
                                   }
                                break; 
                        case 8:if(keydata1<7)                                  //对秒的高位进行修改
                                 {
                                   mcuport2=modify[ii];enable();
                                   mcuport2=table[keydata1];writer();
                                   ts1302[0]=(ts1302[0]&0x0f)+(keydata1*16);
                                   v_Set1302(&ts1302[0]);
                                   mcuport2=modify[ii];enable();
                                 }
                                 break;
                        case 9:ts=(ts1302[0]&0xf0)+keydata1;                   //对秒的低位进行修改
                               if(ts<0x61)
                                  {
                                    mcuport2=modify[ii];enable();
                                    mcuport2=table[keydata1];writer();
                                    ts1302[0]=ts;
                                    v_Set1302(&ts1302[0]);
                                    mcuport2=modify[ii];enable();
                                   }
                                break; 
                                             
                        }
                     break;
            case 14: mcuport1=0x7f;
                     while(mcuport1!=0x7f);
                     
                     ii="ii"+1;
                     if(ii>9){ii="0";}mcuport2=modify[ii];enable();break;
            case 13: mcuport1=0x7f;
                     while(mcuport1!=0x7f);
                     ii="ii"-1;
                     if(ii>9){ii="9";}
                     mcuport2=modify[ii];
                     enable();
                     break;
            case 10: case 11: case 12:
            case 15: mcuport1=0x7f;
                     while(mcuport1!=0x7f);
                     break;
            //default: exit(0);
         }
       }
      
       EA="1";
       EX0=1;
       pd="0";
       EA="1";
       mcuport1=0x7f;
   }
/*********************************************************************/       
                    
        for(i="20";i>0;i--)
        for(j="245";j>0;j--);             //一段延时
       
     
        v_Get1302(get1302);
        appear[7]=table[(get1302[6]&0xf0)/16];
        appear[8]=table[get1302[6]&0x0f];
        appear[10]=table[(get1302[4]&0xf0)/16];
        appear[11]=table[get1302[4]&0x0f];
        appear[13]=table[(get1302[3]&0xf0)/16];
        appear[14]=table[get1302[3]&0x0f];
        appear[21]=table[(get1302[2]&0xf0)/16];
        appear[22]=table[get1302[2]&0x0f];
        appear[24]=table[(get1302[1]&0xf0)/16];
        appear[25]=table[get1302[1]&0x0f];
        appear[27]=table[(get1302[0]&0xf0)/16];
        appear[28]=table[get1302[0]&0x0f];//修改显示码表
   
   
        mcuport2=0x80;
        enable();
        mcuport2=0x80;
        enable();
       
        for(n="0";n<16;n++)
          {
            mcuport2=appear[n];
            writer();
          }
        mcuport2=0xc0;
        enable();
        mcuport2=0xc0;
        enable();   
        for(n="16";n<29;n++)
          {
             mcuport2=appear[n];
             writer();                  //lcd显示控制
           }                        
       
}
}

void int0(void) interrupt 0
{
  EA="0";
  delay40ms();
 
     pd="1";     
   
 }

阅读(2952) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册