51单片机入门教程(4)——波形发生器
时间:2023-12-14 07:07:02
目录
1、总述
2、系统硬件设计
3.系统软件设计理念
3.测试和分析
(1)Proteus仿真测试
(2)直流稳压电源试验
(3)实物测试
1、总述
本文为51单片机入门教程实战篇,本文介绍了51单片机和DAC以0832数模转换芯片为核心的波形发生器DAC0832和UA说明741的结构、工作原理和电路连接。波形发生器通过AT89C51控制DAC0832产生所需电流,然后使用操作放大器UA741将其电流输出线性转换为电压输出,线性转换为电压输出LS21控制四个开关,切换锯齿波、三角波、方波和正弦波,输出不同的波形。
2.系统硬件设计
该系统以51台单片机为控制核心,初始化系统,主要控制开关响应和发送指令,起到总控制和协调各模块之间工作的作用。通过数模转换模块产生波形的具体产生。系统主要包括主控器AT89C51.由数模转换电路、振幅、频率调节电路、晶振电路和外部复位电路组成。本设计的特点是通过程序控制生成数字信号波形,因此波形输出非常稳定。修改控制程序可以实现波形参数的任意变化,波形的选择可以通过外部开关进行改变。
PCB原理图如下:
直流稳压电源电路原理图如下:
3.系统软件设计理念
(1)锯齿波的实现原理:锯齿波的实现过程是先定义初始值,然后进行加法操作,并根据要求的频率增加步数。然后添加到一定数量,然后重新设置为初始值,然后重复执行刚性操作,以便循环。本程序的初始值为00H,最大值为0FFH。
(2)三角形波的实现原理:三角形波的实现是设置一个初始值,然后添加数量,也添加到一定数量,然后减少到初始值,然后返回到以前的操作。该程序输入VREF的电压是+5V,因此,波形输出的最大频率为00H和最终值为0FFH,步数为1,因此输出的波形最大。
(3)方波的实现原理:该波形的实现只需在开始时设置一个初始值,然后直接输出该值。输出一段时间后,重置数据,然后输出一段时间,但此时的时间必须等于前一段时间。这是一个方波,如果两个时间不同,它相当于一个脉冲波。
(4)正弦波的实现原理:正弦波的实现过程是将一个周期分为四个部分,提前写一个含有19个数的数组,从而获得正弦波的第一个1/4周期。第二个1/4周期是将数组倒过来执行,第三和第四个1/4周期是前两个1/4周期的反转过程。通过上述过程,可以完成一个完整周期的正弦波。
至于按钮检测部分的程序,它是一个经典的代码。一般的想法是通过判断中断函数中的高低电平来检测按钮或开关是否关闭。
#include #include #define uchar unsigned char #define uint unsigned int #define DAC 0x7FFF //定义DAC端口地址 uchar code SINTAB[]={0x7F, 0x89, 0x94, 0x9F, 0xAA, 0xB4, 0xBE, 0xC8,0xD1, 0xD9, 0xE0, 0xE7, 0xED,0xF2, 0xF7,0xFA, 0xFC, 0xFE, 0xFF}; uchar bdata Tbase = 0x20; sbit KST = Tbase^0; ///阶梯波标志 sbit KTRI = Tbase^1; ///三角波标志 sbit KSQ = Tbase^2; ///方波标志 sbit KSIN = Tbase^3;//正弦波标志 sbit K1=P1^0; //K1健 sbit K2=P1^2; //K2键 sbit K3=P1^4; //K3键 sbit K4=P1^6; //K4键 ///延迟函数 void delay() { uchar i; for(i = 0; i<0xff;i ); } ///阶梯波函数 void st() { uchar i = 0; while(KST) { XBYTE[DAC] = i ;//启动DAC } } ///三角波函数 void tri() { uchar i = 0; XBYTE[DAC] = i; //启动DAC do { XBYTE[DAC] = i; //上升沿 i ; }while(i<0xff); do { XBYTE[DAC] = i;//下降沿 i--; }while(i>0x00); } //方波 void sq() { XBYTE[DAC] = 0x00;//启动DAC delay(); XBYTE[DAC] = 0xff; delay(); } //正弦波 void sin() { uchar i; for(i=0;i<18;i ) { XBYTE[DAC] = SINTAB[i];///第一个1/4周期 } for(i=18;i>0;i--) { XBYTE[DAC] = SINTAB[i];//第二个1/4周期 } for(i=0;i<18;i ) { XBYTE[DAC] = ~SINTAB[i];// } for(i=18;i>0;i--) { XBYTE[DAC] = ~SINTAB[i];// } } //主函数 main() { EX0=1;IT0=1;EA=1; while(1) { if(KST==1) { st(); } if(KTRI==1) { tri(); } if(KSQ==1) { sq(); } if(KSIN==1) { sin(); } } } //中断服务 int0() interrupt 0 using 1 { if(K1==0) //判断阶梯波键是否按下 { Tbase = 0; KST = 1; } if(K2==0) //判断三角波键是否按下 { Tbase = 0; KTRI = 1; } if(K3==0) //判方波键是否按下 { Tbase = 0; KSQ = 1; } if(K4==0) ///判断正弦波键是否按下 { Tbase = 0; KSIN = 1; } }
3.测试和分析
(1)Proteus仿真测试
在利用Proteus在构建的模拟电路中,我们可以很容易地进行实验模拟测试,在信号输出端口连接模拟示波器,切换四个开关,观察不同的波形。
因为一开始我提供了运输±5V直流电压,模拟后会发现波形失真,所以最后选择使用±12V直流电压对运放UA74进行供电,这样得到的波形才能做到无失真。
(2)直流稳压电源测试
(3)实物测试
利用AT89C51和DAC0832以及其他基本模块完成了总体电路的设计,并用开关来控制各种波形的发生及转换,用单片机输出后,经过模数转换器生成波形,最终可以通过示波器观察到较为理想的波形。通过仿真测试运行结果和实物测试结果表明,该波形发生器能够很好满足实际要求,具有重要的应用价值。