久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3757|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

正弦波逆變器 51單片機(jī)實(shí)例之38用PCF8591T實(shí)現(xiàn)DA功能(正弦波)驅(qū)動場館

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:221001 發(fā)表于 2017-7-20 10:27 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式

  • /********************************************************************
  • * 文件名  : PCF8591T做DA實(shí)驗(yàn).c
  • * 描述    :  我們單片機(jī)去控制PCF8591T去實(shí)現(xiàn)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點(diǎn)正弦波樣本表
  • 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 變換, 轉(zhuǎn)化函數(shù)
  • *******************************************************************/
  • bit DACconversion(unsigned char sla,unsigned char c,  unsigned char Val)
  • {
  •    Start_I2c();              //啟動總線
  •    SendByte(sla);            //發(fā)送器件地址
  •    if(ack==0)return(0);
  •    SendByte(c);              //發(fā)送控制字節(jié)
  •    if(ack==0)return(0);
  •    SendByte(Val);            //發(fā)送DAC的數(shù)值
  •    if(ack==0)return(0);
  •    Stop_I2c();               //結(jié)束總線
  •    return(1);
  • }
  • /*******************************************************************
  • ADC發(fā)送字節(jié)[命令]數(shù)據(jù)函數(shù)
  • *******************************************************************/
  • bit ISendByte(unsigned char sla,unsigned char c)
  • {
  •    Start_I2c();              //啟動總線
  •    SendByte(sla);            //發(fā)送器件地址
  •    if(ack==0)return(0);
  •    SendByte(c);              //發(fā)送數(shù)據(jù)
  •    if(ack==0)return(0);
  •    Stop_I2c();               //結(jié)束總線
  •    return(1);
  • }
  • /*******************************************************************
  • ADC讀字節(jié)數(shù)據(jù)函數(shù)
  • *******************************************************************/
  • unsigned char IRcvByte(unsigned char sla)
  • {  unsigned char c;
  •    Start_I2c();          //啟動總線
  •    SendByte(sla+1);      //發(fā)送器件地址
  •    if(ack==0)return(0);
  •    c=RcvByte();          //讀取數(shù)據(jù)0
  •    Ack_I2c(1);           //發(fā)送非就答位
  •    Stop_I2c();           //結(jié)束總線
  •    return(c);
  • }
  • /********************************************************************
  • * 名稱 : Delay_1ms()
  • * 功能 : 延時子程序,延時時間為 1ms * x
  • * 輸入 : x (延時一毫秒的個數(shù))
  • * 輸出 : 無
  • ***********************************************************************/
  • 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 模數(shù)轉(zhuǎn)換1
  •              break;
  •      case 1: ISendByte(PCF8591,0x42);
  •              D[1]=IRcvByte(PCF8591)*2;  //ADC1  模數(shù)轉(zhuǎn)換2
  •              break;
  •      case 2: ISendByte(PCF8591,0x43);
  •              D[2]=IRcvByte(PCF8591)*2;  //ADC2  模數(shù)轉(zhuǎn)換3
  •              break;
  •      case 3: ISendByte(PCF8591,0x40);
  •              D[3]=IRcvByte(PCF8591)*2;  //ADC3   模數(shù)轉(zhuǎn)換4
  •              break;
  •      case 4: DACconversion(PCF8591,0x40, D[4]/4); //DAC   數(shù)模轉(zhuǎn)換
  •              break;
  •    }
  •    if(++AD_CHANNEL>4) AD_CHANNEL=0;
  • /********以下將AD的值送到LED數(shù)碼管顯示*************/
  •         D[4] = auc_SinParam[i++]*2;
  •         Delay_1ms(5);
  •         if(i==128) i=0;
  •     }
  • }


view plaincopy to clipboardprint?

  • /*************************此部分為I2C總線的驅(qū)動程序*************************************/
  • #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  數(shù)據(jù)
  • bit ack;                 /*應(yīng)答標(biāo)志位*/
  • /*******************************************************************
  •                      起動總線函數(shù)
  • 函數(shù)原型: void  Start_I2c();
  • 功能:     啟動I2C總線,即發(fā)送I2C起始條件.
  • ********************************************************************/
  • void Start_I2c()
  • {
  •   SDA=1;         /*發(fā)送起始條件的數(shù)據(jù)信號*/
  •   _Nop();
  •   SCL=1;
  •   _Nop();        /*起始條件建立時間大于4.7us,延時*/
  •   _Nop();
  •   _Nop();
  •   _Nop();
  •   _Nop();
  •   SDA=0;         /*發(fā)送起始信號*/
  •   _Nop();        /* 起始條件鎖定時間大于4μs*/
  •   _Nop();
  •   _Nop();
  •   _Nop();
  •   _Nop();
  •   SCL=0;       /*鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù) */
  •   _Nop();
  •   _Nop();
  • }
  • /*******************************************************************
  •                       結(jié)束總線函數(shù)
  • 函數(shù)原型: void  Stop_I2c();
  • 功能:     結(jié)束I2C總線,即發(fā)送I2C結(jié)束條件.
  • ********************************************************************/
  • void Stop_I2c()
  • {
  •   SDA=0;      /*發(fā)送結(jié)束條件的數(shù)據(jù)信號*/
  •   _Nop();       /*發(fā)送結(jié)束條件的時鐘信號*/
  •   SCL=1;      /*結(jié)束條件建立時間大于4μs*/
  •   _Nop();
  •   _Nop();
  •   _Nop();
  •   _Nop();
  •   _Nop();
  •   SDA=1;      /*發(fā)送I2C總線結(jié)束信號*/
  •   _Nop();
  •   _Nop();
  •   _Nop();
  •   _Nop();
  • }
  • /*******************************************************************
  •                  字節(jié)數(shù)據(jù)發(fā)送函數(shù)
  • 函數(shù)原型: void  SendByte(UCHAR c);
  • 功能:     將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應(yīng)答,并對
  •           此狀態(tài)位進(jìn)行操作.(不應(yīng)答或非應(yīng)答都使ack=0)
  •            發(fā)送數(shù)據(jù)正常,ack=1; ack=0表示被控器無應(yīng)答或損壞。
  • ********************************************************************/
  • void  SendByte(unsigned char  c)
  • {
  • unsigned char  BitCnt;
  • for(BitCnt=0;BitCnt<8;BitCnt++)  /*要傳送的數(shù)據(jù)長度為8位*/
  •     {
  •      if((c<<BitCnt)&0x80)SDA=1;   /*判斷發(fā)送位*/
  •        else  SDA=0;
  •      _Nop();
  •      SCL=1;               /*置時鐘線為高,通知被控器開始接收數(shù)據(jù)位*/
  •       _Nop();
  •       _Nop();             /*保證時鐘高電平周期大于4μs*/
  •       _Nop();
  •       _Nop();
  •       _Nop();
  •      SCL=0;
  •     }
  •     _Nop();
  •     _Nop();
  •     SDA=1;                /*8位發(fā)送完后釋放數(shù)據(jù)線,準(zhǔn)備接收應(yīng)答位*/
  •     _Nop();
  •     _Nop();
  •     SCL=1;
  •     _Nop();
  •     _Nop();
  •     _Nop();
  •     if(SDA==1)ack=0;
  •        else ack=1;        /*判斷是否接收到應(yīng)答信號*/
  •     SCL=0;
  •     _Nop();
  •     _Nop();
  • }
  • /*******************************************************************
  •                  字節(jié)數(shù)據(jù)接收函數(shù)
  • 函數(shù)原型: UCHAR  RcvByte();
  • 功能:        用來接收從器件傳來的數(shù)據(jù),并判斷總線錯誤(不發(fā)應(yīng)答信號),
  •           發(fā)完后請用應(yīng)答函數(shù)應(yīng)答從機(jī)。
  • ********************************************************************/
  • unsigned char   RcvByte()
  • {
  •   unsigned char  retc;
  •   unsigned char  BitCnt;
  •   retc=0;
  •   SDA=1;                     /*置數(shù)據(jù)線為輸入方式*/
  •   for(BitCnt=0;BitCnt<8;BitCnt++)
  •       {
  •         _Nop();
  •         SCL=0;                  /*置時鐘線為低,準(zhǔn)備接收數(shù)據(jù)位*/
  •         _Nop();
  •         _Nop();                 /*時鐘低電平周期大于4.7μs*/
  •         _Nop();
  •         _Nop();
  •         _Nop();
  •         SCL=1;                  /*置時鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效*/
  •         _Nop();
  •         _Nop();
  •         retc=retc<<1;
  •         if(SDA==1)retc=retc+1;  /*讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入retc中 */
  •         _Nop();
  •         _Nop();
  •       }
  •   SCL=0;
  •   _Nop();
  •   _Nop();
  •   return(retc);
  • }
  • /********************************************************************
  •                      應(yīng)答子函數(shù)
  • 函數(shù)原型:  void Ack_I2c(bit a);
  • 功能:      主控器進(jìn)行應(yīng)答信號(可以是應(yīng)答或非應(yīng)答信號,由位參數(shù)a決定)
  • ********************************************************************/
  • void Ack_I2c(bit a)
  • {
  •   if(a==0)SDA=0;              /*在此發(fā)出應(yīng)答或非應(yīng)答信號 */
  •   else SDA=1;
  •   _Nop();
  •   _Nop();
  •   _Nop();
  •   SCL=1;
  •   _Nop();
  •   _Nop();                    /*時鐘低電平周期大于4μs*/
  •   _Nop();
  •   _Nop();
  •   _Nop();
  •   SCL=0;                     /*清時鐘線,鉗住I2C總線以便繼續(xù)接收*/
  •   _Nop();
  •   _Nop();
  • }


view plaincopy to clipboardprint?

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



view plaincopy to clipboardprint?

  • /*************************此部分為74HC595的驅(qū)動程序使用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);
  • /*********************************************************************************************************
  • ** 函數(shù)名稱: HC595SendData
  • ** 功能描述: 向SPI總線發(fā)送數(shù)據(jù)
  • ** 管腳描述:請參考相關(guān)的芯片資料(學(xué)習(xí)光盤中以配)
  • *********************************************************************************************************/
  • 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;
  • }


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:95059 發(fā)表于 2018-6-17 22:24 | 只看該作者
可以分享一下原理圖嗎?
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩精品一区二 | 久久三区| 97超碰在线免费 | 久草热视频 | 玖草资源| av中文在线 | 日本不卡视频在线播放 | 日日想夜夜操 | 亚洲九九| www成人免费| 国产精品久久久久久吹潮 | 国产一区免费视频 | 第四色播日韩第一页 | 日韩欧美在线免费观看 | 91在线观看视频 | 亚洲欧美一区二区三区国产精品 | 国产精品久久久久久妇女 | 精品欧美一区二区三区久久久小说 | 国产精品99久久久久久久久久久久 | 国产中文字幕在线观看 | 九九热精品在线视频 | 国产高清免费 | 久久免费精品视频 | 一a级片 | 日韩三级电影一区二区 | 久久精品视频99 | 色毛片| 免费同性女女aaa免费网站 | 国产精品久久久久久亚洲调教 | 日韩精品一区二区三区视频播放 | 国产不卡视频在线 | 亚洲成人精品 | 国产精品国产三级国产aⅴ中文 | 午夜免费观看体验区 | 91久久精品国产91久久 | 91社区在线高清 | 国产精品自产拍 | 涩涩鲁亚洲精品一区二区 | 久草视频网站 | 成人免费在线视频 | 日韩欧美一区二区三区四区 |