单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12134|回复: 39
收起左侧

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

  [复制链接]
362443451 发表于 2018-12-16 22:02 | 显示全部楼层 |阅读模式
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
YXET8491D``DG04T8}3BH40.png
一、设计要求
设计一个能产生方波、三角波、梯形波、锯齿波的波形发生器。
二、方案论证
方案 :利用单片机AT89C51编写程序,然后将产生信号通过DAC0832(数模转换器)转化成模拟信号,输入信号经运放电路后信号放大,低通滤波是输出的信号稳定不失真,通过四个按键来选择输出的波形。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
方案二:集成运算放大器应用于波形发生器。正弦波和非正弦波产生电路常常作为信号源,利用正弦波振荡电路(RC桥式正弦波振荡器)产生正弦波,用集成运放构成方波发生器和三角波发生器一般包括比较器和RC积分器。此方案实现起来比较复杂,对运算电路要有严格的分析,所需要的东西较多。
方案比较:采用方案一,该信号发生器具有体积小,价格低,性能稳定优点。

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



图3-3  DAC0832的引脚图

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


3.6系统总体结构图
0.png

四、电路仿真及仿真结果分析
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. }
复制代码



0.png


全部资料51hei下载地址:

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

评分

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

查看全部评分

回复

使用道具 举报

xiayan666 发表于 2018-12-18 21:47 | 显示全部楼层
为什么代码显示错误呢
回复

使用道具 举报

tieq1952 发表于 2018-12-19 08:18 | 显示全部楼层
谢谢分享!!!
回复

使用道具 举报

 楼主| 362443451 发表于 2018-12-19 22:02 | 显示全部楼层
xiayan666 发表于 2018-12-18 21:47
为什么代码显示错误呢

没有问题啊
回复

使用道具 举报

15738536901 发表于 2018-12-24 19:02 | 显示全部楼层
这个很给力,必须支持
回复

使用道具 举报

zzjay 发表于 2018-12-24 21:10 | 显示全部楼层
大神,我弄成功了,不胜感激
回复

使用道具 举报

yufei0734 发表于 2019-3-18 17:54 | 显示全部楼层
感谢, 下了这么多个,这套资料总算仿真成功,感谢楼主的贡献
回复

使用道具 举报

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

使用道具 举报

hey12345678 发表于 2019-4-13 18:28 | 显示全部楼层
可以,倾向于方案二
回复

使用道具 举报

vinformation 发表于 2019-4-23 22:59 | 显示全部楼层
我想问一下,有没有proteus的仿真电路图文件

回复

使用道具 举报

肖蠢蠢 发表于 2019-5-22 09:30 | 显示全部楼层
为什么我的不出结果呀
回复

使用道具 举报

肖蠢蠢 发表于 2019-5-22 10:25 | 显示全部楼层
好啦,是我自己的问题,谢谢楼主~~
回复

使用道具 举报

油菜花123 发表于 2019-5-23 16:24 | 显示全部楼层
我想问一下楼主如何改变三角波的频率
回复

使用道具 举报

夏尔64579 发表于 2019-6-3 15:06 来自手机 | 显示全部楼层
请问楼主这是双极性输出吗?我看电路图好像单极性电压输出啊?
回复

使用道具 举报

xiehua 发表于 2019-6-3 15:45 | 显示全部楼层
您好,如果要在同一个图中显示方波正弦波等该怎么改
回复

使用道具 举报

小鹿LY 发表于 2019-6-18 18:14 | 显示全部楼层
楼主,这个梯形波怎改了频率为130HZ 之后,波形就不对了,应该怎么修改啊
回复

使用道具 举报

491989986 发表于 2019-7-3 17:36 来自手机 | 显示全部楼层
压缩文件损坏
回复

使用道具 举报

51hei团团 发表于 2019-7-3 23:35 | 显示全部楼层

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

使用道具 举报

1294081095 发表于 2019-9-2 15:42 | 显示全部楼层
谢谢分享
回复

使用道具 举报

15816798481 发表于 2019-10-1 09:18 来自手机 | 显示全部楼层
谁能告诉下这个lm324怎么接+-10v电压
回复

使用道具 举报

123kk321kk 发表于 2019-10-22 18:12 | 显示全部楼层
为啥我的波形显示不对?
回复

使用道具 举报

BT馒头 发表于 2019-12-12 16:25 | 显示全部楼层
谢谢楼主666
回复

使用道具 举报

sijie 发表于 2019-12-13 08:32 | 显示全部楼层
肖蠢蠢 发表于 2019-5-22 10:25
好啦,是我自己的问题,谢谢楼主~~

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

使用道具 举报

我可不会at89s52 发表于 2019-12-24 19:25 | 显示全部楼层
做的真好,按键设计很合理
回复

使用道具 举报

bhk4 发表于 2020-2-25 14:13 | 显示全部楼层
楼主 我的为什么不显示结果呢
回复

使用道具 举报

bhk4 发表于 2020-2-25 14:15 | 显示全部楼层
肖蠢蠢 发表于 2019-5-22 10:25
好啦,是我自己的问题,谢谢楼主~~

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

使用道具 举报

源歌 发表于 2020-3-20 21:08 | 显示全部楼层
肖蠢蠢 发表于 2019-5-22 10:25
好啦,是我自己的问题,谢谢楼主~~

怎么搞,我的也不出
回复

使用道具 举报

YDYQ 发表于 2020-4-8 16:16 | 显示全部楼层
那正弦波呢
回复

使用道具 举报

kaikaikai 发表于 2020-5-1 01:15 | 显示全部楼层
楼主我想问下编写各个函数时的具体思想
回复

使用道具 举报

马梦圆 发表于 2020-5-2 12:48 | 显示全部楼层
楼主可以联系你吗
回复

使用道具 举报

马梦圆 发表于 2020-5-2 13:12 | 显示全部楼层
楼主有STM32版本的发生器设计吗
回复

使用道具 举报

二一二 发表于 2020-5-23 18:06 | 显示全部楼层

同问
回复

使用道具 举报

swustlx86 发表于 2020-5-30 13:43 | 显示全部楼层
感谢分享
回复

使用道具 举报

fssst 发表于 2020-6-8 14:30 | 显示全部楼层
谢谢分享
回复

使用道具 举报

墨二火 发表于 2020-6-10 08:51 | 显示全部楼层
QAQ为啥我没找到仿真
回复

使用道具 举报

算术平均数 发表于 2020-6-10 11:24 | 显示全部楼层
请问有没有用DAC0832控制直流电机调速的啊?
回复

使用道具 举报

145614586 发表于 2020-6-11 09:44 | 显示全部楼层
我也出不了波形救济孩子
回复

使用道具 举报

3232966108 发表于 2020-6-15 22:40 | 显示全部楼层
请问正弦波函数怎么写呢?
回复

使用道具 举报

小宇宙88 发表于 2020-6-24 18:59 来自手机 | 显示全部楼层
如果弄硬件的话,可以成功吗
回复

使用道具 举报

Jeff_BlindCat 发表于 2020-6-27 13:49 | 显示全部楼层
这个要好好学习下,谢谢分享。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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