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

📄 iic.lst

📁 iic通讯程序
💻 LST
字号:
C51 COMPILER V8.02   IIC                                                                   03/21/2008 20:17:21 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE IIC
OBJECT MODULE PLACED IN IIC.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE IIC.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <reg52.h>
   2          #define uchar  unsigned char
   3          #define uint unsigned int
   4          sbit SCL=P3^5;//I2C时钟线
   5          sbit SDA=P3^6;//I2C数据线
   6          sbit PROM_CS=P3^4;//片选
   7          sbit WP=P3^7;
   8          
   9          bit receive;//接收标志
  10          bit re_finish;//接收一串字符完成标志
  11          sbit LED = P0^0;//LED指示灯
  12          
  13          uchar  i,buffer[8];//串口缓冲区
  14          uchar  sbuffer,number;//发送字符个数
  15          //uchar  sendFINS ;//发送完成标志
  16          uchar  copyOK , cmd_numb ;//发送缓冲区填充完成
  17          
  18          extern void Start_I2c();
  19          extern void Stop_I2c();
  20          extern uchar RcvB();
  21          void   send(void);
  22          void   vGet_Send(void);
  23          extern void Ack_I2c(bit a);
  24          extern void SendB(uchar c);
  25          extern void  delay(unsigned int loop);
  26          
  27          /*******************************系统初始化***********************/
  28          void initial()
  29          {  unsigned char j;
  30   1        
  31   1         SCON=0x50;           //串口工作方式1,允许接收
  32   1         PCON=0x80;           //波特率翻倍
  33   1         TCON=0;              
  34   1         TMOD=0x26;           //T1用于串口波特率控制
  35   1         TL1=0xfa;            //初始化T1,波特率为9600(晶振11.0592M)
  36   1         TH1=0xfa;                    
  37   1         TR1=1;               //开定时器
  38   1         EA=1;                //开总中断
  39   1         ES=1;                //开串口中断
  40   1         copyOK = 0;         //缓冲区准备好标志清零
  41   1         receive = 0;        //接收标志清零
  42   1         re_finish = 0;      //接受完成标志清零
  43   1         cmd_numb = 0;       //接受计数器清零
  44   1         PROM_CS=0;
  45   1         WP=0;
  46   1      
  47   1        for(j=0; j<8; j++)   //串口缓冲区清空
  48   1            buffer[i] = 0xff;  //table[18]为空显示    
  49   1       }                        
  50          
  51          /******************************主函数**************************/
  52          
  53          main()
  54          { 
  55   1        initial();
C51 COMPILER V8.02   IIC                                                                   03/21/2008 20:17:21 PAGE 2   

  56   1        while(1){
  57   2          if(re_finish){//接收一串字符完成
  58   3            re_finish = 0;  
  59   3            vGet_Send(); 
  60   3             }
  61   2          }
  62   1       }
  63          
  64          /*****************************保存和串口发送**************************/
  65          void  vGet_Send(void)
  66          { uchar i;       
  67   1         
  68   1         Start_I2c();
  69   1         SendB(0xa0);
  70   1         SendB(6);           //数据存放初始地址为0x06
  71   1         for(i=0;i<6;i++)
  72   1           {SendB(buffer[i]); //向24C02写6个数据
  73   2            delay(2); }
  74   1         Stop_I2c();
  75   1      
  76   1         delay(1000); //非常关键!!! 
  77   1      
  78   1         for(i=0;i<8;i++)
  79   1            buffer[i] = 0xff; //用0xff填充发送缓冲区
  80   1      
  81   1         for(i=0;i<6;i++){
  82   2           Start_I2c();  
  83   2           SendB(0xa0);        //从24C02读取刚才写入的数据
  84   2           SendB(6+i);         //数据存放地址为0x06+i
  85   2           Start_I2c();        
  86   2           SendB(0xa1);           
  87   2           buffer[i]=RcvB();   //读取的值送串口缓冲区
  88   2           Ack_I2c(1);     
  89   2           Stop_I2c();
  90   2           } 
  91   1         copyOK = 1;           //置准备好标志
  92   1         send();               //向串口发送
  93   1      }
  94          
  95          /*****************************串口发送***************************/
  96          
  97          void  send(void)//向串口发送字符串
  98           { 
  99   1         
 100   1         if(copyOK)  //串口准备好且缓冲区准备好
 101   1          { 
 102   2           i = 0;                 
 103   2           REN = 0;               //发送过程中禁止接收数据
 104   2           copyOK = 0;            //清缓冲区准备好标志
 105   2           SBUF = buffer[i++];      //发送字符串首字符
 106   2           number = 7;            //置发送计数器
 107   2            }
 108   1         else
 109   1             return;              //没准备好则返回
 110   1        }
 111          
 112          
 113          /***************************串口中断响应*************************/
 114          
 115          void serial(void) interrupt 4//串口中断响应
 116          {  
 117   1        if(RI)//为接收中断
C51 COMPILER V8.02   IIC                                                                   03/21/2008 20:17:21 PAGE 3   

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

 180   1          SCL=1;
 181   1          delay(3);
 182   1          SDA=1;
 183   1          delay(1);
 184   1      
 185   1      }
 186          
 187          
 188          /*********************************I2C写一个字节************************/
 189          void SendB(uchar c)
 190          {
 191   1          uchar BitCnt;//,ack ;
 192   1          for(BitCnt=0;BitCnt<8;BitCnt++)
 193   1          {
 194   2            if((c<<BitCnt)&0x80)SDA=1;
 195   2            else SDA=0;
 196   2            delay(2);
 197   2            SCL=1;
 198   2            delay(5);
 199   2            SCL=0;
 200   2            delay(2);
 201   2      
 202   2          }
 203   1            delay(1);
 204   1            SDA=1;
 205   1            delay(5);  
 206   1            SCL=1;
 207   1            delay(1);
 208   1           // if(SDA==1)ack=0;
 209   1            //else ack=1;
 210   1            SCL=0;
 211   1            delay(1);
 212   1      
 213   1      }
 214          
 215          /******************************I2C读取一个字节****************************/   
 216          uchar RcvB()
 217          {
 218   1           uchar retc;
 219   1           uchar BitCnt;
 220   1           retc=0;
 221   1           SDA=1;
 222   1           for(BitCnt=0;BitCnt<8;BitCnt++)
 223   1           {
 224   2              delay(1);
 225   2              SCL=0;
 226   2              delay(5);
 227   2              SCL=1;
 228   2              delay(2);
 229   2              retc=retc<<1;
 230   2              if(SDA==1)retc=retc+1;
 231   2              delay(1);
 232   2           }
 233   1           SCL=0;
 234   1              delay(1);  
 235   1           return(retc);
 236   1      }
 237          
 238          /*********************************I2C应答*********************************/  
 239          void Ack_I2c(bit a)
 240          {
 241   1          if(a==0)SDA=0;
C51 COMPILER V8.02   IIC                                                                   03/21/2008 20:17:21 PAGE 5   

 242   1          else SDA=1;
 243   1              delay(1);
 244   1          SCL=1;    
 245   1              delay(2);
 246   1          SCL=0;
 247   1              delay(1);
 248   1       
 249   1      }
 250          
 251          /**********************************结束***********************************/


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    526    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     13       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 + -