找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機DA轉(zhuǎn)換 PCF8591鋸齒波代碼Proteus仿真原理圖

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:903830 發(fā)表于 2022-11-16 11:06 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
鋸齒波生成原理:PCF8591中所存數(shù)據(jù)不斷增大,直至到達最值(十進制255),隨后令PCF8591中所存數(shù)據(jù)變?yōu)?,從而到達鋸齒波的效果
實現(xiàn):輸出峰峰值為0-3V的爬升鋸齒波
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>   //包含函數(shù)_nop_()定義的頭文件
  3. #define AddWr 0x90   //PCF8591寫地址
  4. #define u8 unsigned char
  5. #define u16 unsigned int

  6. u8 code juchi[64]=
  7. {
  8. 0,4,8,12,16,20,24,28,32,36,40,45,49,53,57,61,65,69,73,77,81,85,89,93,97,101,105,109,113,117,121,125,130,134,138,142,
  9. 146,150,154,158,162,166,170,174,178,182,186,190,194,198,202,206,210,215,219,223,227,231,235,239,243,247,251,255
  10. };                                          //鋸齒波取碼
  11. sbit Sda=P1^2;        //定義IIC總線引腳
  12. sbit Scl=P1^1;
  13. u16 num;


  14.   void Start(void)
  15.   {
  16.    Sda=1;
  17.    _nop_();
  18.    Scl=1;
  19.    _nop_();
  20.    Sda=0;        //sda負(fù)跳變
  21.    _nop_();
  22.    Scl=0;
  23.   }

  24.   void Stop(void)
  25.   {
  26.    Sda=0;
  27.    _nop_();
  28.    Scl=1;
  29.    _nop_();
  30.    Sda=1;        //sda正跳變
  31.    _nop_();
  32.    Scl=0;
  33.    }

  34.          
  35.          void Send(u8 Data)
  36.         {
  37.           u8 BitCounter=8;   //定義發(fā)送位數(shù)為8
  38.           do
  39.           {
  40.                  Scl=0;
  41.                  _nop_();
  42.                  if((Data&0x80)==0x80)        //逐位判別1/0后送至SDA
  43.                     Sda=1;        //scl低電平期間數(shù)據(jù)送至sda線                        
  44.                  else
  45.                     Sda=0;
  46.                   Scl=1;        //scl變高輸出數(shù)據(jù)(寫入pcf8591)                        
  47.                   Data=Data<<1;
  48.                   BitCounter--;
  49.           }while(BitCounter);
  50.           Scl=0;
  51.         }
  52.         
  53.         void Ack(void)
  54.    {
  55.     Sda=0;         //scl高電平期間sda輸出低電平
  56.                 _nop_();
  57.                 Scl=1;         
  58.                 _nop_();
  59.                 Scl=0;
  60.                 _nop_();
  61.         }
  62.          
  63.         void DACconversion(u8 sla,u8 c, u8 Val)    //8591輸出一個數(shù)據(jù)
  64.         {
  65.                 Start();//啟動總線
  66.                 Send(sla);//發(fā)送器件地址
  67.                          Ack();        
  68.                 Send(c);//發(fā)送控制字節(jié)
  69.                          Ack();        
  70.                 Send(Val);//發(fā)送DAC的數(shù)值
  71.                          Ack();        
  72.                 Stop();//結(jié)束總線
  73.         }

  74.          
  75.         void main()
  76.         {
  77.                 while(1)
  78.                 {
  79.                                 for(num=0;num<64;num++)
  80.                          {
  81.                                         DACconversion(AddWr,0x40,juchi[num]);
  82.                          }
  83.                   if(num==64)
  84.                                 {
  85.                                                 num=0;
  86.                                 }

  87.                 }
  88.         }
復(fù)制代碼

Keil代碼與Proteus8.13版本的仿真下載(注意不能兼容其他版本 只能用8.13打開):
DA鋸齒波發(fā)生器.7z (32.08 KB, 下載次數(shù): 22)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表