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

📄 51

📁 51单片机大量源码
💻
字号:
C51 COMPILER V8.09   EX85                                                                  07/12/2010 14:45:58 PAGE 1   


C51 COMPILER V8.09, COMPILATION OF MODULE EX85
OBJECT MODULE PLACED IN ex85.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE ex85.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          //将数据"0x0f"写入AT24C08再读出送P0口显示
   2          #include <reg52.h>        //  包含51单片机寄存器定义的头文件
   3          #include <intrins.h>      //包含_nop_()函数定义的头文件
   4          #define OP_READ 0xa1            // 器件地址以及读取操作,0xa1即为1010 0001B
   5          #define OP_WRITE 0xa0           // 器件地址以及写入操作,0xa1即为1010 0000B
   6          sbit SDA=P3^5;          //将串行数据总线SDA位定义在为P3.5引脚
   7          sbit SCL=P3^4;         //将串行时钟总线SDA位定义在为P3.4引脚
   8          
   9          /*****************************************************
  10          函数功能:延时1ms
  11          (3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
  12          ***************************************************/
  13          void delay1ms()
  14          {
  15   1         unsigned char i,j;   
  16   1               for(i=0;i<10;i++)
  17   1                for(j=0;j<33;j++)
  18   1                 ;             
  19   1       }
  20          
  21          /*****************************************************
  22          函数功能:延时若干毫秒
  23          入口参数:n
  24          ***************************************************/
  25           void delaynms(unsigned char n)
  26           {
  27   1         unsigned char i;
  28   1              for(i=0;i<n;i++)
  29   1                 delay1ms();
  30   1       }
  31          /***************************************************
  32          函数功能:开始数据传送
  33          ***************************************************/
  34          void start()
  35          // 开始位
  36          {
  37   1              SDA = 1;    //SDA初始化为高电平“1”
  38   1         SCL = 1;    //开始数据传送时,要求SCL为高电平“1”
  39   1              _nop_();    //等待一个机器周期
  40   1              _nop_();    //等待一个机器周期
  41   1              _nop_();    //等待一个机器周期
  42   1              _nop_();    //等待一个机器周期
  43   1              SDA = 0;    //SDA的下降沿被认为是开始信号
  44   1              _nop_();    //等待一个机器周期
  45   1              _nop_();    //等待一个机器周期
  46   1              _nop_();    //等待一个机器周期
  47   1              _nop_();    //等待一个机器周期
  48   1              SCL = 0;    //SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)  
  49   1      }
  50          /***************************************************
  51          函数功能:结束数据传送
  52          ***************************************************/
  53          void stop()
  54          // 停止位
  55          {
C51 COMPILER V8.09   EX85                                                                  07/12/2010 14:45:58 PAGE 2   

  56   1              SDA = 0;     //SDA初始化为低电平“0”   _n
  57   1              SCL = 1;     //结束数据传送时,要求SCL为高电平“1”
  58   1              _nop_();     //等待一个机器周期
  59   1              _nop_();     //等待一个机器周期
  60   1              _nop_();     //等待一个机器周期
  61   1              _nop_();     //等待一个机器周期
  62   1              SDA = 1;    //SDA的上升沿被认为是结束信号
  63   1              _nop_();     //等待一个机器周期
  64   1              _nop_();     //等待一个机器周期
  65   1              _nop_();     //等待一个机器周期
  66   1              _nop_();     //等待一个机器周期
  67   1              SDA=0;
  68   1              SCL=0;
  69   1      }
  70          /***************************************************
  71          函数功能:从AT24Cxx读取数据
  72          出口参数:x
  73          ***************************************************/
  74          unsigned char ReadData()
  75          // 从AT24Cxx移入数据到MCU
  76          {
  77   1              unsigned char i;
  78   1              unsigned char x;   //储存从AT24Cxx中读出的数据
  79   1              for(i = 0; i < 8; i++)
  80   1              {
  81   2                      SCL = 1;                //SCL置为高电平
  82   2                      x<<=1;                  //将x中的各二进位向左移一位
  83   2                      x|=(unsigned char)SDA;  //将SDA上的数据通过按位“或“运算存入x中
  84   2                      SCL = 0;                        //在SCL的下降沿读出数据
  85   2              }
  86   1              return(x);                //将读取的数据返回
  87   1      }
  88          /***************************************************
  89          函数功能:向AT24Cxx的当前地址写入数据
  90          入口参数:y (储存待写入的数据)
  91          ***************************************************/
  92          //在调用此数据写入函数前需首先调用开始函数start(),所以SCL=0
  93          bit WriteCurrent(unsigned char y)
  94          {
  95   1              unsigned char i;
  96   1              bit ack_bit;               //储存应答位
  97   1              for(i = 0; i < 8; i++)          // 循环移入8个位
  98   1              {
  99   2              SDA = (bit)(y&0x80);   //通过按位“与”运算将最高位数据送到S
 100   2                                                        //因为传送时高位在前,低位在后
 101   2                      _nop_();            //等待一个机器周期   
 102   2                 SCL = 1;            //在SCL的上升沿将数据写入AT24Cxx      
 103   2              _nop_();            //等待一个机器周期 
 104   2                _nop_();             //等待一个机器周期       
 105   2                      
 106   2                      SCL = 0;            //将SCL重新置为低电平,以在SCL线形成传送数据所需的8个脉冲
 107   2                      y <<= 1;           //将y中的各二进位向左移一位
 108   2              }
 109   1              SDA = 1;                          // 发送设备(主机)应在时钟脉冲的高电平期间(SCL=1)释放SDA线,
 110   1                              //以让SDA线转由接收设备(AT24Cxx)控制
 111   1              _nop_();        //等待一个机器周期 
 112   1              _nop_();        //等待一个机器周期 
 113   1              SCL = 1;       //根据上述规定,SCL应为高电平
 114   1              _nop_();       //等待一个机器周期 
 115   1              _nop_();       //等待一个机器周期 
 116   1              _nop_();       //等待一个机器周期 
 117   1              _nop_();       //等待一个机器周期 
C51 COMPILER V8.09   EX85                                                                  07/12/2010 14:45:58 PAGE 3   

 118   1              ack_bit = SDA; //接受设备(AT24Cxx)向SDA送低电平,表示已经接收到一个字节
 119   1                             //若送高电平,表示没有接收到,传送异常
 120   1              SCL = 0;       //SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)
 121   1              return  ack_bit;                        // 返回AT24Cxx应答位
 122   1      }
 123          /***************************************************
 124          函数功能:向AT24Cxx中的指定地址写入数据
 125          入口参数:add (储存指定的地址);dat(储存待写入的数据)
 126          ***************************************************/
 127          void WriteSet(unsigned char add, unsigned char dat)
 128          // 在指定地址addr处写入数据WriteCurrent
 129          {
 130   1              start();               //开始数据传递
 131   1              WriteCurrent(OP_WRITE);  //选择要操作的AT24Cxx芯片,并告知要对其写入数据
 132   1              WriteCurrent(add);       //写入指定地址
 133   1              WriteCurrent(dat);       //向当前地址(上面指定的地址)写入数据
 134   1              stop();                //停止数据传递
 135   1              delaynms(4);           //1个字节的写入周期为1ms, 最好延时1ms以上
 136   1      }
 137          /***************************************************
 138          函数功能:从AT24Cxx中的当前地址读取数据
 139          出口参数:x (储存读出的数据) 
 140          ***************************************************/
 141          unsigned char ReadCurrent()
 142          {
 143   1              unsigned char x;
 144   1              start();               //开始数据传递
 145   1              WriteCurrent(OP_READ);   //选择要操作的AT24Cxx芯片,并告知要读其数据
 146   1              x=ReadData();         //将读取的数据存入x
 147   1              stop();                //停止数据传递
 148   1              return x;              //返回读取的数据
 149   1      }
 150          /***************************************************
 151          函数功能:从AT24Cxx中的指定地址读取数据
 152          入口参数:set_addr
 153          出口参数:x 
 154          ***************************************************/
 155          unsigned char ReadSet(unsigned char set_addr)
 156          // 在指定地址读取
 157          {
 158   1              start();                      //开始数据传递
 159   1              WriteCurrent(OP_WRITE);       //选择要操作的AT24Cxx芯片,并告知要对其写入数据
 160   1              WriteCurrent(set_addr);       //写入指定地址
 161   1              return(ReadCurrent());        //从指定地址读出数据并返回
 162   1      }
 163          /***************************************************
 164          函数功能:主函数
 165          ***************************************************/
 166          main(void)
 167          {
 168   1         SDA = 1;           // SDA=1,SCL=1,使主从设备处于空闲状态
 169   1              SCL = 1;               
 170   1         WriteSet(0x36,0x0f);   //在指定地址“0x36”中写入数据“0x0f”
 171   1              P1=ReadSet(0x36);      //从指定地址“0x36中读取数据并送P1口显示
 172   1      
 173   1      }
 174          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    207    ----
   CONSTANT SIZE    =   ----    ----
C51 COMPILER V8.09   EX85                                                                  07/12/2010 14:45:58 PAGE 4   

   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       1
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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