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

📄 text1.lst

📁 单片机用DS1302进行计时
💻 LST
📖 第 1 页 / 共 2 页
字号:
 152   1       PORTC&=~BIT(RTC_CS);    //拉低片选端
 153   1       PORTB&=~BIT(RTC_CLK);   //拉低时钟端
 154   1       Delayus(10);
 155   1       PORTC|=BIT(RTC_CS);     //拉高片选端
 156   1       Delayus(10);                    //调整片选脉冲
 157   1       DS1302_writeB(addr);    //写入操作命令(地址)
C51 COMPILER V7.06   TEXT1                                                                 01/31/2009 12:11:09 PAGE 4   

 158   1       Delayus(10);
 159   1       data=DS1302_readB();    //读出数据
 160   1       Delayus(10);
 161   1       PORTB&=~BIT(RTC_CLK);   //拉低时钟端
 162   1       PORTC&=~BIT(RTC_CS);    //拉低片选端
 163   1       return data;                    //返回读出的数据
 164   1      }
 165          /*******************************************
 166          函数名称: DS1302_setT
 167          功    能: 设置DS1302的时间
 168          参    数: ptTimeD--设置时间数组指针
 169          返回值  : 无
 170          /********************************************/
 171          void DS1302_setT(uchar ptTimeD[])
 172          {
 173   1          uchar i;
 174   1          uchar addr = 0x80;                            //写入地址从秒寄存器开始
 175   1          DS1302_writeD(C_WP|WR,UPROTECT); //控制命令,WP位为0,允许写操作
 176   1              Delayms(5);
 177   1          for(i=0;i<7;i++)
 178   1          {
 179   2              DS1302_writeD(addr|WR,ptTimeD[i]);   // 秒 分 时 日 月 星期 年         
 180   2              addr+=2;
 181   2                      Delayms(1);
 182   2          }
 183   1          DS1302_writeD(C_WP|WR,PROTECT);             //控制命令,WP位为1,不允许写操作
 184   1      }
 185          /*******************************************
 186          函数名称: DS1302_getT
 187          功    能: 读取DS1302的当前时间
 188          参    数: time[]--读取的时间数组
 189          返回值  : 无
 190          /********************************************/
 191          void DS1302_getT(uchar time[])
 192          {
 193   1          uchar i;
 194   1      ////////下面的是单次读写//////////////////////////      
 195   1         /* uchar addr = 0x80;                                                  //读取地址从秒寄存器开始 
 196   1          for(i=0;i<7;i++)
 197   1          {
 198   1              time[i]=DS1302_readD(addr|RD);    // 秒 分 时 日 月 星期 年        
 199   1              addr+=2;
 200   1          }*/
 201   1      ////////////////////////////////////////////////////    
 202   1              /////////下面是多字节读取/////////////// 
 203   1               PORTC&=~BIT(RTC_CS);    //拉低片选端
 204   1           Delayus(10);
 205   1           PORTC|=BIT(RTC_CS);         //拉高片选端
 206   1           Delayus(10);                        //调整片选脉冲
 207   1               DS1302_writeB(0xbf);       // 0xbf:时钟多字节读取命令 
 208   1           for (i=0;i<8;i++)       //时间数据的存放格式是:
 209   1             {                        //秒,分,时,日,月,星期,年,控制
 210   2               time[i]=DS1302_readB(); //【7个数据(BCD格式)+1个控制】 
 211   2             }
 212   1                                      
 213   1           PORTC&=~BIT(RTC_CS);        //拉低片选端
 214   1       ///////////////////////////////////////////////
 215   1           PORTB&=~BIT(RTC_CLK);                                        //拉低时钟端(时钟端在不操作时为低)
 216   1      }
 217          /*******************************************
 218          函数名称: DS1302_check
 219          功    能: 检测DS1302是否正常工作
C51 COMPILER V7.06   TEXT1                                                                 01/31/2009 12:11:09 PAGE 5   

 220          参    数: 无
 221          返回值  : exist--为TRUE为检测到DS1302,为FALSE为没检测到
 222          /********************************************/
 223          uchar DS1302_check(void)
 224          {
 225   1              uchar exist;
 226   1          DS1302_writeD(C_WP|WR,UPROTECT);              //写入写允许命令
 227   1          DS1302_writeD(C_RAMBASE|WR,0xA5);             //RAM0写入0xA5
 228   1          exist=DS1302_readD(C_RAMBASE|RD);             //读取RAM0
 229   1          if(exist==0xA5)     
 230   1              {
 231   2               exist=TRUE;                                                      //如果读取值与写入值相等,返回TRUE
 232   2              }
 233   1          else        
 234   1              {
 235   2               exist=FALSE;                                                     //如果读取值与写入值不相等,返回FALSE
 236   2              }       
 237   1              return exist;
 238   1      }
 239          /*******************************************
 240          函数名称: DS1302_init
 241          功    能: 初始化DS1302
 242          参    数: 无
 243          返回值  : 无
 244          /********************************************/
 245          void DS1302_init(void)
 246          {
 247   1       DS1302_writeD(C_WP|WR,UPROTECT);                 //写入写允许命令
 248   1       DS1302_writeD(C_SEC|WR,CLK_START);             //启动振荡器,DS1302开始工作
 249   1       DS1302_writeD(C_WP|WR,PROTECT);                //控制命令,WP位为1,不允许写操作   
 250   1      }
 251          /*******************************************
 252          函数名称: BCD_ASCII
 253          功    能: 将压缩BCD码转换成ascii码
 254          参    数: BCD--将要转换的压缩BCD码
 255                            ptasc--转换后的ASCII码数组指针
 256          返回值  : 无
 257          /********************************************/
 258          void BCD_ASCII(uchar BCD,uchar ptasc[])
 259          {       
 260   1              ptasc[0]=BCD/16|0x30;   //0X58  35  38 //转换十位
 261   1              ptasc[1]=BCD&0x0F|0x30;  //转换个位
 262   1      }
 263          /*******************************************
 264          函数名称: Disp_time
 265          功    能: 在1602液晶上显示当前时间(第1行格式:年-月-日 星期;第2行格式:时-分-秒)
 266          参    数: time[]--时间数组
 267          返回值  : 无
 268          /********************************************/
 269          void Disp_time(uchar time[])
 270          {
 271   1       uchar i,asc[2];
 272   1       uchar line1[11]={0,0,'-',0,0,'-',0,0,' ',0,'\0'};//显示第1行的字符数组
 273   1       uchar line2[9]={0,0,':',0,0,':',0,0,'\0'};               //显示第2行的字符数组
 274   1       for(i=0;i<3;i++)                                                                 //为第2行的字符数组赋值
 275   1       {
 276   2        BCD_ASCII(time[2-i],asc);
 277   2        line2[i*3]=asc[0];
 278   2        line2[i*3+1]=asc[1];
 279   2       } 
 280   1       BCD_ASCII(time[6],asc);                                                  //为第1行的年赋值
 281   1       line1[0]=asc[0];
C51 COMPILER V7.06   TEXT1                                                                 01/31/2009 12:11:09 PAGE 6   

 282   1       line1[1]=asc[1];
 283   1       BCD_ASCII(time[4],asc);                                                  //为第1行的月赋值
 284   1       line1[3]=asc[0];
 285   1       line1[4]=asc[1];
 286   1       BCD_ASCII(time[3],asc);                                                  //为第1行的日赋值
 287   1       line1[6]=asc[0];
 288   1       line1[7]=asc[1];
 289   1       BCD_ASCII(time[5],asc);                                                  //为第1行的星期赋值
 290   1       line1[9]=asc[1];
 291   1       
 292   1       while(LCD1602_readBF());
 293   1       LCD1602_gotoXY(1,2);                                                     //第1行从第3个位置开始显示
 294   1       LCD1602_sendstr("20");                                                   //将07年显示为2007的形式
 295   1       LCD1602_sendstr(line1);                                                  //第1行显示
 296   1       while(LCD1602_readBF());
 297   1       LCD1602_gotoXY(2,4);                                                     //第2行从第5个位置开始显示
 298   1       LCD1602_sendstr(line2);                                                  //第2行显示
 299   1      }
 300          /*******************************************
 301          函数名称: main
 302          功    能: 1. 在1602液晶上显示当前时间 2.可以设置时间(M1-M9为数字0-9,M13为设置模式和显示模式选择,M14为当
             -前设置位选择)
 303          参    数: 无
 304          返回值  : 无
 305          /********************************************/
 306          void main(void)
 307          {
 308   1              
 309   1              
 310   1              uchar setadd,setdat,shift;        //setadd指定将当前数值送入DS1302的哪个寄存器
 311   1                                                                //setdat是当前设置的数值,即被送入DS1302指定寄存器的数
 312   1                                                                //shift来实现十位和各位的设置相互独立(因为十位和个位是在一个寄存器里的)
 313   1       uchar dis_x,dis_y;                       //存储1602液晶当前光标的位置
 314   1       uchar settime[7]={0x50,0x59,0x23,0x01,0x01,0x06,0x07};//设置的秒,分,时,日,月,星期,年
 315   1       uchar gettime[7]={0x00,0x00,0x00,0x00,0x00,0x00,0x00};//保存当前时间的数组
 316   1       LCD1602_initial();             //初始化1602液晶
 317   1       DS1302_portinit();                     //初始化DS1302的三根数据线
 318   1       DS1302_init();                         //启动振荡器,DS1302开始工作 
 319   1       DS1302_setT(settime);          //设置初始时间
 320   1       while(1)                                       //以下程序完成显示和设置时间
 321   1       {
 322   2         DS1302_getT(gettime);        //获得当前时间
 323   2         
 324   2         Disp_time(gettime);          //显示当前时间
 325   2       }
 326   1      }

C51 COMPILATION COMPLETE.  3 WARNING(S),  19 ERROR(S)

⌨️ 快捷键说明

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