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

发布者:快乐行者最新更新时间:2023-06-09 来源: elecfans关键字:STC89C52  单片机  信号发生器 手机看文章 扫描二维码
随时随地手机看文章

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

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

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

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

Source文件(.c文件):

1main.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 }

2init.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 }

3single.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 }

4Key.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 }

5delay.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文件):

1init.h文件:

1 extern void init(void);

2single.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);

3Key.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);

4delay.h文件:

1 #include

2 void delay(unsigned int r);

3 #define NOP() _nop_()

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

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

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

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

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

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

需要修改的地方有:

1、电源改成双电源

2、Iout接口需要接地

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

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

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


关键字:STC89C52  单片机  信号发生器 引用地址:如何利用STC89C52单片机做一个多种信号发生器

上一篇:STC89C52RC串口波特率程序
下一篇:AT89C52单片机与SD卡实现通讯的设计方案

推荐阅读最新更新时间:2024-11-03 13:34

用51单片机汇编语言,写一个60s倒计时的程序
题目。写出一个60s倒计时的汇编语言,不要用C语言写,用汇编语言。 再设置一个按键,按一下,停止倒计时,再按一下,恢复倒计时。 ;--------------------------------------- ;假设系统晶振为 12MHz ;按键连接在P3.2 ;--------------------------------------- ORG 0000H LJMP MAIN ORG 0003H LJMP X0_INT ORG 000BH LJMP T0_INT ;--------------------------------------- ORG 0100H
[单片机]
单片机c语言教程 第一课 建立您的第一个C项目
51单片机C语言学习杂记 学习单片机实在不是件易事,一来要购买高价格的编程器,仿真器,二来要学习编程语言,还有众多种类的单片机选择真是件让人头疼的事。在众多单片机中51架构的芯片风行很久,学习资料也相对很多,是初学的较好的选择之一。51的编程语言常用的有二种,一种是汇编语言,一种是C语言。汇编语言的机器代码生成效率很高但可读性却并不强,复杂一点的程序就更是难读懂,而C语言在大多数情况下其机器代码生成效率和汇编语言相当,但可读性和可移植性却远远超过汇编语言,而且C语言还可以嵌入汇编来解决高时效性的代码编写问题。对于开发周期来说,中大型的软件编写用C语言的开发周期通常要小于汇编语言很多。综合以上C语言的优点,我在学习时选择了C语言。以后
[单片机]
<font color='red'>单片机</font>c语言教程 第一课 建立您的第一个C项目
基于AVR单片机的I SP1362OTG设计
简介: 本文设计的USB 0TG主从机系统性能稳定,数据传输效率高。测试表明,此设计能够正确地实现USB 0TG主从机间的数据交换,性能可以满足设备间的数据传输要求,同时又能很好地控制成本,具有一定的实用价值。 0 引言 随着PDA、移动电话、数码相机、打印机等消费类产品的普及,用于这些设备与电脑、或设备与设备之间的高速数据传输技术越来越受到人们的关注。以往以计算机为核心的数据传输结构,非常不利于USB,总线在嵌入式行业的应用,也不适用于野外作业,而OTG技术的推出则可实现在没有PC的情况下,设备与设备之间的数据传输,它拓展了USB技术的应用范围。本文采用的设计方案是基于Philips公司的ISP1362 OTG控制芯片,参照
[单片机]
基于AVR<font color='red'>单片机</font>的I SP1362OTG设计
单片机数字钟程序
#include at89x52.h #include intrins.h #define uchar unsigned char #define uint unsigned int #define A 1 uint year; uchar count; uchar flag=0; uchar month,date,hour,min,sec; uchar code monthdata ={31,28,31,30,31,30,31,31,30,31,30,31}; //uchar code disdata ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; ucha
[单片机]
51单片机~DS1302时钟,SPI总线原理
(一)说明: (二)SPI总线原理: (三)日历时钟寄存器: 慢充电: BCD码: temp.h #ifndef __TEMP_H_ #define __TEMP_H_ #include reg52.h //---重定义关键词---// #ifndef uchar #define uchar unsigned char #endif #ifndef uint #define uint unsigned int #endif //--定义使用的IO口--// sbit DSPORT=P3^7; //--声明全局函数--// void Delay1ms(uin
[单片机]
51<font color='red'>单片机</font>~DS1302时钟,SPI总线原理
单片机ROM和RAM区别
单片机的一个主要作用就是数据信息的处理,而在处理数据的过程中,需要一些 容器 来存放这些数据。这就好比烧饭要用到锅碗瓢盆一样。在这里,我们称这些 容器 为 存储器 。 存储器的物理实质是一组(或多组)具备数据输入/输出和数据存储功能的集成电路,用于充当设备缓存或保存同定的程序及数据。存储器按存储信息功能的不同,可分为只读存储器ROM和随机存储器RAM ROM即只读存储器。ROM中的信息一次写入后只能被读出,而不能被操作者修改或删除。一般用于存放固定的程序或数据表格等。 不能被操作者修改或删除。一般用于存放固定的程序或数据表格等。 当然, 只读 这个 传统 的概念有时是可以被一些新特性的器件颠覆的。下面介绍的这两种类型的ROM
[单片机]
AVR单片机与串行时钟器件DS3231的接口设计
1 引言 由单片机构成的测控系统或智能显示屏经常需要用到实时日历或时钟信号。为节省CPU资源,本文介绍了串行时钟器件DS3231的应用及其与AVR单片机ATmega8的接口,该系统具有抗干扰能力强,计时准确且不随季节变化产生误差的特点。 2 DS3231的结构及工作原理 DS3231是低成本、高精度I2C实时时钟(RTC)器件,具有集成的温度补偿晶体振荡器(TCXO)。该器件包含电池输入端,断开主电源时仍可保持精确计时。集成的晶体振荡器可提高器件的长期精确度。DS3231的寄存器能保存秒、分、时、星期、日期、月、年和闹钟设置等信息。少于31天的月份,可自动调整月末日期,包括闰年补偿。时钟的工作格式为24小时或带AM/PM指示
[单片机]
基于1T单片机的电子标签销码器[图]
0 引言 电子标签在现代超市、图书馆、仓储等公共流通部门的防盗系统中应用越来越广泛。电子标签及其销码本质为一种射频识别(RFID)系统,其工作方式为非接触式,是利用射频信号及其空间耦合、传输特性,对静止的或移动中的待识别物品进行自动识别,有快捷、方便等优点。本设计以单片机STC12C2052AD为核心,应用NE546锁相环等芯片,以及频率合成、高频小信号检测等技术,制作的电子标签销码器具有较高的可靠性和实际应用价值。 1 系统硬件设计 RFID系统一般由电子标签和阅读器两部分组成。应用中,电子标签附着在待识别的物品上,阅读器用于当附着电子标签的待识别物品通过其读出范围时,以无接触的方式自动将电子标签中的约定识别信息取出,从而
[单片机]
基于1T<font color='red'>单片机</font>的电子标签销码器[图]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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