美文网首页单片机学习程序员蓝桥杯
LanQiao比赛单片机专用板——CT107D把玩笔记(四)

LanQiao比赛单片机专用板——CT107D把玩笔记(四)

作者: W_Honor | 来源:发表于2017-04-01 16:19 被阅读111次

    新入门的看官请点击此处目录:



    这次我们来研究一下AD转换模块和外部存储模块。

    • AD转换

    CT107D实验板采用的AD转换芯片是PCF8591.

    以下是百度百科的简介:

    PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。PCF8591具有4个模拟输入、1个模拟输出和1个串行I²C总线接口。PCF8591的3个地址引脚A0, A1和A2可用于硬件地址编程,允许在同个I2C总线上接入8个PCF8591器件,而无需额外的硬件。在PCF8591器件上输入输出的地址、控制和数据信号都是通过双线双向I2C总线以串行的方式进行传输。

    PCF8591芯片可以实现AD/DA转换,比赛官方只对AD转换做要求,所以我们只看模数转换。

    从简介中知道,该芯片是通过I2C总线通信的。所以在编程时会用到I2C总线的驱动,多数芯片都是通过此类型总线与单片机主机通信,掌握好总线的应用很重要。

    I2C总线驱动如下:

      //总线开始
    void iic_start(void)
    {
       SDA = 1;
       _nop_();
       SCL = 1;
       somenop();
       SDA = 0;
       somenop();
       SCL = 0;
    }
     //总线关闭
    void  iic_stop(void)
    {
      SDA = 0;
      _nop_();
      SCL = 1;
      somenop();
      SDA = 1;
    
     }
      //总线问答
     void iic_ack(bit ackbit)
    {
       if(ackbit)
        SDA = 0;
       else
        SDA = 1;
       somenop();
       SCL = 1;
       somenop();
       SCL = 0;
       SDA = 1;
       somenop();
    
     }
       //等待问答
    bit  iic_waitack(void)
    {
       SDA = 1;
       somenop();
       SCL = 0;
       somenop();
       if(SDA)
      {
          SCL = 0;
          iic_stop();
          return 0;
      }
      else
      {
         SCL = 0;
         return 1;
      }
    
    }
     //发送字节
    void  iic_sendbyte(uchar byt)
    {
      uchar i;
      for(i = 0; i<8; i++)
      {
        if(byt&0x80)
            SDA = 1;
        else
            SDA = 0;
        somenop();
        SCL = 1;
        byt <<= 1;
        somenop();
        SCL = 0;    
     }
    }
    //回送数据
    uchar iic_recbyte(void)
    {
       uchar da;
       uchar i;
      for(i = 0; i<8; i++)
      {
         SCL = 1;
         somenop();
         da <<= 1;
         if(SDA)
            da |= 0x01;
         SCL = 0;
         somenop();
      }
      return da;
    }
    

    待初始化好总线后,单片机便可读取总线传送回来的数据。

    uchar adc_pcf8591(void)
    {
       uchar temp;
    
       iic_start();
       iic_sendbyte(0x91);
       iic_waitack();
       temp = iic_recbyte();
       iic_ack(0);
       iic_stop();
    
       return temp;
    
    }
    
    • 外部存储模块

    板子上搭载的存储芯片是AT24c02。

    AT24C02是一个2K位串行CMOS E2PROM, 内部含有256个8位字节,CATALYST公司的先进CMOS技术实质上减少了器件的功耗。AT24C02有一个8字节页写缓冲器。该器件通过IIC总线接口进行操作,有一个专门的写保护功能。

    嗯,芯片也是用I2C总线通信的,所以其他的不用多说,自然会用上I2C总线的驱动,另外再加入读写驱动就行了。

       //写AT24c02
       void wrbyte_24c02(uchar add, uchar dat)
     {
       iic_start();
       iic_sendbyte(0xa0);//写地址
       iic_waitack();
       iic_sendbyte(add);
       iic_waitack();
       iic_sendbyte(dat);
       iic_waitack();
       iic_stop();
       delay(10);
    
      }
      //读AT24c02
     uchar rdbyte_24c02(uchar add)
    {
       uchar da;
       iic_start();
       iic_sendbyte(0xa0);         //写地址
       iic_waitack();
       iic_sendbyte(add);
       iic_waitack();
       iic_start();
       iic_sendbyte(0xa1);   //读地址
       iic_waitack();
       da = iic_recbyte();
       iic_ack(0);
       iic_stop();
       return da;
    
     }
    

    其实都很简单,只要用心学习,自然而然就明白其中的道理了。

    相关文章

      网友评论

        本文标题:LanQiao比赛单片机专用板——CT107D把玩笔记(四)

        本文链接:https://www.haomeiwen.com/subject/apdvottx.html