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

📄 ds1302+lcd1602-c51.lst

📁 基于C51实现多功能钟,一键多功能,友好的液晶显示,人机界面,同时能播放音乐.绝对原创!
💻 LST
📖 第 1 页 / 共 4 页
字号:
 258           //读的子函数
 259          /**********************************************************/
 260          uchar read_byte()    //sclk的下跳沿读数据
 261          {
 262   1         uchar i,temp=0; 
 263   1         io=1;                //设置为输入口
 264   1         for(i=0;i<7;i++)
 265   1         {
 266   2          sclk=0;
 267   2          if(io==1)
 268   2          temp=temp|0x80;
 269   2          else
 270   2          temp=temp&0x7f;
 271   2          sclk=1;             //产生下跳沿
 272   2          
 273   2          temp=temp>>1;
 274   2         }
 275   1         return (temp);
 276   1      }
 277          
 278          /**********************************************************/
 279          // 往ds1302的某个地址写入数据 
 280          /**********************************************************/
 281          void write_ds1302(uchar cmd,uchar indata)
 282          {
 283   1         sclk=0;
 284   1         reset=1;
 285   1         write_byte(cmd);        
 286   1         write_byte(indata);
 287   1         
 288   1         sclk=0;
 289   1         reset=0;
 290   1      }
 291          
 292          /**********************************************************/
 293          // 读ds1302某地址的的数据 
 294          /**********************************************************/
 295          uchar read_ds1302(uchar addr)
 296          {
 297   1         uchar backdata;
 298   1         sclk=0;
 299   1         reset=1;
 300   1      
 301   1         write_byte(addr);      //先写地址
 302   1         backdata=read_byte();  //然后读数据
C51 COMPILER V8.02   DS1302_LCD1602_C51                                                    01/22/2008 14:37:10 PAGE 6   

 303   1        
 304   1         sclk=0;
 305   1         reset=0;
 306   1         return (backdata);
 307   1      }
 308          
 309          /**********************************************************/
 310          // 设置初始时间
 311          /**********************************************************/
 312          void set_ds1302(uchar addr,uchar *p,uchar n) //写入n个数据
 313          {
 314   1         write_ds1302(0x8e,0x00);          //写控制字,允许写操作
 315   1         for(;n>0;n--)
 316   1         {
 317   2         write_ds1302(addr,*p);
 318   2         p++;
 319   2         addr=addr+2;
 320   2         }
 321   1         write_ds1302(0x8e,0x80);          //写保护,不允许写
 322   1      }
 323          
 324          /**********************************************************/
 325          // 读取当前时间 
 326          /**********************************************************/
 327          void read_nowtime(uchar addr,uchar *p,uchar n) //读出N个数据
 328          {
 329   1        for(;n>0;n--)
 330   1        {
 331   2          *p=read_ds1302(addr);
 332   2          p++;
 333   2          addr=addr+2;
 334   2        } 
 335   1      }
 336          
 337          /**********************************************************/
 338          // 初始化DS1302
 339          /**********************************************************/
 340          void init_ds1302()
 341          {
 342   1         reset=0;
 343   1         sclk=0;
 344   1         write_ds1302(0x80,0x00); 
 345   1         write_ds1302(0x90,0xa6); //一个二极管+4K电阻充电
 346   1         write_ds1302(0x8e,0x80); //写保护控制字,禁止写
 347   1      }
 348          
 349          /**********************************************************/
 350          /*                                                        */
 351          /* 蜂鸣器响一声                                           */
 352          /*                                                        */
 353          /**********************************************************/
 354          void beep()
 355            {
 356   1          unsigned char y;
 357   1          for (y=0;y<100;y++)
 358   1          {
 359   2            delay();
 360   2            BEEP=!BEEP;                //BEEP取反
 361   2          } 
 362   1          BEEP=1;                      //关闭蜂鸣器
 363   1              delay1(50);
 364   1        }
C51 COMPILER V8.02   DS1302_LCD1602_C51                                                    01/22/2008 14:37:10 PAGE 7   

 365          
 366          /**********************************************************/
 367          /*                                                        */
 368          /* :闪动函数                                             */
 369          /*                                                        */
 370          /**********************************************************/
 371          void  flash()
 372          {
 373   1         if(flag)
 374   1          {
 375   2            write_position(2,9);
 376   2            lcd_wdat(':');
 377   2            write_position(2,12);
 378   2            lcd_wdat(':');     
 379   2          }
 380   1          else
 381   1          {
 382   2            write_position(2,9);
 383   2            lcd_wdat(0x20);    //写显示数据到LCD
 384   2            write_position(2,12);
 385   2            lcd_wdat(0x20);     
 386   2          }
 387   1      }
 388          void init_24c02(void)
 389          {
 390   1        int i;
 391   1        for(i=0;i<8;i++)
 392   1        {
 393   2         Write_One_Byte(0x00+i*0x02,0x59);
 394   2         Write_One_Byte(0x01+i*0x02,0x23);
 395   2        }
 396   1         Write_One_Byte(0xaf,0x08);
 397   1      }
 398          
 399          /**********************************************************/
 400          // 主函数
 401          /**********************************************************/
 402          void main()
 403          {
 404   1        
 405   1         P1=0xff;
 406   1         TMOD=0x01;
 407   1         TH0=0x4c;          //50ms定时
 408   1         TL0=0x00;
 409   1         EA=1;
 410   1         ET0=1;  
 411   1         TR0=1;
 412   1         init_lcd();                 //初始化LCD
 413   1         write_str(0x80,str1);       //液晶显示提示信息
 414   1         write_str(0xc0,str2);       //液晶显示提示信息
 415   1         init_ds1302();              //初始化ds1302
 416   1         init_24c02();                          //初始化24c02
 417   1         writetab();               //自定义字符写入CGRAM
 418   1         delay1(5);
 419   1         write_position(2,16);
 420   1         lcd_wdat(0x00);           //显示自定义字符小喇叭
 421   1         
 422   1         while(1)
 423   1         {
 424   2      //---------------------------------------------------------
 425   2         if(!K1)
 426   2            {
C51 COMPILER V8.02   DS1302_LCD1602_C51                                                    01/22/2008 14:37:10 PAGE 8   

 427   3              if(!K2)
 428   3                      {
 429   4                    set_ds1302(0x80,init2,7);  //设置初始时间,日期,年 ,月
 430   4                        beep();
 431   4              }
 432   3            
 433   3                      if(!K3)
 434   3                      {       
 435   4                        delay1(35);                            //消除抖动
 436   4                        if(!K3)
 437   4                       {                                                                                                                                       
             -              
 438   5                write_str(0xc0,str3);      //显示报警信息
 439   5                if(alarm_flag)              //alarm_flag=1,开定时
 440   5                    {
 441   6                      write_position(2,16);
 442   6                  lcd_wdat(0x00);           //显示自定义字符小喇叭
 443   6                    }
 444   5                        write_str(0x80,str4); 
 445   5                      
 446   5                       k=Read_One_Byte(0xaf);
 447   5              do      
 448   5                {             
 449   6                      count=k;
 450   6                  num=1;        
 451   6                  while(num)     //写入闹钟个数
 452   6                 {
 453   7                   key_set(8,1,14);
 454   7                 if(!K4)
 455   7                      {
 456   8                       delay1(35);
 457   8                        if(!K4)
 458   8                        {
 459   9                        Set_place(1,14);
 460   9                        k=(init1[0]<<4|init1[1]);
 461   9                      
 462   9                        Play_alarmtime();           //查看报警时间 
 463   9      
 464   9                        beep();
 465   9                        num=0;  
 466   9                        }
 467   8                       } 
 468   7                      }  
 469   6                        
 470   6      //        Play_alarmtime();           //查看报警时间             
 471   6               
 472   6               }while(k>=1);    
 473   5                        beep();
 474   5                        delay1(700);
 475   5                        write_str(0x80,str1);
 476   5                       
 477   5                        write_str(0xc0,str2);       //显示时间信息
 478   5                        if(alarm_flag)              //alarm_flag=1,开定时
 479   5                    {
 480   6                      write_position(2,16);
 481   6                  lcd_wdat(0x00);           //显示自定义字符小喇叭
 482   6                    }
 483   5                      }
 484   4                 }
 485   3              if(!K4)
 486   3               {      
 487   4                  delay1(35);    //消除抖动
C51 COMPILER V8.02   DS1302_LCD1602_C51                                                    01/22/2008 14:37:10 PAGE 9   

 488   4                       if(!K4)
 489   4                      { 
 490   5      //               for(k=0;k<ALARM_NUM;)
 491   5      //              {
 492   5                       
 493   5                       alarm_time();               //K4键设定报警时间
 494   5                 
 495   5              //              k=k+2;
 496   5              //      }
 497   5                       if(alarm_flag)              //alarm_flag=1,开定时
 498   5                    {
 499   6                      write_position(2,16);
 500   6                  lcd_wdat(0x00);          //显示自定义字符小喇叭
 501   6                    }
 502   5                      }
 503   4              }
 504   3        }
 505   2      //---------------------------------------------------------
 506   2       if(!K4)
 507   2       {
 508   3           delay1(35);          //消除抖动
 509   3         if(!K4)
 510   3              {
 511   4                 beep();
 512   4             alarm_flag=~alarm_flag;
 513   4              if(alarm_flag)              //alarm_flag=1,开定时
 514   4               {
 515   5                 write_position(2,16);
 516   5             lcd_wdat(0x00);           //显示自定义字符小喇叭
 517   5               }
 518   4              else
 519   4               {
 520   5               write_position(2,16);
 521   5           lcd_wdat(0x20);           //显示自定义字符小喇叭
 522   5           }
 523   4        }

⌨️ 快捷键说明

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