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

📄 main.lst

📁 T89S52单片机以及DS1302时钟芯片
💻 LST
📖 第 1 页 / 共 2 页
字号:
 220   1      
 221   1      }
 222          
 223          
 224          //ds1302控制
 225          sbit reset=P3^7;
 226          sbit sclk=P2^6;
 227          sbit io=P2^7;
 228          
 229          
 230          
 231          
 232          void delay()
 233          {uint j;
 234   1      for(j=500;j>0;j--);
 235   1      }
 236           
 237          //-----------ds1302模块开始-------------------
 238          //注意点:sclk的上升沿输入数据,sclk的下跳沿输出数据
 239          //读写时都是从第0位开始
 240          void write_byte(uchar inbyte)
 241          {
C51 COMPILER V7.06   MAIN                                                                  05/03/2008 23:24:27 PAGE 5   

 242   1      uchar i;
 243   1      for(i=8;i>0;i--)
 244   1      {
 245   2        sclk=0;   //写的时候低电平改变数据
 246   2        if(inbyte&0x01)
 247   2            io=1;
 248   2        else
 249   2            io=0; 
 250   2        sclk=1;  //写的时候高电平,把数据写入ds1302
 251   2        _nop_();
 252   2        inbyte=inbyte>>1;
 253   2      }
 254   1      }
 255          uchar read_byte() //sclk的下跳沿读数据
 256          {
 257   1      uchar i,temp=0; 
 258   1      io=1;          //设置为输入口
 259   1      for(i=7;i>0;i--)
 260   1      {
 261   2         sclk=0;
 262   2         if(io==1)
 263   2         temp=temp|0x80;
 264   2         else
 265   2         temp=temp&0x7f;
 266   2         sclk=1;       //产生下跳沿
 267   2         temp=temp>>1;
 268   2      }
 269   1      return (temp);
 270   1      }
 271          //----------往ds1302的某个地址写入数据-------------
 272          void write_ds1302(uchar cmd,uchar indata)
 273          {
 274   1        reset=1;
 275   1        write_byte(cmd);
 276   1        write_byte(indata);
 277   1        reset=0;
 278   1        sclk=0;
 279   1      }
 280          //----------读ds1302某地址的的数据-----------------
 281          uchar read_ds1302(uchar addr)
 282          {
 283   1      uchar backdata;
 284   1      reset=1;
 285   1      write_byte(addr);
 286   1      backdata=read_byte();//先写地址,然后读数据
 287   1      reset=0;
 288   1      sclk=0;
 289   1      return (backdata);
 290   1      }
 291          //------------设置初始时间-------------------
 292          void set_ds1302(uchar addr,uchar *p,uchar n)//写入n个数据
 293          {
 294   1        write_ds1302(0x8e,0x00);//写控制字,允许写操作
 295   1        for(;n>0;n--)
 296   1        {write_ds1302(addr,*p);
 297   2         p++;
 298   2         addr=addr+2;
 299   2        }
 300   1        write_ds1302(0x8e,0x80);//写保护,不允许写
 301   1      }
 302          //----------- 读取当前时间-------------------
 303          void read_nowtime(uchar addr,uchar *p,uchar n)
C51 COMPILER V7.06   MAIN                                                                  05/03/2008 23:24:27 PAGE 6   

 304          {
 305   1      for(;n>0;n--)
 306   1      {
 307   2         *p=read_ds1302(addr);
 308   2         p++;
 309   2         addr=addr+2;
 310   2      }      
 311   1      }
 312          void init_ds1302()
 313          {
 314   1        reset=0;
 315   1        sclk=0;
 316   1        write_ds1302(0x80,0x00);//写控制字,允许写
 317   1        write_ds1302(0x90,0x00);//禁止涡流充电 
 318   1      }
 319          //-----------ds1302模块结束-------------------
 320          
 321          
 322          //-  ----------公历转阴历结束-------------------
 323          //LCD1602显示
 324          void LCD1602_DISP(void)
 325          {
 326   1      uchar format=0;
 327   1                      if(SHEZHI[14]==0x0A)
 328   1                      {
 329   2                      flag_san_key=0;
 330   2                      set_ds1302(0x80,init,7);//设置初始时间,日期,年月
 331   2              SHEZHI[14]=0x00;
 332   2                                      for(format=0;format<14;format++)
 333   2                                      {
 334   3                                      SHEZHI[format]=0;
 335   3                                      }
 336   2      
 337   2                      }
 338   1      
 339   1                  if(temp_OUT==0X0A)
 340   1           {
 341   2               
 342   2           
 343   2            read_nowtime(0x81,init,7); //读出当前时间,读出7个字节 
 344   2            //年
 345   2            LCD_set_position(1);
 346   2            LCD_printc(0X32);
 347   2      
 348   2            LCD_set_position(2);
 349   2            LCD_printc(0X30);
 350   2      
 351   2            LCD_set_position(3);
 352   2            LCD_printc(0X30+init[6]/16);
 353   2      
 354   2            LCD_set_position(4);
 355   2            LCD_printc(0X30+init[6]%16);
 356   2      
 357   2            LCD_set_position(5);
 358   2            LCD_prints("  "); 
 359   2            //月日
 360   2      
 361   2            LCD_set_position(7);
 362   2            LCD_printc(0X30+init[4]/16);
 363   2            LCD_set_position(8);
 364   2            LCD_printc(0X30+init[4]%16);
 365   2      
C51 COMPILER V7.06   MAIN                                                                  05/03/2008 23:24:27 PAGE 7   

 366   2            LCD_set_position(9);
 367   2            LCD_prints("-");
 368   2      
 369   2            LCD_set_position(10);
 370   2            LCD_printc(0X30+init[3]/16);
 371   2      
 372   2            LCD_set_position(11);
 373   2            LCD_printc(0X30+init[3]%16);
 374   2            LCD_set_position(12);
 375   2            LCD_prints("  ");
 376   2            //星期
 377   2      
 378   2            LCD_set_position(14);
 379   2            LCD_printc(0X30+init[5]%16);
 380   2      
 381   2      
 382   2            //时分秒
 383   2      
 384   2           LCD_set_position(0X4E);
 385   2           LCD_printc(0X30+init[0]%16);
 386   2      
 387   2           LCD_set_position(0X4D);
 388   2           LCD_printc(0X30+init[0]/16);
 389   2      
 390   2           LCD_set_position(0X4C);
 391   2           LCD_prints(":");
 392   2      
 393   2           LCD_set_position(0x4B);
 394   2           LCD_printc(0X30+init[1]%16);
 395   2      
 396   2           LCD_set_position(0x4a);
 397   2           LCD_printc(0X30+init[1]/16);
 398   2      
 399   2          LCD_set_position(0X49);
 400   2          LCD_prints(":");
 401   2      
 402   2          LCD_set_position(0X48);
 403   2          LCD_printc(0X30+init[2]%16);
 404   2          LCD_set_position(0X47);
 405   2          LCD_printc(0X30+init[2]/16);
 406   2         }
 407   1      }
 408          
 409          
 410          
 411          void main()
 412          
 413          {   
 414   1         LCD_initial();
 415   1         init_ds1302();          //初始化ds1302
 416   1         set_ds1302(0x80,init,7);//设置初始时间,日期,年月
 417   1      
 418   1                      while(1)
 419   1                      {
 420   2              DISP_DATA();
 421   2                      LCD1602_DISP();
 422   2      
 423   2                      }
 424   1      
 425   1      
 426   1      
 427   1              
C51 COMPILER V7.06   MAIN                                                                  05/03/2008 23:24:27 PAGE 8   

 428   1                         
 429   1      }
 430          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    966    ----
   CONSTANT SIZE    =      7    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     25      13
   IDATA SIZE       =   ----    ----
   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 + -