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

📄 1302.lst

📁 单片机与时钟芯片ds1302接口程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 218          
 219           函 数 名:BurstW1302R()
 220           功    能:往DS1302寄存器数写入数据(多字节方式)
 221           说    明:先写地址,后写数据(寄存器多字节方式)
 222           调    用:RTInputByte()
 223           入口参数:pWReg: 寄存器数据地址
 224           返 回 值:无
 225           设    计:zhaojunjie           日    期:2002-03-19
 226           修    改:                     日    期: 
 227          ***********************************************************************/
 228          void BurstW1302R(uchar *pWReg)
 229          {
 230   1          uchar i;
 231   1          W1302(0x8e,0x00);         /* 控制命令,WP=0,写操作*/
 232   1          T_RST = 0;
 233   1          T_CLK = 0;
 234   1          T_RST = 1;
 235   1          RTInputByte(0xfe);         /* 0xbe:时钟多字节写命令 */
 236   1          for (i=31; i>0; i--)       /* 31Byte 寄存器数据 */
 237   1          {
 238   2              RTInputByte(*pWReg);    /* 写1Byte数据*/
 239   2              pWReg++;
 240   2          }
 241   1          T_CLK = 1;
C51 COMPILER V7.50   1302                                                                  07/27/2007 22:38:52 PAGE 5   

 242   1          T_RST = 0;
 243   1      } 
 244          /******************************************************************** 
 245          
 246           函 数 名:BurstR1302R()
 247           功    能:读取DS1302寄存器数据
 248           说    明:先写地址,后读命令/数据(寄存器多字节方式)
 249           调    用:RTInputByte() , RTOutputByte()
 250           入口参数:pRReg: 寄存器数据地址
 251           返 回 值:无
 252           设    计:zhaojunjie           日    期:2002-03-19
 253           修    改:                     日    期: 
 254          ***********************************************************************/
 255          void BurstR1302R(uchar *pRReg)
 256          {
 257   1          uchar i;
 258   1          T_RST = 0;
 259   1          T_CLK = 0;
 260   1          T_RST = 1;
 261   1          RTInputByte(0xff);            /* 0xff:时钟多字节读命令 */
 262   1          for (i=31; i>0; i--)          /*31Byte 寄存器数据 */
 263   1          {
 264   2              *pRReg = RTOutputByte();  /* 读1Byte数据 */
 265   2              pRReg++;
 266   2          }
 267   1          T_CLK = 1;
 268   1          T_RST = 0;
 269   1      }
 270          /******************************************************************** 
 271          
 272           函 数 名:Set1302()
 273           功    能:设置初始时间
 274           说    明:先写地址,后读命令/数据(寄存器多字节方式)
 275           调    用:W1302()
 276           入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年
 277                                         7Byte (BCD码)1B 1B 1B 1B 1B  1B  1B
 278           返 回 值:无
 279           设    计:zhaojunjie           日    期:2002-03-19
 280           修    改:                     日    期: 
 281          ***********************************************************************/
 282          void Set1302(uchar *pClock) 
 283          {
 284   1          uchar i;
 285   1          uchar ucAddr = 0x80; 
 286   1          W1302(0x8e,0x00);           /* 控制命令,WP=0,写操作?*/
 287   1          for(i =7; i>0; i--)
 288   1          { 
 289   2              W1302(ucAddr,*pClock);  /* 秒 分 时 日 月 星期 年 */ 
 290   2              pClock++;
 291   2              ucAddr +=2;
 292   2          }
 293   1          W1302(0x8e,0x80);           /* 控制命令,WP=1,写保护?*/
 294   1      }
 295          void delayms(int t)
 296          {
 297   1              uchar i;
 298   1              while(t--)
 299   1              {
 300   2              i=100;
 301   2              while(i--);     
 302   2              }
 303   1      }
C51 COMPILER V7.50   1302                                                                  07/27/2007 22:38:52 PAGE 6   

 304          /******************************************************************** 
 305          
 306           函 数 名:Get1302()
 307           功    能:读取DS1302当前时间
 308           说    明:
 309           调    用:R1302() 
 310           入口参数:ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年 
 311                                                  7Byte (BCD码)   1B 1B 1B 1B 1B  1B  1B
 312           返 回 值:无
 313           设    计:zhaojunjie           日    期:2002-03-19
 314           修    改:                     日    期: 
 315          ***********************************************************************/
 316          void Get1302(uchar ucCurtime[]) 
 317          {
 318   1          uchar i;
 319   1          char j;
 320   1          uchar ucAddr = 0x81;
 321   1          for (i=0; i<7; i++)
 322   1          {
 323   2              j= R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */
 324   2                                      //if (j>=0)
 325   2              ucCurtime[i] =j;/*格式为: 秒 分 时 日 月 星期 年 */
 326   2              //ucCurtime[i] = R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */
 327   2              ucAddr += 2;
 328   2                                      _nop_();
 329   2          }
 330   1      }
 331          /*//////////////////////////////////////////////////////////////////////*/
 332          
 333          
 334          void put_num(char cnum)
 335          {
 336   1              P0=seg[ cnum & 0x0f];
 337   1      }
 338          
 339          #define xt_mhz          11.0592                 //晶体的振荡频率
 340          //unsigned int TimeTHTL;
 341          unsigned int TimeMode1Set(float timeslot)
 342          {
 343   1              return (unsigned int)(0x10000-xt_mhz*1000000/12*timeslot);
 344   1      }
 345          idata unsigned  int TimeTick;
 346          void timer0() interrupt 1 using 3 
 347          { 
 348   1              static  char disppoint;
 349   1      //      unsigned char temp; 
 350   1              //晶振为 11.0592MHZ 时计数 9216(2400)=(0x10000-0xd800) 次为 10ms 
 351   1          //11.0592*10e6/12=每秒计数 /100=10ms应计数
 352   1              TH0=(XMS/256); 
 353   1              TL0=(XMS%256);
 354   1              TimeTick++;
 355   1      
 356   1              P2=P2|0x3f;
 357   1      
 358   1              //put_num(dispbuf[disppoint]);
 359   1              P0=seg[ dispbuf[disppoint] & 0x0f];
 360   1              if(disppoint==2)        P0&=~dot; /* 小数点*/
 361   1      
 362   1              P2=P2 & low[disppoint];
 363   1      
 364   1              if (disppoint++>=5)     disppoint=0;
 365   1      
C51 COMPILER V7.50   1302                                                                  07/27/2007 22:38:52 PAGE 7   

 366   1      } 
 367          void displed(void)
 368          {
 369   1      
 370   1      }
 371          void systemini(void)
 372          {
 373   1              P0=0xff;
 374   1              P1=0xff;
 375   1              P2=0xff;
 376   1              P3=0xff;
 377   1              TMOD=0x01;
 378   1              XMS=TimeMode1Set(0.004);
 379   1              //XMS=2000;
 380   1              //XMS=0x10000-1000;
 381   1              TH0=XMS/256;    /* 5ms */
 382   1              TL0=XMS%256;
 383   1              TR0=1;
 384   1              ET0=1;              //Enable timer 0 Interrupt
 385   1              EA=1;
 386   1      //      stop=1;
 387   1      }
 388          void main(void)
 389          {
 390   1        uchar WClock[8]={0x01,0x02,0x03};/*格式为: 秒 分 时 日 月 星期 年 */
 391   1        uchar RClock[8];
 392   1        uchar ds_hour;
 393   1        uchar ds_min;
 394   1        uchar ds_sec;
 395   1              systemini();
 396   1      //      Get1302(&RClock);                       /*把当前的时间值读取到数组SClock[3]中去*/
 397   1          W1302(0x8e,0x00);           /* 控制命令,WP=0,写操作?*/
 398   1                      W1302(0x90,0xA5);                                       //TCS=1010:使能涓流充电 DS=01:选择一个二极管 RS=01:2K
 399   1          W1302(0x8e,0x80);           /* 控制命令,WP=1,写保护?*/
 400   1      Set1302(WClock);                
 401   1      while(1)
 402   1              {
 403   2      
 404   2          //Get1302(&RClock);                /*获取当前时间值*/
 405   2      //              displed();
 406   2                      BurstR1302T(&RClock);
 407   2      //              Get1302(&RClock);                       /*把当前的时间值读取到数组SClock[3]中去*/
 408   2      //              if (TimeTick>5)
 409   2      //              {
 410   2      //                      TimeTick=0;             
 411   2                      //  Get1302(&RClock);                   /*把当前的时间值读取到数组SClock[3]中去*/
 412   2                  ds_sec  = RClock[0];//&0x7f;        /*得到当前时间秒值*/
 413   2                  ds_min  = RClock[1];             /*得到当前时间分值*/
 414   2                  ds_hour = RClock[2];             /*得到当前时间小时值*/
 415   2                              dispbuf[0]=ds_hour>>4;
 416   2                              dispbuf[1]=ds_hour&0x0f;
 417   2                              dispbuf[2]=ds_min>>4;
 418   2                              dispbuf[3]=ds_min&0x0f;
 419   2                              dispbuf[4]=ds_sec>>4;
 420   2                              dispbuf[5]=ds_sec&0x0f;
 421   2      //        }
 422   2                      //delayms(2000);
 423   2      //              keyproc();
 424   2                      //ledrun();
 425   2              }
 426   1      }

C51 COMPILER V7.50   1302                                                                  07/27/2007 22:38:52 PAGE 8   


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    624    ----
   CONSTANT SIZE    =     24    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     16      24
   IDATA SIZE       =      2    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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