国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee

ELEOK

標題: 51單片機+TLC5628信號發生器Proteus仿真圖與程序 [打印本頁]

作者: eng    時間: 2021-7-20 17:19
標題: 51單片機+TLC5628信號發生器Proteus仿真圖與程序
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


部分源碼:完整見附件
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. /*定義I/O端口*/
  4. sbit CLK = P0^0; //串行時鐘,下降沿有效
  5. sbit DAT = P0^1; //串行數據
  6. sbit LOAD = P0^7; //串行數據加載,下降沿有效
  7. sbit LDAC = P0^3; //DAC更新鎖存控制,下降沿有效

  8. /*函數申明*/
  9. void delayms(unsigned char ms);
  10. void TCL5628_Write(unsigned char addr, bit rng, unsigned char dat);
  11. void Init_TLC5628();
  12. void jichiWave();
  13. void delay5us(void);   //誤差 0us
  14. /*函數定義*/

  15. /*延時函數*/
  16. void delayms(unsigned char ms)
  17. {
  18.         unsigned char i;
  19.         while(ms--)
  20.         {
  21.                 for(i = 0; i < 250; i++)
  22.                 {
  23.                         _nop_();
  24.                         _nop_();
  25.                         _nop_();
  26.                         _nop_();
  27.                 }
  28.         }        
  29. }

  30. void delay5us(void)   //誤差 0us
  31. {
  32.     unsigned char a;
  33.     for(a=1;a>0;a--);
  34. }


  35. /*TCL5628 driver*/
  36. void TCL5628_Write(unsigned char addr, bit rng, unsigned char dat)
  37. {
  38.         unsigned char n;
  39.         // 發送通道地址
  40.         n = 3;
  41.         do
  42.         {
  43.                 DAT = (bit)(addr & 0x02);
  44.                 addr <<= 1;
  45.                 CLK = 0;
  46.                 CLK = 1;
  47.         }while(--n != 0);
  48.         //發送RNG位
  49.         DAT = rng;
  50.         CLK = 0;
  51.         CLK = 1;
  52.         //發送8位DAC數據
  53.         n = 8;
  54.         do
  55.         {
  56.                 DAT = (bit)(dat & 0x80);
  57.                 dat <<= 1;
  58.                 CLK = 0;
  59.                 CLK = 1;
  60.         }while(--n != 0);
  61.         
  62.         //加載數據
  63.         LOAD = 0;
  64. //        delay5us();
  65.         LOAD = 1;
  66. //        delay5us();
  67.         LDAC = 0;
  68. //        delay5us();
  69.         LDAC = 1;
  70. }

  71. /*初始化TLC5628*/
  72. void Init_TLC5628()
  73. {
  74.         DAT = 1;
  75.         CLK = 1;
  76.         LDAC = 1;
  77.         LOAD = 1;
  78. }

  79. ///*方法一:采樣設計
  80. //        TLC5628轉換一次大概要12.5us
  81. //        即最高80KHz
  82. //        但是用51單片機,晶振為12MHz
  83. //        最快產生一個方波為2us,即最高頻率為500KHz
  84. //        
  85. //        正弦波產生函數
  86. //        用32個點
  87. //*/
  88. //void juchiWave()
  89. //{
  90. //        /*根據曲線光滑來選取采樣點*/
  91. //        code unsigned char juchiTab[] =
  92. //        {
  93. //                0,10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200,210,220,230,240,250
  94. //        };

  95. //        unsigned char n;
  96. //        for(n = 0; n < 25; n++)
  97. //        {
  98. //                TCL5628_Write(0,0,juchiTab[n]);
  99. //                delayms(1);
  100. //        }
  101. //}

  102. //void main()
  103. //{
  104. //        Init_TLC5628();
  105. //        while(1)
  106. //        {
  107. //                juchiWave();
  108. //        }
  109. //        
  110. //}

  111. /*方法二:算法設計*/
  112. void juchiwave()
  113. {
  114.       unsigned char n;
  115. for(n=0;n<50;n++)
  116.                                         {
  117.   TCL5628_Write(0,0,n);
  118.                 delayms(1);
  119. }
  120.      }
  121. void main()
  122. {
  123.         Init_TLC5628();
  124.         while(1)
  125.         {
  126.                 juchiWave();
  127.         }
  128.         
  129. }
復制代碼
完整源碼和proteus仿真文件: 信號發生器.zip (108.2 KB, 售價: 2 E幣)





歡迎光臨 ELEOK (http://m.afoofa.cn/) Powered by Discuz! X5.0