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

📄 24c02读写成功.lst

📁 采用DS12C887做时钟
💻 LST
📖 第 1 页 / 共 2 页
字号:
 181   1                             
 182   1                Stop();   
 183   1                DelayMs(20);   
 184   1        }   
 185            void   Read_Date(uchar   StartAddress,uchar   *date,uchar   bytes)   
 186            {       uchar   i; 
 187   1                Start();   
 188   1                Write_I2c(WR24C02);   
 189   1                        TestAck();
 190   1                        Write_I2c(StartAddress);      
 191   1                TestAck(); 
 192   1                        Start();  
 193   1                Write_I2c(RD24C02);   
 194   1                TestAck();  
 195   1                         for   (i   =   0;   i   <   bytes;   i++)   
 196   1                {   
 197   2                   *date=   Read_I2c();
 198   2                                
 199   2                             Ack();   
 200   2                     date++;   
 201   2                }   
 202   1                                           
 203   1                NoAck();   
 204   1                Stop();   
 205   1                DelayMs(10);   
 206   1        }   
 207           void delay(void)
 208          {  unsigned char        i,j;
 209   1         for(i=0;i<15;i++){   for(j=0;j<50;j++) ;     }
 210   1      } 
 211          
 212          unsigned char displaycount,x; 
 213          unsigned char displaybuf[8]={0,0,0,0,0,0,0,0}; 
 214          unsigned char timecount; 
 215          unsigned char readdata[8]; 
 216           unsigned long a,aa,bb;
 217          sbit DQ=P2^6;   //选P3.7口与DS18B20的数字信号输出端DQ相连 
 218          bit sflag; 
 219           
 220          bit resetpulse(void)     //DS18B20初始化实现对DS18B20的复位
 221          { unsigned char pre;
 222   1        unsigned char i; 
 223   1        DQ=0;        //发出复位脉冲,将数据线下拉480μS-960μS 
 224   1        for(i=220;i>0;i--);  //(改!!!!!!!!!!!!!!!!!!!!)
 225   1        DQ=1;         //DS18B20等待15μS-60μS 
 226   1        for(i=60;i>0;i--); 
 227   1        pre=DQ; 
 228   1        for(i=150;i>0;i--);
 229   1        return(pre);    // DS18B20返回60μS-240μS存在低脉冲,判断是否准备好接受或发送数据 
 230   1      }
 231           
 232          void writecommandtods18b20(unsigned char command)    //写时序 
 233          { 
 234   1        unsigned char i; 
C51 COMPILER V8.02   24C02读写成功                                                         06/01/2007 22:49:53 PAGE 5   

 235   1        unsigned char j; 
 236   1         
 237   1        for(i=0;i<8;i++) 
 238   1          { 
 239   2            if((command & 0x01)==0)   //写0时序 
 240   2              { 
 241   3                DQ=0;        //拉低单总线至少60μS,保证DS18B20在15μS-45μS时可以正确地采样I/O总线上的低电平
 242   3                for(j=35;j>0;j--); 
 243   3                DQ=1; 
 244   3              } 
 245   2              else       //写1时序
 246   2                { 
 247   3      DQ=0;         //拉低单总线后,在15us之内就得释放
 248   3                  for(j=2;j>0;j--); 
 249   3                  DQ=1; 
 250   3                  for(j=33;j>0;j--); 
 251   3                } 
 252   2            command=_cror_(command,1);       
 253   2          } 
 254   1      } 
 255           
 256          unsigned char readdatafromds18b20(void)     //读时序   
 257          { 
 258   1        unsigned char i; 
 259   1        unsigned char j; 
 260   1        unsigned char temp; 
 261   1       
 262   1        temp=0; 
 263   1        for(i=0;i<8;i++) 
 264   1          { 
 265   2            temp=_cror_(temp,1);    
 266   2            DQ=0;                 //单总线拉低后,读时序开始 
 267   2            _nop_(); 
 268   2            _nop_(); 
 269   2            DQ=1;                  //停止将数据线拉低,以读取数据     
 270   2            for(j=10;j>0;j--); 
 271   2            if(DQ==1) 
 272   2              { 
 273   3                temp=temp | 0x80; 
 274   3              } 
 275   2              else 
 276   2                { 
 277   3                  temp=temp | 0x00; 
 278   3                } 
 279   2            for(j=20;j>0;j--);  ////////////////////(改!!!!!!!!!!!!)
 280   2          } 
 281   1        return(temp); 
 282   1      } 
 283           
 284          
 285          
 286          void main(void)
 287            {     SCON=0;P1=0;
 288   1          Write_Date(0,date_txd,8);
 289   1              Read_Date(0,date_rxd,8);          
 290   1          //while(resetpulse());      //写前调用初始化程序对DS18B20复位
 291   1          //writecommandtods18b20(0xcc);  //单片DS18B20工作,跳过读ROM中64位地址的过程 
 292   1          //writecommandtods18b20(0x44); //启动DS18B20进行温度转化,将结果存入内部RAM中
 293   1         while(1)        
 294   1          {           
 295   2                                        for(m=0;m<16;m++)
 296   2                                         {   SBUF=codedisplay[date_rxd[0]*16+m];    while(!TI) ; TI=0;
C51 COMPILER V8.02   24C02读写成功                                                         06/01/2007 22:49:53 PAGE 6   

 297   3                                     SBUF=codedisplay[date_rxd[1]*16+m];    while(!TI) ; TI=0; 
 298   3                                         SBUF=codedisplay[date_rxd[2]*16+m];   while(!TI) ; TI=0; 
 299   3                                         SBUF=codedisplay[date_rxd[3]*16+m];    while(!TI) ; TI=0;
 300   3                                                 SBUF=codedisplay[date_rxd[4]*16+m];   while(!TI) ; TI=0; 
 301   3                                         SBUF=codedisplay[date_rxd[5]*16+m];    while(!TI) ; TI=0; 
 302   3                                                 SBUF=codedisplay[date_rxd[6]*16+m];    while(!TI) ; TI=0; 
 303   3                                         SBUF=codedisplay[date_rxd[7]*16+m];    while(!TI) ; TI=0;  
 304   3                                             //P2_0=0;P2_1=0;P2_1=1;P2_1=0;P2_0=1;
 305   3                                                 SBUF=Tab[2*m]; while(!TI) ; TI=0;
 306   3                                                 SBUF=Tab[2*m+1];while(!TI) ; TI=0; 
 307   3                                                 
 308   3                                                 P3_4=0;P3_4=1;       P3_4=0;
 309   3                                 delay();
 310   3                              /*                 count++;
 311   3                if(count==600)
 312   3                {     count=0;
 313   3                while(resetpulse());    //写前调用初始化程序对DS18B20复位
 314   3            writecommandtods18b20(0xcc);      //单片DS18B20工作,跳过读ROM中64位地址的过程 
 315   3            writecommandtods18b20(0xbe);      // 读DS18B20RAM中温度数据
 316   3            readdata[0]=readdatafromds18b20();   //温度数据低8位赋值
 317   3            readdata[1]=readdatafromds18b20();    //温度数据高8位赋值 
 318   3            sflag=0; 
 319   3            if((readdata[1] & 0xf8)!=0x00)   //温度数据高5位为1时,温度为负值 
 320   3              { 
 321   3                sflag=1; 
 322   3                readdata[1]=~readdata[1];   //对负温度值进行取反加1操作
 323   3                readdata[0]=~readdata[0]; 
 324   3                result=readdata[0]+1; 
 325   3                readdata[0]=result; 
 326   3                if(result>255) 
 327   3                  { 
 328   3                    readdata[1]++; 
 329   3                  } 
 330   3              } 
 331   3            readdata[1]=readdata[1]&0x07;      //将代表符号的高5位数屏蔽
 332   3                              aa=625;bb=(readdata[1]*256+readdata[0]);
 333   3                          a=bb*aa;   //计算实际温度值
 334   3              
 335   3                              
 336   3                          
 337   3                          displaybuf[0]=a/100000;      //给各显示位赋温度值
 338   3                          displaybuf[1]=a%100000/10000;
 339   3                          displaybuf[2]=a%10000/1000;
 340   3                              displaybuf[3]=a%1000/100;
 341   3                              displaybuf[4]=a%100/10;
 342   3                              displaybuf[5]=a%10;
 343   3            while(resetpulse()); 
 344   3            writecommandtods18b20(0xcc); 
 345   3            writecommandtods18b20(0x44); 
 346   3            }*/
 347   3                 }}}
 348          
 349          
 350          
 351          
 352          
 353          
 354          
 355          
 356          
 357          
 358          
C51 COMPILER V8.02   24C02读写成功                                                         06/01/2007 22:49:53 PAGE 7   

 359                                             
 360                            


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    785    ----
   CONSTANT SIZE    =    192    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     75      10
   IDATA SIZE       =      1    ----
   BIT SIZE         =      2    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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