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

📄 com.lst

📁 使用I2C总线
💻 LST
字号:
C51 COMPILER V7.06   COM                                                                   06/17/2007 08:03:15 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE COM
OBJECT MODULE PLACED IN COM.OBJ
COMPILER INVOKED BY: E:\Program Files\C51\BIN\C51.EXE COM.C BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          
   2          /*****************************************************************/ 
   3          /*                                                               */                                       
             -                         
   4          /*名称:                   24C02读写程序                         */                                       
             -                                                                                                                        
             -            
   5          /*功能:           接收串口发来的数据,写到24C02里面             */
   6          /*                 再从24C02里读出刚写进的数据,由串口发出       */                               
   7          /*难度等级:                   高                                */                                       
             -                              
   8          /* 作者:                  zengrenliang                          */
   9          /* 版权:           http://www.51kaifa.com                       */
  10          /*编写日期:        2006.05.21                                   */                                       
             -                                                                                                                        
             -                                              
  11          /*****************************************************************/
  12          
  13          #include <reg52.h>
  14          #define uchar  unsigned char
  15          #define uint unsigned int
  16          sbit SCL=P1^0;//I2C时钟线
  17          sbit SDA=P1^1;//I2C数据线
  18          
  19          bit receive;//接收标志
  20          bit re_finish;//接收一串字符完成标志
  21          sbit LED = P1^2;//LED指示灯
  22          
  23          uchar  i,buffer[8];//串口缓冲区
  24          uchar  sbuffer,number;//发送字符个数
  25          uchar  sendFINS ;//发送完成标志
  26          uchar  copyOK , cmd_numb ;//发送缓冲区填充完成
  27          
  28          extern void Start_I2c();
  29          extern void Stop_I2c();
  30          extern uchar RcvB();
  31          void   send(void);
  32          void   vGet_Send(void);
  33          extern void Ack_I2c(bit a);
  34          extern void SendB(uchar c);
  35          extern void  delay(unsigned int loop);
  36          
  37          /*******************************系统初始化***********************/
  38          void initial()
  39          {  unsigned char j;
  40   1        
  41   1         SCON=0x50;           //串口工作方式1,允许接收
  42   1         PCON=0x80;           //波特率翻倍
  43   1         TCON=0;              
  44   1         TMOD=0x26;           //T1用于串口波特率控制
  45   1         TL1=0xfa;            //初始化T1,波特率为9600(晶振11.0592M)
  46   1         TH1=0xfa;                    
  47   1         TR1=1;               //开定时器
  48   1         EA=1;                //开总中断
  49   1         ES=1;                //开串口中断
C51 COMPILER V7.06   COM                                                                   06/17/2007 08:03:15 PAGE 2   

  50   1         copyOK = 0;         //缓冲区准备好标志清零
  51   1         receive = 0;        //接收标志清零
  52   1         re_finish = 0;      //接受完成标志清零
  53   1         cmd_numb = 0;       //接受计数器清零
  54   1      
  55   1        for(j=0; j<8; j++)   //串口缓冲区清空
  56   1            buffer[i] = 0xff;  //table[18]为空显示    
  57   1       }                        
  58          
  59          /******************************主函数**************************/
  60          
  61          main()
  62          { 
  63   1        initial();
  64   1        while(1){
  65   2          if(re_finish){//接收一串字符完成
  66   3            re_finish = 0;  
  67   3            vGet_Send(); 
  68   3             }
  69   2          }
  70   1       }
  71          
  72          /*****************************保存和串口发送**************************/
  73          void  vGet_Send(void)
  74          { uchar i;       
  75   1         
  76   1         Start_I2c();
  77   1         SendB(0xa0);
  78   1         SendB(0x10);           //数据存放初始地址为0x06
  79   1         for(i=0;i<6;i++)
  80   1           {SendB(buffer[i]); //向24C02写6个数据
  81   2            delay(2); }
  82   1         Stop_I2c();
  83   1      
  84   1         delay(1000);  
  85   1      
  86   1         for(i=0;i<8;i++)
  87   1            buffer[i] = 0xff; //用0xff填充发送缓冲区
  88   1      
  89   1        for(i=0;i<6;i++){
  90   2           Start_I2c();  
  91   2           SendB(0xa0);        //从24C02读取刚才写入的数据
  92   2           SendB(0x10+i);         //数据存放地址为0x06+i
  93   2           Start_I2c();        
  94   2           SendB(0xa1);           
  95   2           buffer[i]=RcvB();   //读取的值送串口缓冲区
  96   2           Ack_I2c(1);     
  97   2           Stop_I2c();
  98   2           } 
  99   1         copyOK = 1;           //置准备好标志
 100   1         send();               //向串口发送
 101   1      }
 102          
 103          /*****************************串口发送***************************/
 104          
 105          void  send(void)//向串口发送字符串
 106           { 
 107   1         
 108   1         if(copyOK)  //串口准备好且缓冲区准备好
 109   1          { 
 110   2           i = 0;                 
 111   2           REN = 0;               //发送过程中禁止接收数据
C51 COMPILER V7.06   COM                                                                   06/17/2007 08:03:15 PAGE 3   

 112   2           copyOK = 0;            //清缓冲区准备好标志
 113   2           SBUF = buffer[i++];      //发送字符串首字符
 114   2           number = 7;            //置发送计数器
 115   2            }
 116   1         else
 117   1             return;              //没准备好则返回
 118   1        }
 119          
 120          
 121          /***************************串口中断响应*************************/
 122          
 123          void serial(void) interrupt 4//串口中断响应
 124          {  
 125   1        if(RI)//为接收中断
 126   1           {      
 127   2            RI=0;                                         //清接收中断标志
 128   2            LED = ~LED;                                   //闪串口指示LED
 129   2            sbuffer = SBUF;                               //读取串口缓冲区数据
 130   2      
 131   2            if((sbuffer == 's') && (receive == 0))       //判断是否为数据头 ,是数据头则准备接收
 132   2             {     
 133   3                 receive = 1;     //开始接收标志                         
 134   3                 cmd_numb = 0;    //清接收计数器
 135   3                 re_finish = 0;   //清接收完成标志
 136   3                }
 137   2            else if(sbuffer == 'e')   //判断数据尾     
 138   2              { 
 139   3                re_finish = 1;         //置接收完成标志      
 140   3                receive =0;            //清接收标志
 141   3                }
 142   2            else if(receive){     //判断当前是否处于接收状态
 143   3                         
 144   3                buffer[cmd_numb++] = sbuffer-'0';  //当前字符送缓冲区
 145   3               }      
 146   2            else                    //无效命令则返回
 147   2               return;
 148   2             }
 149   1          else{ 
 150   2           TI=0;                   //为单个字符发送完中断
 151   2           if(!number)             //字符串发送完
 152   2            { REN = 1;             //允许接收
 153   3             }
 154   2           else{                  //字符串未发送完
 155   3              SBUF =  buffer[i++];   //发送下一字符
 156   3                      number--;           //发送字符数减一
 157   3             }             
 158   2           }
 159   1         }
 160          
 161          /*****************************延时函数**************************/
 162          void  delay(unsigned int loop) 
 163          {  unsigned int i ;          //loop 为执行空指令的次数,改变它可一改变延时时长
 164   1        for(i=0;i<loop;i++);//循环执行空指令loop次,达到延时目的
 165   1       }
 166          
 167          
 168          /*******************************I2C开始*****************************/
 169          void Start_I2c()
 170          {
 171   1          SDA=1;
 172   1          delay(1);
 173   1          SCL=1;
C51 COMPILER V7.06   COM                                                                   06/17/2007 08:03:15 PAGE 4   

 174   1          delay(3);
 175   1          SDA=0;
 176   1          delay(3);
 177   1          SCL=0;
 178   1          delay(1);
 179   1      }
 180          
 181          
 182          
 183          /*********************************I2C结束*****************************/
 184          void Stop_I2c()
 185          { 
 186   1          SDA=0;
 187   1          delay(1);
 188   1          SCL=1;
 189   1          delay(3);
 190   1          SDA=1;
 191   1          delay(1);
 192   1      
 193   1      }
 194          
 195          
 196          /*********************************I2C写一个字节************************/
 197          void SendB(uchar c)
 198          {
 199   1          uchar BitCnt,ack;
 200   1          for(BitCnt=0;BitCnt<8;BitCnt++)
 201   1          {
 202   2            if((c<<BitCnt)&0x80)SDA=1;
 203   2            else SDA=0;
 204   2            delay(2);
 205   2            SCL=1;
 206   2            delay(5);
 207   2            SCL=0;
 208   2            delay(2);
 209   2      
 210   2          }
 211   1            delay(1);
 212   1            SDA=1;
 213   1            delay(5);  
 214   1            SCL=1;
 215   1            delay(1);
 216   1            if(SDA==1)ack=0;
 217   1            else ack=1;
 218   1            SCL=0;
 219   1            delay(1);
 220   1      
 221   1      }
 222          
 223          /******************************I2C读取一个字节****************************/   
 224          uchar RcvB()
 225          {
 226   1           uchar retc;
 227   1           uchar BitCnt;
 228   1           retc=0;
 229   1           SDA=1;
 230   1           for(BitCnt=0;BitCnt<8;BitCnt++)
 231   1           {
 232   2              delay(1);
 233   2              SCL=0;
 234   2              delay(5);
 235   2              SCL=1;
C51 COMPILER V7.06   COM                                                                   06/17/2007 08:03:15 PAGE 5   

 236   2              delay(2);
 237   2              retc=retc<<1;
 238   2              if(SDA==1)retc=retc+1;
 239   2              delay(1);
 240   2           }
 241   1           SCL=0;
 242   1              delay(1);  
 243   1           return(retc);
 244   1      }
 245          
 246          /*********************************I2C应答*********************************/  
 247          void Ack_I2c(bit a)
 248          {
 249   1          if(a==0)SDA=0;
 250   1          else SDA=1;
 251   1              delay(1);
 252   1          SCL=1;    
 253   1              delay(2);
 254   1          SCL=0;
 255   1              delay(1);
 256   1       
 257   1      }
 258          
 259          /**********************************结束***********************************/


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    535    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     14       1
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      2       1
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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