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

📄 51

📁 51单片机大量源码
💻
📖 第 1 页 / 共 2 页
字号:
 159   1              SDA = 0;    //SDA的下降沿被认为是开始信号
 160   1              _nop_();    //等待一个机器周期
 161   1              _nop_();    //等待一个机器周期
 162   1              _nop_();    //等待一个机器周期
 163   1              _nop_();    //等待一个机器周期
 164   1              SCL = 0;    //SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)
 165   1      }
 166          /***************************************************
 167          函数功能:结束数据传送
 168          ***************************************************/
 169          void stop()
 170          // 停止位
 171          {
 172   1              SDA = 0;     //SDA初始化为低电平“0”
 173   1              _nop_();     //等待一个机器周期
 174   1              _nop_();     //等待一个机器周期
 175   1              SCL = 1;     //结束数据传送时,要求SCL为高电平“1”
 176   1              _nop_();     //等待一个机器周期
 177   1              _nop_();     //等待一个机器周期
 178   1              _nop_();     //等待一个机器周期
 179   1              _nop_();     //等待一个机器周期
C51 COMPILER V8.09   EX86                                                                  07/12/2010 14:45:07 PAGE 4   

 180   1              SDA = 1;    //SDA的上升沿被认为是结束信号
 181   1      }
 182          /***************************************************
 183          函数功能:从AT24Cxx读取数据
 184          出口参数:x
 185          ***************************************************/
 186          unsigned char ReadData()
 187          // 从AT24Cxx移入数据到MCU
 188          {
 189   1              unsigned char i;
 190   1              unsigned char x;   //储存从AT24Cxx中读出的数据
 191   1              for(i = 0; i < 8; i++)
 192   1              {
 193   2                      SCL = 1;                //SCL置为高电平
 194   2                      x<<=1;                  //将x中的各二进位向左移一位
 195   2                      x|=(unsigned char)SDA;  //将SDA上的数据通过按位“或“运算存入x中
 196   2                      SCL = 0;                        //在SCL的下降沿读出数据
 197   2              }
 198   1              return(x);                //将读取的数据返回
 199   1      }
 200          /***************************************************
 201          函数功能:向AT24Cxx的当前地址写入数据
 202          入口参数:y (储存待写入的数据)
 203          ***************************************************/
 204          //在调用此数据写入函数前需首先调用开始函数start(),所以SCL=0
 205          bit WriteCurrent(unsigned char y)
 206          {
 207   1              unsigned char i;
 208   1              bit ack_bit;               //储存应答位
 209   1              for(i = 0; i < 8; i++)          // 循环移入8个位
 210   1              {
 211   2              SDA = (bit)(y&0x80);   //通过按位“与”运算将最高位数据送到S
 212   2                                                        //因为传送时高位在前,低位在后
 213   2                      _nop_();            //等待一个机器周期   
 214   2                 SCL = 1;            //在SCL的上升沿将数据写入AT24Cxx      
 215   2              _nop_();            //等待一个机器周期 
 216   2                _nop_();             //等待一个机器周期       
 217   2                      
 218   2                      SCL = 0;            //将SCL重新置为低电平,以在SCL线形成传送数据所需的8个脉冲
 219   2                      y <<= 1;           //将y中的各二进位向左移一位
 220   2              }
 221   1              SDA = 1;                          // 发送设备(主机)应在时钟脉冲的高电平期间(SCL=1)释放SDA线,
 222   1                              //以让SDA线转由接收设备(AT24Cxx)控制
 223   1              _nop_();        //等待一个机器周期 
 224   1              _nop_();        //等待一个机器周期 
 225   1              SCL = 1;       //根据上述规定,SCL应为高电平
 226   1              _nop_();       //等待一个机器周期 
 227   1              _nop_();       //等待一个机器周期 
 228   1              _nop_();       //等待一个机器周期 
 229   1              _nop_();       //等待一个机器周期 
 230   1              ack_bit = SDA; //接受设备(AT24Cxx)向SDA送低电平,表示已经接收到一个字节
 231   1                             //若送高电平,表示没有接收到,传送异常
 232   1              SCL = 0;       //SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)
 233   1              return  ack_bit;                        // 返回AT24Cxx应答位
 234   1      }
 235          /***************************************************
 236          函数功能:向AT24Cxx中的指定地址写入数据
 237          入口参数:add (储存指定的地址);dat(储存待写入的数据)
 238          ***************************************************/
 239          void WriteSet(unsigned char add, unsigned char dat)
 240          // 在指定地址addr处写入数据WriteCurrent
 241          {
C51 COMPILER V8.09   EX86                                                                  07/12/2010 14:45:07 PAGE 5   

 242   1              start();               //开始数据传递
 243   1              WriteCurrent(OP_WRITE);  //选择要操作的AT24Cxx芯片,并告知要对其写入数据
 244   1              WriteCurrent(add);       //写入指定地址
 245   1              WriteCurrent(dat);       //向当前地址(上面指定的地址)写入数据
 246   1              stop();                //停止数据传递
 247   1              delaynms(4);           //1个字节的写入周期为1ms, 最好延时1ms以上
 248   1      }
 249          /***************************************************
 250          函数功能:从AT24Cxx中的当前地址读取数据
 251          出口参数:x (储存读出的数据) 
 252          ***************************************************/
 253          unsigned char ReadCurrent()
 254          {
 255   1              unsigned char x;
 256   1              start();               //开始数据传递
 257   1              WriteCurrent(OP_READ);   //选择要操作的AT24Cxx芯片,并告知要读其数据
 258   1              x=ReadData();         //将读取的数据存入x
 259   1              stop();                //停止数据传递
 260   1              return x;              //返回读取的数据
 261   1      }
 262          /***************************************************
 263          函数功能:从AT24Cxx中的指定地址读取数据
 264          入口参数:set_add
 265          出口参数:x 
 266          ***************************************************/
 267          unsigned char ReadSet(unsigned char set_add)
 268          // 在指定地址读取
 269          {
 270   1              start();                      //开始数据传递
 271   1              WriteCurrent(OP_WRITE);       //选择要操作的AT24Cxx芯片,并告知要对其写入数据
 272   1              WriteCurrent(set_add);       //写入指定地址
 273   1              return(ReadCurrent());        //从指定地址读出数据并返回
 274   1      }
 275          /*********************************************************************
 276          函数功能:主函数
 277          ***********************************************************************/
 278           void main(void)
 279           {
 280   1          unsigned char sum;    //储存计数值
 281   1               unsigned char x;      //储存从AT24C08读出的值
 282   1                unsigned char i;
 283   1          LcdInitiate();        //调用LCD初始化函数  
 284   1               sum=0;                //将计数值初始化为0
 285   1                WriteAddress(0x01);    //写地址,从第1行第4列开始显示
 286   1               i=0;              //从字符数组的第1个元素开始显示
 287   1               while(string[i]!='\0')   //只要没有显示到字符串的结束标志'\0',就继续
 288   1               {
 289   2                       WriteData(string[i]); //将第i个字符数组元素写入LCD
 290   2                       i++;                 //指向下一个数组元素
 291   2               }
 292   1          while(1)             //无限循环
 293   1            {
 294   2                        if(K5==0)          //如果该键被按下
 295   2                         {
 296   3                          delaynms(80);   //软件消抖,延时80ms
 297   3                               if(K5==0)        //确实该键被按下
 298   3                                sum++;         //计件值加1
 299   3                                while(!K5);     //等待按键释放
 300   3                               if(sum==99)     //如果计满99
 301   3                                sum=0;         //清0,重新开始计数
 302   3                              }
 303   2             WriteSet(0x10,sum); //将计件值写入AT24C02中的指定地址"0x10"
C51 COMPILER V8.09   EX86                                                                  07/12/2010 14:45:07 PAGE 6   

 304   2                       x=ReadSet(0x10);    //从AT24C02中读出计件值
 305   2                       Display(x);          //将计件值用1602LCD显示
 306   2                }
 307   1      }
 308          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    422    ----
   CONSTANT SIZE    =     25    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       2
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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