正文

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";         }

阅读(3169) | 评论(0)


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

评论

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