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

📄 2402shiyan.lst

📁 采用DS12C887做时钟
💻 LST
📖 第 1 页 / 共 2 页
字号:
 159   1                         for   (i   =   0;   i   <   bytes;   i++)   
 160   1                {   
 161   2                   *date=   Read_I2c();
 162   2                                
 163   2                             Ack();   
 164   2                     date++;   
 165   2                }   
 166   1                                           
 167   1                NoAck();   
 168   1                Stop();   
 169   1                DelayMs(10);   
 170   1        }   
 171           void delay(void)
 172          {  unsigned char        i,j;
C51 COMPILER V8.02   2402SHIYAN                                                            06/01/2007 22:56:05 PAGE 4   

 173   1         for(i=0;i<15;i++){   for(j=0;j<50;j++) ;     }
 174   1      } 
 175          
 176          unsigned char displaycount,x; 
 177          unsigned char displaybuf[8]={0,0,0,0,0,0,0,0}; 
 178          unsigned char timecount; 
 179          unsigned char readdata[8]; 
 180           unsigned long a,aa,bb;
 181          sbit DQ=P2^6;   //选P3.7口与DS18B20的数字信号输出端DQ相连 
 182          bit sflag; 
 183           
 184          bit resetpulse(void)     //DS18B20初始化实现对DS18B20的复位
 185          { unsigned char pre;
 186   1        unsigned char i; 
 187   1        DQ=0;        //发出复位脉冲,将数据线下拉480μS-960μS 
 188   1        for(i=220;i>0;i--);  //(改!!!!!!!!!!!!!!!!!!!!)
 189   1        DQ=1;         //DS18B20等待15μS-60μS 
 190   1        for(i=60;i>0;i--); 
 191   1        pre=DQ; 
 192   1        for(i=150;i>0;i--);
 193   1        return(pre);    // DS18B20返回60μS-240μS存在低脉冲,判断是否准备好接受或发送数据 
 194   1      }
 195           
 196          void writecommandtods18b20(unsigned char command)    //写时序 
 197          { 
 198   1        unsigned char i; 
 199   1        unsigned char j; 
 200   1         
 201   1        for(i=0;i<8;i++) 
 202   1          { 
 203   2            if((command & 0x01)==0)   //写0时序 
 204   2              { 
 205   3                DQ=0;        //拉低单总线至少60μS,保证DS18B20在15μS-45μS时可以正确地采样I/O总线上的低电平
 206   3                for(j=35;j>0;j--); 
 207   3                DQ=1; 
 208   3              } 
 209   2              else       //写1时序
 210   2                { 
 211   3      DQ=0;         //拉低单总线后,在15us之内就得释放
 212   3                  for(j=2;j>0;j--); 
 213   3                  DQ=1; 
 214   3                  for(j=33;j>0;j--); 
 215   3                } 
 216   2            command=_cror_(command,1);       
 217   2          } 
 218   1      } 
 219           
 220          unsigned char readdatafromds18b20(void)     //读时序   
 221          { 
 222   1        unsigned char i; 
 223   1        unsigned char j; 
 224   1        unsigned char temp; 
 225   1       
 226   1        temp=0; 
 227   1        for(i=0;i<8;i++) 
 228   1          { 
 229   2            temp=_cror_(temp,1);    
 230   2            DQ=0;                 //单总线拉低后,读时序开始 
 231   2            _nop_(); 
 232   2            _nop_(); 
 233   2            DQ=1;                  //停止将数据线拉低,以读取数据     
 234   2            for(j=10;j>0;j--); 
C51 COMPILER V8.02   2402SHIYAN                                                            06/01/2007 22:56:05 PAGE 5   

 235   2            if(DQ==1) 
 236   2              { 
 237   3                temp=temp | 0x80; 
 238   3              } 
 239   2              else 
 240   2                { 
 241   3                  temp=temp | 0x00; 
 242   3                } 
 243   2            for(j=20;j>0;j--);  ////////////////////(改!!!!!!!!!!!!)
 244   2          } 
 245   1        return(temp); 
 246   1      } 
 247           
 248          
 249          
 250          void main(void)
 251            {     SCON=0;  P1=0;
 252   1          Write_Date(0,date_txd,8);
 253   1              Read_Date(0,date_rxd,8);          
 254   1          //while(resetpulse());      //写前调用初始化程序对DS18B20复位
 255   1          //writecommandtods18b20(0xcc);  //单片DS18B20工作,跳过读ROM中64位地址的过程 
 256   1          //writecommandtods18b20(0x44); //启动DS18B20进行温度转化,将结果存入内部RAM中
 257   1         while(1)        
 258   1          {           
 259   2                                        for(m=0;m<16;m++)
 260   2                                         {   SBUF=codedisplay[date_rxd[0]*16+m];    while(!TI) ; TI=0;
 261   3                                     SBUF=codedisplay[date_rxd[1]*16+m];    while(!TI) ; TI=0; 
 262   3                                         SBUF=codedisplay[date_rxd[2]*16+m];   while(!TI) ; TI=0; 
 263   3                                         SBUF=codedisplay[date_rxd[3]*16+m];    while(!TI) ; TI=0;
 264   3                                                 SBUF=codedisplay[date_rxd[4]*16+m];   while(!TI) ; TI=0; 
 265   3                                         SBUF=codedisplay[date_rxd[5]*16+m];    while(!TI) ; TI=0; 
 266   3                                                 SBUF=codedisplay[date_rxd[6]*16+m];    while(!TI) ; TI=0; 
 267   3                                         SBUF=codedisplay[date_rxd[7]*16+m];    while(!TI) ; TI=0;  
 268   3                                             //P2_0=0;P2_1=0;P2_1=1;P2_1=0;P2_0=1;
 269   3                                                 SBUF=Tab[2*m]; while(!TI) ; TI=0;
 270   3                                                 SBUF=Tab[2*m+1];while(!TI) ; TI=0; 
 271   3                                                 
 272   3                                                 P3_4=0;P3_4=1;       P3_4=0;
 273   3                                 delay();
 274   3                              /*                 count++;
 275   3                if(count==600)
 276   3                {     count=0;
 277   3                while(resetpulse());    //写前调用初始化程序对DS18B20复位
 278   3            writecommandtods18b20(0xcc);      //单片DS18B20工作,跳过读ROM中64位地址的过程 
 279   3            writecommandtods18b20(0xbe);      // 读DS18B20RAM中温度数据
 280   3            readdata[0]=readdatafromds18b20();   //温度数据低8位赋值
 281   3            readdata[1]=readdatafromds18b20();    //温度数据高8位赋值 
 282   3            sflag=0; 
 283   3            if((readdata[1] & 0xf8)!=0x00)   //温度数据高5位为1时,温度为负值 
 284   3              { 
 285   3                sflag=1; 
 286   3                readdata[1]=~readdata[1];   //对负温度值进行取反加1操作
 287   3                readdata[0]=~readdata[0]; 
 288   3                result=readdata[0]+1; 
 289   3                readdata[0]=result; 
 290   3                if(result>255) 
 291   3                  { 
 292   3                    readdata[1]++; 
 293   3                  } 
 294   3              } 
 295   3            readdata[1]=readdata[1]&0x07;      //将代表符号的高5位数屏蔽
 296   3                              aa=625;bb=(readdata[1]*256+readdata[0]);
C51 COMPILER V8.02   2402SHIYAN                                                            06/01/2007 22:56:05 PAGE 6   

 297   3                          a=bb*aa;   //计算实际温度值
 298   3              
 299   3                              
 300   3                          
 301   3                          displaybuf[0]=a/100000;      //给各显示位赋温度值
 302   3                          displaybuf[1]=a%100000/10000;
 303   3                          displaybuf[2]=a%10000/1000;
 304   3                              displaybuf[3]=a%1000/100;
 305   3                              displaybuf[4]=a%100/10;
 306   3                              displaybuf[5]=a%10;
 307   3            while(resetpulse()); 
 308   3            writecommandtods18b20(0xcc); 
 309   3            writecommandtods18b20(0x44); 
 310   3            }*/
 311   3                 }}}
 312          
 313          
 314          
 315          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    749    ----
   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 + -