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

📄 com.lst

📁 51单片机的I2C总线程序
💻 LST
字号:
C51 COMPILER V8.05a   COM                                                                  02/20/2009 14:27:41 PAGE 1   


C51 COMPILER V8.05a, COMPILATION OF MODULE COM
OBJECT MODULE PLACED IN COM.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE COM.C BROWSE DEBUG OBJECTEXTEND

line 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 V8.05a   COM                                                                  02/20/2009 14:27:41 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   1         {
  66   2          if(re_finish)
  67   2                {//接收一串字符完成
  68   3            re_finish = 0;  
  69   3            vGet_Send(); 
  70   3             }
  71   2          }
  72   1      }
  73          
  74          /*****************************保存和串口发送**************************/
  75          void  vGet_Send(void)
  76          { uchar i;       
  77   1         
  78   1         Start_I2c();
  79   1         SendB(0xa0);
  80   1         SendB(0x10);           //数据存放初始地址为0x06
  81   1         for(i=0;i<6;i++)
  82   1           {SendB(buffer[i]); //向24C02写6个数据
  83   2            delay(10); }
  84   1         Stop_I2c();
  85   1      
  86   1         delay(1000);  
  87   1      
  88   1         for(i=0;i<8;i++)
  89   1            buffer[i] = 0x5f; //用0xff填充发送缓冲区
  90   1      
  91   1         for(i=0;i<6;i++){
  92   2           Start_I2c();  
  93   2           SendB(0xa0);        //从24C02读取刚才写入的数据
  94   2           SendB(0x10+i);         //数据存放地址为0x06+i
  95   2           Start_I2c();        
  96   2           SendB(0xa1); 
  97   2           delay(6);        
  98   2           buffer[i]=RcvB();   //读取的值送串口缓冲区
  99   2           Ack_I2c(1);     
 100   2           Stop_I2c();
 101   2           } 
 102   1         copyOK = 1;           //置准备好标志
 103   1         send();               //向串口发送
 104   1      }
 105          
 106          /*****************************串口发送***************************/
 107          
 108          void  send(void)//向串口发送字符串
 109           { 
 110   1         
 111   1         if(copyOK)  //串口准备好且缓冲区准备好
C51 COMPILER V8.05a   COM                                                                  02/20/2009 14:27:41 PAGE 3   

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

 174   1          SDA=1;
 175   1          delay(3);
 176   1          SCL=1;
 177   1          delay(6);
 178   1          SDA=0;
 179   1          delay(6);
 180   1          SCL=0;
 181   1          delay(3);
 182   1      }
 183          
 184          
 185          
 186          /*********************************I2C结束*****************************/
 187          void Stop_I2c()
 188          { 
 189   1          SDA=0;
 190   1          delay(3);
 191   1          SCL=1;
 192   1          delay(6);
 193   1          SDA=1;
 194   1          delay(3);
 195   1      
 196   1      }
 197          
 198          
 199          /*********************************I2C写一个字节************************/
 200          void SendB(uchar c)
 201          {
 202   1          uchar BitCnt,ack;
 203   1          for(BitCnt=0;BitCnt<8;BitCnt++)
 204   1          {
 205   2            if((c<<BitCnt)&0x80)SDA=1;
 206   2            else SDA=0;
 207   2            delay(3);
 208   2            SCL=1;
 209   2            delay(6);
 210   2            SCL=0;
 211   2            delay(3);
 212   2      
 213   2          }
 214   1            delay(3);
 215   1            SDA=1;
 216   1            delay(6);  
 217   1            SCL=1;
 218   1            delay(3);
 219   1            SCL=0;
 220   1            delay(3);
 221   1      
 222   1      }
*** WARNING C280 IN LINE 202 OF COM.C: 'ack': unreferenced local variable
 223          
 224          /******************************I2C读取一个字节****************************/   
 225          uchar RcvB()
 226          {
 227   1           uchar retc;
 228   1           uchar BitCnt;
 229   1           retc=0;
 230   1           SDA=1;
 231   1           for(BitCnt=0;BitCnt<8;BitCnt++)
 232   1           {
 233   2              delay(3);
 234   2              SCL=0;
C51 COMPILER V8.05a   COM                                                                  02/20/2009 14:27:41 PAGE 5   

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


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


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

⌨️ 快捷键说明

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