资源描述
word快速扫频信号发生器的设计摘要:信号发生器又称信号源或振荡器,是一种非常重要的仪器,在通信、测控、医疗、教学领域、实践应用领域与科技领域中都有着广泛的应用,由于实际应用需要不同频率的波形,因此设计一个频率可调的信号发生器具有一定的实际意义。本文设计的信号发生装置是以STC89C52RC单片机为主控制器,由复位电路、晶振电路、信号产生电路、LED显示电路、滤波电路等构成硬件电路,采用语言进展编程,通过DDS技术,根据采样定理并通过单片机控制AD9850芯片,产生频率在050MHZ的连续可调正弦波。本文详细介绍了STC89C52RC 单片机的根本原理,分析了STC89C52RC 各个管脚的功能与它在设计电路中的作用,介绍了芯片AD9850的根本结构与工作原理。最后结合此设计的硬件原理和软件原理,给出了实验结果,并在产生正弦波的根底上又实现了快速扫频功能。关键字:信号发生器;DDS技术;AD9850;快速扫频中图分类号:TK514引言1.1 开展背景电子时代的降临,电子元件的日新月异,功能不断强大,给人们带来了极大的方便,波形发生器作为一种常用的信号源,是现代测试领域内应用最广泛的仪器之一,在科研、教学、应用等领域不可或缺的电子仪器,也是电子测量领域中最根本、应用最广泛的一类电子仪器之一。自上世纪20年代波形发生器诞生以来,随着晶体管的出现,DDS技术的产生,集成电路的迅速开展, 用集成电路可很方便地构成各种波形发生器,用集成电路实现的波形发生器与其它波形发生器相比, 其波形质量、幅度和频率稳定性等性能指标, 都有了很大的提高1。随着单片机的功能不断强大,在社会生活中各个领域的应用更加广泛, 单片机集成度高,体积小,可靠性高,抗干扰能力优于一般的通用CPU,控制功能强,低电压,低功耗,易扩展,性价比高,便于生产携带。单片机应用广泛,小到涉与千家万户的家用电器,如全自动洗衣机、热水器、高级音响设备、电子游戏等,大到国家航空航天,如卫星、巡航导弹、火炮、通信、遥感、信息情报收集等国家安全某某。另外,单片机在工业实时控制中系统也有广泛用途,如过程控制中的各种测控参数:压力、流量、液位、温度、湿度、酸碱度、化学成分等。从新型单片机的性能看出,单片机正朝多品种、多规格、超小型、低功耗、廉价的方向开展。单片机在社会生活的意义逐渐显现,并扮演越来越重要的作用。本设计采用单片机作为主要核心,设计简易波形发生器。背景中关于DDS的局部还是太少1.2 研究思路波形发生器的研究理论根底知识主要有模拟电子技术、数字电子技术、单片机的中断系统的设计,另外还涉与显示模块,按键扫描模块的根本知识。单片机体积小、重量轻、可靠性高、灵活性好、开发较为容易。它功能强大,提供了相当多的相关功能模块,所以使用非常方便,用51单片机来设计波形发生器是完全可行的。基于MCS-51 的波形发生器设计,首先要有明确的设计目的和设计方案,要设计出硬件总体框架图。总体系统框架如图1.2.1 所示。图1.2.1 系统框图图中,系统以单片机AT89C52RC 为核心,主要有按键模块、显示模块、DDS技术模块、滤波电路模块等,在设计过程中,波形的产生主要通过C环境下的程序控制单片机与芯片 AD9850工作。这要依靠单片机的中断系统,波形输入频率改变通过外部中断系统实现,在设计过程中,要进展硬件和软件的调试,与时发现问题解决问题,直到能够输出所要求的波形和实现扫频功能为止。1.3 研究意义快速扫频信号发生器目前广泛用于放大器、各种滤波器、与其有源或无源网络的频率特性, 利用扫频信号可对被测网络进展快速、定性或定量的动态测量, 给出被测网络的传输特性、阻抗等参数的实时测量结果。而扫频信号驱动是整个测量系统设计中的关键环节之一, 设计完成一个能够产生等幅、波形失真小、频率随时间线性变化的扫频信号源是本文研究的主要目标。通过对此波形发生器的设计,可以对51单片机有了更加深刻的认识,对其各个引脚功能掌握的更为透彻。同时对DDS信号处理技术以与芯片AD9850有了更加深刻的认识与了解,对DDS的开展过程有了一定的把握,并对最新的DDS技术有了一定的了解,再次认识到单片机的应用具有使用X围广的特点和对各个行业的技术改造,产品智能化的更新换代起着重要推动作用。在设计波形发生器的过程中,需要完成硬件设计和软件设计,所以需要设计电路硬件原理图。在绘制原理图过程中,对PROTEL99SE软件进展了熟悉和应用,对软件中的各个文件编辑器进展了掌握,并且知道了在原理图设计和绘制时,要对元件有合理的布局和放置。在编写C程序过程中,对KEIL软件进展全面复习,熟悉软件的编程环境,调试过程中的单步执行等功能进展熟练练习。通过这次研究,在自己动手设计硬件原理图和软件编程的过程中,可以很好的了解到波形发生器的总体设计过程和功能的实现过程,自己着手硬件和软件的制作,一定程度上提高了自己的动手能力和解决问题的能力。2 波形发生器硬件设计硬件局部主要由单片机控制模块,DDS直接数字式频率合成器模块,键盘输入模块,输入显示模块和功率放大模块等组成。2.1 STC89C52单片机简介STC89C52系列单片机是宏晶科技公司推出的新一代增强型8051单片机,具有超强抗干扰、高速、低功耗一种新型51内核的单片机,与普通的51单片机完全兼容,12MHZ时钟周期与6MHZ时钟周期可以任意切换,无需专用编程器,无需专用仿真器,通过串口可直接下载用户程序,具有EEPROM功能和看门狗功能,它是控制波形输出的核心,主要包括运算器和控制器两大局部,片内含有 8k 字节Flash 闪速存储器,512字节内部RAM,32个I/O接口线,3个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,18个字节的特殊功能存放器,片内振荡器与时钟电路,工作频率X围040MHZ,相当于普通8051的080MHZ,实际工作频率可达48MHZ,同时,片内采用单总线结构,有较强的位处理能力,兼容MCS-51指令系统,为工业和生活提供许多高性价比的应用场合,可灵活应用于各种控制领域。2.1.1 STC89C51引脚与各引脚功能其引脚图如图 2.1.1所示图2.1.1 STC89C52单片机引脚图各引脚功能介绍:40只引脚按功能分为3类:电源与时钟引脚、控制引脚、I/O口引脚。1. 电源与时钟引脚1) 电源引脚1Vcc40脚:+5V电源;2Vss20脚:接地。2) 时钟引脚1XTAL119脚:接外部晶体,如果采用外接振荡器时,振荡器的输出应接到此引脚上。2XTAL218脚:接外部晶体的另一端或采用外接振荡器时悬空。2. 控制引脚提供控制信号,有的引脚还具有复用功能。 (1) RST/VPD(9脚):复位与备用电源。 (2) EA*/VPP(Enable Address/Voltage Pulse of Programing,31脚) EA*:为内外程序存储器选择控制端。 EA*=1,访问片内程序存储器,但在PC程序计数器值超过0FFFH对于8051、8751时,即超出片内程序存储器的4K字节地址X围时,将自动转向执行外部程序存储器内的程序。 EA*=0,单片机如此只访问外部程序存储器。VPP:本引脚的第二功能。用于施加编程电压例如+21V或+12V。对AT89C51,加在VPP脚的编程电压为+12V或+5V。(3) ALE/PROG*30脚:第一功能:ALE为地址锁存允许,可驱动8个LS型TTL负载。第二功能:PROG*为编程脉冲输入端。此外,单片机在运行时,ALE端一直有正脉冲信号输出,此频率为时钟振荡器频率fosc的1/6。该正脉冲信号可以作时钟源或定时信号使用。注意:每当AT89C51单片机访问外部RAM时即执行MOVX类指令时,要丢失1个ALE脉冲。因此,严格来说,ALE还不宜作为准确的时钟源或定时信号。PROG*为该引脚的第二功能,在对片内Flash存储器编程时,此引脚作为编程脉冲输入端。(4) PSEN*29脚:外部程序存储器的读选通信号。在单片机读外部程序存储器时,此引脚输出脉冲的负跳沿作为读外部程序存储器的选通信号。3. 并行I/O口引脚(1) P0口:当89C51扩展外部存储器与I/O接口芯片时,P0口作为地址总线低8位与数据总线的分时复用端口,为双向I/O口。当作为低八位地址总线时需外接地址锁存器。也可作为通用的I/O口使用,但需加上拉电阻,这时为准双向口。当作为普通的I/O输入时,应先向端口的输出锁存器写入1。(2) P1口:8位准双向I/O口,可驱动4个LS型TTL负载。(3) P2口:8位准双向I/O口,与地址总线高8位复用,可驱动4个LS型TTL负载。(4) P3口:8位准双向I/O口,双功能复用口,可驱动4个LS型TTL负载。P3口还可提供第二功能,定义如表2.1所列。表2.1 P3口第二功能综上所述,P0口作为地址总线低8位与数据总线使用时,为双向口。作为通用的I/O口使用时,为准双向口,这时需加上拉电阻。P1口、P2口、P3口均为准双向口。要特别注意准双向口与双向口的差异。准双向口仅有两个状态。双向口P0口的口线内无固定上拉电阻,为双向三态I/O口。这是由于P0口作为数据总线使用时,必须要有高阻的“悬浮状态。而准双向I/O口如此无需高阻的“悬浮状态。 2.1.2 单片机最小系统单片机最小系统,是指用最少的元件组成的单片机可以工作的系统小系统一般应该包括:单片机、晶振电路、复位电路。其电路如图2.1.2所示。图2.1.2 单片机应用最小系统2.2 DDS正弦波产生电路DDS 是直接数字频率合成的简称(即Direct Digital Frequency Synthesize)。直接数字频率合成技术是近年来随着微电子技术的开展而开展起来的。其根本原理是利用采样定理,通过查表法产生波形,是一种全数字化的频率合成器,主要由频率控制存放器、相位累加器、正弦计算器和参考时钟等局部构成。DDS 频率分辨率高,输出频点多,可达N个频点(N 位相位累加器位数);频率切换速度快,可达us 量级;频率切换时相位连续;可以输出宽带正交信号;输出相位噪声低,对参考频率源的相位噪声有改善作用;可以产生任意波形;全数字化实现,便于集成,体积小,重量轻7。该电路也是信号发生器的主要局部,DDS芯片在单片机的数字信号控制下产生高精度的一定幅度的正弦波,DDS同 DSP数字信号处理一样,是一项关键的数字化技术。与传统的频率合成器相比,DDS具有低本钱、低功耗、高分辨率和快速转换时间等优点,广泛使用在电信与电子仪器领域,是实现设备全数字化的一个关键技术。DDS由于采取的芯片不同会有很多种,但根本原理一样,本系统采用的是由美国AD公司生产的AD9850芯片。2.2.1 AD9850简介AD9850 采用先进的CMOS 工艺, 其功耗在3. 3V 供电时仅为155mW , 扩展工业级温度X围为- 40 80 , 最大支持时钟频率为125MHz,此时输出的频率分辨率达0.0291Hz,采用28脚SSOP 外表封装形式。AD9850的引脚排列与外围电路如图2.2.1所示:图2.2.1 AD9850引脚与其外围电路AD9850 内含可编程DDS 系统和高速比拟器,能实现全数字编程控制的频率合成。其组成结构图如图2.2.2 所示:图2.2.2 AD9850的组成框图可编程DDS 系统的核心是相位累加器, 它由一个加法器和一个N位相位存放器组成, N一般为2432。每来一个外部参考时钟,相位存放器便以步长M 递加。相位存放器的输出与相位控制字相加后可输入到正弦查询表地址上。正弦查询表包含一个正弦波周期的数字幅度信息, 每一个地址对应正弦波中0360X围的一个相位点。查询表把输入地址的相位信息映射成正弦波幅度信号, 然后驱动DAC 以输出模拟量。相位存放器每过2N/M个外部参考时钟后返回到初始状态一次, 相应地正弦查询表每经过一个循环也回到初始位置, 从而使整个DDS 系统输出一个正弦波。输出的正弦波周期TO = Tc2N/ M , 频率fout = Mfc/ 2N ,Tc、fc 分别为外部参考时钟的周期和频率5。AD9850 采用32 位的相位累加器将信号截断成14 位输入到正弦查询表,查询表的输出再被截断成10位后输入到DAC , DAC 再输出两个互补的电流。DAC满量程输出电流通过一个外接电阻RSET调节, 调节关系为ISETSET) , RSET的典型值是3. 9k。将DAC的输出经低通滤波后接到AD9850内部的高速比拟器上即可直接输出一个抖动很小的方波。其系统功能如图2.2.3所示。图2.2.3 AD9850系统功能图AD9850 在接上精细时钟源和写入频率相位控制字之后就可产生一个频率和相位都可编程控制的模拟正弦波输出, 此正弦波可直接用作频率信号源或经内部的高速比拟器转换为方波输出。在125MHz 的时钟下, 32 位的频率控制字可使AD9850 的输出频率分辨率达0. 0291Hz ; 并具有5位相位控制位,而且允许相位按增量180、90、45、22. 5、11. 25或这些值的组合进展调整5。2.2.2 AD9850 的控制字与控制时序AD9850有40位控制字, 32位用于频率控制,5位用于相位控制, 1位用于电源休眠( Powerdown) 控制, 2位用于选择工作方式。这40位控制字可通过并行方式或串行方式输入到AD9850 ,图2.2.4是控制字并行输入的控制时序图。图2.2.4 控制字并行输入的时序图在并行装入方式中,通过8位总线D0D7将可数据输入到存放器,在重复5次之后再在FQ-UD上升沿把40位数据从输入存放器装入到频率/相位数据存放器(更新DDS 输出频率和相位) , 同时把地址指针复位到第一个输入存放器。接着在W-CLK 的上升沿装入8位数据,并把指针指向下一个输入存放器,连续5个W-CLK上升沿后, W-CLK的边沿就不再起作用,直到复位信号或FQ-UD上升沿把地址指针复位到第一个存放器。在串行输入方式,W-CLK上升沿25引脚的一位数据串行移入,当移动40位后,用一个FQ-UD脉冲即可更新输出频率和相位。图2.2.5是相应的控制字串行输入的控制时序图。图2.2.5 控制字串行输入的时序图并行写入方式的优点是数据传输的速度快,能够提升整个系统的处理速度,但占用的单片机的I/O口资源太多。与并行方式相比,串行写入方式在数据传输的速度上要慢些,但它更大优点是能节省很多I/O口资源。所以,本系统采用STC89S51单片机作为控制核心,通过串行写入控制字的方式控制AD9850芯片,加上键盘和LED显示局部等外围电路,构成整个系统电路。AD9850的复位(RESET) 信号为高电平有效,且脉冲宽度不小于5个参考时钟周期。AD9850的参考时钟频率一般远高于单片机的时钟频率, 因此AD9850的复位(RESET) 端可与单片机的复位端直接相连。需要注意的是用于选择工作方式的两个控制位,无论并行还是串行最好都写成00,并行时的10、01和串行时的10、01、11 都是工厂测试用的保存控制字,不慎使用可能导致难以预料的后果。由于AD9850内部没有低通滤波器,因此输出的扫频信号含有高频噪声,需要在其输出端口加低通滤波器。由于AD9850的系统时钟典型为125MHZ,而DDS最高能输出系统时钟的一半,但为了更好降低DDS的杂散谐波,产生平滑的信号波形,一般将最高输出控制在系统时钟的40,本系统设计中,滤波器最高输出频率设定为50MHZ,为了能降低AD9850系统时钟的干扰,采用具有较窄过渡带特性的七阶椭圆滤波器,具有下降更快的过渡带,通带设计为55MHZ,通过实际中的不断调试以确定滤波器组件值,如图2.3.1所示。图2.3.1 低通滤波器原理图2.4 键盘输入显示电路该电路模块主要用于显示要输入的显示的频率,包括位八段数码管、显示驱动电路。由于输入与显示电路元件较多,而单片机的接口有限,所以必须对单片机的输入输出口进展扩展,接口扩展电路是输入显示电路的重要组成局部。显示电路如图2.4.1所示:图2.4.1 输入显示电路2.4.1 数码管显示电路简介常用的LED显示器为8段或7段,8段比7段多了1个小数点“dp段。每一个段对应1个发光二极管。这种显示器有共阳极和共阴极2种。共阴极LED显示器的发光二极管的阴极连接在一起,通常此公共阴极接地。当某个发光二极管的阳极为高电平时,发光二极管点亮,相应的段被显示。同样,共阳极LED显示器的发光二极管的阳极连接在一起,通常此公共阳极接正电压,当某个发光二极管的阴极接低电平时,发光二极管被点亮,相应的段被显示,本设计采用的是共阴极LED显示器作为整个系统的输入频率显示器。2.4.2 LED显示器工作原理个LED显示块有位位选线和N根段码线。段码线控制显示字符的字型,而位选线为各个LED显示块中各段的公共端,它控制该LED显示位的亮或暗。LED显示器有静态显示和动态显示2种显示方式。静态显示是指数码管显示某一字符时,相应的发光二极管恒定导通或恒定截止。这种显示方式的各位数码管相互独立,公共端恒定接地(共阴极)或接正电源(共阳极)。每个数码管的8个字段分别与一个8位I/O口地址相连,I/O口只要有段码输出,相应字符即显示出来,并保持不变,直到I/O口输出新的段码。采用静态显示方式,较小的电流即可获得较高的亮度,且占用CPU时间少,编程简单,显示便于监测和控制,但其占用的口线多,硬件电路复杂,本钱高,只适合于显示位数较少的场合。动态显示是一位一位地轮流点亮各位数码管,这种逐位点亮显示器的方式称为位扫描。通常,各位数码管的段选线相应并联在一起,由一个8位的I/O口控制:各位的位选线由另外的I/O口线控制。动态方式显示时,各数码管分时轮流选通,要使其稳定显示必须采用扫描方式,即在某一时刻只选通一位数码管,并送出相应的段码,在另一时刻选通另一位数码管,并送出相应的段码,依此规律循环,即可使各位数码管显示将要显示的字符,虽然这些字符是在不同的时刻分别显示,但由于人眼存在视觉暂留效应,只要每位显示间隔足够短就可以给人同时显示的感觉。本设计采用的是动态显示方式。2.4.3 键盘输入电路键盘输入电路如图2.4.2所示:图2.4.2键盘输入电路键盘是由一组规如此排列的按键组成,一个按键实际上是一个开关元件,也就是说键盘是一组规如此排列的开关。单片机系统中,假设使按键较多时,通常采用矩阵式(也称行列式)键盘。矩阵式键盘由行线和列线组成,按键位于行、列线的交叉点上,其结构如图2.4.3所示。图2.4.3 4*4行列式键盘识别按键的方法很多,其中,最常见的方法是扫描法。按键按下时,与此键相连的行线与列线导通,行线在无键按下时处在高电平,显然,如果让所有的列线也处在高电平,那么,按键按下与否不会引起行线电平的变化,因此,必须使所有列线处在低电平,只有这样,当有键按下时,该键所在的行电平才会由高电平变为低电平。CPU根据行电平的变化,便能判定相应的行有键按下。在单片机应用系统中,键盘扫描只是CPU 的工作内容之一。CPU对键盘的响应取决于键盘的工作方式,键盘的工作方式应根据实际应用系统中CPU的工作状况而定,其选取的原如此是既要保证CPU能与时响应按键操作,又不要过多占用CPU的工作时间。通常,键盘的工作方式有三种,即编程扫描、定时扫描和中断扫描。编程 扫 描 方式是利用CPU完成其它工作的空余调用键盘扫描子程序来响应键盘输入的要求。在执行键功能程序时,CPU不再响应键输入要求,直到CPU 重新扫描键盘为止。定时扫描方式就是每隔一段时间对键盘扫描一次,它利用单片机内部的定时器产生一定时间的定时,当定时时间到就产生定时器溢出中断,CPU 响应中断后对键盘进展扫描,并在有键按下时识别出该键,再执行该键的功能程序。采用上述两种键盘扫描方式时,无论是否按键,CPU 都要定时扫描键盘,而单片机应用系统工作时,并非经常需要键盘输入,因此,CPU 经常处于空扫描状态,为提高CPU工作效率,可采用中断扫描工作方式。其工作过程如下:当无键按下时,CPU处理自己的工作,当有键按下时,产生中断请求,CPU转去执行键盘扫描子程序,并识别键号。信号发生器设计中要用到十六个按键,因此设计过程中选择行列式键盘,为提高CPU利用率,按键扫描采取中断扫描方式口。3 软件设计局部系统程序流程硬件电路设计对系统的稳定性,抗干扰能力有很大的影响,但是软件程序设计对于系统的稳定性、准确性、响应速度也有很大的关系。本设计方案中对应硬件电路的程序包括:LED显示子程序、LCD初始化4x4矩阵键盘子程序、转换子程序、扫频子程序。主程序流程图如图3.4所示:图3.1 系统流程图程序设计中通过4X4矩阵键盘输入我们需要产生的频率值,并在8位7段数码管上实时显示,对于我们输入的数值只需按下确认按钮,就能讲我们设定的频率值通过单片机传递给AD9850,使AD9850输出我们想要得到的频率值。系统由初始化开始,对程序中用到的管脚定义进展声明,显示局部,键盘局部,参数变量,AD9850局部都进展初始化,以防止发生不确定因素,使程序跑飞。在初始化完毕后,程序就进入主函数局部。在主函数中首先打开总中断和外部中断0。然后将P0口的高四位付予高电平。这里应用外部中断作为中断的触发是因为系统中我们采用中断法来对键盘进展读取。这样做的好处是我们可以随时更改我们需要输入到系统中的数值,并且不会占用太多单片机的资源,提高效率。当然,要读取到4X4键盘上任一按键的中断请求,我们需要用到一个74LS21四输入与门,将键盘的四行或如此四列分别引到74LS21的输入端,然后将输出端引到单片机的P3.2INT0段,并将INT0设置成1,即下降沿触发方式。这样一旦有按键按下,74LS21就输出一个低电平,INT0就由高电平变成低电平,这样单片机就检测到有外部中断请求。P1、P2、P3口也要进展相应的初始化,为程序的后续执行做好准备。AD9850的初始化主要是对AD9850进展复位。AD9850的各个功能管脚复位后,为后面的数据传输工作做好准备。接下来是LED的显示。我们需要做到7段8位数码管的循环显示,并且在系统刚上电的时候我们是LED能够显示Fo=000Hz这样8个字符。对于8位数码管位选择控制,我们通过P1口的低3位,经过74HC138译码器输出选择信号。使8位数码管循环显示。数码管的显示却又和键盘的输入息息相关。本系统采用4X4的矩阵键盘,对键盘进展逐行扫描,并结合中断法来判断是否有键按下。在读键盘期间,我们关闭外部中断,防止干扰带来的屡次中断误判。在消抖处理方面,我们在按键按下后,采用延时十多毫秒再读取键值的方法。但是本系统不采用循环语句来判断,因为采用循环语句会使CPU占用系统资源,降低单片机的工作效率。因此这里我们采用定时器中断法,让定时器等待十多毫秒后触发定时器中断,提高了系统的工作效率。软件中对按键的不同功能也作了分类。有功能键和数字键两种。只有按下更改键后,才能向系统重新输入数值,按下确认键后,才能将数值传送给单片机。其它的功能键,按下后就能直接通过单片机控制AD9850执行相应的操作了。假设没有按键被按下,系统就只能执行当前的操作,直到有触发命令的到来。3.2 AD9850程序AD9850在此系统中采用串口方式,即利用D7端口今天传输数据。其他的端口还有复位端口,写始终端口,频率端口,在AD9850中都要对这些端口进展初始化。程序如下: void ad9850_reset()ad9850_w_clk=0;ad9850_fq_up=0;/rest信号ad9850_rest=0;ad9850_rest=1;ad9850_rest=0;/w_clk信号ad9850_w_clk=0;ad9850_w_clk=1;ad9850_w_clk=0;/fq_up信号ad9850_fq_up=0;ad9850_fq_up=1;ad9850_fq_up=0;在对AD9850进展复位后,就是向AD9850进展控制,这局部主要包括写数据与命令。最主要的还是控制字K在程序中的处理。K值在程序中用X来表示,并且要结合模块中使用的有源晶振的频率值。我们也可以对频率进展一定的修正,减小晶振带来的误差。在AD9850中,对于计数容量为2l的相位累加器和具有M个相位取样点的正弦波波形存储器,假设频率控制字为K,输出信号频率fo为参考时钟频率为fc,如此DDS系统输出信号的频率为:=。由奈奎斯特采样定理可知,DDS输出的最大频率为:=。如此可得频率控制字为:K=。程序中我们为了使精度最大化,L取值为32,其程序如下:void ad9850_wr(unsigned char w0,double frequency)unsigned char i,w;long int y;double x;x=4294795550/125;/修正频率使之更准确,减小晶振带来的误差 frequency=frequency/1000000;这里应该是单位统一为MHzfrequency=frequency*x;y=frequency;/写w4数据w=(y=0);for(i=0;ii)&0x01;ad9850_w_clk=1;ad9850_w_clk=0;/写w3数据w=(y8);for(i=0;ii)&0x01;ad9850_w_clk=1;ad9850_w_clk=0;/写w2数据w=(y16);for(i=0;ii)&0x01;ad9850_w_clk=1;ad9850_w_clk=0;/写w1数据w=(y24);for(i=0;ii)&0x01;ad9850_w_clk=1;ad9850_w_clk=0;/写w0数据w=w0; for(i=0;ii)&0x01;ad9850_w_clk=1;ad9850_w_clk=0;/移入始能ad9850_fq_up=1;ad9850_fq_up=0;3.3 44矩阵键盘子程序设计44矩阵键盘工作原理与介绍已经在前面详细的给出,故这里不再重复。其程序流程图如图3.3.1所示:图3.3.1 键盘扫描流程图程序代码如下:void key_scan() interrupt 0 /外部中断 0 EX0=0; TMOD&=0XF1;/设置定时器0为模式1方式, TH0=0X2E; /设置初值,为12毫秒 TL0=0X00; ET0=1; /开启定时器中断0 TR0=1; /启动定时器计数 void timer0_isr(void) interrupt 1 /定时器0的中断函数 TR0=0; /中断后我们停止计数 ReadKey(); /定时器计数12毫秒后产生中断,调用此函数,读取键值void ReadKey(void) /读键盘值 unsigned char i,j,key; j=0xfe; key=0xff; /设定初值 for (i=0;i4;i+) P0=j; /P0口低4位循环输出0,扫描键盘 if (P0&0xf0)!=0xf0) /如果有键按下,P0口高4位不会为1, key=P0; /读取P0口,退出循环,否如此循环下次 break; j=_crol_(j,1); /此函数功能为左循环移位 if (key=0xff) /如果读取不到P0口的值,比如是干扰,我们不做键值处理,返回 l_keyold=0xff; P0=0xf0; /恢复P0口,等待按键按下 EX0=1; /返回之前,开启外中断 return; if(l_keyold=key) /检测按键放开否,如果一样明确没放开, TH0=0X2E; /继续启动定时器,检测按键松开否 TL0=0; TR0=1; return; TH0=0X2E; TL0=0; TR0=1; /继续启动定时器,检测按键松开否 l_keyold=key; /获取键码做为放开的凭证 for(i=0;i17;i+) /查表获得相应的16进制值存放lkey变量中 if (key=key_tab) l_key=i; break; 3.4 数码管显示程序设计 数码管的程序流程图如图3.4.1所示:图3.4.1 数码管显示流程图程序如下:void display(unsigned char *lp,unsigned char lc)/显示 unsigned char i; /定义变量 P2=0; /端口2为输出 P1=P1&0xF8; for(i=0;ilc;i+) /循环显示 P2=tablelp; /查表法得到要显示数字的数码段 delay(); /延时5个空指令 if(i=7) /检测显示完8位否,完成直接退出,不让P1口再加1,否如此进位影响到第四位数据 break; P2=0; /清0端口,准备显示下位 P1+; /下一位数码管 程序中将P1口的前3位即低3位输出0,对应138译门输入脚,全0为第一位数码管,然后再检测是否8位数码管已完全显示,假设没有,P1口右移一位,显示下一位数码管。3.5 键盘显示转换程序在程序的设计中,我们需要将输入的按键转换为相应的数值在数码管上显示,这里就需要设计一段转换程序,具体代码如下所示:void diszf()/处理转换给数码管显示字符bit nums=1;unsigned long tmp; l_tmpdate0=freq/10000000; tmp=freq/10000000; if(tmp=0 & nums)l_tmpdate0=12; else nums=0; tmp=freq%10000000; l_tmpdate1=tmp/1000000; if(l_tmpdate1=0 & nums)l_tmpdate1=12; else nums=0; tmp=tmp%1000000; l_tmpdate2=tmp/100000; if(l_tmpdate2=0 & nums)l_tmpdate2=12; else nums=0; tmp=tmp%100000; l_tmpdate3=tmp/10000; if(l_tmpdate3=0 & nums)l_tmpdate3=12; else nums=0; tmp=tmp%10000; l_tmpdate4=tmp/1000; if(l_tmpdate4=0 & nums)l_tmpdate4=12; else nums=0; tmp=tmp%1000; l_tmpdate5=tmp/100; if(l_tmpdate5=0 & nums)l_tmpdate5=12; else nums=0; tmp=tmp%100; l_tmpdate6=tmp/10; if(l_tmpdate6=0 & nums)l_tmpdate6=12; else nums=0; tmp=tmp%10; l_tmpdate7=tmp%10;3.6 扫频程序 在运行扫频程序时,由于之前的按键已经全部被占用,故我们这里将两个记忆键中的一个改为扫频开始按键。只有按下此键后,我们才开始对起始频率,终止频率,步长的设置。相应的扫频初始化函数为:unsigned char flag=0; long int startf; long int stopf; long int stepf=100; void San_Freq(void);扫频子函数为:void San_Freq(void) do ad9850_wr(0x00,freq);/串行写freqHz频率程序 diszf();/它还起了延时作用,没用定时器原因很多 display(l_tmpdate,8); display(l_tmpdate,8); . display(l_tmpdate,8); display(l_tmpdate,8);/延时作用,它还起了提高数码显示亮度 freq=freq+stepf while(freqstopf) 4 系统调试结果与性能分析系统调试主要分为两局部:硬件调试和软件调试,其中硬件调试主要包括在未对单片机烧写程序前进展根本的电路元件参数检测,元件焊接是否存在短路或者虚焊问题,用万用表对每个线路的连接状况进展检测。在通电以后,查看整个电路版是否会出现异常现象,如冒烟或者有异味等,如出现上述情况,马上关掉电源,重新检查电路版的连接状况,等排除故障后再通电,烧写程序,进展波形的调试。软件调试局部主要通过keil软件编写程序,在C环境下编写各个模块的程序,烧写程序到单片机,并进展一一调试修改,直到达到要求为止。图4.1 硬件电路图片图4.2 频率为10KHz时的波形图4.3 频率为20MHz时的波形图4.4 频率为30MHz时的波形5 总结虽然本次设计在根本功能上达到了相应的要求,但系统的精度并不高,抗干扰能力与稳定性也较差,还应在这些方面有所加强。在软件设计与调试中,在编写键盘输入和LED显示时遇到问题,按键的输入一直无法在LED数码管中显示,起初一直认为是数码管选型不对,74HC245的驱动能力不够使数码管点亮,后来发现问题出在单片机最小系统板的硬件连接上。由于单片机的晶振管脚连接不延时,导致程序运行发生错误;在程序中,也发现按键的扫描程序书写不正确。在发现这两个问题后与时改正,最后数码管和键盘都能够正常工作。除此之外在输出正弦波时也有出现问题,用示波器观察输出来的正弦波频率一直无法稳定,在020MHzX围内波形还算平滑,较为理想,但在20MHz以后,波形开始发生较大的抖动。后来才找到问题出在测量AD9850模块的波形输出是,示波器表笔的接地端未能接到模块上的地端,而是接到单片机的地端。由于本电路采用一个电源供电,未能将数字地和模拟地进展区分,故在测量时没有选择干扰较少的测量点时,其输出波形将不会很理想由于对编程比拟生疏,在检测短路电流时,还有许多细节的问题存在。最后总结得出假设采用PCB制版作为本系统的电路板,并进展一定的隔离抗干扰处理,其结果将更理想,这样系统也将更稳定更完美。参考文献1基于DDS的多波形发生器,王艳芬 古汉招 林良端 赖叶华,20082信号发生器的设计,李翠华,科技广场2009年第01期3基于DDS的信号发生器的研制,陶益凡,某某信息工程大学硕士学位论文4AD9850 125MHz DDS频率合成器的原理与应用,郭荣祥 郭吉祥,电子技术应用,19975DDS信号源的研制,戴柠 陈一尧,仪器仪表学报,19966DDS芯片AD9850的工作原理与其与单片机的接口,石熊 杨加功 彭世蕤,20017基于AD9859 的扫频信号发生器的设计,常铁原 陈小静 胡重九,2010 8910111213141530 / 30
展开阅读全文