51单片机+TLC5628信号发生器Proteus仿真图与程序

[复制链接]
查看26 | 回复0 | 2021-7-20 17:19:35 | 显示全部楼层 |阅读模式
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
1.jpg

部分源码:完整见附件
  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 工控币)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则