




已阅读5页,还剩76页未读, 继续免费阅读
(测试计量技术及仪器专业论文)基于dds技术的程控信号发生器的研究.pdf.pdf 免费下载
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
摘要 直接数字频率合成( d d s ) 是七十年代初提出的一种新的频率合成技术,其 数字结构满足了现代电子系统的许多要求,因而得到了迅速地发展。本论文利 用单片机控制灵活的特点,开发了一种函数波形发生器。本文主要采用硬件电 路实现的方式对直接数字频率合成技术进行了研究,实现正弦波,方波,三角 波信号及各种波形信号的参数控制;应用树形数据结构实现动态菜单,实现智 能化的人机对话,操作简单。 首先,论文论述频率合成技术的发展,比较各种频率合成技术的特点,并 介绍直接数字频率合成技术的现状和发展趋势。 其次,介绍d d s 的基本理论以及数学综合,并对d d s 技术的理想频谱和 非理想频谱进行分析。 再次,在理论研究的基础上给出信号源的。设计方案、软硬件的具体实现。 硬件电路将整个系统分为单片机控制及接口电路、a d 9 8 3 5 芯片、滤波、幅度 控制以及波形转化和选择等模块,对各个硬件模块都给出了原理图并进行了分 析。 最后,软件部分采用k e i lc 语言编写,实现动态菜单、键盘扫描、波形选 择、频率进制转换、a d 9 8 3 5 接口调用、f s k 频率寄存器选择、幅值步迸增减 接口调用等功能。 实验结果表明,本文设计的基于d d s 技术的多波形信号源能够达到预先设 计的要求。 关键词:频率合成直接数字频率合成( d d s )单片机低通滤波器 r e s e a r c ho i lp r o g r a m m a b l es i g n a lg e n e r a t o rb a s e do nd d s t e c h n o l o g y a b s t r a c t d i g i t a l d i r e c t f r e q u e n c ys y n t h e s i s ( d d s ) i s an e w f r e q u e n c ys y n t h e s i s t e c h n i q u ei n t r o d u c e di ne a r l y7 0 s ,i t sd i g i t a ls t r u c t u r em e e t sm a n yr e q u i r e m e n t so f m o d e r ne l e c t r o n i c s y s t e m ,s ot h i st e c h n i q u eg r o w sr a p i d l y u s i n gs i n g l e - c h i p m i c r o c o m p u t e r ,t h i sp a p e rd e v e l o p e san e wf u n c t i o n w a v e f o r mg e n e r a t o r t h e p a p e rd i s c u s s e st h er e a l i z a t i o no fs i n ew a v e ,s q u a r ew a v e ,t r i a n g l ew a v es i g n a la n d v a r i o u sp a r a m e t e r so ft h es i g n a lw a v e f o r mc o n t r o l ,t h ea p p l i c a t i o no ft r e e - l i k ed a t a s t r u c t u r et oa c h i e v ed y n a m i cm e n u ,t h er e a l i z a t i o no fi n t e l l i g e n tp e o p l em a c h i n e d i a l o g u e f i r s t l y ,t h ed e v e l o p m e n to ff r e q u e n c ys y n t h e s i st e c h n i q u e i s e x p o u n d e d , v a r i o u sk i n d sf r e q u e n c ys y n t h e s i st e c h n i q u e sf e a t u r ei sc o m p a r e d ,a tl a s t ,p r e s e n t s i t u a t i o na n dd e v e l o p m e n tt r e n d so fd dsa r ei n t r o d u c e d s e c o n d l y ,b a s i ct h e o r i e sa n dm a t h e m a t i c a ls y n t h e s i so fd d sa r ei n t r o d u c e d , w h a t sm o r e ,i d e a lf r e q u e n c ys p e c t r u ma n dn o n i d e a lf r e q u e n c ys p e c t r u mo fd d s t e c h n i q u ea r ea n a l y z e d t h i r d l y ,d e s i g np r o p o s a lo fs u p p l yo s c i l l a t o ra n di m p l e m e n t a t i o n so fs o f t w a r e a n dh a r d w a r ea r eb r i n gu po nt h eb a s i so ft h e o r e t i c a lr e s e a r c h h a r d w a r ec i r c u i t d i v i d e st h ew h o l es y s t e mi n t os e v e r a lp a r t s :s i n g l e - c h i pm i c r o c o m p u t e rc o n t r o la n d i n t e r f a c ec i r c u i t ,a d 9 8 3 5c h i p ,w a v ef i l t e r i n g ,a m p l i t u d ec o n t r o l ,w a v e f o r m c o n v e r s i o n ,w a v e f o r ms e l e c ta n do t h e rm o d u l e s e v e r ym o d u l ei sg i v e ne l e m e n t a r y d i a g r a ma n di sa n a l y z e d f i n a l l y ,s o f t w a r ei sc o m p i l e db yk e i lcl a n g u a g ei no r d e rt or e a l i z em o t i o n m e n u ,k e y b o a r ds c a n ,w a v e f o r ms e l e c t ,f r e q u e n c ys y s t e mc o n v e r s i o n ,a d 9 8 3 5 i n t e r f a c ec a l l ,f s kf r e q u e n c yr e g i s t e rs e l e c t ,a m p l i t u d es t e p p i n gi n c r e a s ea n d d e c r e a s ei n t e r f a c ec a l la n do t h e rf u n c t i o n s t h ee x p e r i m e n t a lr e s u l ts h o w st h a tm u l t i w a v e f o r ms u p p l yo s c i l l a t o rd e s i g n e d i nt h i sp a p e rb a s e do nd d st e c h n i q u em e e t sp r e l i m i n a r yd e s i g nr e q u i r e m e n t s k e yw o r d s :f r e q u e n c ys y n t h e s i s ,d i g i t a l d i r e c t f r e q u e n c ys y n t h e s i s ( d d s ) , s i n g l e c h i pm i c r o c o m p u t e r ,l o wp a s sf i l t e r 学位论文原创性声明 本人郑重声明:所呈交的学位论文,是本人在导师的指导下进行的研究工作 所取得的成果。尽我所知,除文中已经特别注明引用的内容和致谢的地方外,本 论文不包含任何其他个人或集体已经发表或撰写过的研究成果。对本文的研究做 出重要贡献的个人和集体,均已在文中以明确方式注明并表示感谢。本人完全意 识到本声明的法律结果由本人承担。 蝴槲c 础马迅节 月 学位论文版权使用授权书 本学位论文作者完全了解南京林业大学有关保留、使用学位论文的规定,同 意学校保留并向国家有关部门或机构送交论文的复印件和电子版( 中国科学技术 信息研究所;国家图书馆等) ,允许论文被查阅和借阅瓠人授权南京林业大学 可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以汇编和综合 为学校的科技成果,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论 文全部或部分内容。 保密口,在年解密后适用本授权书。本学位论文属于不保密匝 ( 请在以上方框内打“ _ ) 学位论姗摊础,:马选卅年6 月日 指导教师( 本人签名) :材准思 2 。1 年6 月2o 日 致谢 三年的研究生学习生活即将结束,过去的三年中,得到过许多老师、同学 和朋友无私的关怀和帮助。在这里我要向所有帮助、支持过我的人们致以最真 挚的谢意。 感谢我的导师封维忠副教授。导师不仅在学习上对我严格要求,而且在生 活上给了我无限关心和帮助。他学识渊博、思维敏捷、治学严谨、为人真诚, 使我在三年学习过程中不但获得了许多新的知识,而且学会了许多为人处事的 道理,将使我在今后的道路上得到很大的帮助。我为有这样的导师而感到非常 的骄傲,作为导师的学生,我又感到非常的自豪和幸运。 感谢我的家人对我的默默支持与无私奉献,他们的恩情与期望将是我奋进 的动力。 感谢新联电子的赵永春工程师,感谢他对我课题研究给予的无私帮助,正 是在他的帮助下,才使我能够顺利地完成论文。 感谢实验室中与我朝夕相处的袁哲、吴琼、张瑛、卢宏伟、陈彬、陈维、 吕开亮、辛克廷、胡莲成等同学给与我的支持和帮助,在此向他们表达我深深 的感激之情。 最后,谨向所有关心和帮助过我的人致以衷心的谢意 第一章绪论 1 1 研究背景及研究意义 1 1 1 研究背景 在最近的2 0 年,通信、雷达、宇航和遥感遥测技术的飞速发展,对信号源 的频率稳定度、频谱纯度、频率范围和输出信号的频率提出越来越高的要求。 为了满足现代通信、先进雷达的高指标要求,人们采用一种新的频率合成技术 直接数字频率合成( d i r e c td i g i t a ls y n t h e s i z e r - - d d s ) 。 直接数字频率合成技术是一种新的全数字的频率合成原理,它从相位的角 度出发直接合成所需波形。这种技术由美国学者j t i e r e y ,m r a d e r 和b g o l d t l b 于1 9 71 年首次提出,但限于当时的技术和工艺水平,d d s 技术仅仅在理论上 进行了一些探讨,而没有应用到实际中去。近3 0 年来,随着v l s i ( v e r yl a r g e s c a l ei n t e g r a t i o n ,超大规模集成) 、f p g a ( f i e l dp r o g r a m m a b l eg a t ea r r a y ,现场 可编程门阵列) 、c p l d ( c o m p l e xp r o g r a m m a b l el o g i cd e v i c e ,复杂可编程器件) 等技术的出现以及对d d s 理论上的进一步研究,使得d d s 技术得到了飞速的 发展。 1 1 2 课题意义 由于d d s 采用高速的数字电路和高速的d a 转换技术,与由锁相环构成 的频率合成器相比较,具有很多优点,如频率切换时间极短( ( 刀+ 1 ) 五刎,其中n 为 谐波的阶数,五似等于所要频带的上升沿。需要注意的是一个时钟频率消除了 玎埔阶谐波的同时也消除了低阶谐波。例如,当给定z 脚= 1 0 0 础z ,表2 1 给出 了时钟频率必须超过的数值以消除玎抽阶的谐波,因此大于5 0 0 k h z 的时钟频率 会消除所有通过4 呐阶的谐波,以此类推。 表2 1 避免谐波的时钟频率要求 聆旃阶的谐波 j 时钟频率z 腿必须超过( k h z ) i 23 0 0 3 4 0 0 45 0 0 7 使用最高有效位输出作为可编程时钟源 来自d d s 的数字正弦波形的最高有效位输出是方波信号,它的频率是由程 序设定的基本输出频率。在大多数应用中,最高有效位可以直接作为可编程时 钟源使用。在敏感度最差的情况下,对于任何给定的输出频率,最高有效位是 1 ( 2 f c l k ) ,其中f c l k 是系统时钟频率。只要最高有效位的敏感部件适合时钟的稳 定性需要,那它作为时钟脉冲源就非常合适。鉴于时钟与脉冲源的关系,时钟 频率最大时,敏感度将最小,而且受到最高有效位的敏感度影响的频率随着程 序设定的输出频率的不同而不同,如果频率设定输出是f c l k 的分数( 如: f o = f c i k 4 ) ,那末最高有效位输出的敏感度只取决于系统时钟的固有敏感度。对 于f c l k 的非整数,最高有效位的敏感度总体上会体现在低频,它会取决于系统 时钟与输出时钟的关系。在这种情况下,使用者必须根据经验对于时钟与输出 的方案估计最高有效位的敏感度。 2 4 理想情况下d d s 的频谱分析 理想的d d s ,是满足以下三个条件【2 4 】的d d s : 1 没有相位截断,相位累加器的输出全部用来作寻址r o m 的地址码; 2 r o m 存储的幅度值没有量化误差,即正弦查询表r o m 中所存储的量化 正弦幅度值用无限长的二进制代码来表示; 3 d a c 的分辨率无穷大,并且d a c 具有理想的数模转换特性。 则d d s 的输出为: s ( f ) = s i n ( 2 万元,z 乃涉( f 一刀正)( 2 - 6 ) m ) = 1 。o 其t 他 t o 跏卜万善文警h 警卜盱亿7 , 伽薹勋c 警h 一,警户( c o + n c o 。+ c o o ) 由式( 2 - 7 ) 可见,理想d d s 、的输出信号谱线仅位于n o ) 。( 刀= 0 , 1 ,2 ,) , 而且所有的谱线都在s a i 丛半刀i 的包络内,如图2 4 所示 图2 4 理想d d s 的输出信号频谱 由n y q u i s t 采样定理可知,要输出理想波形,输出频率不能超过0 5 f o l k 。在 典型的d d s 应用中,d d s 后常接一个低通滤波器l p f ,用来滤除杂散信号, 而在实际中,低通滤波器l p f 都有一个过渡带的问题,所以为了更好的滤除杂 散信号,一般将d d s 的输出频率限制在0 4 0 f o l k 内。 由于孔径失真带来的s i n ( x ) x 包络,使得d d s 的输出幅度在n y q u i s t 带宽 内有大约3 9 2 d b 的下降。因此有的公司推出的d d s 芯片中含有一个特性为反 s i n ( x ) x 的预失真滤波器,它可以把d d s 的输出幅度波动限制在士0 1 d b 内。 2 5d d s 实际输出信号频谱分析 实际的d d s 并不满足理想d d s 的3 个条件,其输出的频谱实际上没有图 2 4 那样纯净,而总是含有杂散频谱的,了解这些多余谱线的分布及抑制的方 法,在d d s 的系统设计中是十分必要的。其中杂散主要来源有:相位截断误差、 1 4 幅度量化误差、d a c 非线性误差等,下面将分别介绍。 2 5 1 相位截断误差分析 为了取得精细的频率分辨率,d d s 的相位累加器的位数都取得非常大,如 取3 2 、4 8 、6 0 等,如果把相位累加器输出的所有位数全部用来查询正弦函数表, 那正弦表的容量会非常的大。比如相位累加器有3 2 位,正弦表数据为8 位,则 表的容量为2 3 2 8 = 3 4 ,3 5 9 ,7 3 8 ,3 6 8 ( b i t s ) ,如此巨大的容量难以实现。假如 能实现,其成本和稳定性也不容乐观。所以在d d s 中使用了相位截断这种方法, 它只取相位累加器输出的高多少位用来查表,而剩下的就简单的丢弃了。可想 而知,这样做会使查表的相位值产生误差,导致输出的正弦幅度值也产生误差。 表现在输出的频谱上就会有杂散信号存在。杂散【2 l 】是d d s 频谱研究的重要内 容,下面将给予讨论。 设相位累加器位数为n ( b i t s ) ;相位累加器的输出位数为a ( b i t s ) :截断 的位数为b ( b i t s ) ;显然有:b = n a ; 此时d d s 的输出为: s ( f ) = s i l l 2 万石胛乏+ e ( n ) h ( t - n t c ) ( 2 - 8 ) 其中,p ( 刀) 表示由于相位截断而引起的相位误差。式( 2 - 8 ) 中 厶= 等j e s t 。 ( 2 9 2 ) 2 鬲。 l 。j 其中k 为频率控制字。 理想情况d d s 的正弦输出波形幅度序列为: s ( 玎) = s i i l b 等1 ( 2 经过b b i t s 的相位舍位后,其正弦输出波形幅度序列为: 洳) s ;n 卜歹k m ( ;刀) ) ( 2 - 1 1 ) 该式还可以表示为: s ( 誓) “n 嘉 砌一绵( 理) 卧 ( 2 - 1 2 ) 其中,邱( 刀) 表示由于相位舍位而引起的相位误差序列; 绵o ) 还可以从图2 5 中更直观的表示出来。误差序列s ,g ) 相当于对如图2 5 所示的连续锯齿波的采样,锯齿波的幅度为2 b ,周期为k 2 口。 2 幅度 周期 图2 5 相位误差序列示意图 为了分析绵( 刀) 的频谱特性,必须计算出郇( 刀) 的傅里叶级数表达式。而由图 2 5 可看出,其连续锯齿波在不连续点处为零值,这点不满足求傅里叶级数 d i r i c h l e t 条件。d i r i e h l e t 条件要求在不连续点要取其平均值,令连续锯齿波在 不连续点处的值为2 b ,同时在不连续点处再加上一负脉冲其幅度为2 口2 。由此 可以得出: 占p ( 刀) 的傅里叶级数表达式为: 邱( 玎) = 善。磊2 bs m ( 2 册拳刀) 一筹耋罴s m ( 等) c 。s ( 2 万聊参门) c2 - 3 ) 其中,a = 7 = j 为脉冲序列的周期,( 口,6 ) 表示a , b 的最大公约数。 i2 廿,kl 、 由式( 2 13 ) 得出,唧0 ) 的最大周期为2 b ,若2 8 与k 的公约数不为1 ,则该序 列的采样重复周期为a = 万i ,由于在频域上的谱线是对应f o = o 轴对称, i 二氏i 所以。o ) 谱线数量为i a 。式( 2 - 1 3 ) 中的左边第一项为连续锯齿波的傅里叶级 数表达式,进一步简化为: 州= 筹争( 舟n ( 2 所万刎( 2 - 1 4 ) 洲= 一筹( 2 万m 拳刀) 式( 2 1 4 ) 和( 2 15 ) 合并为: 1 6 ( 2 1 5 ) 咖,= 筹酗( 净n ( 2 万聊割( 2 万聊别( 2 - 1 6 ) 将式( 2 - 1 6 ) 表示为复数的傅里叶级数的形式如下: f 聆1 = 挚fp ,( 2 砌参) 已c o t ( 予) 酃( ,z ) = 己p 。r ”2 占七一l 爿 ( 2 1 7 ) 其中 磊= 和e c ( 筹) ( 2 - 1 8 ) 我们所需求的杂散频率厶的范围为0 厶2 ,现在引入归一化杂散频率 i i 。:辱兰,这时在频谱轴上的所有杂散的位置都为整数值。这时对应第m 个杂 jc l k 散的频率值为: ( 册r ) = 正l ( 2 1 9 ) 其中,r 2 丽k 根据e u l e r 理论,由式( 2 18 ) 式可求小m 值为 m - - ( z l 。r 剧2 q ) _ ( 2 - 2 0 ) 由于采样时镜像频率的存在,使得杂散幅度为六时的杂散频率不在 0 厶 f c l k 12 的范围而是在0 厶 厶。在根据上式计算出的m 值在0 m a 2 时,其杂散频率厶的范围为:0 厶 f c t 。12 ,若l :1 1 值在0 聊 a 时,其杂散频 率厶的范围为:0 厶 厶。因为式( 2 - 2 0 ) 是对? j r = 彳2 轴对称,所以计算出 的m 值在彳2 m a 之间时,只需要将m 用a 一聊代替即可解决频率镜像问题。 根据上面的分析,对相位误差函数绵g ) 的离散频谱分析可总结如下: j , b - i 1 绵( 刀) 产生的杂散数量为兰= 2 【k ,2 。j 2 知2 躲雠糊鼢椭吨 j 蠢 3 由归一化杂散频率石,可求出杂散幅度厶所对应的m 值为: 1 7 聊2 【石f 剧2 1 ) 4 根据m 值可求出其杂散幅度为磊百2 bc 0 s p c 滢) 将( 2 1 2 ) 式展开有: 小声m ( 2 石割c o s p 州等 - c o s ( 2 专刀) 咖p 州学 ( 2 - 2 1 ) 因为嘲 4 9 ,两者交换,此 时1 = 3 ) : i a 1 】 a 2 】 a 3 】 a 【4 】a 5 】a 6 】a 【7 】i i 2 73 84 99 77 61 36 5 进行第j 次交换后( 按照算法的第五步将又一次执行算法的第三步从后开始找) : ia 【1 】a 2 】 a 3 】 a 【4 】 a 5 】 a 6 】a 【7 】i l 2 73 81 39 7 7 64 96 5 进行第四次交换后( 按照算法的第四步从前面开始找大于x 的值,9 7 4 9 ,两者交换, 此时j = 4 ) : a 【l 】a 2 】a 3 】a 4 】a 5 】a 6 】a 7 】 : i 2 73 81 34 97 69 76 5 此时再执行第三步的时候就发现i = j ,从而结束一次快速排序,那么经过一次快速排 序之后的结果如上表所示,即所有大于4 9 的数全部在4 9 的后面,所有小于4 9 的数全部 在4 9 的前面。 后续排序继续递归调用此过程。在以4 9 为中心点分割这个数据序列,分别对前面一 部分和后面一部分单独进行类似的快速排序,从而完成全部数据序列的快速排序,最后把 此数据序列变成一个有序的序列。根据这种思想对于上述数组a 的快速排序的全过程如 下所示: 初始状态: la u a 2 】a 3 】a 4 】a 5 】a 6 】 a 【7 】l 艮熊二 h “ ” ”0 蚴 i 滋盏洫 受数落b i i搋热、囊k鼢溉黢函盔磁涮鬟掇貔燃 进行一次快速排序之后以4 9 划分为两部分数组: f a 1 】 a 2 a 3 】a 4 】a 5 】a 6 】 a 【7 】1 匕 r激翻4 9 篷。滋蕊:i ; “1 二。;缁。盈 自菇自f ;埯:;端自;i ;龇曼霪龇翩 分别对前后两部分进行快速排序: 最终的结果即为: i ja 【1 】h i 2 】 a 3 】 a 【4 】a 5 】a 【6 】a 7 】; i 1 32 73 84 96 57 69 7 根据这个思想,在本程序中,需要排序的全有序数据为: m e n u n o d ex d a t a 堆i d a r r y m a x _ n o d e s ; 为了节省空间,数组里面存放的数据为节点的指针,排序是根据节点的唯一性i d 标 志进行比较的。快速排序的代码如下: u c h a rs o r t ( u c h a ri s m r t , u c h a ri e n d ) u c h a r i r e t = k e 砭s u c c e s s ; u c h a r i ,j ; m e n u n o d ex d a t a 木p m i d d a t a = n u l l ; i f ( i s t a r t i e n d ) p m i d d a t a = i d a r r y i s t a r t ; i - - i s t a r t ; j = i e n d ; w h i l e ( i = p m i d d a t a - i n o d e l d ) j ; i f ( i 勺) i d a r r y i + + = i d a r r y j ;将比枢轴记录小的记录移到低端 w h i l e ( i i n o d e l d = p m i d d a t a - i n o d e i d ) ,i h ; i f ( i r e t u r ni r e t ; 2 按节点标志i d 查找某菜单项 插入一个菜单节点的时候,需要根据父节点i d 定位到父节点,然后建立父子关系。 而目前所有的菜单节点均是在一个数组中存储,而且经过快速排序,是一个有序序列。对 于8 位的单片机来说,运算能力十分有限,遍历查找显然是不合时宜的,时间复杂度大。 所以本程序采用了二分法查找。二分法又称“折半查找”,具体思想是先确定待查记录所 在的范围( 区间) ,然后逐步缩小范围直到找到或找不到该记录为止。 折半查找特点可以用二叉判定树来描述。 1 折半查找在查找成功时,和给定值进行比较的关键字个数至多为r l 0 9 2 n1 + 1 ,查找不成功时的比较次数最多也不超过广l 0 9 2 n - i + 1 。 2 折半查找在查找成功时的平均查找长度为:a s l = l 0 9 2 ( n + 1 ) 1 ,折半查找的平均 性能和最坏性能相当接近。 3 折半查找优点为查找的效率比顺序查找高。局限性为要求查找表有序,而且只适 用于顺序存储结构。 折半查找的具体步骤为首先以整个查找表作为查找范围,用查找条件中给定值k 与 中间位置结点的关键字比较,若相等,则查找成功,否则,根据比较结果缩小查找范围: 5 2 1 如果k 的值小于中间结点关键字的值,根据查找表的有序性可知查找的数据元素 只有可能在表的前半部分,即在左半部分子表中,所以继续对左子表进行折半查 找; 2 如果k 的值大于中间结点关键字的值,则可判定查找的数据元素只有可能在表的 后半部分,即在右半部分子表中,所以继续对右子表进行折半查找。每进行一次 折半查找,要么查找成功,结束查找,要么将查找范围缩小一半,如此重复,直 到查找成功或查找范围缩小为空即查找失败为止。 例:有序表中关键字为( 1 0 ,1 5 ,1 8 ,2 0 ,2 6 ,2 8 ,3 3 ,3 6 ,3 8 , 4 3 ,4 9 ) ,查找1 8 的示意图如图 5 3 4 和图5 3 5 所示。 o1234567891 0 l t 胃r o l i i 酾 r i 曲= l o 第一次比较1 8 1 ) l i l e n d o ) b r e a k ; i m i d = ( i f i r s t + i e n d ) 2 ; i f ( i d a r r y i m i d - i n o d e i d ! = i l d x & & i m i d o ) i f i r s t = i d a r r y i m i d - i n o d e i d ; p r i n t f ( ”错误,节点中没有找至l j d l ! h a , i i d x ) ; r e t u l l ln u l l ; ) e l s ei f ( i d a r r y i m i d 一 i n o d e i d = = i i d x ) | | 正好是 r e t u r n i d a r r y i m i d ; e l s ei f ( i d a r r y t i m i d - i n o d e l d i n o d e l d i i d x ) 在左边 i e n d = i m i d ; c o n t i n u e ; ) r e t u r nn u l l ; 其中全局变量g _ i n o d e n u m 记录了树节点个数的总数。比较的元素是菜单节点的唯一 性i d 标识。 5 3 7 树的遍历( s c a n ) 树的遍历是树中最重要的运算之一,顺着某一条搜索路径循序访问树中的每一个结 点。使得每个结点均能被访问到,而且仅被访问一次。这样一个过程称之为“遍历 ,其 中“访问”的含义可以很广,如输出结点的信息、比较节点某个值大小等。本程序在外 层构建液晶显示内容的时候对树进行了遍历,提取出树的父子关系,每四个节点一组,构 建成一个四维显示数组,送给液晶显示库显示。 5 3 8 销毁树( d e s t o r y ) 在程序结束之前,必须要把原先申请的内存释放,以防止程序c o r e d u m p 。方法是先 遍历所有的节点,然后使用f r e e ( v o i d * f i r s t b y t e ) 函数逐个删除。注意,f r e e 函数的参数是 一个指针,但是调用之后,释放的是内存,不是指针! 这点非常重要! 指针是一个变量, 只有程序结束时才被销毁。释放了内存空间后,原来指向这块空间的指针还是存在,只不 过现在指针指向的内容的“垃圾”,是未定义的野指针。因此,释放内存后需要手工把指 针指向n u l l ,防止指针在后面不小心又被引用。 5 3 9 程序创建的菜单结构 如图5 3 4 所示,菜单共有三层,其中第二层前三个菜单:波形选择、频率输入、f s k 方式是一个整体,三者必须都经过选择才能进行幅度增加减少操作。另外,如果在某个选 择界面时,键盘按下了“r e t l l r r l 键”,则跳出菜单根节点界面( 第一层) ,然后再选择需 要第二层菜单,进入某项重新选择或赋值,完成之后仍然按遍历顺序进行下个菜单的处理。 5 4 键盘扫描软件 图5 3 4 菜单结构图 键盘扫描是本程序的核心模块之一。该模块实现了用户人机交流,用于识别用户的按 键动作,得到具体的按键值,并根据按键值触发相应的动作,比如改变显示界面、改变选 择项等。键盘按键的分布图如图5 4 1 所示: 5 4 1 键盘模块核心函数 木键盘扫描,判断按键值木 u c h a r k e y s c a n0 : 图5 4 1 键盘分布图 木根据内部值,转换为a s c i 值水 u c h a rg e t k e y ( u c h a ru c k e y v a l u e ) : o o o o o o o o o o o o o 木等待按键、构建显示数组木 u c h a rk e y p r o c e s s c o m m ( c m d l n f o * p c m d ,b o o l * p b r e t u r n ,u c h a rs d s p 4 1 6 3 ) : 木等待任意按键木 v o i d w a i t k e y p r e s s0 : 序得到按键数值木 l o n gg e t n u m ( u c h a ru c k e y v a l u e ,b o o lb o r e r ) : 木中断函数木 v o idx n t os v c ( ) i n t e r r u p t0 5 4 2 键盘扫描( k e y s c a n ) 键盘按键采用中断触发的方式,在中断函数设置中断变量来实现。 v o l a t i l eu c h a r g _ u c f l a g l n t = f a l s e ; 中断标志声明一个v o l a t i l e 类型的全局变量,用以记录是否有中断信号产生。没有中 断的时候此变量为f a l s e ,有中断产生的时候在v o i di n t os v c oi n t e r r u p t0 函数中对 gu c f l a g l n t 赋值为t r u e 。为何必须使用v o l a t i l e 类型? 因为访问寄存器的速度要快过 r a m ,所以c 编译器会作一个减少存取外部r a m 的优化动作,每次首先访问某变量在 寄存器的副本。但是如果此变量是状态寄存器、中断服务子程序的非自动变量等,此变量 会被某些编译器未知的因素更改,也就是原始内存地址里面的值发生了改变,而寄存器的 副本并没有改变。这种情况下,如果还是使用的寄存器的副本,就会对运行结果产生错误 的影响。故使用v o l a t i l e 这个修饰符,就是告诉c 编译器变量不需要做优化,每次均从所 在的内存读取数据。 键盘扫描主循环中,是一个w m l e 循环,实时对gu c f l a g i n t 进行判断。如果发现 gu e f l a g i n t 等于t r u e ,则表示已经有按键信号产生。接下来做进一步分析按的是何健。 因为键盘是行列式键盘,以单片机p 1 口驱动,所以软件层面检测按键的核心思想是通过 p 1 端和o x f o 进行& ( 与操作) ,看看是否高4 位有值的变化。如果结果不等于o x f o 证明某行有键按下,否则为没有。如果某行有键按下,需要延时几毫秒去干扰。延时的原 理就是做一个n 次的循环操作,因为单片机执行每个指令均有固定的周期,所以可以根 据循环次数大致推算出延时的时间。如果没有延时操作,可能得出的键值为一奇怪数值, 得到的按键值和实际值不符合。行检测之后,继续检测列,即执行p 1 & o x o f 操作。如果 结果不等于o x o f ,则把上面得到的行的值和列的值进行“i ”或操作,即得到了按键的具 体内部值。 5 4 3 转换值( g e t k e y ) 通过行列扫描,我们得到了按键的内部值,但是这个值不是按键字面上的意思( 比如: 1 、k 、m ) 。要得到正确的a s c i i 码还得进行一次转化。g e t k e y ( ) 函数中建立了一个内部 值和a s c i i 码对应关系的字典。根据输入的内部值,查找到对应关系,返回键盘对应的 a s c i i 码。 5 4 4 菜单等待按键主程序( k e y p r o c e s s c o m m ) 键盘扫描程序需要和菜单相结合,构建液晶显示数组。因为每个菜单项都可以按键选 择,但是可以接受的按键值类型可能各不相同。比如屏幕显示“波形选择”这个菜单项时, 可以输入的键为“f 、“l 或者“1 、“2 ”、“3 ,“e n t e r ,而“输入频率值 这个菜单项可以输入任意数字和“k ”、“m 、“e n t e r 、“r e t u r n ”。这些功能都在 k e y p r o c e s s c o m m ( c m d l n f o 木p c m d ,b o o l 幸p b r e t u r n , u c h a rs d s p 4 1 6 ) 实现。其中参 数c m d l n f o * p c m d ,是菜单取值结构体,包括取值类型、具体值等。菜单取值的结构如 下列所示: t y p e d e fs t r u c tc m d l n f o l o n gf v o l t a g e : 频率值 k e y t y p ei t y p e :要求类型 u c h a ris e q ; 第几个选择 u c h a r i v a l u e t y p e :值类型 u c h a r i w a v e t y p e : 1 正弦波2 锯齿波3 方波 u c h a r i f r e q u e n c y t y p e :f s k 乡肇型 c m d l n f o ; 这个实例是在m a i n 函数中申请的,调用k e y p r o c e s s c o m m 的时候,仅仅传入此实例 指针,通过结构体内部数据i t y p e 会判断本次菜单需要接收的是一个什么类型的数值。 i t y p e 取值类型枚举值如下: e n u mk e y t y p e a l l t y p e= 0 ,无控制,任意值 n u m t y p e= 1 ,只允许数字 n u m _ d i r e c t _ t y p e = 2 ,输入一个数字、方向,以e n t e r 结束 n u m a r r y _ t y p e= 3 ,输入任意数字序列,输入方向无效 e n t e r _ r y p e= 4 ,只有e n t e r d i r e c u y p e= 5只允许方向 5 2 : 菜单可以接受的按键类型需要在菜单建立时候确定,见菜单树i n s e r t n o d e 函数最后一 个参数i t y p e 。 b o o l * p b r e t t t m 参数判断是否按键是“r e t u i l c l 的依据,在此函数外层检测到是 “r e t u r n ”的话,则程序重新进入第一层主菜单选择。s d s p 4 1 6 参数是液晶屏显示缓存, 4 聿1 6 个字节,用于每次生成显示数据。由于液晶屏只有4 行,所以必须要控制上下键的 使用。比如目前显示下标“ 指示的是第4 行,再按键“i 或者按键“5 ”等均不能 回应,否则会出现越界。所以程序使用了一个静态变量控制按键的范围。 s t a t i cu c h a ru c p r e k e y = l : u c p r e k e y 初始化为第一行“1 ,相当于默认显示下标“ 在菜单2 行( 注意c 语 言数组下标从o 开始) 。如果按键在1 ,一3 之间,则显示下标“ 跳到该行。因为 s t a t i c 类型的变量在全局数据区,程序创建即已放进内存,所以这种类型的变量有别于函 数中的“临时变量”( 每次调用此函数时申请内存,函数结束时删除内存) ,这种静态变量 具有“记忆”的特性,所以正好可以用来“记住”上次的选择。 对于“输入频率值”菜单,可以输入任意数字、字母序列,以e n t e r 结束,输入方向 无效。这就要求多次等待输入数字或者“k ”,“m ”等字母。比如,第一次输入“1 , 第二次输入“2 ”,第三次按“e n t e r ”,则输入的频率即为1 2 h z 。对于这种要求,在函 数g e t n u m ( ) q b 声明了一个静态字符串缓存。在非e n t e r 的情况下,数组均放入具有“记忆” 功能的数组,利用b o o lb o r e r 控制是否需要转化值,写入数据的时候调用方法为 g e t n u m ( u c k e y v a l u e ,f a l s e ) 。一旦按键为e n t e r ,则需要把“记忆”的数组转化为长整型 数。调用方法为g e t n u m ( u c k e y v a l u e ,t r u e ) 。函数代码如下所示: 产得到按键序列数值书 l o n gg e t n u m ( u c h a ru c k e y v a l u e ,b o o lb o v e r ) s t a t i cu c h a r s s t r n u m m a x _ a r r y _ n u m ; s t a t i cu c h a r u s e q = 0 ; i f ( b o v e p t r u e ) i f ( u s e q 0 ) u s e q = 0 ; r e t u r na t o l ( s s t r
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年事业单位工勤技能-重庆-重庆管工(技师/高级技师)历年参考题库典型考点含答案解析
- 气库安全知识培训总结课件
- 施工技术与设计图纸的统一性
- 宿舍楼建筑垃圾清理与处理方案
- 视觉艺术与创意结合:插画讲师面试题及答案深度探讨
- 2025秋招银行笔试题库及答案
- 燃气行业求职者必 备:银川燃气公司的面试题及答案
- 施工现场临时设施建设方案
- 消防电气设施接地方案
- 水利项目建设进度管理方案
- 龙虎山正一日诵早晚课
- 微积分的力量
- 中国股票市场投资实务(山东联盟)知到章节答案智慧树2023年山东工商学院
- 安徽宇邦新型材料有限公司年产光伏焊带2000吨生产项目环境影响报告表
- 号线项目tcms便携式测试单元ptu软件使用说明
- 艺术课程标准(2022年版)
- 癫痫所致精神障碍
- 卫生部手术分级目录(2023年1月份修订)
- 电荷及其守恒定律、库仑定律巩固练习
- YY 0666-2008针尖锋利度和强度试验方法
- GB/T 6663.1-2007直热式负温度系数热敏电阻器第1部分:总规范
评论
0/150
提交评论