基于51单片机+DAC0832的信号发生器
2016-05-25 22:45
302 查看
最近帮别人设计一个毕业设计,做一个多种信号发生器(四种波形:方波、三角波、锯齿波、梯形波),现在贴上来给大家参考,如果有错误的地方,望指出~
下面先贴上仿真的电路图(仿真的软件是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文件:
2\init.c文件:
3\single.c文件
4\Key.c文件:
5\delay.c文件:
Header文件(.h文件):
1\init.h文件:
2\single.h文件:
3\Key.h文件:
4\delay.h文件:
所用的工程文件我都已经上传喽~,下面来看看仿真的结果:(大家在电路设计的时候可以进行一下滤波处理,然后对信号进行放大处理,这样的话效果可能会更好点哦~)
方波: 三角波: 锯齿波: 梯形波:
大家转载请注明出处!谢谢!
在这里要感谢GISPALAB实验室的各位老师和学长学姐的帮助!谢谢~
大家注意下,电路有个小问题,由于本人的失误,DAC0832的Iout1和Iout2的输出接口的接法应该按如下的接入方式:
需要修改的地方有:
1、电源改成双电源
2、Iout接口需要接地
修改完毕之后的结果就会比较完美了,下面上传一个三角波的波形
下面先贴上仿真的电路图(仿真的软件是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;//0-方波 1-三角波 2-锯齿波 3-正弦波 unsigned int Count=0;//计数器 unsigned int Squ_Per=256; unsigned int Tri_Per=256; unsigned int Saw_Per=256; unsigned int Sin_Per=256; init(); while(1) { while(Model==0) { Square_wave(Squ_Per,&Count); Count+=4; Squ_Per=Key_Plus(Squ_Per); Squ_Per=Key_Subc(Squ_Per); Model=Key_Model(Model,&Squ_Per,&Count);//每次退出当前while时记得复原Period和Count的数据 } while(Model==1) { Triangle_wave(Tri_Per,&Count); Count+=4; Tri_Per=Key_Plus(Tri_Per); Tri_Per=Key_Subc(Tri_Per); Model=Key_Model(Model,&Tri_Per,&Count); } while(Model==2) { Sawtooth_wave(Saw_Per,&Count); Count+=4; Saw_Per=Key_Plus(Saw_Per); Saw_Per=Key_Subc(Saw_Per); Model=Key_Model(Model,&Saw_Per,&Count); } while(Model==3) { Sin_wave(Sin_Per,&Count); Count+=4; Sin_Per=Key_Plus(Sin_Per); Sin_Per=Key_Subc(Sin_Per); Model=Key_Model(Model,&Sin_Per,&Count); } } return 0; }
2\init.c文件:
#include "reg52.h" sbit CS_DAC=P1^5;//DAC0832的片选端口 sbit WR_DAC=P1^6;//DAC0832的数据写入端口 extern void init(void) { P0=0xff; P1=0xff; P2=0xff; P3=0xff; CS_DAC=0;//一直片选中DAC0832,低电平有效啊~ WR_DAC=0;//一直写入数据到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=0; if(*Count<Per/2) { DATA=0x00; } else { DATA=0xFF; } } void Triangle_wave(unsigned int Per,unsigned int *Count) { if(*Count>=Per) *Count=0; if(*Count<Per/2) { DATA=*Count; } else { DATA=Per-*Count; } } void Sawtooth_wave(unsigned int Per,unsigned int *Count) { if(*Count>=Per) *Count=0; if(*Count<Per) { DATA=*Count; } } void Sin_wave(unsigned int Per,unsigned int *Count) { if(*Count>Per) *Count=0; if(*Count<Per/2) { DATA=*Count; } else if(*Count==Per/2) { delay(100); } else if(*Count<Per) { DATA=Per-*Count; } else if(*Count==Per) { delay(100); } }
4\Key.c文件:
#include "Key.h" #include "delay.h" sbit key2=P3^3; //wave Change sbit key3=P3^4; //Fre plus sbit key4=P3^5; //Fre subc unsigned char Key_Model(unsigned char Model,unsigned int *Pre,unsigned int *Count) { if(key2==0) { delay(10); if(key2==0) { Model=Model+1; *Pre=256; *Count=0; } } while(key2==0); if(Model>3) { Model=0; } return Model; } unsigned int Key_Plus(unsigned int Per) { if(key3==0) { delay(10); if(key3==0) { Per=Per+8; } } while(key3==0); if(Per>256) { Per=0; } return Per; } unsigned int Key_Subc(unsigned int Per) { if(key4==0) { delay(10); if(key4==0) { Per=Per-8; } } while(key4==0); if(Per<0) { Per=256; } return Per; }
5\delay.c文件:
void delay(unsigned int r) { unsigned int i,j; for(i=r;i>0;i--) for(j=110;j>0;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接口需要接地
修改完毕之后的结果就会比较完美了,下面上传一个三角波的波形
相关文章推荐
- java mongodb驱动下载地址
- Java 内部类访问格式
- Bash玩转脚本3之几个指令有趣的筛选京东评价
- S3C2440 之USB设备篇
- error和exception有什么区别?
- UVA 10375 - Choose and divide(数论)(组合数学)
- 黑马程序员——Java基础---循环语句和控制跳转语句和Mark标记和方法重载
- 模块化编程
- 剑指offer之编程(十一)
- java的primitive主数据类型和引用
- 149_缓存网络数据
- AndroidJNI 通过C++调用JAVA
- 异常整理之:java.lang.NoClassDefFoundError:org/hamcrest/SelfDescribing
- 每天刷个算法题20160521:二叉树高度(递归与非递归)
- HTTP缓存的机制有哪些?
- Robot Framework 教程 - 一个完整的例子
- struts2的一点知识(引入别人的项目,path问题,package的名字不能一样哦 )
- s3c2440的USB主机控制器
- BZOJ_1606_ [Usaco2008_Dec]_Hay_For_Sale _购买干草_(背包)
- LeetCode:Candy