找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机DAC0832波形发生器实验报告

  [复制链接]
跳转到指定楼层
楼主
一个能产生正弦波、方波、三角波、梯形波、锯齿波的波形发生器。
基本实现:5个按键,每按一次按键后输出对应波形
                5个led指示对应波形
                示波器中显示2~3个周期波形时,正弦波波形要光滑              
                双极性电压输出,电压幅值可调.
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

实验报告
实验名称:波形发生器
班级:应物142
小组成员:董世豪 谢士辉 孙志伟 赵辉 孙豪

单片机实验——DA转换实验

DA转换器是将数字量转换为模拟量的电路,主要用于数据传输系统、自动测试设备、医疗信息处理、电视信号的数字化、图像信号的处理和识别、数字通信和语音信息处理等。按数字量输入方式:并行输入和串行输入DA转换器。按模拟量输出方式:电流输出和电压输出DA转换器。按DA转换的分辩率:低分辩率、中分辩率和高分辩率DA转换器。学习并熟悉如何设置DA转换对于科学研究等将产生重要影响。

1实验目的

  • 了解常用DA转换芯片的结构组成,工作原理。
  • 掌握DAC0832引脚功能,与单片机连接
  • 理解单、双极输出方式的电路结构原理,学会用这两种方式。
      ( 4 )  设计一个能产生正弦波、方波、三角波、梯形波、锯齿波的波形发生器。

2 D/A转换器工作原理

任D/A是将数字量转换成模拟量的器件,D/A的输出是电压或电流信号。衡量D/A性能的主要参数是:

分辨率:即输出模拟量的最小变化量。
满刻度误差:即输入为全1时,实际输出电压与理想值之差。
输出范围
转换时间:从转换器的输入改变到输出稳定的时间间隔。
是否容易与CPU接口。
3 DAC0832工作方式
DAC0832三种工作方式
  • 单缓冲方式:若应用系统中只有一路D/A转换或虽然有夺路转换,并不要求各路信号同步输出,则采用单缓冲的方式来接口。方法是:使锁存器和DAC寄存器同时接收数据。
  • 双缓冲方式:当多路D/A信号要求同步输出,则采用双缓冲方式。方法是:分别使其输入锁存器接收数据;同时传送数据到其DAC寄存器,以实现多路转换同步输出。
  • 直通方式:所有控制信号均有效,适宜连续控制时。

D/A转换

D/A芯片DAC0832的应用:DAC0832是8位              D/A芯片,片内带数据锁存器,电流输出。该系列产品包括DAC0830——32,它们可以完全相互代换。它由8位输入锁存器、8位DAC寄存器、8位D/A转换电路及转换控制电路组成

ADC0808引脚如图,各引脚功能如下:

  • DI0-DI7:数据输入线,TLL电瓶
  • ILE数据锁存允许控制信号输入线,高电平有效。
  • CS片选信号输入线,低电平有效。
  • WR1:为输入寄存器的写选通信号。
  • XFER数据传送控制信号输入线,低电平有效。
  • WR2DAC寄存器写选通输入线。
  • Iout1电流输出线。当输入全为1Iout1最大
  • Iout2电流输出线。其值与Iout1之和为常数。
  • Rfb:反馈信号输入线,芯片内部有反馈电阻。
  • Vcc:电源输入线(+5v~+15v
  • Vref:基准电压输入线-10v~+10v
  • AGND模拟地,模拟信号和基准信号参考
  • DGND数字地,两种地线在基准电源处共地比较好。
  • 主要功能电路
4.0 电路图

4.1转换电路


4.2波形指示


4.3按键电路


4.4单片机电路

  




4.5 运行结果

三角形
方波
锯齿波
梯形波
正弦波

5. 总结

方波拟合成功,其他波形拟合存在问题。


单片机源程序如下:
  1. #include "reg52.h"
  2. #include <math.h>

  3. #define ADC_PORT P2 //如图,ADC0832连接端口

  4. //老师要求的5种波
  5. #define W_SINE 0
  6. #define W_SQU 1
  7. #define W_TRI 2
  8. #define W_TRA 3
  9. #define W_SAW 4

  10. #define PI 3.1415926f //圆周率好像是这个数

  11. //简化类型符写法
  12. typedef unsigned char u8;
  13. typedef unsigned int u16;
  14. typedef unsigned long u32;

  15. sbit ADC_CS_WR=P3^0; //如图,ADC0832使能口

  16. //老师要求的5个LED,接P0口
  17. sbit LED0=P0^0;
  18. sbit LED1=P0^1;
  19. sbit LED2=P0^2;
  20. sbit LED3=P0^3;
  21. sbit LED4=P0^4;

  22. //图给出的5个按键
  23. sbit KEY0=P1^0;
  24. sbit KEY1=P1^1;
  25. sbit KEY2=P1^2;
  26. sbit KEY3=P1^3;
  27. sbit KEY4=P1^4;

  28. //全局变量
  29. u8 mode;//模式:正弦波……
  30. u16 freq;//频率
  31. u8 time;//计次参数
  32. u8 AM;//调幅


  33. void Timer0Init(void);
  34. void scanKey(void);
  35. void sys_init(void);

  36. void sine_wave(u8 location);//正弦波
  37. void squ_wave(u8 location);//方……
  38. void tri_wave(u8 location);//三……
  39. void tra_wave(u8 location);//梯……
  40. void saw_wave(u8 location);//锯……

  41. void Timer0Init(void)                //100微秒@12.000MHz
  42. {
  43.         TMOD &= 0xF0;                //设置定时器模式
  44.         TMOD |= 0x02;                //设置定时器模式
  45.         TL0 = 0x9C;                //设置定时初值
  46.         TH0 = 0x9C;                //设置定时重载值
  47.         TF0 = 0;                //清除TF0标志
  48.         TR0 = 1;                //定时器0开始计时
  49.         EA = 1;         //开总中断
  50.         ET0 = 1;        //开定时器0中断
  51. }

  52. void scanKey(void)//按键扫描
  53. {
  54.         if(KEY0==0)
  55.         {
  56.                 mode=0;
  57.                 P0=0xFF;//灭所有灯
  58.                 LED0=0;
  59.         }
  60.         
  61.         if(KEY1==0)
  62.         {
  63.                 mode=1;
  64.                 P0=0xFF;//灭所有灯
  65.                 LED1=0;
  66.         }
  67.         
  68.         if(KEY2==0)
  69.         {
  70.                 mode=2;
  71.                 P0=0xFF;//灭所有灯
  72.                 LED2=0;
  73.         }
  74.         
  75.         if(KEY3==0)
  76.         {
  77.                 mode=3;
  78.                 P0=0xFF;//灭所有灯
  79.                 LED3=0;
  80.         }
  81.         
  82.         if(KEY4==0)
  83.         {
  84.                 mode=4;
  85.                 P0=0xFF;//灭所有灯
  86.                 LED4=0;
  87.         }
  88. }

  89. void sys_init(void)//系统初始化
  90. {
  91.         time=0;
  92.         ADC_CS_WR=0;
  93.         ADC_PORT=0;
  94.         mode=0;//默认输出正弦波
  95.         freq=100;//默认频率100Hz
  96.         AM=255;//最大幅度
  97. }
  98. void sine_wave(u8 location)//输出正弦波
  99. {
  100.         double x=(double)location/50*PI;//把0-100放缩到0-2派(pai,没有那个符号,好难受(╯﹏╰))
  101.         u8 y=(sin(x)*(AM/2)+(AM/2));//算出y,并放缩到0-254(因为ADC范围0-AM,感觉这个芯片好落后)
  102.         ADC_PORT=y;
  103. }

  104. void squ_wave(u8 location)//方……
  105. {
  106.         if(location<50)
  107.                 ADC_PORT=AM;
  108.         else
  109.                 ADC_PORT=0x0;//这个好简单
  110. }

  111. void tri_wave(u8 location)//三……
  112. {
  113.         //为了简化,在单周期输出V字形
  114.         u8 y;
  115.         if(location<50)
  116.                 y=(50-location)*AM/50;
  117.         else
  118.                 y=(location-50)*AM/50;
  119.         ADC_PORT=y;
  120.         //偶函数,信不?当然你说奇函数也没错
  121. }
  122. void tra_wave(u8 location)//梯……
  123. {
  124.         u8 y;
  125.         if(location<25)
  126.                 y=0xFF;
  127.         else if(location<50)
  128.                 y=(50-location)*AM/25;
  129.         else if(location<75)
  130.                 y=0;
  131.         else
  132.                 y=(location-75)*AM/25;
  133.         ADC_PORT=y;
  134. }
  135. void saw_wave(u8 location)//锯……
  136. {
  137.         ADC_PORT=location*AM/100;
  138.         //用(100-location)也以变成反向锯齿
  139. }

  140. void Timer0Work() interrupt 1 //中断服务函数
  141. {
  142.         switch(mode)
  143. ……………………

  144. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


所有资料51hei提供下载:
323 实验三波形发生器.rar (673.88 KB, 下载次数: 816)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:350855 发表于 2018-6-13 09:44 | 只看该作者
谢谢楼主分享...............
回复

使用道具 举报

板凳
ID:352835 发表于 2018-6-16 12:58 | 只看该作者
求楼主分享
回复

使用道具 举报

地板
ID:358283 发表于 2018-6-27 11:02 | 只看该作者
不错 兄嘚
回复

使用道具 举报

5#
ID:360600 发表于 2018-6-27 21:52 | 只看该作者
挺不错的
回复

使用道具 举报

6#
ID:360600 发表于 2018-6-27 21:52 | 只看该作者

求楼主分享
回复

使用道具 举报

7#
ID:375744 发表于 2018-7-20 12:32 来自手机 | 只看该作者
兄弟,波形失真了
回复

使用道具 举报

8#
ID:396289 发表于 2018-10-8 22:54 | 只看该作者
123521 发表于 2018-7-20 12:32
兄弟,波形失真了

怎么更改呢??
回复

使用道具 举报

9#
ID:396289 发表于 2018-10-8 22:55 | 只看该作者
怎么更改呢??
回复

使用道具 举报

10#
ID:234325 发表于 2018-10-9 09:15 | 只看该作者
mark            
回复

使用道具 举报

11#
ID:313328 发表于 2018-12-4 17:06 | 只看该作者
非常实用,感谢分享
回复

使用道具 举报

12#
ID:459429 发表于 2019-1-1 17:31 | 只看该作者
感谢大佬的奉献
回复

使用道具 举报

13#
ID:496232 发表于 2019-3-22 16:25 | 只看该作者
感谢大佬的奉献
回复

使用道具 举报

14#
ID:497439 发表于 2019-3-24 19:44 | 只看该作者
感谢大佬,非常有用
回复

使用道具 举报

15#
ID:498267 发表于 2019-3-25 21:30 | 只看该作者
谢谢楼主分享!
回复

使用道具 举报

16#
ID:521459 发表于 2019-4-25 15:51 | 只看该作者
感谢楼主分享
回复

使用道具 举报

17#
ID:434140 发表于 2019-5-26 09:46 来自手机 | 只看该作者
真好!非常感谢
回复

使用道具 举报

18#
ID:148472 发表于 2019-5-28 13:55 | 只看该作者
波形失真了怎么处理啊?
回复

使用道具 举报

19#
ID:550238 发表于 2019-5-29 15:44 | 只看该作者
优秀,我咋没想出来
回复

使用道具 举报

20#
ID:574286 发表于 2019-6-28 19:32 | 只看该作者
感谢大佬的贡献。
回复

使用道具 举报

21#
ID:631363 发表于 2019-10-28 13:46 | 只看该作者
感谢楼主分享
回复

使用道具 举报

22#
ID:635139 发表于 2019-11-6 23:11 | 只看该作者
感谢大佬
回复

使用道具 举报

23#
ID:635578 发表于 2019-11-29 10:35 | 只看该作者
电压幅值怎么调
回复

使用道具 举报

24#
ID:757987 发表于 2020-5-30 15:39 | 只看该作者
楼主的程序教教我怎么写?
回复

使用道具 举报

25#
ID:500754 发表于 2020-5-30 16:34 | 只看该作者
感谢楼主分享 受益匪浅
回复

使用道具 举报

26#
ID:765220 发表于 2020-5-30 18:09 | 只看该作者
不错啊兄弟
回复

使用道具 举报

27#
ID:722746 发表于 2020-5-30 18:09 | 只看该作者
上边5月30那两人,咱是不是一个师傅哇
回复

使用道具 举报

28#
ID:783409 发表于 2020-6-18 16:50 | 只看该作者

感谢楼主分享
回复

使用道具 举报

29#
ID:785181 发表于 2020-6-21 10:45 | 只看该作者
大佬牛皮
回复

使用道具 举报

30#
ID:890152 发表于 2021-3-12 02:14 来自手机 | 只看该作者
感谢!学到了
回复

使用道具 举报

31#
ID:857072 发表于 2021-4-24 08:52 来自手机 | 只看该作者
老哥这正弦波能拟合到多高频率
回复

使用道具 举报

32#
ID:952005 发表于 2021-7-12 09:14 | 只看该作者
楼主,请问void sine_wave(u8 location);这个函数后面的括号里定义的location是啥意思
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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