痞酷網_PIGOO

 找回密碼
 立即註冊
!!! [系統偵測到廣告阻擋軟體] !!!

如果您覺得痞酷網對您有些許幫助,或者您認同痞酷網的理想,

那麼希望您將痞酷網設定為白名單.

並請在上論壇的時候,動動您的手指,用行動支持我們.

謝謝!
查看: 3569|回復: 2

PCF 8591問題

[複製鏈接]
發表於 2012-8-8 14:42:42 | 顯示全部樓層 |閱讀模式
各位大大
       小弟最近想要利用PCF8591控制AD DA 功能 但看了範例還是不明白  懇求貴大大指導
可以提供組合語言的範例   謝謝


ADDA电路图.jpg



以下是附贈這是程式  但我看不懂

/*************************此部分為I2C總線的驅動程序*************************************/

#include<reg52.h>
#include <intrins.h>
#include <I2C.H>

#define  NOP()   _nop_()   /* 定義空指令 */
#define  _Nop()  _nop_()   /*定義空指令*/


sbit     SCL=P2^1;       //I2C  時鐘
sbit     SDA=P2^0;       //I2C  數據
bit ack;                 /*應答標誌位*/
   

/*******************************************************************
                     起動總線函數               
函數原型: void  Start_I2c();  
功能:     啟動I2C總線,即發送I2C起始條件.  
********************************************************************/
void Start_I2c()
{
  SDA=1;         /*發送起始條件的數據信號*/
  _Nop();
  SCL=1;
  _Nop();        /*起始條件建立時間大於4.7us,延時*/
  _Nop();
  _Nop();
  _Nop();
  _Nop();   
  SDA=0;         /*發送起始信號*/
  _Nop();        /* 起始條件鎖定時間大於4μs*/
  _Nop();
  _Nop();
  _Nop();
  _Nop();      
  SCL=0;       /*鉗住I2C總線,準備發送或接收數據 */
  _Nop();
  _Nop();
}

/*******************************************************************
                      結束總線函數               
函數原型: void  Stop_I2c();  
功能:     結束I2C總線,即發送I2C結束條件.  
********************************************************************/
void Stop_I2c()
{
  SDA=0;      /*發送結束條件的數據信號*/
  _Nop();       /*發送結束條件的時鐘信號*/
  SCL=1;      /*結束條件建立時間大於4μs*/
  _Nop();
  _Nop();
  _Nop();
  _Nop();
  _Nop();
  SDA=1;      /*發送I2C總線結束信號*/
  _Nop();
  _Nop();
  _Nop();
  _Nop();
}

/*******************************************************************
                 字節數據發送函數               
函數原型: void  SendByte(UCHAR c);
功能:     將數據c發送出去,可以是地址,也可以是數據,發完後等待應答,並對
          此狀態位進行操作.(不應答或非應答都使ack=0)     
           發送數據正常,ack=1; ack=0表示被控器無應答或損壞。
********************************************************************/
void  SendByte(unsigned char  c)
{
unsigned char  BitCnt;

for(BitCnt=0;BitCnt<8;BitCnt++)  /*要傳送的數據長度為8位*/
    {
     if((c<<BitCnt)&0x80)SDA=1;   /*判斷發送位*/
       else  SDA=0;               
     _Nop();
     SCL=1;               /*置時鐘線為高,通知被控器開始接收數據位*/
      _Nop();
      _Nop();             /*保證時鐘高電平週期大於4μs*/
      _Nop();
      _Nop();
      _Nop();         
     SCL=0;
    }
   
    _Nop();
    _Nop();
    SDA=1;                /*8位發送完後釋放數據線,準備接收應答位*/
    _Nop();
    _Nop();   
    SCL=1;
    _Nop();
    _Nop();
    _Nop();
    if(SDA==1)ack=0;     
       else ack=1;        /*判斷是否接收到應答信號*/
    SCL=0;
    _Nop();
    _Nop();
}

/*******************************************************************
                 字節數據接收函數               
函數原型: UCHAR  RcvByte();
功能:        用來接收從器件傳來的數據,並判斷總線錯誤(不發應答信號),
          發完後請用應答函數應答從機。  
********************************************************************/   
unsigned char   RcvByte()
{
  unsigned char  retc;
  unsigned char  BitCnt;
  
  retc=0;
  SDA=1;                     /*置數據線為輸入方式*/
  for(BitCnt=0;BitCnt<8;BitCnt++)
      {
        _Nop();           
        SCL=0;                  /*置時鐘線為低,準備接收數據位*/
        _Nop();
        _Nop();                 /*時鐘低電平週期大於4.7μs*/
        _Nop();
        _Nop();
        _Nop();
        SCL=1;                  /*置時鐘線為高使數據線上數據有效*/
        _Nop();
        _Nop();
        retc=retc<<1;
        if(SDA==1)retc=retc+1;  /*讀數據位,接收的數據位放入retc中 */
        _Nop();
        _Nop();
      }
  SCL=0;   
  _Nop();
  _Nop();
  return(retc);
}

/********************************************************************
                     應答子函數
函數原型:  void Ack_I2c(bit a);
功能:      主控器進行應答信號(可以是應答或非應答信號,由位參數a決定)
********************************************************************/
void Ack_I2c(bit a)
{
  
  if(a==0)SDA=0;              /*在此發出應答或非應答信號 */
  else SDA=1;
  _Nop();
  _Nop();
  _Nop();      
  SCL=1;
  _Nop();
  _Nop();                    /*時鐘低電平週期大於4μs*/
  _Nop();
  _Nop();
  _Nop();  
  SCL=0;                     /*清時鐘線,鉗住I2C總線以便繼續接收*/
  _Nop();
  _Nop();   
}




發表於 2012-8-8 18:08:51 | 顯示全部樓層
單純的8bit的AD/DA轉換,可以參考看看大陸別人PO的組合語言,剩下的請自行測試了
http://read.pudn.com/downloads10 ... H-XIANSHI.asm__.htm
 樓主| 發表於 2012-8-9 13:29:49 | 顯示全部樓層
感謝大大指導
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

關閉

站長小叮嚀上一條 /1 下一條

禁閉室|手機版|連繫我們|痞酷網電子技術論壇

GMT+8, 2024-11-23 12:08 PM , Processed in 0.156632 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.