欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3824|回復: 1
收起左側

正弦波逆變器 51單片機實例之38用PCF8591T實現DA功能(正弦波)驅動場館

[復制鏈接]
ID:221001 發表于 2017-7-20 10:27 | 顯示全部樓層 |閱讀模式

  • /********************************************************************
  • * 文件名  : PCF8591T做DA實驗.c
  • * 描述    :  我們單片機去控制PCF8591T去實現DA功能。
  •              這個代碼也要在示波器上才能觀測到,DA輸出一個正弦波。
  • * 可以用示波器測到正弦波
  • ***********************************************************************/
  • #include<reg52.h>
  • #include <I2C.H>
  • #define  PCF8591 0x90    //PCF8591 地址
  • // 此表為 LED 的字模            // 0    1    2    3    4    5    6   7    8    9    A    b    c    d    E    -    L   P    U    Hidden  _ (20)
  • unsigned char Disp_Tab[] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x88,0x83,0xC6,0xA1,0x86,0xbf,0xc7,0x8c,0xc1, 0xff,  0xf7 };
  • unsigned char AD_CHANNEL;
  • unsigned long xdata  LedOut[8];
  • unsigned int  idata D[32];
  • // 128點正弦波樣本表
  • unsigned char code auc_SinParam[128] = {
  • 64,67,70,73,76,79,82,85,88,91,94,96,99,102,104,106,109,111,113,115,117,118,120,121,
  • 123,124,125,126,126,127,127,127,127,127,127,127,126,126,125,124,123,121,120,118,
  • 117,115,113,111,109,106,104,102,99,96,94,91,88,85,82,79,76,73,70,67,64,60,57,54,51,48,
  • 45,42,39,36,33,31,28,25,23,21,18,16,14,12,10,9,7,6,4,3,2,1,1,0,0,0,0,0,0,0,1,1,2,3,4,6,
  • 7,9,10,12,14,16,18,21,23,25,28,31,33,36,39,42,45,48,51,54,57,60};
  • /*******************************************************************
  • DAC 變換, 轉化函數
  • *******************************************************************/
  • bit DACconversion(unsigned char sla,unsigned char c,  unsigned char Val)
  • {
  •    Start_I2c();              //啟動總線
  •    SendByte(sla);            //發送器件地址
  •    if(ack==0)return(0);
  •    SendByte(c);              //發送控制字節
  •    if(ack==0)return(0);
  •    SendByte(Val);            //發送DAC的數值
  •    if(ack==0)return(0);
  •    Stop_I2c();               //結束總線
  •    return(1);
  • }
  • /*******************************************************************
  • ADC發送字節[命令]數據函數
  • *******************************************************************/
  • bit ISendByte(unsigned char sla,unsigned char c)
  • {
  •    Start_I2c();              //啟動總線
  •    SendByte(sla);            //發送器件地址
  •    if(ack==0)return(0);
  •    SendByte(c);              //發送數據
  •    if(ack==0)return(0);
  •    Stop_I2c();               //結束總線
  •    return(1);
  • }
  • /*******************************************************************
  • ADC讀字節數據函數
  • *******************************************************************/
  • unsigned char IRcvByte(unsigned char sla)
  • {  unsigned char c;
  •    Start_I2c();          //啟動總線
  •    SendByte(sla+1);      //發送器件地址
  •    if(ack==0)return(0);
  •    c=RcvByte();          //讀取數據0
  •    Ack_I2c(1);           //發送非就答位
  •    Stop_I2c();           //結束總線
  •    return(c);
  • }
  • /********************************************************************
  • * 名稱 : Delay_1ms()
  • * 功能 : 延時子程序,延時時間為 1ms * x
  • * 輸入 : x (延時一毫秒的個數)
  • * 輸出 : 無
  • ***********************************************************************/
  • void Delay_1ms(unsigned char i)//1ms延時
  • {
  •     unsigned char x,j;
  •     for(j=0;j<i;j++)
  •     for(x=0;x<=148;x++);
  • }
  • //******************************************************************/
  • main()
  • {
  • unsigned char i=0;
  • while(1)
  • {/********以下AD-DA處理*************/
  •    switch(AD_CHANNEL)
  •    {
  •      case 0: ISendByte(PCF8591,0x41);
  •              D[0]=IRcvByte(PCF8591)*2;  //ADC0 模數轉換1
  •              break;
  •      case 1: ISendByte(PCF8591,0x42);
  •              D[1]=IRcvByte(PCF8591)*2;  //ADC1  模數轉換2
  •              break;
  •      case 2: ISendByte(PCF8591,0x43);
  •              D[2]=IRcvByte(PCF8591)*2;  //ADC2  模數轉換3
  •              break;
  •      case 3: ISendByte(PCF8591,0x40);
  •              D[3]=IRcvByte(PCF8591)*2;  //ADC3   模數轉換4
  •              break;
  •      case 4: DACconversion(PCF8591,0x40, D[4]/4); //DAC   數模轉換
  •              break;
  •    }
  •    if(++AD_CHANNEL>4) AD_CHANNEL=0;
  • /********以下將AD的值送到LED數碼管顯示*************/
  •         D[4] = auc_SinParam[i++]*2;
  •         Delay_1ms(5);
  •         if(i==128) i=0;
  •     }
  • }


view plaincopy to clipboardprint?

  • /*************************此部分為I2C總線的驅動程序*************************************/
  • #include<reg52.h>
  • #include <intrins.h>
  • #include <I2C.H>
  • #define  NOP()   _nop_()   /* 定義空指令 */
  • #define  _Nop()  _nop_()   /*定義空指令*/
  • sbit     SCL=P1^5;       //I2C  時鐘
  • sbit     SDA=P3^6;       //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();
  • }


view plaincopy to clipboardprint?

  • extern bit ack;
  • //起動總線函數
  • extern void Start_I2c();
  • //結束總線函數
  • extern void Stop_I2c();
  • //應答子函數
  • extern void Ack_I2c(bit a);
  • //字節數據發送函數
  • extern void  SendByte(unsigned char  c);
  • //有子地址發送多字節數據函數
  • extern bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no) ;
  • //無子地址發送多字節數據函數
  • extern bit ISendStrExt(unsigned char sla,unsigned char *s,unsigned char no);
  • //無子地址讀字節數據函數
  • extern unsigned char RcvByte();
  • extern void HC595SendData(unsigned int SendVal);



view plaincopy to clipboardprint?

  • /*************************此部分為74HC595的驅動程序使用SPI總線連接*************************************/
  • #include<reg52.h>
  • #include <intrins.h>
  • #define  NOP()   _nop_()    /* 定義空指令 */
  • #define  _Nop()  _nop_()    /*定義空指令*/
  • //SPI IO
  • sbit    MOSIO =P1^5;
  • sbit    R_CLK =P1^6;
  • sbit    S_CLK =P1^7;
  • sbit    OE    =P3^6;
  • void HC595SendData(unsigned int SendVal);
  • /*********************************************************************************************************
  • ** 函數名稱: HC595SendData
  • ** 功能描述: 向SPI總線發送數據
  • ** 管腳描述:請參考相關的芯片資料(學習光盤中以配)
  • *********************************************************************************************************/
  • void HC595SendData(unsigned int SendVal)
  • {
  •   unsigned char i;
  •   for(i=0;i<16;i++)
  •    {
  •     if((SendVal<<i)&0x8000) MOSIO=1; // set dataline high
  •     else MOSIO=0;
  •     S_CLK=0;
  •     NOP();
  •     NOP();
  •     S_CLK=1;
  •    }
  •   R_CLK=0; //set dataline low
  •   NOP();
  •   NOP();
  •   R_CLK=1; //片選
  •   OE=0;
  • }


回復

使用道具 舉報

ID:95059 發表于 2018-6-17 22:24 | 顯示全部樓層
可以分享一下原理圖嗎?
回復

使用道具 舉報

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

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表