P0口:
P0口为一个8位漏极开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作 图2-2 80C51引脚图
为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。因此作为输入时,P2口的管脚被外部拉低,将输出电流,这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口,如下表所示:
P3.0 RXD(串行输入口)
P3.1 TXD(串行输出口)
P3.2 /INT0(外部中断0)
P3.3 /INT1(外部中断1)
P3.4 T0(记时器0外部输入)
P3.5 T1(记时器1外部输入)
P3.6 /WR(外部数据存储器写选通)
P3.7 /RD(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:
复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:
外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
2.1.3 使用I/O口的注意事项
(1) P1,P2,P3口的输出缓冲器可驱动4个LSTTL电路。对于HCMOS芯片单片机的I/O口,在正常情况下,可任意由TTL或NMOS电路驱动。HMOS及CMOS性的单片机I/O口有集电极开路或漏极开路的输出来驱动时,不必外加上拉电阻
(2)对于74LS系列,CD4000系列以及一些大规模集成电路芯片(如8155,8253,8279等),都可以和MCS-51系列单片机直接接口。具体使用时,可以查阅有关器件手册或参考典型电路
(3)对一些线性组件,特别是应用键盘、码盘、LED显示器等输入/输出设备时,应当尽量增加驱动部分的容量,否则,单片机将提供不出足够的驱动电流供给负载使用
2.2 80C51中断系统
所谓中断,是指当计算机执行正常程序时,系统中出现某些急需处理的异常情况和特殊情求,CPU暂停执行现行程序,转去对随机发生地更紧迫事件进行处理;处理完毕后,CPU自动返回原来的程序继续执行。
中断允许软件设计不需要关心系统其他部分定时要求,算术程序不需要考虑隔几个指令检查I/O设备是否需要服务。相反,算术程序编写时好像有无限的时间作算术运算而无其他工作在进行。若其它事件需要服务时,则通过中断告诉系统。
80C51单片机有5个中断源,有两个中断优先级,每个中断源的优先级可以编程控制。中断允许受到CPU开中断和中断源开中断的两级控制。
2.2.1 中断源
中断源是指任何引起计算机中断的事件,一般一台机器允许有许多个中断源。80C51系列单片机至少有5个中断源。增加很少的硬件就可把各种硬件中断源“线或”成为一个外部中断输入,然后再顺序检索一起中断的特定源。
80C51单片机的5个中断源是:
① 外部中断请求0,由 (P3.2)输入;
② 外部中断请求1,由 (P3.3)输入;
③ 片内定时器/计数器0益处中断请求;
④ 片内定时器/计数器1 溢出中断请求;
⑤ 片内串行口发送/接收中断请求;
为了了解每个中断源是否产生了中断请求,中断系统应设置许多个中断请
求触发器(标志位)实现记忆。这些中断源请求标志位分别有特殊功能寄存器TCON和SCON的相应位锁存
定时器/计数器控制寄存器TCON,它是一个八位的寄存器,各位如下表所示
● IT0,IT1:外部中断0、1触发方式选择位,由软件设置。1是下降沿触发,0是电平触发。
● IE0,IE1:外部终端0、1请求标志位。
● TF0,TF1:定时器/计数器0、1溢出中断请求标志。
2.2.2 中断的控制
中断的控制主要实现中断的开关管理和中断优先级的管理。这个管理主要通过对特殊功能寄存器IE和IP的编程实现。
(1)中断允许寄存器IE
EA |
|
ET2 |
ES |
ET1 |
EX1 |
ET0 |
EX0 |
● EX0,EX1:外部终端0,1的中断允许位。1是中断开,0是中断关
● ET0,ET1:定时器/计数器0、1溢出中断允许位。1是开中断,0是关中断
● ES:串行口中断允许位。1是中断开,0是中断关
● ET2:定时器/计数器2溢出中断位
● EA:CPU开/关中断控制位。1是开中断,0是关中断
(2)中断优先级寄存器IP
若系统中多个中断源同时请求中断,则CPU按中断源的优先级别,由高到低分别响应。
80C51单片机有两个中断优先级:高优先级和低优先级。每个中断源都可以编程为高优先级。这可以实现两级中断嵌套。嵌套的原则:一个正在执行的中断服务程序可以被高级的中断请求中断,而不能被同级或较低级的中断请求中断。两级中断通过使用IP寄存器设置,相应的位置1,则优先级高,0则优先级低。
PX0、PX1:终端0、1中断优先级控制;
PT0、PT1:定时器/计数器0、1中断优先级控制。
PS:串行口中断优先级控制。
80C51复位时,IP被清零,5个中断源都在同一个优先级。这时若其中几个中断源同时产生中断请求,则CPU按照片内硬件优先级链路的顺序相应中断,硬件优先级由高到低的顺序是:外部终端0 定时器/计数器0 外部中断1 定时器/计数器1 串行口中断。
2.2.3 中断响应
80C51的CPU在每个机器周期采样中断源的中断请求标志位,如果没有上述阻止条件,则将在下一个机器周期响应被激活的最高级中断请求。阻止条件如下:
① CPU正在处理同级或更高级的中断;
② 现行机器周期不是所执行指令的最后一个机器周期;
③ 正在执行的是RETI或者是访问IE或IP的指令;
CPU在中断响应之后完成如下操作:
① 硬件清除相应的中断标志位;
② 执行一条硬件子程序,保护断点,并转向中断服务程序入口。
③ 结束中断时执行RETI指令,恢复断点,返回主程序。
80C51的CPU在相应中断请求时,由硬件电路自动形成转向与该中断源对应的中断的服务程序入口地址。这种方法为硬件向量中断法。
各中断源的中断服务程序入口地址如下:
编号 |
中断源 |
入口地址 |
0 |
外部终端0 |
0003H |
1 |
定时器/计数器0 |
000BH |
2 |
外部终端1 |
0013H |
3 |
定时器/计数器1 |
001BH |
4 |
串行口中断 |
0023H |
各中断服务程序入口地址仅隔8个字节,编译器在这些地址放入无条件转移指令,跳到服务程序的实际地址。
向量中断包括把先前的程序计数指针推入堆栈,中断服务程序很像其他子程序。当向量中断发生时,硬件禁止所有中断。此时表明外部中断或定时器溢出的标志位由硬件清除。中断服务程序的不同分支取决于中断源。在重新允许全局CPU中断EA之前,必须仔细清除各种标志。标志会引起立即地重复中断。80C51对终端实际上有特殊的返回指令----RETI。不是RET。RETI重新允许系统识别其他中断。因而,没必要在正常使用中断时复位EA,只要在程序初始化时开中断一次就可以了。
2.3 单片机定时/计数器的使用
80C51系列单片机至少有两个16位内部定时器/计数器。8052有三个定时器/计数器,其中连个基本定时器/计数器是定时器/计数器0和定时器/计数器1。他们既可以编程为定时器使用,也可以编程为计数器使用。若是计数内部晶振驱动时钟,则它是定时器;若是计数80C51的输入引脚的脉冲信号,则它是计数器。
80C51的T/C时加一计数的。定时器实际上也是工作在技术方式下的,只不过对固定频率的脉冲计数;由于脉冲周期固定,由计数值可以计算出时间,有定时功能。
当T/C工作在定时器时,对振荡源12分频的脉冲计数,即每个机器周期计数值加一,频率加=fosc/12。晶振为6MHz,计数频率=500KHz,每2uS计数加一。
当T/C工作在计数器时,计数脉冲来自外部脉冲输入引脚T0或T1。当T0或T1脚上负跳变需2个机器周期,即24个振荡周期。所以T0或T1脚输入的计数外部脉冲的最高频率为fosc/12。当晶振为12MHz时,最高技术频率为500KHz,高于此频率将计数出错。
2.3.1与T/C有关的特殊功能寄存器
(1)计数寄存器TH和TL
T/C是16位的,计数寄存器有TH高8位TL低8位构成。在特殊功能寄存器中,对应T/C0为TH0和TL0;对应T/C1为TH1和TL1。定时器/计数器的初始值通过TH1/TL1和TH0/TL0设置
(2)定时器/计数器控制寄存器TCON
TR0、TR1:定时器/计数器0、1启动控制位。1是启动,0是停止
TCON复位后清零,T/C需要受到软件控制才能启动计数;当计数计满时,产生向高位的进位TF,即溢出中断请求标志
T/C的方式控制寄存器TMOD
GATE |
C/T |
M1 |
M0 |
GATE |
C/T |
M1 |
M0 |
● C/T:计数器或定时器选择位。1位计数器,0位定时器
● GATE:门控信号。1时T/C的启动控制受到双重控制,即要求TR0/TR1和INT0/INT1同时为高;0时T/C的启动仅受TR0/TR1控制
● M1和M0:工作方式选择位,具体见下表
M1 M0 |
方式 |
功能 |
0 0 |
0 |
为13位定时器/计数器,TL存低5位,TH存高8位 |
0 1 |
1 |
为16定时器/计数器,TL存低8,TH存高8位 |
1 0 |
2 |
常数自动装入的8位定时器/计数器 |
1 1 |
3 |
仅适用于T/C0,两个8为定时器/计数器 |
2.3.2 定时器/计数器的初始化
(1)初始化步骤
在使用80C51的定时器/计数器前,应对它进行编程初始化,主要是对TCON和TMOD编程,还需要计算和装载T/C的计数初值。一般完成以下几个步骤:
① 确定T/C的工作方式----编程TMOD寄存器。
② 计算T/C中的计数初值,并装载到TH和TL。
③ T/C在中断方式工作时,须开CPU中断和源中断----编程IE寄存器。
④ 启动定时器/计数器----编程TCON中TR1和TR0位
(2)计数初值的计算
在定时器方式下,T/C是对机器周期脉冲计数的,如果fosc=6MHz,一个机器周期为2us,则
方式0 13位定时器最大时间间隔=(2 -1)*2us=16.384ms;
方式1 16位定时器最大时间间隔=(2 -1)*2us=131.072ms;
方式2 8位时器最大时间间隔=(2 -1)*2us=512us
若使T/C工作在定时器方式1,要求定时1ms,求计数初值。如设计数初值为x,则有(2 -1)*2us=1000us
x=2 -500
因此,TH,TL可置65536-500。
第三章 AD9850简介
3.1 AD9850功能概述
AD9850是高稳定度的直接数字频率合成器件,内部包含有输入寄存器、数据寄存器、数字合成器(DDS)、10位高速D/A转换器和高速比较器。AD9850高速的直接数字合成器(DDS)核心根据设定的32位频率控制字和5位相移控制字,可产生0.029Hz到62.5MHz的正弦波信号和标准的方波信号。该器件提供了并行和串行控制字输入,可通过并行接口或串行接口实现控制字的定入,以改变其输出频率和相位。其主要特性如下:
(1)单电源供电,+5V或+3.3V;
(2)功耗低,380mW(=5V),
155mW(3.3V);
(3)具有电源关断功能;
(4)工作温度:-40℃-+85℃。
1.2 AD9850的引脚功能
AD9850是28脚SOP表面封装,
体积小,易用于便携仪器。其AD9850
排列如图1所示,功能如下:
(1)D0-D7,控制字并行输入
端,其中D7可作为串行输入; 图3-1 AD9850引脚图
(2)DGND,数字地;
(3)DVDD,为内部数字电路提供电源;
(4)WCLK,控制字装入时钟;
(5)FQUD,频率更新控制;
(6)CLK,输入时钟;
(7)AGND,模拟地;
(8)AVDD,为内部模拟电路提供电源,可与数字电源共用;
(9)RSET,DAC外接电阻;
(10)QOUT,QB,内部比较器输出端;
(11)VINN,VINP,内部比较器输入端;
(12)DACBL,内部DAC外接参考电压端,可空;
(13)IB,IOUT,DAC输出端;
(14)RES,复位端。
3.2 AD9850工作原理
3.2.1 控制字格式及写入时序
AD9850包含一个40位输入寄存器,
其中低32位为频率控制字,高5位
为相位控制字,还有一位电源使能位
和两位测试位。
AD9850的控制字有并行和串行两种写入方式,时序如图5-2所示。并行装入模式下, WCLK第一个时钟上升沿到来时,装入高8位控制字,依次下去,当第5个WCLK时钟到来时装入低8位控制字,这样,连续5个WCLK时钟即可将40位控制字装入输入寄存器。第5个WCLK时钟后,WCLK时钟将不再起作用,直到FQUD时钟上升沿以来或重新复位。FQUD时钟上升沿将40位控制字写入数据寄存器,AD9850输出新的频率波。对于串行模式,每一个WCLK时钟上升沿,由控制字输入口的第8位(管脚25)移入1位控制位(低位先移入),40个WCLK时钟后,FQUD脉冲的上升沿更新输出频率。值得注意的是两位测试位仅是为了生产测试用,必须是00。
3.2.2频率输出原理
AD9850的直接数字合成技术是基于数字分频原理实现频率合成的。器件内部有一个增量可调的累加器,每接收到一个输入脉冲,累加器就增加所设定的增量(由写入的32位频率控制字决定),当累加器溢出时,就输出一临界值,AD9850用一种算法逻辑把累加器输出值转换为接近正弦的量化值,这种算法逻辑实际上就是由高度集成化的存储器查表技术和数字信号处理(DSP)技术来完成的。随后AD9850将量化值送内部的D/A转换器输出正弦波形,若再辅以外部电路(低通滤波)送内部比较器,即可输出标准的方波信号。其输出频率ƒout由输入参考时钟和32位频率控制字决定,即 =WD*CLK/ ,其中WD是32位频率控制字,CLK为输入时钟。
由于AD9850是由10位D/A转换器输出正弦波信号,因此其输出频率最大值不能超过参考输入频率的1/2。当作为时钟源时,考虑到衰减问题,其输出频率的最佳值限制在参考输入频率的33%以下。器件内部设有最小时钟门限,当输入频率低于1MHz时,芯片将自动实现电源判断。
3.3 AD9850应用与设计
AD9850主要应用于频率合成以及数字通信领域,但由于其具有分频特性且易于控制,这里,我们把它应用于信号发生器。
3.3.1 AD9850的应用
由于AD9851是贴片式的体积非常小,引脚排列比较密,焊接时必须小心,还要防静电,焊接不好就很容易把芯片给烧坏。还有在使用中数据线、电源等接反或接错都很容易损坏芯片。所以在AD9851外围采用了电源、输入、输出、数据线的保护电路。为了不受外界干扰,还应添加了滤波电路,显得整个电路完美。
3.3.2 AD9850的硬件设计
采用AT89C51作为CPU与AD9850并行接口方式对时钟频率进行分频控制,其中先用一片锁存器来锁存控制字,用P3.2、P3.4模拟控制字写入时钟来控制数据的定入。控制字写入后,AD9850即由内部D/A转换器输出正弦波。电路设计时,对时钟信号的质量要求比较高,即时钟信号的上升沿和下降沿应无大的尖峰和凹坑,时钟信号必须用地线屏蔽。另外,给AD9850的时钟信号不能低于1 MHz,低于这个数值时,芯片将自动进入休眠状态;当高于此频率时,系统则恢复正常。最后还要考虑设计良好的去耦电路,去耦电容尽可能靠近器件,并注意良好接地,模拟地和数字地一定要分开等。
第四章 DDS信号源系统设计
4.1 方案论证与比较
4.1.1 正弦波生成方案
方案一:采用自激振荡。
1.产生正弦波自激振荡的平衡条件为:
幅度平衡条件 AF=1
相位平衡条件 jAF = jA+j F = 2np , n为整数
实质上,只要电路中的反馈是正反馈,相位平衡条件就一定满足,这是由电路结构决定的,而幅度平衡条件则由电路参数决定,当环路增益 AF=1时,电路产生等幅振荡;AF<1时电路产生减幅振荡;AF>1时,电路产生增幅振荡。
2.选频特性
在振荡电路中,当放大电路或正反馈网络具有选频特性时,电路才能输出所需频率f0的正弦信号。也就是说,在电路的选频特性作用下,只有频率为f0的正弦信号才能满足振荡条件。
3.稳幅措施
如果振荡电路满足起振条件,在接通直流电源后,它的输出信号将随时间的推移逐渐增大。当输出信号幅值达到一定程度后,放大环节的非线性器件接近甚至进入饱和或截止区,这时放大电路的增益A 将会逐渐下降,直到满足幅度平衡条件AF = 1,输出信号将不会再增大,从而形成等幅振荡。这就是利用放大电路中的非线性器件稳幅的原理。由于放大电路进入非线性区后,信号幅度才能稳定,所以输出信号必然会产生非线性失真(削波)。为了改善输出信号的非线性失真,常常在放大电路中设置非线性负反馈网络(如,热敏电阻、半导体二极管、钨丝灯泡等),使放大电路未进入非线性区时,电路满足幅度平衡条件(AF=1),维持等幅振荡输出。这是一种比较好的稳幅措施。
由基本放大器A和正反馈网络F组成的闭合正反馈环路,如图4-1所示。由闭合环路组成的自激振荡器,其振荡产生的起始信号来自于电路中的各种起伏和外来扰动这些电信号中含丰富的频率成分,经选频网络选出某频率的信号输送至放大器A放大后,经F网络反馈后再放大,……,反复循环直至电路的输出由小至大。最后建立和形成稳定的波形输出。但此电路易受外界的干扰,波形不易于稳定,而且难以达到题目中所要求的波形频率,操作麻烦。
图4-1 闭合正反馈环路图
方案二:采用单片机最小系统与AD9850并行接口方式对时钟频率进行分频控制,再连接锁相环,是输出波形的频率更加稳定。如图4-2所示,AD9850内含可编程DDS系统和高速比较器,能实现全数字编程控制的频率合成。AD9850是以高速的直接数字合成器(DDS)为核心根据设定的32位频率控制字和5位相移控制字,可产生0.029Hz到62.5MHz的正弦波信号和标准的方波信号,而且DDS芯片转换速度快、性能价格比高、体积小、输出波形稳定度,精度高、分辨率高,而且输出波形的频率、相位可控,能达到题目预期的效果,操作方便,易于实现。
经比较,在本设计中采用方案二。
4.1.2 输出电压幅度控制方案
方案一:采用多级放大电路。由两个晶体管构成共射——共集放大电路如图4-3,第一级起到电压放大作用,达到正弦信号峰-峰值输出,第二级为跟随器,主要为了能够带50欧的负载,使其负载上的正弦信号的输出电压的峰-峰值达到题目的要求。此电路只是在调试选定具体参数中比较麻烦,但工作比较稳定,比较易于实现。
图4-3 共射-共基放大电路的交流通路
方案二:采用可变增益放大器。增益放大器直接与AD9850相接,用来实现电压的放大并且控制波形的失真,精确度高,且较稳定,实现简单。可以采用AD603,它正是这样一种具有程控增益调整功能的芯片。它是美国ADI公司的专利产品,是一个低噪、90MHz带宽增益可调的集成运放,如增益用分贝表示,则增益与控制电压成线性关系,压摆率为275V/μs。管脚间的连接方式决定了可编程的增益范围,增益在-11~+30dB时的带宽为90Mhz,增益在+9~+41dB时具有9MHz带宽,改变管脚间的连接电阻,可使增益处在所需范围内。
本设计采用方案二。
4.1.3 模拟幅度调制
方案一:采用DDS芯片与0832分别产生正弦波,再经乘法器进行波形幅度调制,如图4-4所示。DDS产生调制正弦波信号,范围在1兆赫兹到10兆赫兹。0832产生正弦波载波,频率为1kHz。单片机可以控制调制信号的步进量,但由于在本设计中所采用的51单片机不具备达到设计中所需正弦波载波的频率,因而此方案不能采用。
方案二:采用两片DDS芯片分别产生正弦波调制信号与载波信号,如图4-5所示。产生的信号再由模拟乘法器进行调幅,用数字电位器来控制调制信号的步进量,此方案产生的波形稳定,且易于实现,能够基本实现设计中的要求。
4.1.4 数字PSK/ASK载波调制
方案一:采用两片DDS芯片分别产生正弦波和方波,如图4-6所示,在ASK的载波调制中,正弦波和方波通过模拟乘法器进行调制;在PSK的调制中,正弦波和方波通过高频继电器进行调制。但DDS芯片产生方波外界电路较为复杂,不易于调试。
方案二:采用555芯片来产生方波,DDS芯片来产生正弦波,如图4-6所示。在ASK的载波调制中,正弦波和方波通过模拟乘法器进行调制;在PSK的调制中,正弦波和方波通过高频继电器进行调制。此方案中所实现的方波较为稳定,易于调试。
经比较,本设计采用方案一。
根据题目的具体要求,以及各方案的讨论及研究得出了最终的整体方案,下图既为本设计的主体系统设计图4-7。
4.2 单元电路设计
4.2.1 正弦波的生成
本设计中单片机最小系统中的8155与AD9850芯片的接口采用的是8位并行接口方式。AD9850的频率/相位控制字—共有40位,并行加载时,要连续加载5次,D7位最高位,D0位最低位。频率相位控制字的第一个8位中的5位用来控制相位的调制,1位用来低功耗,2位用于装载格式。第2个字节到第5个字节组成32位的频率控制字,其输出信号的频率f= ,其中 为32位频率控制字的值, 为工作时钟。8155的PB口(PB0脚~PB7脚)与AD9850的数据口(D0脚~D7脚)相接,AD9850的第7脚WCLK是加载时钟,与引脚FQUD配合,完成数据加载,FQUD为频率/相位更新控制。用单片机的P3.2与P3.4分别与AD9850的WCLK和FQUD相连接,模拟控制字写入时钟来控制数据的定入。本设计中AD9850选用的时钟为66MHz。AD9850波形的输出频率可以达到几十MHz。连接如图4-8所示。
4.2.2 输出电压幅度控制
最初我对输出电压的幅度控制由模拟电路(晶体管等)来实现。正弦波从AD9850输出后进入到模拟电路中,晶体管基极上的10微法电容和100皮法电容分别控制高频信号和部分低频信号的通过,第一级为放大电路,实现电压的放大,使其输出电压的峰-峰值达到5伏到7伏之间,晶体管采用9018,测得它的电流放大倍数 ,集极的电压控制为所加电压源的一半,本设计中晶体管所加电源为12伏,因此集极的电压为6伏,初始先定集极的电阻为3千欧,根据公式由 得出从而得出集极的电流 ,进而由 求得基极的电阻,发射极直接接地,从而构成了共射放大电路,实现输出电压的峰-峰值要求(5伏~7伏)。第二级为跟随器,从而能够带动50欧的负载。基极与发射极由0.1微法的电容所构成的回路为自举电路。基极接电阻后直接接到电源,发射极直接接负载从而构成了跟随器。根据调试再对相应的参数进行调整,来实现整个电路的运行,最终实现在频率范围内50欧负载电阻上正弦信号输出电压的峰-峰值(5伏~7伏)。
但在设计过程中,我发现模拟电路部分难以实现,于是我们采用了添加自动增益放大器芯片的方法来实现设计的要求。采用的是美国ADI公司的AD603芯片如图4-9,经它放大后,可以实现设计的要求,达到输出波形的幅度标准。
4.2.3 模拟信号的产生
为了能够产生模拟幅度调制信号,设计要求在1MHZ-10MHZ范围内调制度可在10%-100%之间可调,所以由DDS芯片产生的正弦波调制信号能够进行调节,为了实现调节的步进,应该使用数字电位器,利用单片机进行程控,不过因为时间紧,未能找到合适的数字电位器,故只好采用普通电位器。虽能实现幅度调节,但是不能实行步进,只能做到线性调节。
4.2.4 数字PSK/ASK载波调制
对数字信号进行二进制调制振幅键控,主要有两种方法:乘法器实现法和键控法。在这里我们采用乘法器实现法,我们采用的乘法器是美国ADI公司的乘法器AD835,如图4-10
图4-10 AD835引脚图
它具它有工作频率高,运算速度快等优点,十分适合进行ASK载波调制。对于PSK调制,采用了键控法,采用了开关式三极管和高频继电器来实现,通过调制信号来控制高频继电器通断来实现调制。
4.2.5 键盘与显示控制的设计
利用芯片8279来进行键盘控制显示管LED的显示以及波形的频率和波形频率的步进。初始化时,有芯片8279控制的显示管LED显示HELLO,当按下A建时,键盘清屏;键盘的0~9设置频率,当设置完毕后,按B键表示设置完毕,此时显示管LED的值即为输出正弦波的频率;C键为频率步进正100赫兹,D键为步进负100赫兹。
第五章 软件设计
5.1 软件功能的实现
程序全部由单片机的C语言编写,由正弦信号发生模块、功率放大模块、调幅(AM)、调频(FM)模块、数字键控(ASK,PSK)模块以及测试信号发生模块组成。采用数控的方法控制DDS芯片AD9850产生0Hz-30MHz正弦信号,经滤波、放大和功放模块放大至6V并具有一定的驱动能力。测试信号发生模块产生的1kHz正弦信号经过调幅(AM)模块、调频(FM)模块,对高频载波进行调幅或调频。二进制基带序列信号送入数字键控模块,产生二进制PSK或ASK信号,同时对ASK信号进行解调,恢复出原始数字序列。
5.2 软件流程图
5.2.1 总设计流程图
在对系统初始化后,LED显示HELLO,同时两片AD9850都产生1KHz的正弦波。产生正弦波测试信号的AD9850将保持1KHz不变,而作为信号发生器的AD9850将在键盘的控制下产生预定的正弦波。同时还可以通过电路的改变进行模拟调制和数字调制。从而实现各种功能。设计流程图如图5-1所示。
5.2.2 外设流程图
作为人机界面的键盘和LED通过8279来控制。8279是专用键盘/显示器控制芯片,能对显示器自动扫描,能识别键盘上按下键的键号;可充分提高CPU的工作效率。8279与MCS-51接口方便,由它构成的标准键盘/显示器接口在微机应用系统中使用越来越广泛。键盘和LED的软件流程图如图5-2所示。
5.2.3 AD9850流程图
由于用一片AT89C51来控制两片AD9850,所以利用8155扩展I/O口。这样可以使得I/O口更加充足。如图5.3。
总 结
本设计是我第一次比较系统完成的一次设计。在本次设计中我从选题,搜集资料,电路设计到硬件电路的调试以及程序的调试,比较系统的接触到了一次设计整个过程的具体环节,从中受益匪浅。本设计基本上实现了设计任务所要求的功能,但由于时间的紧迫,有许多本可以做的更好的地方,但没能做到。例如:对于数字信号发生器,起初是设想通过从机与主机之间通信数据完成,而实际设计过程仅仅选用了键盘直接控制没有实现通讯控制。尽管如此,这次设计是对大学四年来所学知识的一次综合运用,增强了我理论结合实践能力。
通过本次设计我进一步加深了对51系列单片机、DDS、信号发生器系统设计的了解,增强了我对电路分析能力,并且对AT89C51、AD9850、8279、8155等所用芯片有了更深的了解,这为我以后的学习打下了良好的基础。
参考文献
[1] 张肃文 陆兆熊 高频电子线路(第三版)[M] 北京 高等教育出版社 1992:102-134.
[2] 谢自美 电子线路设计•实验•测试[M] 武汉 华中理工大学出版社 1994:89-117.
[3] 周立功 夏宇闻 单片机与CPLD综合应用技术[M] 北京 北京航空航天大学出版社 2004:189-218.
[4] 童诗白 化成英 模拟电子技术基础[M] 北京 高等教育出版社 2000:271-295.
[5] 樊昌信 詹道庸 通信原理[M] 北京 国防工业出版社 1995:71-83.
[6] 李友平 直接数字频率合成器(DDS)的原理与设计[J] 电声技术 1992,(11).
[7] 马忠梅 籍顺心 单片机的C语言应用程序设计[M] 北京 北京航空航天大学出版社
2003:102-109
[8] 靳达编 单片机应用系统开发实例导航[M] 北京 人民邮电出版社 2000:24-31.
[9] 求是科技 单片机典型模块设计实例导航[M] 北京 人民邮电出版社 2003:61-69.
[10] 李光飞 单片机课程设计实例指导[M] 北京 北京航空航天大学出版社2004:45-51.
[11] 胡汉才 单片机原理及其接口技术[M] 北京 清华大学出版社 2005:157-164.
[12] 胡宴如 高频电子线路[M] 北京 高等教育出版社 2000:186-203.
[13] 白驹珩 雷晓平 单片计算机及其应用[M] 成都 电子科技大学出版社1997:74-82..
[14] 李广弟 单片机基础[M] 北京 北京航空航天大学出版社 1994:72-84.
[15] 肖汉波 一种基于DDS芯片AD9850的信号源[J] 北京 中国工程物理研究院电子工程研究所 2002,(9).
[16] 陈永泰 刘雪燕 AD9850与AT89C51在信号源中的应用[J] 武汉理工大学 2002,(8).
[17] Analog Devices Inc. CMOS 180MHz Complete DDS Synthesizer AD9851 [M]1997:45-59.
[18] Nicholas HT The optimisation ofdirect digitalfrequency synthesizer performance in thepresence of finite word length effects[J].Proc.42nd Annu.Frequency Cont Symp USER-ACOM,1988,(5)5:357.
附 录
设计程序源代码:
#include <reg51.h>
#include <absacc.h>
#define COM8155 XBYTE[0x2100] //8155
#define PB8155 XBYTE[0x2102]
#define COM8279 XBYTE[0x7fff] //8279
#define DAT8279 XBYTE[0x7ffe]
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
uchar code keytab[]={0xc1,0xc8,0xc9,0xd0,0xd8,0xe0,0xc2,0xca,0xd1,0xd9,0xda,0xc3,0xcb,0xd2,0xd3,0xdb};
uchar code dispcode[]={0x0c,0x9f,0x4a,0x0b,0x99,0x29,0x28,0x8f,0x08,0x09,0x88,0x38,0x6c,0x1a,0x68,0xe8};
uchar code hello[]={0x98,0x68,0x7c,0x7c,0x0c};
uchar k=0,a[8],add=0,dec=0;
sbit clearflag=ACC^7;
sbit W_CLK=P1^6;
sbit FQ_UD=P1^4;
sbit reset=P1^2;
ulong x0=0xfd72,frequency=0xfd72,pa=1,seem;
void reset1() //9850复位 (1)
{uchar i,j;
for(i=0;i<125;i++)
for(j=0;j<125;j++)
P1=0xff;
P1=0;
}
void again(ulong x0) &am, p;am, p;am, p;am, p;nb, sp; &nb, sp; &a, mp;a, mp;a, mp;a, mp;a, mp;n, bsp; //写9850控制字
{
uchar i;
for(i=0;i<32;i++)
{
W_CLK=0;
FQ_UD=0;
PB8155=0x00;
W_CLK=1;
, , , W_CLK=0;, FONT>
PB8155=(x0/65535)/255;
W_CLK=1;
W_CLK=0;
PB8155=(x0/65535)%255;
W_CLK=1;
W_CLK=0;
PB8155=(x0%65535)/255;
W_CLK=1;
W_CLK=0;
PB8155=(x0%65535)%255;
W_CLK=1;
W_CLK=0;
}
FQ_UD=1;
}
void intial() //系统初始化 (3)
{
reset1(); //复位
COM8279=0xdf; //初始化8279
do{ACC=COM8279;}
while(clearflag==1);
COM8279=0x10;
COM8279=0x2a;
COM8279=0x80;
COM8155=0x03; //初始化8155 a b输出 c输入
again(x0); //9850初始化 产生1kHZ正弦波
}
uchar keyboard() //键盘检测 (4)
{
uchar i,j;
i= COM8279;
if((i&07)!=0)
{
j= DAT8279;
for(i=0;i<16;i++)
if(j==keytab[i])
return i;
}
return 0;
}
void hellome() //0键显示
{
uchar i;
for(i=0;i<5;i++)
{ COM8279=0x82+i;
DAT8279=hello[i];
}
}
void caution()
{ uchar i,j,m,n;
COM8279=0xdf;
do{ACC=COM8279;}
while(clearflag==1);
while(1)
{
j=COM8279;
if((j&07)!=0)
{
n=DAT8279;
for(m=0;m<10;m++)
if(n==keytab[m])
{
{ COM8279=0x80+k;
DAT8279=dispcode[m];
a[k]=m;
k++;
if(k>8)
{
k=0;
COM8279=0xdf;
do{ACC=COM8279;}
while(clearflag==1);
}
}
}
}
if(n==0xc3)
break;
}
}
void dispfre(ulong x ) //频率显示 (5)
{
uchar i;
COM8279=0x80;
i=x/10000000;
DAT8279=dispcode[i];
COM8279=0x81;
i=(x%10000000)/1000000;
DAT8279=dispcode[i];
COM8279=0x82;
i=(x%1000000)/100000;
DAT8279=dispcode[i];
COM8279=0x83;
i=(x%100000)/10000;
DAT8279=dispcode[i];
COM8279=0x84;
i=(x%10000)/1000;
DAT8279=dispcode[i];
COM8279=0x85;
i=(x%1000)/100;
DAT8279=dispcode[i];
COM8279=0x86;
i=(x%100)/10;
DAT8279=dispcode[i];
COM8279=0x87;
i=x%10;
DAT8279=dispcode[i];
}
void disp()
{
switch(k=k-1)
{
case 7:
frequency=a[0]*10000000+a[1]*1000000+a[2]*100000+a[3]*10000+a[4]*1000+a[5]*100+a[6]*10+a[7];break;
case 6:
frequency=a[0]*1000000+a[1]*100000+a[2]*10000+a[3]*1000+a[4]*100+a[6]*10+a[6];break;
case 5:
frequency=a[0]*100000+a[1]*10000+a[2]*1000+a[3]*100+a[4]*10+a[5];break;
case 4:
frequency=a[0]*10000+a[1]*1000+a[2]*100+a[3]*10+a[4];break;
case 3:
frequency=a[0]*1000+a[1]*100+a[2]*10+a[3];break;
case 2:
frequency=a[0]*100+a[1]*10+a[2];break;
case 1:
frequency=a[0]*10+a[1];break;
case 0:
frequency=a[0];break;
}
k=0;
seem=frequency*65;
again(seem);
}
void addtion()
{
if(seem<0x27000000)
seem+=0x19ca;
else
add=1;
dispfre(seem/65);
again(seem);
}
void decrease()
{
if(seem>0x19ca)
, seem-=0x19ca;
&, nbsp; else
,
dec=1;
dispfre(seem/65);
again(seem);
}
main()
{ uchar i;
reset1();
intial();
hellome();
while(1)
{
i=keyboard();
if(i==0x0a)
{
caution();
disp();
}
if(i==0x0c)
{
add++;
addtion();
}
if(i==0x0d)
{
dec++;
decrease();
}
}
}
致 谢
经过几个月的努力,毕业设计顺利地完成了!这一过程让我学得了很多平时没有学到的知识。毕业设计是大学四年所学知识的一次综合运用,也是由理论结合实践的第一步,为我以后的学习奠定了良好的基础。经过这次毕业设计,我对信号发生器系统有了更加清楚地认识,知道了所学知识的重要性,对设计的过程与步骤以及应注意的细节都有了更为深刻的理解和领会。设计中遇到了许多平时想象不到问题,但是,在指导老师的指点,以及其他同学的帮助下,基本上得到了解决。设计中我得到了李庆华老师的悉心指导。他渊博的知识,诚恳的为人,使我受益匪浅,在此对李老师表示衷心的感谢,另外,还要谢谢其他给予我帮助的同学。
鉴于作者的水平有限,难免存在一些错误和漏洞。望各位专家、学者不吝赐教,在此向大家表示衷心的感谢。
敬告:本站论文载自网络,本站不予评论或纠错!所有内容读者自行论证!更多设计论文陆续添加中...