如何利用STC89C52单片机做一个多种信号发生器

下面先贴上仿真的电路图(仿真的软件是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_()
所用的工程文件我都已经上传喽~,下面来看看仿真的结果:(大家在电路设计的时候可以进行一下滤波处理,然后对信号进行放大处理,这样的话效果可能会更好点哦~)
方波: 三角波: 锯齿波: 梯形波:
大家注意下,电路有个小问题,由于本人的失误,dac0832的iout1和iout2的输出接口的接法应该按如下的接入方式:
需要修改的地方有:
1、电源改成双电源
2、iout接口需要接地
修改完毕之后的结果就会比较完美了,下面上传一个三角波的波形

光电液位开关与液位传感器有什么区别
PWM原理与PWM逆变器的工作原理图
蚂蚁集团回应:收到约谈通知,做好相关工作的落实
思谋打造全工序标准检测方案满足产线CT要求
直流电源维护保养的方法
如何利用STC89C52单片机做一个多种信号发生器
PCB布局设计检视要素有哪些?
硅谷:设计师利用生成式 AI 辅助芯片设计
曙光在遥感市场打造多个百PB级超大规模存储系统
面试必问题目:PCB包含哪些信息?
浪潮信息提出基于配置模板的一键自动部署运维方式
表扬杰出半导体公司,GSA公布年度奖项得主
带32位MCU和高精度ADC的SoC产品----SD93F系列开发指南(五)
单片机USB-ISP下载线制作详细教程
NESAS推出5G E2E 网络安全解决方案
触摸屏相关技术与术语补充
基于M68HC912D60芯片的嵌入式税务监控系统
Linux中应该如何入侵排查?
【机器视觉】欢创播报 | PSVR2国行版正式开售
全球首架C919正式交付,背后是中国制造业的崛起