快速扫频信号发生器的设计 - 图文

更新时间:2024-07-08 02:43:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

快速扫频信号发生器的设计

摘要:信号发生器又称信号源或振荡器,是一种非常重要的仪器,在通信、测控、医疗、教学领域、实践应用领域及科技领域中都有着广泛的应用,由于实际应用需要不同频率的波形,因此设计一个频率可调的信号发生器具有一定的实际意义。

本文设计的信号发生装置是以STC89C52RC单片机为主控制器,由复位电路、晶振电路、信号产生电路、LED显示电路、滤波电路等构成硬件电路,采用C语言进行编程,通过DDS技术,根据采样定理并通过单片机控制AD9850芯片,产生频率在0~50MHZ的连续可调正弦波。

本文详细介绍了STC89C52RC 单片机的基本原理,分析了STC89C52RC 各个管脚的功能及它在设计电路中的作用,介绍了芯片AD9850的基本结构及工作原理。最后结合此设计的硬件原理和软件原理,给出了实验结果, 并在产生正弦波的基础上又实现了快速扫频功能。

关键字:信号发生器;DDS技术;AD9850;快速扫频 中图分类号:TK514

1 引言

1.1 发展背景

电子时代的来临,电子元件的日新月异,功能不断强大,给人们带来了极大的方便,波形发生器作为一种常用的信号源,是现代测试领域内应用最广泛的仪器之一,在科研、教学、应用等领域不可或缺的电子仪器,也是电子测量领域中最基本、应用最广泛的一类电子仪器之一。自上世纪20年代波形发生器诞生以来,随着晶体管的出现,DDS技术的产生,集成电路的迅速发展, 用集成电路可很方便地构成各种波形发生器,用集成电路实现的波形发生器与其它波形发生器相比, 其波形质量、幅度和频率稳定性等性能指标, 都有了很大的提高[1]。

随着单片机的功能不断强大,在社会生活中各个领域的应用更加广泛, 单片机集成度高,体积小,可靠性高,抗干扰能力优于一般的通用CPU,控制功能强,低电压,低功耗,易扩展,性价比高,便于生产携带。单片机应用广泛,小到涉及千家万户的家用电器,如全自动洗衣机、热水器、高级音响设备、电子游戏等,大到国家航空航天,如卫星、巡航导弹、火炮、通信、遥感、信息情报收集等国家安全机密。另外,单片机在工业实时控制中系统也有广泛用途,如过程控制中的各种测控参数:压力、流量、液位、温度、湿度、酸碱度、化学成分等。从新型单片机的性能看出,单片机正朝多品种、多规格、超小型、低功耗、廉价的方向发展。单片机在社会生活的意义逐渐显现,并扮演越来越重要的作用。本设计采用单片机作为主要核心,设计简易波形发生器。背景中关于DDS的部分还是太少

1.2 研究思路

波形发生器的研究理论基础知识主要有模拟电子技术、数字电子技术、单片机的中断系统的设计,另外还涉及显示模块,按键扫描模块的基本知识。单片机体积小、重量轻、可靠性高、灵活性好、开发较为容易。它功能强大,提供了相当多的相关功能模块,所以使用非常方便,用51单片机来设计波形发生器是完全可行的。基于MCS-51 的波形发生器设计,首先要有明确的设计目的和设计方案,要设计出硬件总体框架图。总体系统框架如图1.2.1 所示。

LED显示 控制信号AD9850滤波电路单片机4x4矩阵键盘125MHz晶振输出图1.2.1 系统框图

图中,系统以单片机AT89C52RC 为核心,主要有按键模块、显示模块、DDS技术模块、滤波电路模块等,在设计过程中,波形的产生主要通过C环境下的程序控制单片机及芯片 AD9850工作。这要依靠单片机的中断系统,波形输入频率改变通过外部中断系统实现,在设计过程中,要进行硬件和软件的调试,及时发现问题解决问题,直到能够输出所要求的波形和实现扫频功能为止。

1.3 研究意义

快速扫频信号发生器目前广泛用于放大器、各种滤波器、及其有源或无源网络的频率特性, 利用扫频信号可对被测网络进行快速、定性或定量的动态测量, 给出被测网络的传输特性、阻抗等参数的实时测量结果。而扫频信号驱动是整个测量系统设计中的关键环节之一, 设计完成一个能够产生等幅、波形失真小、频率随时间线性变化的扫频信号源是本文研究的主要目标。

通过对此波形发生器的设计,可以对51单片机有了更加深刻的认识,对其各个引脚功能掌握的更为透彻。同时对DDS信号处理技术以及芯片AD9850有了更加深刻的认识与了解,对DDS的发展过程有了一定的把握,并对最新的DDS技术有了一定的了解,再次认识到单片机的应用具有使用范围广的特点和对各个行业的技术改造,产品智能化的更新换代起着重要推动作用。在设计波形发生器的过程中,需要完成硬件设计和软件设计,所以需要设计电路硬件原理图。在绘制原理图过程中,对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个字节的特殊功能寄存器,片内振荡器及时钟电路,工作频率范围0~40MHZ,相当于普通8051的0~80MHZ,实际工作频率可达48MHZ,同时,片内采用单总线结构,有较强的位处理能力,兼容MCS-51指令系统,为工业和生活提供许多高性价比的应用场合,可灵活应用于各种控制领域。 2.1.1 STC89C51引脚及各引脚功能 其引脚图如图 2.1.1所示

图2.1.1 STC89C52单片机引脚图

各引脚功能介绍:

40只引脚按功能分为3类:电源及时钟引脚、控制引脚、I/O口引脚。 1. 电源及时钟引脚 1) 电源引脚

(1)Vcc(40脚):+5V电源; (2)Vss(20脚):接地。 2) 时钟引脚

(1)XTAL1(19脚):接外部晶体,如果采用外接振荡器时,振荡器的输出应接到此引脚上。

(2)XTAL2(18脚):接外部晶体的另一端或采用外接振荡器时悬空。 2. 控制引脚

提供控制信号,有的引脚还具有复用功能。 (1) RST/VPD(9脚):复位与备用电源。

(2) EA*/VPP(Enable Address/Voltage Pulse of Programing,31脚) EA*:为内外程序存储器选择控制端。

EA*=1,访问片内程序存储器,但在PC(程序计数器)值超过0FFFH(对于8051、8751)时,即超出片内程序存储器的4K字节地址范围时,将自动转向执行外部程序存储器内的程序。

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 , 扩展工业级温度范围为- 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一般为24~32。每来一个外部参考时钟,相位寄存器便以步长M 递加。相位寄存器的输出与相位控制字相加后可输入到正弦查询表地址上。正弦查询表包含一个正弦波周期的数字幅度信息, 每一个地址对应正弦波中0°~360°范围的一个相位点。查询表把输入地址的相位信息映射成正弦波幅度信号, 然后驱动DAC 以输出模拟量。相位寄存器每过2N/M个外部参考时钟后返回到初始状态一次, 相应地正弦查询表每经过一个循环也回到初始位置, 从而使整个DDS 系统输出一个正弦波。输出的正弦波周期TO = Tc2N/ M , 频率fout = Mfc/

2N ,Tc、fc 分别为外部参考时钟的周期和频率[5]。

AD9850 采用32 位的相位累加器将信号截断成14 位输入到正弦查询表,查询表的输出再被截断成10位后输入到DAC , DAC 再输出两个互补的电流。DAC满量程输出电流通过一个外接电阻RSET调节, 调节关系为ISET=32(1.248V/ RSET) , 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位用于电源休眠( Power down) 控制, 2位用于选择工作方式。这40位控制字可通过并行方式或串行方式输入到AD9850 ,图2.2.4是控制字并行输入的控制时序图。

图2.2.4 控制字并行输入的时序图

在并行装入方式中,通过8位总线D0-D7将可数据输入到寄存器,在重复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 都是工厂测试用的保留控制字,不慎使用可能导致难以预料的后果。

2.3低通滤波器的设计

由于AD9850内部没有低通滤波器,因此输出的扫频信号含有高频噪声,需要在其输出端口加低通滤波器。由于AD9850的系统时钟典型为125MHZ,而DDS最高能输出系统时钟的一半,但为了更好降低DDS的杂散谐波,产生平滑的信号波形,一般将最高输出控制在系统时钟的40%,本系统设计中,滤波器最高输出频率设定为50MHZ,为了能降低AD9850系统时钟的干扰,采用具有较窄过渡带特性的七阶椭圆滤波器,具有下降更快的过渡带,通带设计为55MHZ,通过实际中的不断调试以确定滤波器组件值,如图2.3.1所示。

图2.3.1 低通滤波器原理图

2.4 键盘输入显示电路

该电路模块主要用于显示要输入的显示的频率,包括8位八段数码管、显示驱动电路。由于输入与显示电路元件较多,而单片机的接口有限,所以必须对单片机的输入输出口进行扩展,接口扩展电路是输入显示电路的重要组成部分。显示电路如图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显示器工作原理

N个LED显示块有N位位选线和8×N根段码线。段码线控制显示字符的字型,而位选线为各个LED显示块中各段的公共端,它控制该LED显示位的亮或暗。

LED显示器有静态显示和动态显示2种显示方式。 1. LED静态显示方式

静态显示是指数码管显示某一字符时,相应的发光二极管恒定导通或恒定截止。这种显示方式的各位数码管相互独立,公共端恒定接地(共阴极)或接正电源(共阳极)。每个数码管的8个字段分别与一个8位I/O口地址相连,I/O口只要有段码输出,相应字符即显示出来,并保持不变,直到I/O口输出新的段码。采用静态显示方式,较小的电流即可获得较高的亮度,且占用CPU时间少,编程简单,显示便于监测和控制,但其占用的口线多,硬件电路复杂,成本高,只适合于显示位数较少的场合。 2. LED动态显示方式

动态显示是一位一位地轮流点亮各位数码管,这种逐位点亮显示器的方式称为位扫描。通常,各位数码管的段选线相应并联在一起,由一个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 软件设计部分

3.1系统程序流程

硬件电路设计对系统的稳定性,抗干扰能力有很大的影响,但是软件程序设计对于系统的稳定性、准确性、响应速度也有很大的关系。本设计方案中对应硬件电路的程序包括:LED显示子程序、LCD初始化4x4矩阵键盘子程序、转换子程序、扫频子程序。主程序流程图如图3.4所示:

开始系统初始化开中断端口初始化AD9850复位初始化显示获取的键值等待NO判断是否有键按下Y判断是数字键还是命令键 命令键数字键将按下的键进行转换将按下的键进行转换输出控制命令给AD9850

图3.1 系统流程图

程序设计中通过4X4矩阵键盘输入我们需要产生的频率值,并在8位7段数码管上实时显示,对于我们输入的数值只需按下确认按钮,就能讲我们设定的频率值通过单片机传递给AD9850,使AD9850输出我们想要得到的频率值。

系统由初始化开始,对程序中用到的管脚定义进行声明,显示部分,键盘部分,参数变量,AD9850部分都进行初始化,以避免发生不确定因素,使程序跑飞。

在初始化结束后,程序就进入主函数部分。在主函数中首先打开总中断和外部中断0。然后将P0口的高四位付予高电平。这里应用外部中断作为中断的触发是因为系统中我们采用中断法来对键盘进行读取。这样做的好处是我们可以随时更改我们需要输入到系统中的数值,并且不会占用太多单片机的资源,提高效率。当然,要读取到4X4键盘上任一按键的中断请求,我们需要用到一个74LS21(四输入与门),将键盘的四行或则四列分别引到74LS21的输入端,然后将输出端引到单片机的P3.2(INT0)段,并将INT0设置成\,即下降沿触发方式。这样一旦有按键按下,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系统输出信号的频率为:

fo=

K2L。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 fc。

由奈奎斯特采样定理可知,DDS输出的最大频率为:

fo=

fc2。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

则可得频率控制字为:

K=

fofc。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 2。

l程序中我们为了使精度最大化,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;这里应该是单位统一为MHz frequency=frequency*x; y=frequency; //写w4数据 w=(y>>=0); for(i=0;i<8;i++) {

ad9850_bit_data=(w>>i)&0x01; ad9850_w_clk=1; ad9850_w_clk=0; }

//写w3数据 w=(y>>8); for(i=0;i<8;i++) {

ad9850_bit_data=(w>>i)&0x01; ad9850_w_clk=1; ad9850_w_clk=0; }

//写w2数据 w=(y>>16); for(i=0;i<8;i++) {

ad9850_bit_data=(w>>i)&0x01; ad9850_w_clk=1; ad9850_w_clk=0;

}

//写w1数据 w=(y>>24); for(i=0;i<8;i++)

{ad9850_bit_data=(w>>i)&0x01; ad9850_w_clk=1; ad9850_w_clk=0; }

//写w0数据 w=w0; for(i=0;i<8;i++) {

ad9850_bit_data=(w>>i)&0x01; ad9850_w_clk=1; ad9850_w_clk=0; }

//移入始能 ad9850_fq_up=1; ad9850_fq_up=0; }

3.3 4×4矩阵键盘子程序设计

4×4矩阵键盘工作原理及介绍已经在前面详细的给出,故这里不再重复。其程序流程图如图3.3.1所示:

键盘初始化判断是否有键按下YESNO等待按键触发进入外部中断函数开启定时器逐行扫描键盘确定按下通过定时器消抖返回键盘值抖动继续扫描等待

图3.3.1 键盘扫描流程图

程序代码如下: {

EX0=0;

TMOD&=0XF1;//设置定时器0为模式1方式, TH0=0X2E; //设置初值,为12毫秒 TL0=0X00;

ET0=1; //开启定时器中断0

void key_scan() interrupt 0 //外部中断 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;i<4;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;i<17;i++){ //查表获得相应的16进制值存放l key变量中 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;i

P2=table[lp]; //查表法得到要显示数字的数码段 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_tmpdate[0]=freq/10000000; tmp=freq/10000000; if(tmp==0 && nums)l_tmpdate[0]=12; else { nums=0; } tmp=freq000000;

l_tmpdate[1]=tmp/1000000; if(l_tmpdate[1]==0 && nums)l_tmpdate[1]=12;

else { nums=0; } tmp=tmp00000;

l_tmpdate[2]=tmp/100000; if(l_tmpdate[2]==0 && nums)l_tmpdate[2]=12; else { nums=0; } tmp=tmp0000;

l_tmpdate[3]=tmp/10000; if(l_tmpdate[3]==0 && nums)l_tmpdate[3]=12; else { nums=0; } tmp=tmp000;

l_tmpdate[4]=tmp/1000; if(l_tmpdate[4]==0 && nums)l_tmpdate[4]=12; else { nums=0; } tmp=tmp00;

l_tmpdate[5]=tmp/100; if(l_tmpdate[5]==0 && nums)l_tmpdate[5]=12; else { nums=0; } tmp=tmp0;

l_tmpdate[6]=tmp/10; if(l_tmpdate[6]==0 && nums)l_tmpdate[6]=12; else { nums=0; } tmp=tmp; l_tmpdate[7]=tmp; }

3.6 扫频程序

在运行扫频程序时,由于之前的按键已经全部被占用,故我们这里将两个记忆键中的一个改为扫频开始按键。只有按下此键后,我们才开始对起始频率,终止频率,步长的设置。

本文来源:https://www.bwwdw.com/article/0kh.html

Top