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

📄 lm92.lst

📁 c8051f020读/写LM92并将温度值显示在SAA1064驱动的四位数码管上
💻 LST
📖 第 1 页 / 共 2 页
字号:
 121   1         SM_BUSY = 1;                           // SMBus busy flag set.
 122   1         SMB0CN = 0x44;                         // SMBus enabled, ACK low.
 123   1         COMMAND = (chip_select | WRITE);       // COMMAND = 7 address bits + WRITE.
 124   1         STO = 0;
 125   1         STA = 1;                               // Start transfer.
 126   1              while(SM_BUSY);   
 127   1      }
*** WARNING C280 IN LINE 114 OF LM92.C: 'wr_data': unreferenced local variable
 128          // 读从器件的程序
 129          // chip_select = 从读地址
 130          // out_op = 读出的数据字节
 131          //number=读出数据的长度
 132          char SLA_READ(char chip_select, char out_op,char number) //从LM92读出数据到主机的函数
 133          {
 134   1         totalnumber=number;
 135   1         rdnumber=number;
 136   1         SENDMODE=0;
 137   1         while(SM_BUSY);                        // 总线SMBus忙碌则等待
 138   1         SM_BUSY = 1;                           // 设置忙碌位
 139   1         SMB0CN = 0x44;                         // 允许SMBus工作, 应答信号为低
 140   1         COMMAND1 = (chip_select | READ);       // COMMAND1 = 7位地址+ 1个读位
 141   1         COMMAND = (chip_select | WRITE);       // COMMAND = 7位地址+ 1个写位
 142   1         wr_data[0]=out_op;
 143   1         STO = 0;
 144   1         STA = 1;                               // 数据传输开始
 145   1         while(SM_BUSY);                        // 等待数据传输完成
 146   1         return WORD;                           // 返回
 147   1      }
 148          // SMBus Interrupt Service Routine   SMBus中断程序
 149          void SMBUS_ISR (void) interrupt 7
 150          { 
 151   1         switch (SMB0STA){                    // SMBus中断状态 SMB0STA register)
 152   2      //SMB_START     ;                  (SMB0STA  =08H)                                  
 153   2      //主发送器/接收器发送起始位成功.再将从机写地址送SMB0DAT并清除START位.
 154   2            case SMB_START:   //0x08
 155   2               SMB0DAT = COMMAND ;                    
 156   2               STA = 0;                       // 人工清除STA
 157   2               SI = 0;                        // 人工清除SI
 158   2               break;
 159   2      //SMB_RP_START                    ;(SMB0STA  =10H)
 160   2      //主发送器/接收器发送重复起始位成功.再将从机读地址送SMB0DAT并清除START位.
 161   2            case SMB_RP_START:        //0x10
 162   2               SMB0DAT = COMMAND1;
 163   2               STA = 0;                       // 人工清除STA
 164   2               SI = 0;
 165   2               break;
 166   2      //SMB_MTADDACK                      (SMB0STA  =18H)
 167   2      //主发送器(MT)发送从地址+W成功;收到 ACK(从机应答),再将要发的子地址送入SMB0DAT.
 168   2               case SMB_MTADDACK:     //0x18
 169   2               SMB0DAT = wr_data[0];
 170   2               SI = 0;                        // Clear interrupt flag
 171   2               break;
 172   2      //SMB_MTDBACK                            SMB0STA  =28H)
 173   2      //主发送器(MT)发送数据字节成功;收到ACK(从机应答) 
 174   2      //检查BYTE_SENT:如果为1,说明刚发出的是存储器地址;为0,刚发出的是数据字节    
 175   2                case SMB_MTDBACK:             //0x28
 176   2               switch (SENDMODE){             // Check only lower 4 bits.
 177   3                  // OP_CODE is a READ.  Send repeated START.
 178   3                  case 1:
C51 COMPILER V7.05   LM92                                                                  02/14/2006 09:16:42 PAGE 4   

 179   3                                 wrnumber--;
 180   3                                 if(wrnumber)
 181   3                                 SMB0DAT = wr_data[totalnumber-wrnumber];
 182   3                                 else{
 183   4                                              STO=1;
 184   4                                              SM_BUSY=0;                              }
 185   3                     break;                     
 186   3                  case 0:
 187   3                                   STO = 0;
 188   3                     STA = 1;
 189   3                     break;                          
 190   3                  default:                      // 遇到无效的中断状态码,结束传输
 191   3                     STO = 1;
 192   3                     SM_BUSY = 0;
 193   3                     break;
 194   3               }
 195   2               SI = 0;
 196   2               break;
 197   2      //SMB_MRADDACK                          ;(SMB0STA  =40H)
 198   2      //(MR)主收发器发送从地址+R成功;收到 ACK(从机应答).主机发送ACK.
 199   2            // Master Receiver: Slave address + READ transmitted.  ACK received.
 200   2            // Set to transmit NACK after next transfer since it will be the 
 201   2            // last (only) byte.
 202   2            case SMB_MRADDACK:        //0x40
 203   2               if(rdnumber==1){
 204   3                              AA = 0;
 205   3                       }
 206   2                       SI = 0;
 207   2               break;
 208   2      //SMB_MRDBACK                    (SMB0STA  =50H)
 209   2      //(MR)主收发器接收数据成功;主机发送ACK .
 210   2            
 211   2            case SMB_MRDBACK:         //0x50
 212   2                      rd_data[totalnumber-rdnumber] = SMB0DAT;
 213   2                      rdnumber--;
 214   2                       AA = 0;
 215   2               SM_BUSY = 0;
 216   2               SI = 0;
 217   2               break;
 218   2      //SMB_MRDBNACK                  ;(SMB0STA  =58H)
 219   2      //(MR)主收发器接收数据成功;主机发送NACK 
 220   2      //读操作完成。读数据寄存器并发送STOP
 221   2            case SMB_MRDBNACK:        //0x58
 222   2               rd_data[totalnumber-1] = SMB0DAT;
 223   2               STO = 1;
 224   2               SM_BUSY = 0;
 225   2               AA = 1;                          // Set AA for next transfer
 226   2               SI = 0;
 227   2               break;
 228   2            default:
 229   2               STO = 1;
 230   2               SM_BUSY = 0;
 231   2               break;
 232   2            };
 233   1                }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    695    ----
   CONSTANT SIZE    =     16    ----
   XDATA SIZE       =      1    ----
   PDATA SIZE       =   ----    ----
C51 COMPILER V7.05   LM92                                                                  02/14/2006 09:16:42 PAGE 5   

   DATA SIZE        =     22      24
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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