電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 2428|回復(fù): 2
收起左側(cè)

單片機(jī)C語言實例-266-液晶AD_DA_PCF8591

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2022-3-14 09:56:56 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
單片機(jī)C語言實例-266-液晶AD_DA_PCF8591

/*-----------------------------------------------
  名稱:IIC協(xié)議 PCF8591ADDA轉(zhuǎn)換
  公司:上海浩豚電子科技有限公司
  編寫:師訪
  日期:2009.5
  修改:無
  內(nèi)容:此程序通過IIC協(xié)議對DAAD芯片操作,讀取電位器的電壓通過液晶顯示,并輸出模擬量,用LED亮度漸變指示
------------------------------------------------*/
#include<reg52.h>    //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
#include <intrins.h> //包含NOP空指令函數(shù)_nop_();
#include<LCD1602.h>

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


sbit Sda=P1^2;       //定義總線連接端口
sbit Scl=P1^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ù)值
/*------------------------------------------------
                    延時程序
------------------------------------------------*/
void mDelay(unsigned char j)
{
  unsigned int i;
  for(;j>0;j--)
     {
          for(i=0;i<125;i++)
             {;}
          }
  }
/*------------------------------------------------
                    初始化定時器1
------------------------------------------------*/
void Init_Timer1(void)
{
TMOD |= 0x10;                             
TH1=0xff;                              /* Init value */
TL1=0x00;
//PT1=1;                   /* 優(yōu)先級    */
EA=1;                      /* interupt enable */
ET1=1;                     /* enable timer1 interrupt */
TR1=1;  
}
/*------------------------------------------------
                    啟動IIC總線
------------------------------------------------*/
  void Start(void)
  {
   Sda=1;
   _nop_();
   Scl=1;
   _nop_();
   Sda=0;
   _nop_();
   Scl=0;
  }


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


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


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


/*------------------------------------------------
              發(fā)送一個字節(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;
          }


/*------------------------------------------------
               讀入一個字節(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);
          }

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

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

/*------------------------------------------------
                   主程序
------------------------------------------------*/
        void main()
        {
         unsigned char num;                   //DA數(shù)模輸出變量
         unsigned char ADtemp;                //定義中間變量
         InitLcd();
     mDelay(20);
     Init_Timer1();

         while(1)
              {
           DAC(num);       //DA輸出,可以用LED模擬電壓變化
                   num++;          //累加,到256后溢出變?yōu)?,往復(fù)循環(huán)。顯示在LED上亮度逐漸變化
                   mDelay(20);     //延時用于清晰看出變化
                   if(ADFlag)      //定時采集輸入模擬量
           {
                   ADFlag=0;

                   ADtemp=ReadADC(0);
                TempData[0]=(ReadADC(0))/50;//處理0通道電壓顯示
                  TempData[1]=((ReadADC(0))%50)/10;
         
        ADtemp=ReadADC(1);
                TempData[2]=(ReadADC(1))/50;//處理1通道電壓顯示 此通道暫時屏蔽,可以自行添加
                  TempData[3]=((ReadADC(1))%50)/10;
                 
        ADtemp=ReadADC(2);
                TempData[4]=(ReadADC(2))/50;//處理1通道電壓顯示 此通道暫時屏蔽,可以自行添加
                  TempData[5]=((ReadADC(2))%50)/10;
                 
        ADtemp=ReadADC(3);
                TempData[6]=(ReadADC(3))/50;//處理1通道電壓顯示 此通道暫時屏蔽,可以自行添加
                  TempData[7]=((ReadADC(4))%50)/10;
                 
        disp();
                   }
           }
        }

/*------------------------------------------------
                   定時器中斷程序
------------------------------------------------*/
void Timer1_isr(void) interrupt 3 using 1//定時器1執(zhí)行數(shù)碼管動態(tài)掃描
{

static unsigned int j;
TH1=0xfb;                //重新賦值
TL1=0x00;
j++;
if(j==200)
    {j=0;ADFlag=1;} //定時置位AD采樣標(biāo)志位
         
   // P0=Display[count];//用于動態(tài)掃描數(shù)碼管
   // P2=count;
   // count++;
  // if(count==8)     //表示掃描8個數(shù)碼管
   //   count=0;


}


更多詳情參考附件文檔

游客,如果您要查看本帖隱藏內(nèi)容請回復(fù)

回復(fù)

使用道具 舉報

0

主題

91

帖子

330

積分

一級會員

Rank: 1

積分
330
沙發(fā)
發(fā)表于 2022-3-14 11:55:22 | 只看該作者
666666666666666666666
回復(fù) 支持 反對

使用道具 舉報

0

主題

7

帖子

19

積分

一級會員

Rank: 1

積分
19
板凳
發(fā)表于 2022-3-15 22:36:07 | 只看該作者

資料很好,學(xué)習(xí)學(xué)習(xí)
回復(fù) 支持 反對

使用道具 舉報

發(fā)表回復(fù)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表