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

下面先贴上仿真的电路图(仿真的软件是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文件:

 #include "reg52.h"
#include "init.h"
#include "single.h"
#include "delay.h"
#include "Key.h"
int main(void)
{
unsigned char Model=;//0-方波 1-三角波 2-锯齿波 3-正弦波
unsigned int Count=;//计数器
unsigned int Squ_Per=;
unsigned int Tri_Per=;
unsigned int Saw_Per=;
unsigned int Sin_Per=;
init();
while()
{
while(Model==)
{
Square_wave(Squ_Per,&Count);
Count+=;
Squ_Per=Key_Plus(Squ_Per);
Squ_Per=Key_Subc(Squ_Per);
Model=Key_Model(Model,&Squ_Per,&Count);//每次退出当前while时记得复原Period和Count的数据
}
while(Model==)
{
Triangle_wave(Tri_Per,&Count);
Count+=;
Tri_Per=Key_Plus(Tri_Per);
Tri_Per=Key_Subc(Tri_Per);
Model=Key_Model(Model,&Tri_Per,&Count);
}
while(Model==)
{
Sawtooth_wave(Saw_Per,&Count);
Count+=;
Saw_Per=Key_Plus(Saw_Per);
Saw_Per=Key_Subc(Saw_Per);
Model=Key_Model(Model,&Saw_Per,&Count);
}
while(Model==)
{
Sin_wave(Sin_Per,&Count);
Count+=;
Sin_Per=Key_Plus(Sin_Per);
Sin_Per=Key_Subc(Sin_Per);
Model=Key_Model(Model,&Sin_Per,&Count);
}
}
return ;
}

2\init.c文件:

 #include "reg52.h"
sbit CS_DAC=P1^;//DAC0832的片选端口
sbit WR_DAC=P1^;//DAC0832的数据写入端口
extern void init(void)
{
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
CS_DAC=;//一直片选中DAC0832,低电平有效啊~
WR_DAC=;//一直写入数据到DAC0832
}

3\single.c文件

 #include "reg52.h"
#include "single.h"
#include "delay.h"
#define DATA P0
void Square_wave(unsigned int Per,unsigned int *Count)
{
if(*Count>=Per) *Count=;
if(*Count<Per/)
{
DATA=0x00;
}
else
{
DATA=0xFF;
}
}
void Triangle_wave(unsigned int Per,unsigned int *Count)
{
if(*Count>=Per) *Count=;
if(*Count<Per/)
{
DATA=*Count;
}
else
{
DATA=Per-*Count;
}
}
void Sawtooth_wave(unsigned int Per,unsigned int *Count)
{
if(*Count>=Per) *Count=;
if(*Count<Per)
{
DATA=*Count;
}
}
void Sin_wave(unsigned int Per,unsigned int *Count)
{
if(*Count>Per) *Count=;
if(*Count<Per/)
{
DATA=*Count;
}
else if(*Count==Per/)
{
delay();
}
else if(*Count<Per)
{
DATA=Per-*Count;
}
else if(*Count==Per)
{
delay();
}
}

4\Key.c文件:

 #include "Key.h"
#include "delay.h"
sbit key2=P3^; //wave Change
sbit key3=P3^; //Fre plus
sbit key4=P3^; //Fre subc
unsigned char Key_Model(unsigned char Model,unsigned int *Pre,unsigned int *Count)
{
if(key2==)
{
delay();
if(key2==)
{
Model=Model+;
*Pre=;
*Count=;
}
}
while(key2==);
if(Model>)
{
Model=;
}
return Model;
}
unsigned int Key_Plus(unsigned int Per)
{
if(key3==)
{
delay();
if(key3==)
{
Per=Per+;
}
}
while(key3==);
if(Per>)
{
Per=;
}
return Per;
}
unsigned int Key_Subc(unsigned int Per)
{
if(key4==)
{
delay();
if(key4==)
{
Per=Per-;
}
}
while(key4==);
if(Per<)
{
Per=;
}
return Per;
}

5\delay.c文件:

 void delay(unsigned int r)
{
unsigned int i,j;
for(i=r;i>;i--)
for(j=;j>;j--);
}

Header文件(.h文件):

1\init.h文件:

 extern void init(void);

2\single.h文件:

 void Square_wave(unsigned int Per,unsigned int *Count);
void Triangle_wave(unsigned int Per,unsigned int *Count);
void Sawtooth_wave(unsigned int Per,unsigned int *Count);
void Sin_wave(unsigned int Per,unsigned int *Count);

3\Key.h文件:

 #include "reg52.h"
unsigned char Key_Model(unsigned char Model,unsigned int *Pre,unsigned int *Count);
unsigned int Key_Plus(unsigned int Per);
unsigned int Key_Subc(unsigned int Per);

4\delay.h文件:

 #include <intrins.h>
void delay(unsigned int r);
#define NOP() _nop_()

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

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

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

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

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

需要修改的地方有:

1、电源改成双电源

2、Iout接口需要接地

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

基于51单片机+DAC0832的信号发生器的更多相关文章

  1. ET 与RETI 基于51单片机中断跳出指令“RETI”浅议

    最近在基于51单片机编程的过程中出现了个很奇怪的问题“程序执行中在寄存器EA=1,ET0=1,TR0=1条件下,单TF0=1时并没有执行中断”.在有过单片机中断编程经历者都知道当EA=1,ET0=1的 ...

  2. 基于51单片机IIC通信的PCF8591学习笔记

    引言 PCF8591 是单电源,低功耗8 位CMOS 数据采集器件,具有4 个模拟输入.一个输出和一个串行I2C 总线接口.3 个地址引脚A0.A1 和A2 用于编程硬件地址,允许将最多8 个器件连接 ...

  3. 基于51单片机个LCD1602的万年历程序

    小白 第一次跟新博客 基于51单片机和LCD1602的万年历程序 可实现走时和调时功能 有简单的1602菜单制作 欢迎大家交流 LCD1602和51单片机的连接方法 RS = P3^5; //数据/命 ...

  4. 基于51单片机的CAN通讯协议C语言程序

      //-----------------------函数声明,变量定义-------------------------------------------------------- #includ ...

  5. 基于51单片机IIC通信的AT24C02学习笔记

    引言 最近在学习几种串行通信协议,感觉收获很多,这篇文章是学习IIC总线协议的第一篇文章,以后还会再写一篇关于PCF8591 IIC通信的ADDA转换芯片的文章. 关于IIC总线 IIC 即Inter ...

  6. 3.7 基于51单片机+MC20的路径显示【使用STC15W内核】

    需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ...

  7. ESP8266 AT指令开发(基于STC89C52单片机): 测试下诱人的程序(51单片机,8266,MQTT远程通信控制)

    前言 实现的功能,APP通过SmartConfig给Wi-Fi模块配网并绑定设备,然后通过MQTT远程控制开发板的继电器, 简而言之: 51单片机+ESP8266用AT指令实现实现MQTT,(连接的本 ...

  8. 一种基于C51单片机的非抢占式的操作系统架构

    摘 要:从Keil C51的内存空间管理方式入手,着重讨论实时操作系统在任务调度时的重入问题,分析一些解决重入的基本方式与方法:分析实时操作系统任务调度的占先性,提出非占先的任务调度是能更适合于Kei ...

  9. 单片机课程设计——《基于AT89S52单片机和DS1302时钟芯片的电子时钟(可蓝牙校准)》

    引言 本设计以AT89S52单片机为控制核心,时钟芯片DS1302提供时钟源,配合LCD1602液晶显示模块,组成基本硬件系统,同时利用HC-05嵌入式蓝牙串口通讯模块,可在手机端进行日期.时间的校准 ...

随机推荐

  1. 循序渐进开发WinForm项目(1) --数据库设计和项目框架的生成

    随笔背景:在很多时候,很多入门不久的朋友都会问我:我是从其他语言转到C#开发的,有没有一些基础性的资料给我们学习学习呢,你的框架感觉一下太大了,希望有个循序渐进的教程或者视频来学习就好了. 其实也许我 ...

  2. SQLServer获取临时表所有列名或是否存在指定列名的方法

    获取临时表中所有列名 select name from tempdb.dbo.syscolumns where id=object_id( '#TempTB') 判断临时表中是否存在指定列名 if c ...

  3. 重新想象 Windows 8 Store Apps (48) - 多线程之其他辅助类: SpinWait, SpinLock, Volatile, SynchronizationContext, CoreDispatcher, ThreadLocal, ThreadStaticAttribute

    [源码下载] 重新想象 Windows 8 Store Apps (48) - 多线程之其他辅助类: SpinWait, SpinLock, Volatile, SynchronizationCont ...

  4. ActiveReports 报表应用教程 (7)---交叉报表及数据透视图实现方案

    在 ActiveReports 中可以通过矩阵控件非常方便的实现交叉报表,同时还可以设置数据的分组.排序.过滤.小计.合计等操作,可以满足您报表的智能数据分析等需求.在矩阵控件中组的行数和列数由每个行 ...

  5. webservice 原理

    webservice 原理1.soap协议,其实就是用http协议来传输xml格式的数据,可以post,get.一般有post.2.服务端有:本地程序代码(也不是dll)和xml格式的文件用来描述dl ...

  6. POSTMAN and HTTPie to test APIs

    http://blog.mashape.com/postman-httpie-test-apis/ We love working with APIs at Mashape, and we love ...

  7. ahjesus 安装mongodb企业版for ubuntu

    导入共匙 sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10 创建源列表 echo 'deb http ...

  8. phpcms—— 内容中的附件调用和添加远程地址的调用

    phpcms中几个地址调用的方法 1,CSS路径有{CSS_PATH}2,图片路径有{IMG_PATH}3,JS路径有{JS_PATH} 4,那么附件的路径如何调用,使用下面的方式可以得到附件的路径前 ...

  9. ASP.NET Web API 通过Authentication特性来实现身份认证

    using System; using System.Collections.Generic; using System.Net.Http.Headers; using System.Security ...

  10. [译] 第三十天:Play Framework - Java开发者梦寐以求的框架 - 百花宫

    前言 30天挑战的最后一天,我决定学习 Play Framework .我本来想写Sacla,但是研究几个小时后,我发现没法在一天内公正评价Scala,下个月花些时间来了解并分享经验.本文我们先来看看 ...