第11章单片机,信号发生器设计_第1页
第11章单片机,信号发生器设计_第2页
第11章单片机,信号发生器设计_第3页
第11章单片机,信号发生器设计_第4页
第11章单片机,信号发生器设计_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、信号发生器是一种常用的信号源,广泛应用于科学研究、生产实践和教学实验等领域。特别是在通信系统的科研实验中,常常需要用到多种不同频率和相位的信号,因此多功能信号发生器应用非常广泛。本章采用单片机编程的方法设计信号发生器,可以产生方波、正弦波、三角波、和锯齿波等信号。由于通过编程方法产生的是数字信号,所以信号的稳定性和精确度很高,电路简洁,并且可以通过改变程序来实现信号的频率变换。 信号发生器能产生方波、正弦波、三角波和锯齿波四种周期性波形; 信号输出频率为100Hz或500Hz; 输出波形幅度为15V, 输出信号波形无明显失真; 信号的频率通过液晶显示器显示;采用单片机编程产生所需数字信号,通过

2、数/模转换器转换成模拟信号来获得所需要的波形。89C52单片机本身就是一个完整的微型计算机,具有组成微型计算机的各部分部件:中央处理器CPU、随机存取存储器RAM、只读存储器ROM、I/O接口电路、定时器/计数器以及串行通讯接口等,只要将89C52再配置键盘、显示器、数模转换、滤波放大等四部分,即可构成所需的波形发生器,其信号发生器构成原理框图如图11-1所示。图11-1 信号发生器原理框图89C52是整个波形发生器的核心部分,通过程序的编写和执行,产生各种波形信号,并从键盘接收数据,进行各种信号的转换和信号频率、幅度的调节。当数字信号经过数模转换电路,转换后得到的模拟信号就是所需的输出波形。

3、单片机STC89C52显示电路键盘电路D/A电路复位电路放大电路波形输出下面从硬件电路着手对信号发生器进行设计,主要包括主控模块、信号数据处理模块和显示电路的设计。1RF-X1开发板(STC89C52)最小系统RF-X1开发板(STC89C52)的最小系统包括时钟振荡电路和复位电路。(1)时钟振荡电路时钟振荡电路为单片机提供各种微操作的时间基准,STC89S52片内设有一个由反向放大器所构成的震荡电路,所以外部只要连接一个晶振和两个电容即可。具体电路如图11-2所示,电容C1、C2起稳定震荡频率,快速起振的作用,电容值一般为533pF。本设计采用22pF的电容和12MHz的晶振。(2)复位电路

4、复位控制信号在STC89S52的第9管脚输入,当在此引脚输入高电平并保持2个机器周期时,单片机内部就执行复位操作。在本设计中,复位电路由按键复位和上电复位组成,STC89S52单片机为高电平复位,通常在复位引脚RST上连接一个电容到VCC,在连接一个电阻到GND,由此形成一个RC充放电回路保证单片机在上电时RST脚上有足够时间的高电平进行复位,随后回归到低电平进入正常工作状态。当单片机已运行时,也可以通过按下复位键使RST持续一段时间的高电平,实现复位操作。本设计采用10F电容和10K的电阻。2 键盘控制电路RF-X1开发板提供了一个3*4的矩阵键盘和6个独立按键。但是6个独立按键与P3口进行

5、连接,与TLC5615(数模转换)的连接相冲突,所以这里采用矩阵键盘。矩阵键盘的行信号分别接P1.0P1.3,列信号分别接P1.4P1.6,识别按键的方法是:先让P1.0输出低电平,检测P1.4P1.6,如果在某个时刻为低电平,则可确定第一行的哪个按键被按下,接着让P1.1输出低电平(其他都为高电平),检测列的电平,为低则被按下,依次就可以确定按键号了。键盘控制电路如图11-3所示。本设计采用了矩阵键盘中的6个按键,在系统工作时,STC89C52不断的扫描键盘,看是否有键按下,如有,则根据相应按键作出反应。其中按键“S7”代表正弦波输出,按键“S11”代表锯齿波输出,按键“S15”代表三角波输

6、出, 按键“S8”代表方波输出,按键“S12”为频率选择键,可选择输出100Hz和500Hz的信号,按键“S16”为波形幅度调节键,幅度范围为15V。S70S111S152S83S124S165S96S137S178S109S1410S1811P10P11P12P13P14P15P161数模转换电路(1)TLC5615数模转换电路由于单片机产生的是数字信号,要想得到所需的波形,就要把数字信号转换成模拟信号。为了得到较高的设计精度,RF-X1开发板采用了一个10位的DAC芯片TLC5615。TLC5615具有接口连接简单、转换速率快、微功耗等特点,并且输出的最大电压可以达到基准输入电压的2倍。8

7、脚直插式TLC5615各引脚功能如下:DIN:串行二进制数输入端; AGND:模拟地;SCLK:串行时钟输入端; REFIN:基准电压输入端;CS非:芯片选择,低电平有效; OUT:DAC模拟电压输出端;DOUT:用于级联的串行数据输出; VCC:工作电压输入端,+5V;将STC89C52的P3口与TLC5615相连,构成DAC电路如图11-4所示。用P3.5触发片选CS非使DAC进如工作状态,P3.6模拟串行时钟与SCLK连接,待转换的二进制数从P3.7输出到TLC5615的数据输入端DIN,进行数模转换。(2)TLC5615的工作原理为了使TLC5615能够正常稳定的工作,编程时必须掌握它

8、的工作时序和工作方式。1) TLC5615的工作时序TLC5615的工作时序如图11-5所示。从图中可以看出,只有当片选CS非为低电平时,串行输入数据才能被移入16位移位寄存器。当CS非为低电平时,在每一个SCLK时钟的上升沿将DIN的一位数据移入16位移位寄存器。注意,二进制最高有效位被导前移入。然后,在CS非的上升沿将16位移位寄存器的10位有效数据锁存于10位DAC寄存器,供DAC电路进行转换;当片选CS非为高电平时,串行输入数据不能被移入16位移位寄存器。此外,CS非的上升和下降都必须发生在SCLK的低电平期间。图11-5 TLC5615时序图2) TLC5615的工作方式TLC561

9、5的内部功能框图如图11-6所示,主要由16位移位寄存器、10位DAC寄存器、10位DAC电路、电压跟随器、2电路和控制电路等部分组成,它有两种工作方式。第一种是串行工作方式,从图中可以看出,16位移位寄存器分为高4位虚拟位、低2位填充位和10位有效位。在TLC5615工作时,只需要向16位移位寄存器按先后顺序输入10位有效位和2位填充位即可,2位填充位数据任意,即12位数据序列。第二种是级联方式,即16位数据序列,可以将本片TLC5615的DOUT接到下一片TLC5615的DIN,需要向16位移位寄存器按先后顺序输入高4位虚拟位、10位有效位和低2位填充位,由于增加了高4位虚拟位,所以需要1

10、6个时钟脉冲。但是,无论TLC5615工作在那一种方式,输出电压:其中, VREFIN是参考电压,N为输入的二进制数。图11-6 TLC5615的内部功能框图2滤波放大电路设计经TLC5615数模转换后,可得到比较准确的15V的模拟电压输出,可以达到设计要求。若想得到更加宽泛的信号电压输出范围,可以通过运算放大器进行放大。常用的运放种类很多,如OP07、LM324、LM258等。本设计采用了具有低失调、高开环增益特性的OP07,其各引脚功能如下:Offset Null 1:偏置平衡(调零端); Offset Null 2偏置平衡(调零端);Inverting Input:反向输入端; VCC+

11、:电源;Non-inverting Input:同向输入端; Output:信号输出端;VCC -:接地端; N.C.:空脚;由数模转换电路输出的模拟电压信号通过R56进入OP07反向端,构成了反向放大电路如图11-7所示。图11-7 OP07运算放大电路显示电路用来显示波形信号的频率,使波形信号更加直观。在此选用可显示两行字符的LCD1602就可以满足设计要求,RF-X1开发板为LCD1602提供了接口(见开发板插口J24),与单片机P1口相连接,但与矩阵键盘接口相冲突,所以在此将LCD1602的数据口改接到单片机的P0口。其电路连接图如图11-8所示,LCD1602引脚说明如表11-1所示

12、。此外,由于52单片机P0口内部是开漏的,不管驱动能力多大,都相当于它是没有电源的,而LCD显示屏是需要电源驱动才能点亮的。因此,在这里需要外接上拉电阻来提供驱动电源。表11-1 LCD1602引脚说明编号编号符号符号引脚说明引脚说明编号编号符号符号引脚说明引脚说明0VSS电源地8D2Data I/O1VDD电源正极9D3Data I/O2VL液晶显示偏压信号10D4Data I/O3RS数据/命令选择端(H/L)11D5Data I/O4R/W读写选择端(H/L)12D6Data I/O5E使能信号13D7Data I/O6D0Data I/O14BLA背光源正极背光源正极7D1Data I

13、/O15BLK背光源负极背光源负极图11-8 LCD1602液晶显示电路1主程序流程图本设计中子程序的调用是通过按键的选择来实现的,在取得相应按键的键值后,根据键值来确定各种波形的输出,以及信号幅度和频率调节,并将相应的数据送入D/A转换器转换成模拟信号,等到所需信号波形。主程序流程图如图11-9所示,在程序开始运行之后,首先是对TLC5615进行初始化,之后判断是否有按键按下,根据键值输出相应波形,然后判断是否进行幅度和频率调节,确定波形频率后,显示其频率。(1)正弦波正弦波是幅度和相位随时间呈周期性变化的一种波形。利用正弦波数据生成器可以方便的产生离散的正弦波形采样点,描绘出正弦波信号。如

14、图11-10所示,输出点数为256,输出精度为10,即用256个离散的采样点来描绘正弦波形。在编程时,只要循环输出这256个离散值就可以得到所需正弦波形,正弦波的频率可以通过延时时间来调节。图11-10 正弦波数据生成器 uint code sin1256= 0 x1FF,0 x20C,0 x218,0 x225,0 x231,0 x23E,0 x24A,0 x256,0 x263,0 x26F,0 x27B,0 x287,0 x293,0 x29F,0 x2AB,0 x2B7,0 x2C3,0 x2CE,0 x2DA,0 x2E5,0 x2F0,0 x2FB,0 x306,0 x311,0

15、x31B,0 x326,0 x330,0 x33A,0 x343,0 x34D,0 x357,0 x360,0 x369,0 x371,0 x37A,0 x382,0 x38A,0 x392,0 x39A,0 x3A1,0 x3A8,0 x3AF,0 x3B6,0 x3BC,0 x3C2,0 x3C8,0 x3CD,0 x3D3,0 x3D8,0 x3DC,0 x3E1,0 x3E5,0 x3E8,0 x3EC,0 x3EF,0 x3F2,0 x3F5,0 x3F7,0 x3F9,0 x3FB,0 x3FC,0 x3FD,0 x3FE,0 x3FE,0 x3FE,0 x3FE,0 x3FE,0

16、 x3FD,0 x3FC,0 x3FB,0 x3F9,0 x3F7,0 x3F5,0 x3F2,0 x3EF,0 x3EC,0 x3E8,0 x3E5,0 x3E1,0 x3DC,0 x3D8,0 x3D3,0 x3CD,0 x3C8,0 x3C2,0 x3BC,0 x3B6,0 x3AF,0 x3A8,0 x3A1,0 x39A,0 x392,0 x38A,0 x382,0 x37A,0 x371,0 x369,0 x360,0 x357,0 x34D,0 x343,0 x33A,0 x330,0 x326,0 x31B,0 x311,0 x306,0 x2FB,0 x2F0,0 x2E5,

17、0 x2DA,0 x2CE,0 x2C3,0 x2B7,0 x2AB,0 x29F,0 x293,0 x287,0 x27B,0 x26F,0 x263,0 x256,0 x24A,0 x23E,0 x231,0 x225,0 x218,0 x20C,0 x1FF,0 x1F2,0 x1E6,0 x1D9,0 x1CD,0 x1C0,0 x1B4,0 x1A8,0 x19B,0 x18F,0 x183,0 x177,0 x16B,0 x15F,0 x153,0 x147,0 x13B,0 x130,0 x124,0 x119,0 x10E,0 x103,0 x0F8,0 x0ED,0 x0E3

18、,0 x0D8,0 x0CE,0 x0C4,0 x0BB,0 x0B1,0 x0A7,0 x09E,0 x095,0 x08D,0 x084,0 x07C,0 x074,0 x06C,0 x064,0 x05D,0 x056,0 x04F,0 x048,0 x042,0 x03C,0 x036,0 x031,0 x02B,0 x026,0 x022,0 x01D,0 x019,0 x016,0 x012,0 x00F,0 x00C,0 x009,0 x007,0 x005,0 x003,0 x002,0 x001,0 x000,0 x000,0 x000,0 x000,0 x000,0 x00

19、1,0 x002,0 x003,0 x005,0 x007,0 x009,0 x00C,0 x00F,0 x012,0 x016,0 x019,0 x01D,0 x022,0 x026,0 x02B,0 x031,0 x036,0 x03C,0 x042,0 x048,0 x04F,0 x056,0 x05D,0 x064,0 x06C,0 x074,0 x07C,0 x084,0 x08D,0 x095,0 x09E,0 x0A8,0 x0B1,0 x0BB,0 x0C4,0 x0CE,0 x0D8,0 x0E3,0 x0ED,0 x0F8,0 x103,0 x10E,0 x119,0 x1

20、24,0 x130,0 x13B,0 x147,0 x153,0 x15F,0 x16B,0 x177,0 x183,0 x18F,0 x19B,0 x1A8,0 x1B4,0 x1C0,0 x1CD,0 x1D9,0 x1E6,0 x1F2;/*正弦波子程序*/void sin() uint i; for(i=0;i256;i+) output(sin1i); delay2(250);/*/(2)方波方波是实验中最常见的一种信号波形,它只有“高”和“低”两个值,所以在编程时,只要循环输出高低电平即可。/*方波子程序*/void fangbo() uchar i; for(i=0;i0;i-)

21、 output(0 x0000);/ TLC5615转换后为0V(3)锯齿波锯齿波是常见的波形之一,其波形与时间成正比上升,到达一定值,快速下降到零,再重复上升,下降,形成锯齿形。/*锯齿波子程序*/void saw() uint i; for(i=0;i0 x8000;i+1) _nop_(); _nop_(); output(i); /锯齿波i的值从00 x8000变化 delay2(250);/*/(4)三角波三角波波形首先与时间成正比上升,到大一定值,然后在与时间成正比下降,如此循环。其程序与锯齿波相似。/*三角波子程序*/void trigle() uint i; for(i=0;i

22、0;i-1) _nop_(); _nop_(); output(i);/i的值从0 x8000到0 delay2(250);/*/3TLC5615输出子程序TLC5615是一个串行的10位数模转换器,首先上电初始化,将片选CS非置高电平,串行时钟信号置低电平。当片选CS非为低电平时,芯片进入正常工作状态,在每一个SCLK时钟的上升沿将DIN的一位数据移入16位移位寄存器,供DAC进行转换输出。/*TLC5615输出子程序*/void output(uint a)unsigned char i;cs=1; /初始化clock=0;cs=0; /低电平有效,低电平芯片处于工作状态di=1;for(

23、i=12;i0;) /送数i-;if(a&0 x8000) /取12位数据的最高位,如果为1输出高电平,否则输出低电平di=1;elsedi=0;clock=1; /时钟为高电平_nop_();_nop_();clock=0; /时钟为低电平_nop_();_nop_();a=a1; /左移一位,准备下一个数据 /*/4按键扫描子程序本设计采用了RF-X1开发板上提供的矩阵键盘中的6个。先将第一行P1.0置低电平,检测列信号P1.4P1.6,当某一列为低电平时,则第一行该列按键被按下;然后令P1.1输出低电平(其他都为高电平),检测第二行按键的状态,依次确定前两行6个按键的键值。/*按键扫描子

24、程*/uchar keyscan() P1=0 x7e;/给P1口最低位(即P1.0)置0 delay(1);temp=P1;/读P1口temp=temp&0 x70;/屏蔽第四位,保留高三位while(temp!=0 x70)/判断是否有键按下delay(5);/延时去抖temp=P1;/读P1口 temp=temp&0 x70;/屏蔽第四位,保留高三位 while(temp!=0 x70)/判断是否有键按下temp=P1;switch(temp) case 0 x6D:num=4;/按键S8按下,键值为3break;case 0 x5D:num=5;/按键S12按下,键值为4break;c

25、ase 0 x3D:num=6;/按键S16按下,键值为5break; while(temp!=0 x70)/等待按键释放temp=P1; temp=temp&0 x70;return num;/*/5频率选择子程序当频率选择按键S12被按下时,键值num=4。当flag1=0时,输出频率为100Hz的信号波形;flag1=1时,输出频率为500Hz的信号波形。以正弦波形为例,频率选择子程序如下。/*频率选择子程序*/void tiaopin() uchar flag1,i; if(num=4) if(flag1=1) flag1+; else flag1=0; switch(flag1) c

26、ase 0:for(i=0;i256;i+0 x8000/256) _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(

27、); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); output(sin1i);/输出频率为100HZ的正弦波 delay(250);break; case 1: for(i=0;i256;i+0 x8000/256) _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); output(sin1i);/输出频率为500HZ的正弦波 delay(250);break; /*/6幅度选择子程序当

28、幅度选择按键S16被按下时,键值num=5,每按一次flag加1,对应输出波形幅值加1V,flag4,按满4次,flag清零。信号输出幅值范围为15V。以正弦波形为例,幅度选择子程序如下。/*幅度选择子程序*/void tiaofu(uchar aa) uchar flag,i;/按键次数标志位 aa=num; if(aa=5) /S16键按下 if(flag=4) flag+; else flag=0;/S16满四次清0 switch(flag) case 0: for(i=0;i256;i+) output(sini/5);/输出1V正弦波 delay(250);break; case 1

29、: for(i=0;i256;i+) output(sini*2/5);/输出2V正弦波 delay(250);break; case 2: for(i=0;i256;i+) output(sini*3/5);/输出3V正弦波 delay(250);break; case 3: for(i=0;i256;i+) output(sini*4/5);/输出4V正弦波 delay(250);break; case 4: for(i=0;i256;i+) output(sini);/输出5V正弦波 delay(250);break; /*/7显示程序在液晶模块上显示字符,需要3个最基本的控制操作:写指令代码、写显示数据和读显示数据。液晶初始化和显示程序如下:/*显示程序*/1602液晶初始化:void init()lcden=0;write_com(0 x38);/* 假设为5*7 的点阵*/write_com(0 x0c);/* 开显示,0 x0e显示光标,光标不闪烁,当为0 x0f时光标就闪烁,0 x0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论