LanQiao比賽單片機專用板——CT107D把玩筆記(四)

新入門的看官請點擊此處目錄:



這次我們來研究一下AD轉換模塊和外部存儲模塊。

  • AD轉換

CT107D實驗板采用的AD轉換芯片是PCF8591.

以下是百度百科的簡介:

PCF8591是一個單片集成、單獨供電、低功耗、8-bit CMOS數據獲取器件。PCF8591具有4個模擬輸入、1個模擬輸出和1個串行I2C總線接口。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;

 }

其實都很簡單,只要用心學習,自然而然就明白其中的道理了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容