亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

標(biāo)題: 51單片機(jī)PCF8591的DA轉(zhuǎn)換程序詳解[含HL-1與HJ-c52 DA代碼AD/DA原理圖](可直接復(fù)... [打印本頁(yè)]

作者: 羽一生    時(shí)間: 2019-8-1 09:01
標(biāo)題: 51單片機(jī)PCF8591的DA轉(zhuǎn)換程序詳解[含HL-1與HJ-c52 DA代碼AD/DA原理圖](可直接復(fù)...

以下是補(bǔ)充(能想到的范圍有限有沒(méi)想到的還請(qǐng)諒解)
DA工作原理
基于PCF8591芯片
DA是什么?
n DA指數(shù)模轉(zhuǎn)換(Digital to Analog),顧名思義,就是把數(shù)字信號(hào)轉(zhuǎn)換成模擬信號(hào)。與DA
相對(duì)應(yīng),AD是把模擬信號(hào)轉(zhuǎn)換為數(shù)字信號(hào),便于計(jì)算機(jī)等數(shù)字控制器處理。
DA有什么作用?
n 1、將數(shù)字量轉(zhuǎn)換成模擬量,以便操縱控制對(duì)象。n 2、用數(shù)字化來(lái)控制各種對(duì)象。
n 3、可以在單片機(jī)中輸入數(shù)字,來(lái)控制輸出壓力計(jì)力的大小。
串行DA芯片與單片機(jī)連接方法(兩種)
HL-1連接方法

HJ-c52連接方法

D/A轉(zhuǎn)換器的主要性能指標(biāo)
1、分辨率
分辨率是指輸入數(shù)字量的最低有效位(LSB)發(fā)生變化時(shí),所對(duì)應(yīng)的輸出模擬量(電壓或電流)的變化量。它反映了
輸出模擬量的最小變化值。
分辨率與輸入數(shù)字量的位數(shù)有確定的關(guān)系,可以表示成FS /2的n方 。FS表示滿(mǎn)量程輸入值,n為二進(jìn)制位數(shù)。對(duì)于5V
的滿(mǎn)量程,采用8位的DAC時(shí),分辨率為5V/256=19.5mV;當(dāng)采用12位的DAC時(shí),分辨率則為5V/4096=1.22mV。顯然,
位數(shù)越多分辨率就越高。
2、線(xiàn)性度
線(xiàn)性度(也稱(chēng)非線(xiàn)性誤差)是實(shí)際轉(zhuǎn)換特性曲線(xiàn)與理想直線(xiàn)特性之間的最大偏差。常以相對(duì)于滿(mǎn)量程的百分?jǐn)?shù)
表示。如±1%是指實(shí)際輸出值與理論值之差在滿(mǎn)刻度的±1%以?xún)?nèi)。
3、絕對(duì)精度和相對(duì)精度
絕對(duì)精度(簡(jiǎn)稱(chēng)精度)是指在整個(gè)刻度范圍內(nèi),任一輸入數(shù)碼所對(duì)應(yīng)的模擬量實(shí)際輸出值與理論值之
間的最大誤差。絕對(duì)精度是由DAC的增益誤差(當(dāng)輸入數(shù)碼為全1時(shí),實(shí)際輸出值與理想輸出值之差)、
零點(diǎn)誤差(數(shù)碼輸入為全0時(shí),DAC的非零輸出值)、非線(xiàn)性誤差和噪聲等引起的。絕對(duì)精度(即
最大誤差)應(yīng)小于1個(gè)LSB。 相對(duì)精度與絕對(duì)精度表示同一含義,用最大誤差相對(duì)于滿(mǎn)刻度的百分比表示。
4、建立時(shí)間
建立時(shí)間是指輸入的數(shù)字量發(fā)生滿(mǎn)刻度變化時(shí),輸出模擬信號(hào)達(dá)到滿(mǎn)刻度值的±1/2LSB所需的時(shí)間。
是描述D/A轉(zhuǎn)換速率的一個(gè)動(dòng)態(tài)指標(biāo)。電流輸出型DAC的建立時(shí)間短。電壓輸出型DAC的
建立時(shí)間主要決定于運(yùn)算放大器的響應(yīng)時(shí)間。根據(jù)建立時(shí)間的長(zhǎng)短,可以將DAC分成超高速(<1μ
S)、高速(10~1μS)、中速(100~10μS)、低速(≥100μS)幾檔。
應(yīng)當(dāng)注意,精度和分辨率具有一定的聯(lián)系,但概念不同。DAC的位數(shù)多時(shí),分辨率會(huì)提高,對(duì)
應(yīng)于影響精度的量化誤差會(huì)減小。但其它誤差(如溫度漂移、線(xiàn)性不良等)的影響仍會(huì)使DAC
的精度變差。
附帶三個(gè)說(shuō)明
一,HL-1的AD/DA模塊和DS1302時(shí)鐘模塊原理圖

二,HJ-C52的AD/DA原理圖

三,一個(gè)AD/DA單獨(dú)模塊(PCF8951)的說(shuō)明



AD/DA獨(dú)立模塊接線(xiàn)說(shuō)明

1. 可以自己用杜邦線(xiàn)接到你自己的最小系統(tǒng)上,也可以接到慧凈HJ-C51智能小車(chē)核心板上,接線(xiàn)方法參考源理圖接,VCC接學(xué)
習(xí)板上的VCC,GND接學(xué)習(xí)板上的GND 其他的信號(hào)輸入可以自己定義。
AD/DA獨(dú)立模塊簡(jiǎn)單說(shuō)明
1. 本板采用全新AD/DA芯片PCF8591,設(shè)計(jì)合理,性能非常穩(wěn)定,提供原理圖及配套示例代碼。
模塊說(shuō)明:
2. 該模塊A/D輸入和D/A輸出定義,模塊有4路A/D輸入,1路D/A輸出:
3. A/D輸入通道0:連接外部測(cè)試;
4.A/D輸入通道1:一路電位器可測(cè)變阻器分壓;連接外部測(cè)試;
5. A/D輸入通道2:一路熱敏電阻可測(cè)溫度;連接外部測(cè)試;
6. A/D輸入通道3:一路光敏電阻可測(cè)光強(qiáng);連接外部測(cè)試;
7. D/A輸出通道0:一路LED通過(guò)亮度顯示。
------------------------------------------------(因?yàn)橛行〇|西電腦沒(méi)備份..所以找不到了)-----------------------------------------------------
  1. /*-----------------------------------------------
  2.   內(nèi)容:scl=P3^0;//IIC的時(shí)鐘線(xiàn)  sda=P3^1;//IIC的數(shù)據(jù)線(xiàn)分別接J26-7和J26-6上。
  3.         J23-5接J26-5上
  4.         LED會(huì)逐漸變亮后有逐漸變暗
  5. ------------------------------------------------*/
  6. #include<reg51.h>
  7. #include<intrins.h>
  8. #define uc unsigned char
  9. #define ui unsigned int

  10. sbit scl=P3^0;//IIC的時(shí)鐘線(xiàn)
  11. sbit sda=P3^1;//IIC的數(shù)據(jù)線(xiàn)
  12. uc code shuju[]={
  13. 0x0f,0x1e,0x2d,0x3c,0x4b,0x5a,0x69,0x78,0x87,0x96,0xa5,0xb4,0xc3,0xd2,0xe1,0xf0,0xff,//讓電壓逐漸升高的數(shù)據(jù)
  14. 0xff,0xf0,0xe1,0xd2,0xc3,0xb4,0xa5,0x96,0x87,0x78,0x69,0x5a,0x4b,0x3c,0x2d,0x1e,0x0f,//讓電壓逐漸下降的數(shù)據(jù)
  15. };

  16. void delayus(void)
  17. {
  18.   ;;
  19. }


  20. void delay(ui m)
  21. {
  22. ui i,j;
  23. for(i=0;i<120;i++)
  24.   for(j=0;j<m;j++);
  25. }


  26. void init(void)//IIC的初始化
  27. {
  28.    scl=1;
  29.    delayus();
  30.    sda=1;
  31.    delayus();
  32. }

  33. void start(void)//IIC的起始信號(hào)
  34. {
  35.    scl=1;
  36.    delayus();
  37.    sda=1;
  38.    delayus();
  39.    sda=0;
  40.    delayus();
  41. }

  42. void stop(void)//IIC的停止信號(hào)
  43. {
  44.    sda=0;
  45.    delayus();
  46.    scl=1;
  47.    delayus();
  48.    sda=1;
  49.    delayus();
  50. }

  51. void ack(void)//IIC的應(yīng)答信號(hào)
  52. {
  53.    uc i;
  54.    scl=1;
  55.    delayus();
  56.    while((sda==1)&(i<255))i++;
  57.    scl=0;
  58.    delayus();
  59. }

  60. void write_byte(uc date)//向IIC寫(xiě)一個(gè)字節(jié)的數(shù)據(jù)
  61. {
  62.         uc i,temp;
  63.         temp=date;
  64.         for(i=0;i<8;i++)
  65.         {
  66.                 temp=temp<<1;
  67.                 scl=0;
  68.             delayus();
  69.                 sda=CY;
  70.                 delayus();
  71.                 scl=1;
  72.                 delayus();
  73.         }
  74.         scl=0;
  75.         delayus();
  76.         sda=1;
  77.         delayus();
  78. }

  79. void write(uc add,uc sda,uc date)
  80. {
  81.    start();
  82.    write_byte(add);//0x90表示器件地址為000的寫(xiě)操作
  83.    ack();
  84.    write_byte(sda);//0x40表示四路單數(shù)入00通道無(wú)增益的器件控制指令
  85.    ack();
  86.    write_byte(date);//表示DA數(shù)據(jù)
  87.    ack();
  88.    stop();
  89. }

  90. void main(void)
  91. { uc i;
  92.   init();//I2C總線(xiàn)初始化
  93.   while(1)
  94.   {
  95.    for(i=0;i<34;i++)
  96.    {
  97.    write(0x90,0x40,shuju[ i]);//向PCF8591里寫(xiě)入數(shù)據(jù)(即電壓量的數(shù)據(jù));
  98.    delay(100);
  99.    }
  100.   }
  101. }
復(fù)制代碼
以上是一個(gè)DA轉(zhuǎn)換例子[我也是也是補(bǔ)充的(上傳不了附件....就只能直接上碼了)
附帶兩種使LED輸出顯示DA
1,HJ-52
/*-----------------------------------------------
  名稱(chēng):IIC協(xié)議 PCF8591ADDA轉(zhuǎn)換                  
  內(nèi)容:此程序通過(guò)IIC協(xié)議對(duì)DAAD芯片操作, 并輸出模擬量,用LED亮度漸變指示
------------------------------------------------*/
#include<reg52.h>    //包含頭文件,一般情況不需要改動(dòng),頭文件包含特殊功能寄存器的定義
#include <intrins.h> //包含NOP空指令函數(shù)_nop_();

#define AddWr 0x90   //寫(xiě)數(shù)據(jù)地址
#define AddRd 0x91   //讀數(shù)據(jù)地址

sbit Sda=P1^2;      //定義總線(xiàn)連接端口
sbit Scl=P1^7;
sbit dula=P2^0;
sbit wela=P2^1;
bit ADFlag;          //定義AD采樣標(biāo)志位
unsigned char code Datatab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//7段數(shù)共陰碼管段碼表
data unsigned char  Display[8];//定義臨時(shí)存放數(shù)碼管數(shù)值
/*------------------------------------------------
                    延時(shí)程序
------------------------------------------------*/
void mDelay(unsigned char j)
{
  unsigned int i;
  for(;j>0;j--)
     {
          for(i=0;i<125;i++)
             {;}
          }
  }
/*------------------------------------------------
                    初始化定時(shí)器1
------------------------------------------------*/
void Init_Timer1(void)
{
TMOD |= 0x10;                             
TH1=0xff;                              /* Init value */
TL1=0x00;
//PT1=1;                   /* 優(yōu)先級(jí)    */
EA=1;                      /* interupt enable */
ET1=1;                     /* enable timer1 interrupt */
TR1=1;  
}
/*------------------------------------------------
                    啟動(dòng)IIC總線(xiàn)
------------------------------------------------*/
  void Start(void)
  {
   Sda=1;
   _nop_();
   Scl=1;
   _nop_();
   Sda=0;
   _nop_();
   Scl=0;
  }


/*------------------------------------------------
                    停止IIC總線(xiàn)
------------------------------------------------*/
  void Stop(void)
  {
   Sda=0;
   _nop_();
   Scl=1;
   _nop_();
   Sda=1;
   _nop_();
   Scl=0;
   }


/*------------------------------------------------
                   應(yīng)答IIC總線(xiàn)
------------------------------------------------*/
   void Ack(void)
   {
    Sda=0;
        _nop_();
        Scl=1;
        _nop_();
        Scl=0;
        _nop_();
        }


/*------------------------------------------------
                 非應(yīng)答IIC總線(xiàn)
------------------------------------------------*/
        void NoAck(void)
        {
         Sda=1;
         _nop_();
         Scl=1;
         _nop_();
         Scl=0;
         _nop_();
         }


/*------------------------------------------------
              發(fā)送一個(gè)字節(jié)
------------------------------------------------*/
         void Send(unsigned char Data)
         {
          unsigned char BitCounter=8;
          unsigned char temp;

          do
            {
                 temp=Data;
                 Scl=0;
                 _nop_();
                 if((temp&0x80)==0x80)
                    Sda=1;
                 else
                    Sda=0;

                        Scl=1;
                        temp=Data<<1;
                        Data=temp;
                        BitCounter--;
                  }
          while(BitCounter);
              Scl=0;
          }


/*------------------------------------------------
               讀入一個(gè)字節(jié)并返回
------------------------------------------------*/
          unsigned char Read(void)
          {
           unsigned char temp=0;
           unsigned char temp1=0;
           unsigned char BitCounter=8;

           Sda=1;
           do
             {
                  Scl=0;
          _nop_();
                  Scl=1;
                  _nop_();
                  if(Sda)
                     temp=temp|0x01;
                  else
                     temp=temp&0xfe;

                  if(BitCounter-1)
                     {
                          temp1=temp<<1;
                          temp=temp1;
                          }
                          BitCounter--;
                         }
                while(BitCounter);
                return(temp);
          }

/*------------------------------------------------
                    寫(xiě)入DA數(shù)模轉(zhuǎn)換值
------------------------------------------------*/
          void DAC(unsigned char Data)
          {
                   Start();
                   Send(AddWr); //寫(xiě)入芯片地址
                   Ack();
                   Send(0x40);  //寫(xiě)入控制位,使能DAC輸出
                   Ack();
                   Send(Data);  //寫(xiě)數(shù)據(jù)
                   Ack();
                   Stop();
                 
           }

/*------------------------------------------------
                 讀取AD模數(shù)轉(zhuǎn)換的值,有返回值
------------------------------------------------*/
          unsigned char ReadADC(unsigned char Chl)
          {
       unsigned char Data;
                   Start();        //寫(xiě)入芯片地址
                   Send(AddWr);
                   Ack();
                    Send(0x40|Chl);//寫(xiě)入選擇的通道,本程序只用單端輸入,差分部分需要自行添加
                                  //Chl的值分別為0、1、2、3,分別代表1-4通道
                   Ack();
                   Start();
                   Send(AddRd);    //讀入地址
                   Ack();
                   Data=Read();    //讀數(shù)據(jù)
                   Scl=0;
                   NoAck();
                   Stop();
                   return Data;   //返回值
          }


                 void cmg(void)//數(shù)碼管鎖存函數(shù)                   關(guān)時(shí)鐘DS1302
        {
        dula=1;
        P0=0x00;
        dula=0;
        wela=1;
        P0=0x00;
        wela=0;
        }
/*------------------------------------------------
                   主程序
------------------------------------------------*/
        void main()
        {
         unsigned char num;                   //DA數(shù)模輸出變量
    unsigned char ADtemp;                //定義中間變量
     Init_Timer1();
         cmg();//關(guān)數(shù)碼管函數(shù)
         while(1)
              {
               
           DAC(num);       //DA輸出,可以用LED模擬電壓變化
                   num++;          //累加,到256后溢出變?yōu)?,往復(fù)循環(huán)。顯示在LED上亮度逐漸變化
                   mDelay(20);     //延時(shí)用于清晰看出變化
                   if(ADFlag)      //定時(shí)采集輸入模擬量
               
           {
                   ADFlag=0;
                   }
           }
        }
2,HL-1
/*-----------------------------------------------
  名稱(chēng):IIC協(xié)議 PCF8591ADDA轉(zhuǎn)換                  
  內(nèi)容:此程序通過(guò)IIC協(xié)議對(duì)DAAD芯片操作, 并輸出模擬量,用LED亮度漸變指示
------------------------------------------------*/
#include<reg52.h>    //包含頭文件,一般情況不需要改動(dòng),頭文件包含特殊功能寄存器的定義
#include <intrins.h> //包含NOP空指令函數(shù)_nop_();

#define AddWr 0x90   //寫(xiě)數(shù)據(jù)地址
#define AddRd 0x91   //讀數(shù)據(jù)地址

sbit RST=P2^4;   //關(guān)掉時(shí)鐘芯片輸出
sbit Sda=P2^0;      //定義總線(xiàn)連接端口
sbit Scl=P2^1;
sbit Fm=P2^3;          //FM
sbit dula=P2^6;
sbit wela=P2^7;
bit ADFlag;          //定義AD采樣標(biāo)志位
unsigned char code Datatab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//7段數(shù)共陰碼管段碼表
data unsigned char  Display[8];//定義臨時(shí)存放數(shù)碼管數(shù)值
/*------------------------------------------------
                    延時(shí)程序
------------------------------------------------*/
void mDelay(unsigned char j)
{
  unsigned int i;
  for(;j>0;j--)
     {
          for(i=0;i<125;i++)
             {;}
          }
  }
/*------------------------------------------------
                    初始化定時(shí)器1
------------------------------------------------*/
void Init_Timer1(void)
{
TMOD |= 0x10;                             
TH1=0xff;                              /* Init value */
TL1=0x00;
//PT1=1;                   /* 優(yōu)先級(jí)    */
EA=1;                      /* interupt enable */
ET1=1;                     /* enable timer1 interrupt */
TR1=1;  
}
/*------------------------------------------------
                    啟動(dòng)IIC總線(xiàn)
------------------------------------------------*/
  void Start(void)
  {
   Sda=1;
   _nop_();
   Scl=1;
   _nop_();
   Sda=0;
   _nop_();
   Scl=0;
  }


/*------------------------------------------------
                    停止IIC總線(xiàn)
------------------------------------------------*/
  void Stop(void)
  {
   Sda=0;
   _nop_();
   Scl=1;
   _nop_();
   Sda=1;
   _nop_();
   Scl=0;
   }


/*------------------------------------------------
                   應(yīng)答IIC總線(xiàn)
------------------------------------------------*/
   void Ack(void)
   {
    Sda=0;
        _nop_();
        Scl=1;
        _nop_();
        Scl=0;
        _nop_();
        }


/*------------------------------------------------
                 非應(yīng)答IIC總線(xiàn)
------------------------------------------------*/
        void NoAck(void)
        {
         Sda=1;
         _nop_();
         Scl=1;
         _nop_();
         Scl=0;
         _nop_();
         }


/*------------------------------------------------
              發(fā)送一個(gè)字節(jié)
------------------------------------------------*/
         void Send(unsigned char Data)
         {
          unsigned char BitCounter=8;
          unsigned char temp;

          do
            {
                 temp=Data;
                 Scl=0;
                 _nop_();
                 if((temp&0x80)==0x80)
                    Sda=1;
                 else
                    Sda=0;

                        Scl=1;
                        temp=Data<<1;
                        Data=temp;
                        BitCounter--;
                  }
          while(BitCounter);
              Scl=0;
          }


/*------------------------------------------------
               讀入一個(gè)字節(jié)并返回
------------------------------------------------*/
          unsigned char Read(void)
          {
           unsigned char temp=0;
           unsigned char temp1=0;
           unsigned char BitCounter=8;

           Sda=1;
           do
             {
                  Scl=0;
          _nop_();
                  Scl=1;
                  _nop_();
                  if(Sda)
                     temp=temp|0x01;
                  else
                     temp=temp&0xfe;

                  if(BitCounter-1)
                     {
                          temp1=temp<<1;
                          temp=temp1;
                          }
                          BitCounter--;
                         }
                while(BitCounter);
                return(temp);
          }

/*------------------------------------------------
                    寫(xiě)入DA數(shù)模轉(zhuǎn)換值
------------------------------------------------*/
          void DAC(unsigned char Data)
          {
                   Start();
                   Send(AddWr); //寫(xiě)入芯片地址
                   Ack();
                   Send(0x40);  //寫(xiě)入控制位,使能DAC輸出
                   Ack();
                   Send(Data);  //寫(xiě)數(shù)據(jù)
                   Ack();
                   Stop();
                 
           }

/*------------------------------------------------
                 讀取AD模數(shù)轉(zhuǎn)換的值,有返回值
------------------------------------------------*/
          unsigned char ReadADC(unsigned char Chl)
          {
       unsigned char Data;
                   Start();        //寫(xiě)入芯片地址
                   Send(AddWr);
                   Ack();
                    Send(0x40|Chl);//寫(xiě)入選擇的通道,本程序只用單端輸入,差分部分需要自行添加
                                  //Chl的值分別為0、1、2、3,分別代表1-4通道
                   Ack();
                   Start();
                   Send(AddRd);    //讀入地址
                   Ack();
                   Data=Read();    //讀數(shù)據(jù)
                   Scl=0;
                   NoAck();
                   Stop();
                   return Data;   //返回值
          }

                 void fmg(void)//fm關(guān)
        {        
        Fm=1;        //                關(guān) fm
        }
                 void cmg(void)//數(shù)碼管鎖存函數(shù)                   關(guān)時(shí)鐘DS1302
        {
        dula=1;
        P0=0x00;
        dula=0;
        wela=1;
        P0=0x00;
        wela=0;
        RST=0;                //                關(guān)時(shí)鐘DS1302
        }
/*------------------------------------------------
                   主程序
------------------------------------------------*/
        void main()
        {
         unsigned char num;                   //DA數(shù)模輸出變量
    unsigned char ADtemp;                //定義中間變量
     Init_Timer1();
         cmg();//數(shù)碼管鎖存
         fmg();
         while(1)
              {
               
           DAC(num);       //DA輸出,可以用LED模擬電壓變化
                   num++;          //累加,到256后溢出變?yōu)?,往復(fù)循環(huán)。顯示在LED上亮度逐漸變化
                   mDelay(20);     //延時(shí)用于清晰看出變化
                   if(ADFlag)      //定時(shí)采集輸入模擬量
               
           {
                   ADFlag=0;
                   }
           }
        }




作者: admin    時(shí)間: 2019-8-1 17:46
本帖需要重新編輯補(bǔ)全電路原理圖,源碼,詳細(xì)說(shuō)明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)




歡迎光臨 (http://www.denmoz.com/bbs/) Powered by Discuz! X3.1