找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 28554|回复: 42
打印 上一主题 下一主题
收起左侧

单片机+DAC0832信号发生器的仿真设计(方波、三角波、梯形波、锯齿波)

  [复制链接]
跳转到指定楼层
楼主
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

一、设计要求
设计一个能产生方波、三角波、梯形波、锯齿波的波形发生器。
二、方案论证
方案 :利用单片机AT89C51编写程序,然后将产生信号通过DAC0832(数模转换器)转化成模拟信号,输入信号经运放电路后信号放大,低通滤波是输出的信号稳定不失真,通过四个按键来选择输出的波形。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
方案二:集成运算放大器应用于波形发生器。正弦波和非正弦波产生电路常常作为信号源,利用正弦波振荡电路(RC桥式正弦波振荡器)产生正弦波,用集成运放构成方波发生器和三角波发生器一般包括比较器和RC积分器。此方案实现起来比较复杂,对运算电路要有严格的分析,所需要的东西较多。
方案比较:采用方案一,该信号发生器具有体积小,价格低,性能稳定优点。

三、理论设计
3.1原理分析
利用单片机AT89C51编写程序,然后将产生信号通过DAC0832(数模转换器)转化成模拟信号,输入信号经运放电路后信号放大,低通滤波是输出的信号稳定不失真,通过四个按键来选择输出的波形。



图3-3  DAC0832的引脚图

3.4电流/电压转换放大电路
由于从DAC0832转换出来的模拟信号为电流信号,将DAC0832输出的信号经过电流/电压转换放大电路转变为电压信号。本设计中使用的运放为LM324,LM324运算放大器是价格便宜的带差动输入功能的四运算放大器
图3-4 电流/电压转换放大电路
3.5按键输入电路
按键使由一组按压式或触摸式开关构成的阵列,是一种常用的输入设备。键盘可分为编码式键盘和非编码式键盘两种。


3.6系统总体结构图

四、电路仿真及仿真结果分析
4.1电路图
四个按键,每按一次按键后输出对应的波形。双极性电压输出,电压幅值可调。
4.2方波仿真结果
4.3三角波仿真结果
4.4梯形波仿真结果
4.5锯齿波仿真结果
五、心得体会

通过本次课程设计,使我对课程所学理论知识的深化和提高,我了解和掌握了单片机应用系统的软硬件设计过程、方法及实现,为以后设计和实现更难得应用打下了良好的基础。

   在本次设计工程中,遇到了很多得问题,对硬件方面的各种知识并不是非常理解。对于单片机设计,硬件电路还是比较简单,但是在程序设计上,费了很大的功夫,对于程序不是那么容易上手,查找书籍并参考了网上的例子,才得以把实验完成。要设计一个成功的电路,必须要有耐心,要有坚持的毅力,因此在整个设计过程中大部分时间都是用在程序上面的,很多子程序事可以借鉴书本上的,但怎样衔接各个子程序比较重要。完成这次设计后,我在书本理论知识的基础上又有了更深层次的理解。



  1. #include "reg52.h"
  2. #include <math.h>

  3. #define DAC_PORT P2 //DAC0832连接端口
  4. #define K_SQU 1        // 方波标志
  5. #define K_TRI 2        //三角波标志
  6. #define K_TRA 3        //梯形波标志
  7. #define K_SAW 4        //锯齿波标志
  8. sbit DAC_CS_WR=P3^0; //ADC0832使能口
  9. sbit K1=P1^0;
  10. sbit K2=P1^1;
  11. sbit K3=P1^2;
  12. sbit K4=P1^3;

  13. typedef unsigned char u8;
  14. typedef unsigned int u16;
  15. typedef unsigned long u32;

  16. //全局变量
  17. u8 mode;//模式:
  18. u16 freq;//频率
  19. u8 time;//计次参数
  20. u8 AM;//调幅


  21. void Timer0Int(void);
  22. void scanKey(void);
  23. void sys_int(void);
  24. void squ_wave(u8 location);
  25. void tri_wave(u8 location);
  26. void tra_wave(u8 location);
  27. void saw_wave(u8 location);

  28. void Timer0Int(void)               
  29. {
  30.         
  31.         TMOD &= 0xF0;                //设置定时器模式
  32.         TMOD |= 0x02;        //设置定时器模式
  33.         TL0 = 0x9C;                //设置定时初值
  34.         TH0 = 0x9C;               
  35.         TF0 = 0;                //清除TF0标志
  36.         TR0 = 1;                //定时器0开始计时
  37.         EA = 1;         //开总中断
  38.         ET0 = 1;        //开定时器0中断
  39. }

  40. void scanKey(void)
  41. {
  42.         
  43.         if(K1==0)
  44.         {
  45.                 mode=1;
  46.         }
  47.         
  48.         if(K2==0)
  49.         {
  50.                 mode=2;
  51.         }
  52.         
  53.         if(K3==0)
  54.         {
  55.                 mode=3;
  56.         }
  57.         
  58.         if(K4==0)
  59.         {
  60.                 mode=4;
  61.         }
  62. }
  63. void sys_int(void)
  64. {
  65.         time=0;
  66.         DAC_CS_WR=0;
  67.         DAC_PORT=0;
  68.         mode=0;
  69.         freq=100;//默认频率100Hz
  70.         AM=255;//最大幅度
  71. }


  72. void squ_wave(u8 location)//方波函数
  73. {
  74.         if(location<50)
  75.                 DAC_PORT=AM;
  76.         else
  77.                 DAC_PORT=0x00;
  78. }

  79. void tri_wave(u8 location)//三角波函数
  80. {
  81.         u8 y;
  82.         if(location<50)
  83.                 y=(50-location)*AM/50;
  84.         else
  85.                 y=(location-50)*AM/50;
  86.         DAC_PORT=y;
  87. }
  88. void tra_wave(u8 location)//梯形波函数
  89. {
  90.         u8 y;
  91.         if(location<25)
  92.                 y=0xFF;
  93.         else if(location<50)
  94.                 y=(50-location)*AM/25;
  95.         else if(location<75)
  96.                 y=0;
  97.         else
  98.                 y=(location-75)*AM/25;
  99.         DAC_PORT=y;
  100. }
  101. void saw_wave(u8 location)//锯形波函数
  102. {
  103.         DAC_PORT=location*AM/100;
  104. }

  105. void Timer0Work() interrupt 1 //中断服务函数
  106. {
  107.         switch(mode)
  108.         {
  109.             case K_SQU:squ_wave((u8)((time*freq/100)%100));break;  //计算出波的位置
  110.                 case K_TRI:tri_wave((u8)((time*freq/100)%100));break;
  111.                 case K_TRA:tra_wave((u8)((time*freq/100)%100));break;
  112.                 case K_SAW:saw_wave((u8)((time*freq/100)%100));break;
  113.         }
  114.         time++;
  115.         if(time>=100)//计数100次
  116.                 time=0;
  117. }

  118. int main(void)
  119. {
  120.         sys_int();
  121.         Timer0Int();
  122.         while(1)
  123.         {
  124.                 scanKey();
  125.         }
  126. }
复制代码




全部资料51hei下载地址:

信号发生器的设计.zip (1.51 MB, 下载次数: 840)




评分

参与人数 2黑币 +65 收起 理由
tieq1952 + 15 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏20 分享淘帖 顶4 踩
回复

使用道具 举报

沙发
ID:449332 发表于 2018-12-18 21:47 | 只看该作者
用哪个版本的Proteus打开呢?
回复

使用道具 举报

板凳
ID:253767 发表于 2018-12-19 08:18 | 只看该作者
谢谢分享!!!好资料,51黑有你更精彩!!!
回复

使用道具 举报

地板
ID:430253 发表于 2018-12-19 22:02 | 只看该作者
xiayan666 发表于 2018-12-18 21:47
用哪个版本的Proteus打开?

Proteus7.5

51hei.gif (309.76 KB, 下载次数: 67)

51hei.gif
回复

使用道具 举报

5#
ID:453293 发表于 2018-12-24 19:02 | 只看该作者
这个很给力,必须支持
回复

使用道具 举报

6#
ID:453180 发表于 2018-12-24 21:10 | 只看该作者
大神,我弄成功了,不胜感激
回复

使用道具 举报

7#
ID:478772 发表于 2019-3-18 17:54 | 只看该作者
感谢, 下了这么多个,这套资料总算仿真成功,感谢楼主的贡献
回复

使用道具 举报

8#
ID:508300 发表于 2019-4-13 16:11 | 只看该作者
楼主 我是小萌新  就是问一下如果说要输出其他的波形例如正弦波是不是可以继续用这个电路然后只是在单片机编程方面修改就可以啦
回复

使用道具 举报

9#
ID:511084 发表于 2019-4-13 18:28 | 只看该作者
可以,倾向于方案二
回复

使用道具 举报

10#
ID:512814 发表于 2019-4-23 22:59 | 只看该作者
我想问一下,有没有proteus的仿真电路图文件

回复

使用道具 举报

11#
ID:537232 发表于 2019-5-22 09:30 | 只看该作者
为什么我的不出结果呀
回复

使用道具 举报

12#
ID:537232 发表于 2019-5-22 10:25 | 只看该作者
好啦,是我自己的问题,谢谢楼主~~
回复

使用道具 举报

13#
ID:545554 发表于 2019-5-23 16:24 | 只看该作者
我想问一下楼主如何改变三角波的频率
回复

使用道具 举报

14#
ID:553761 发表于 2019-6-3 15:06 来自手机 | 只看该作者
请问楼主这是双极性输出吗?我看电路图好像单极性电压输出啊?
回复

使用道具 举报

15#
ID:553778 发表于 2019-6-3 15:45 | 只看该作者
您好,如果要在同一个图中显示方波正弦波等该怎么改
回复

使用道具 举报

16#
ID:556686 发表于 2019-6-18 18:14 | 只看该作者
楼主,这个梯形波怎改了频率为130HZ 之后,波形就不对了,应该怎么修改啊
回复

使用道具 举报

17#
ID:328014 发表于 2019-7-3 23:35 | 只看该作者

貌似我下载了能打开,我用的是winrar新版解压的
回复

使用道具 举报

18#
ID:606403 发表于 2019-9-2 15:42 | 只看该作者
谢谢分享
回复

使用道具 举报

19#
ID:617403 发表于 2019-10-1 09:18 来自手机 | 只看该作者
谁能告诉下这个lm324怎么接+-10v电压
回复

使用道具 举报

20#
ID:624141 发表于 2019-10-22 18:12 | 只看该作者
为啥我的波形显示不对?
回复

使用道具 举报

21#
ID:278565 发表于 2019-12-12 16:25 | 只看该作者
谢谢楼主666
回复

使用道具 举报

22#
ID:662861 发表于 2019-12-13 08:32 | 只看该作者
肖蠢蠢 发表于 2019-5-22 10:25
好啦,是我自己的问题,谢谢楼主~~

我的也不出结果呀 什么情况
回复

使用道具 举报

23#
ID:672777 发表于 2019-12-24 19:25 | 只看该作者
做的真好,按键设计很合理
回复

使用道具 举报

24#
ID:697960 发表于 2020-2-25 14:13 | 只看该作者
楼主 我的为什么不显示结果呢
回复

使用道具 举报

25#
ID:697960 发表于 2020-2-25 14:15 | 只看该作者
肖蠢蠢 发表于 2019-5-22 10:25
好啦,是我自己的问题,谢谢楼主~~

你好  问一下 结果怎样出来的呢?
回复

使用道具 举报

26#
ID:712500 发表于 2020-3-20 21:08 | 只看该作者
肖蠢蠢 发表于 2019-5-22 10:25
好啦,是我自己的问题,谢谢楼主~~

怎么搞,我的也不出
回复

使用道具 举报

27#
ID:724710 发表于 2020-4-8 16:16 | 只看该作者
那正弦波呢
回复

使用道具 举报

28#
ID:522961 发表于 2020-5-1 01:15 | 只看该作者
楼主我想问下编写各个函数时的具体思想
回复

使用道具 举报

29#
ID:741818 发表于 2020-5-2 12:48 | 只看该作者
楼主可以联系你吗
回复

使用道具 举报

30#
ID:741818 发表于 2020-5-2 13:12 | 只看该作者
楼主有STM32版本的发生器设计吗
回复

使用道具 举报

31#
ID:753997 发表于 2020-5-23 18:06 | 只看该作者

同问
回复

使用道具 举报

32#
ID:302325 发表于 2020-5-30 13:43 | 只看该作者
感谢分享
回复

使用道具 举报

33#
ID:772814 发表于 2020-6-8 14:30 | 只看该作者
谢谢分享
回复

使用道具 举报

34#
ID:744425 发表于 2020-6-10 11:24 | 只看该作者
请问有没有用DAC0832控制直流电机调速的啊?
回复

使用道具 举报

35#
ID:760481 发表于 2020-6-11 09:44 | 只看该作者
我也出不了波形救济孩子
回复

使用道具 举报

36#
ID:768328 发表于 2020-6-15 22:40 | 只看该作者
请问正弦波函数怎么写呢?
回复

使用道具 举报

37#
ID:785332 发表于 2020-6-24 18:59 来自手机 | 只看该作者
如果弄硬件的话,可以成功吗
回复

使用道具 举报

38#
ID:495287 发表于 2020-6-27 13:49 | 只看该作者
这个要好好学习下,谢谢分享。
回复

使用道具 举报

39#
ID:794301 发表于 2020-7-6 11:54 | 只看该作者
咦为什么题目介绍说用80C51图上和程序确实80C52啊?如果要用80C51我直接把图上的80C52换成80C51,然后把程序#include "reg52.h"改成#include "reg51.h"就可以了吗?
回复

使用道具 举报

40#
ID:858779 发表于 2020-12-15 14:39 来自手机 | 只看该作者
锯齿波怎么改成上升的啊?
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表