基于51单片机+DAC0832的信号发生器

发布者:龙腾少年最新更新时间:2017-01-11 来源: eefocus关键字:51单片机  DAC0832  信号发生器 手机看文章 扫描二维码
随时随地手机看文章

最近帮别人设计一个毕业设计,做一个多种信号发生器(四种波形:方波、三角波、锯齿波、梯形波),现在贴上来给大家参考,如果有错误的地方,望指出~

下面先贴上仿真的电路图(仿真的软件是Protuse,上传一个大点的图,方便大家看的清楚点):

原件清单:STC89C52单片机X1、DAC0832转换器X1、12M晶振X1、电容22pfX2、10uf的电容X1、1nf陶瓷电容X1、独立按键X4、10千欧排阻X1、10KΩ电阻X5、LM358                 单电源运放X1。仿真就需要这些原件,具体的硬件设计大家定好了在制作~

下面上传一下C程序吧~(使用的IDE环境是Keil 4,语言是C语言)

Source文件(.c文件):

1\main.c文件:

 1 #include "reg52.h"

 2 #include "init.h"

 3 #include "single.h"

 4 #include "delay.h"

 5 #include "Key.h"

 6 int main(void)

 7 {

 8     unsigned char Model=0;//0-方波 1-三角波 2-锯齿波 3-正弦波

 9     unsigned int Count=0;//计数器

10     unsigned int Squ_Per=256;

11     unsigned int Tri_Per=256;

12     unsigned int Saw_Per=256;

13     unsigned int Sin_Per=256;

14     init();

15     while(1)

16     {

17         while(Model==0)

18         {    

19             Square_wave(Squ_Per,&Count);

20             Count+=4;

21             Squ_Per=Key_Plus(Squ_Per);

22             Squ_Per=Key_Subc(Squ_Per);

23             Model=Key_Model(Model,&Squ_Per,&Count);//每次退出当前while时记得复原Period和Count的数据

24         }    

25         while(Model==1)

26         {

27             Triangle_wave(Tri_Per,&Count);

28             Count+=4;

29             Tri_Per=Key_Plus(Tri_Per);

30             Tri_Per=Key_Subc(Tri_Per);

31             Model=Key_Model(Model,&Tri_Per,&Count);

32         }

33         while(Model==2)

34         {

35             Sawtooth_wave(Saw_Per,&Count);

36             Count+=4;

37             Saw_Per=Key_Plus(Saw_Per);

38             Saw_Per=Key_Subc(Saw_Per);

39             Model=Key_Model(Model,&Saw_Per,&Count);

40         }

41         while(Model==3)

42         {

43             Sin_wave(Sin_Per,&Count);

44             Count+=4;

45             Sin_Per=Key_Plus(Sin_Per);

46             Sin_Per=Key_Subc(Sin_Per);

47             Model=Key_Model(Model,&Sin_Per,&Count);

48         }

49     }

50      return 0;

51 }


2\init.c文件:



 1 #include "reg52.h"

 2 sbit CS_DAC=P1^5;//DAC0832的片选端口

 3 sbit WR_DAC=P1^6;//DAC0832的数据写入端口

 4 extern void init(void)

 5 {

 6     P0=0xff;

 7     P1=0xff;

 8     P2=0xff;

 9     P3=0xff;

10     CS_DAC=0;//一直片选中DAC0832,低电平有效啊~

11     WR_DAC=0;//一直写入数据到DAC0832

12 }


3\single.c文件



 1 #include "reg52.h"

 2 #include "single.h"

 3 #include "delay.h"

 4 #define DATA P0

 5 void Square_wave(unsigned int Per,unsigned int *Count)

 6 {

 7     if(*Count>=Per) *Count=0;

 8     if(*Count

 9     {

10         DATA=0x00;

11     }    

12     else

13     {

14         DATA=0xFF;

15     }

16 }

17 void Triangle_wave(unsigned int Per,unsigned int *Count)

18 {

19     if(*Count>=Per) *Count=0;

20     if(*Count

21     {

22         DATA=*Count;

23     }    

24     else

25     {

26         DATA=Per-*Count;

27     }    

28 }

29 void Sawtooth_wave(unsigned int Per,unsigned int *Count)

30 {

31     if(*Count>=Per) *Count=0;

32     if(*Count

33     {

34         DATA=*Count;

35     }        

36 }

37 void Sin_wave(unsigned int Per,unsigned int *Count)

38 {

39     if(*Count>Per) *Count=0;

40     if(*Count

41     {

42         DATA=*Count;

43     }    

44     else if(*Count==Per/2)

45     {

46         delay(100);    

47     }

48     else if(*Count

49     {

50         DATA=Per-*Count;

51     }    

52     else if(*Count==Per)

53     {

54         delay(100);

55     }

56 }


4\Key.c文件:


 1 #include "Key.h"

 2 #include "delay.h"

 3 sbit key2=P3^3;    //wave Change

 4 sbit key3=P3^4;    //Fre plus

 5 sbit key4=P3^5;    //Fre subc

 6 unsigned char Key_Model(unsigned char Model,unsigned int *Pre,unsigned int *Count)

 7 {

 8     if(key2==0)

 9     {

10         delay(10);

11         if(key2==0)

12         {

13             Model=Model+1;

14             *Pre=256;

15             *Count=0;    

16         }

17     }

18     while(key2==0);

19     if(Model>3)

20     {

21         Model=0;

22     }

23     return Model;

24 }

25 unsigned int Key_Plus(unsigned int Per)

26 {

27     if(key3==0)

28     {

29         delay(10);

30         if(key3==0)

31         {

32             Per=Per+8;    

33         }

34     }

35     while(key3==0);

36     if(Per>256)

37     {

38         Per=0;

39     }

40     return Per;        

41 }

42 unsigned int Key_Subc(unsigned int Per)

43 {

44     if(key4==0)

45     {

46         delay(10);

47         if(key4==0)

48         {

49             Per=Per-8;    

50         }

51     }

52     while(key4==0);

53     if(Per<0)

54     {

55         Per=256;

56     }

57     return Per;        

58 }


5\delay.c文件:



1 void delay(unsigned int r)

2 {

3  unsigned int i,j;

4  for(i=r;i>0;i--)

5   for(j=110;j>0;j--);

6 }


Header文件(.h文件):


1\init.h文件:


1 extern void init(void);

2\single.h文件:


1 void Square_wave(unsigned int Per,unsigned int *Count);

2 void Triangle_wave(unsigned int Per,unsigned int *Count);

3 void Sawtooth_wave(unsigned int Per,unsigned int *Count);

4 void Sin_wave(unsigned int Per,unsigned int *Count);

3\Key.h文件:


1 #include "reg52.h"

2 unsigned char Key_Model(unsigned char Model,unsigned int *Pre,unsigned int *Count);

3 unsigned int Key_Plus(unsigned int Per);

4 unsigned int Key_Subc(unsigned int Per);

4\delay.h文件:


1 #include

2 void delay(unsigned int r);

3 #define NOP() _nop_()


所用的工程文件我都已经上传喽~,下面来看看仿真的结果:(大家在电路设计的时候可以进行一下滤波处理,然后对信号进行放大处理,这样的话效果可能会更好点哦~)

                 方波:                                        三角波:                                           锯齿波:                                   梯形波:

大家转载请注明出处!谢谢!

在这里要感谢GISPALAB实验室的各位老师和学长学姐的帮助!谢谢~

 

大家注意下,电路有个小问题,由于本人的失误,DAC0832的Iout1和Iout2的输出接口的接法应该按如下的接入方式:

需要修改的地方有:

1、电源改成双电源

2、Iout接口需要接地

修改完毕之后的结果就会比较完美了,下面上传一个三角波的波形

感谢GISPALAB实验室的老师和同学们的帮助和支持~


关键字:51单片机  DAC0832  信号发生器 引用地址:基于51单片机+DAC0832的信号发生器

上一篇:51单片机串口收发设计的思考
下一篇:单片机DA转换实现正弦波

推荐阅读最新更新时间:2024-03-16 15:30

51单片机 中断1中断整体介绍
简单介绍-- _ :51单片机上的应用 _ :MCS51的中断源 外部中断请求源:即外部中断0 和1,经由外部引脚引入,在单片机上有两个引脚,外称为INT0、INT1,也就是P3.2、P3.3这两个引脚 _ :MCS51的中断向量表 单片机内部的中断模块在每个CPU周期都查询各个中断源的状态,当其发生预期的中断事件时,通知CPU将程序跳转到中断服务程序所在的程序存储器(ROM)地址。该地址称为中断向量。 中断的实质仍然是查询,只是不需要用户程序查询,不占用CPU运行时间而已。 51系列只有5个中断向量,5X系列还增加一个定时器2的中断向量 地址
[单片机]
<font color='red'>51单片机</font> 中断1中断整体介绍
基于51单片机的霍尔自行车里程测速仪
一.硬件方案 以 51 单片机为核心,A44E 霍尔传感器测转数,实现对自行车里程/速度的测量统计,采用 数码管实时显示自行车的里程数及速度。利用霍尔元件将自行车每转一圈的脉冲数传入单片机系统,然后单片机系统将信号经过处理送显示。 主要由51单片机+最小系统+霍尔传感器+数码管+三极管+lm393+LED指示灯模块+按键;如图: 二.设计功能 (1)51单片机作为控制核心,驱动显示模块,驱动按键模块等,并利用霍尔传感器与磁铁获取脉冲信号。 (2)4位共阳数码管为速度,距离显示模块,速度单位为 km/h,距离单位是 km。 (3)设有一个按键来切换显示速度和距离。 三.设计原理图 原理图主要采用AD软件进行设计,如图:
[单片机]
基于<font color='red'>51单片机</font>的霍尔自行车里程测速仪
基于51单片机的编码译码显示实验电路设计
0 引言 在日常数字逻辑电路实验中编码译码显示实验电,路是编码、译码、显示三个电路的综合运用,在数字逻辑实验电路中具有重要的地位,在实验的过程中,时常会出现显示结果的抖动,经研究出现这种现象主要原因是:编码电路的编码信号输入采用手工拨盘方式,产生的编码输入信号往往不稳定;另外,电路控制性能较差,不能达到自动复位,为此有必要对现有电路进行改进,在电路的设计上采用89C51单片机为控制电路制作而成,自动提供稳定编码输入信号,显示结果稳定性和电路控制性能大大提升,提高了教学实验质量。 1 编码译码显示实验电路的基本结构 编码译码显示电路的基本结构如图1所示,主要由控制电路、编码信号发生器、编码译码显示电路等组成,控制电路产生编
[单片机]
基于<font color='red'>51单片机</font>的编码译码显示实验电路设计
MCS-51单片机的结构及特点
单片机(MICROCONTROLLER,又称微控制器)是在一块硅片上集成了各种部件的微型机算计,这些部件包括中央处理器CPU、数据存贮器RAM、程序存贮器ROM、定时器/计数器和多种I/O接口电路。 MCS-51单片机的基本结构如图所示。 51系列单片机结构特点: l 8位CPU; l 片内振荡器及时钟电路; l 32根I/O线; l 外部存贮器寻址范围ROM、RAM各64K; l 3个l6位的定时器/计数器; l 5个中断源,2个中断优先级; l 全双工串行口; l 布尔处理器。
[单片机]
MCS-<font color='red'>51单片机</font>的结构及特点
基于51单片机实现模拟IIC总线时序
最近用到测量光线的模块BH1750FVI时需要用到IIC总线操作, 于是就又费功夫学习了下, 基本上算是了解了, 所以呢, 就用51的IO口, 模拟出了总线时序, 并能正确操纵需要用IIC总线访问地一系列模块. 本来想写篇文章简单介绍下我对IIC总线的理解的, 但, 发现没工夫, 所以, 放在以后有时候再来弄吧. 今天我还是只给出一个范例程序, 它能在我的51单片机机系统上工作得很好. iic.h 列出了所有IIC总线的操作函数. 下面给出源代码: //iic.h - 实现相关的头文件 //女孩不哭 2013-01-18 #ifndef __IIC_H__ #define __IIC_H__ void iic_start(
[单片机]
AT89C51单片机高速串行输出口设计
    摘要: 介绍使用AT89C51单片机扩展高速串行同步移位输出口的方法,给出基于分立TTL元器件和可编程逻辑器件PLD两种电路的实现方案,在LED点阵显示屏系统中已得到应用。     关键词: 串行口 单片机 可编程逻辑器件 AT89C51(与MCS-51兼容)单片机的串行口在方式0工作状态下,使用移位寄存器芯片可以扩展多个8位并行I/O口。在LED点阵显示屏应用系统中,一般都采用数据同步移位输出方式,并使用移位寄存器芯片(如74LS595)扩展并行I/O口驱动LED点阵显示。LED点阵显示采用扫描方式,为不产生闪烁感,每秒需要传送50屏点阵显示数据,因此有大量的数据要通过同步移位的方式送到显示驱动电路部
[应用]
80C51单片机对压力测量控制系统的设计
1 引言 目前我国发展煤炭生产机械化发展迅速。综采设备的应用,是提高效率、改善安全状况的措施。 影响开机率的一个主要因素是支架对工作面的顶板控制的好坏,因此,对综采工作面进行矿压监测与控制是很有必要的。要做到这一点,首先需要对井下工作面的液压支架的实际工作状况进行监测,通过对检测数据处理、分析,评定其效果,并采取相应措施,以提高开机率、提高产量。本文以监测综采液压支架的压力为研究内容,开发了一套基于单片机的压力测量控制系统。 2 压力测量控制系统功能设计 压力测量控制系统用于监测支架压力, 每台测量控制系统配有四只传感器, 可分别通过高压油管连接支架的立柱、平衡千斤顶, 前探梁千斤顶的油压腔。压力测量控制系统接收到通讯测量
[单片机]
80C<font color='red'>51单片机</font>对压力测量控制系统的设计
C51单片机学习笔记(一)——搭建开发环境及烧写工具
1.搭建软件开发环境及使用(Keil uVision) 目前常用的有Keil uVision2、Keil uVision3、Keil uVision4,这些软件可以很方便的在网络上下载,我这里使用的是Keil uVision4. ** 1. 创建一个工程:(以点亮一个发光二极管为例) 菜单点击Project - New uVision Project ,给工程命名、选择储存位置然后保存 选芯片,根据自己的单片机型号选择对应的芯片,我使用的是AT89C52 之后弹出 是否将系统自带的初始化文件添加到工程?一般选择是,这是主界面左边Project面板会显示新建的工程。 新建源程序文件 点击File - New ,在软件
[单片机]
C<font color='red'>51单片机</font>学习笔记(一)——搭建开发环境及烧写工具
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved