资源描述
目录
1 DDS技术的基本原理 1
2.1 DDS结构 1
2.2 DDS数学原理 5
2 总体设计方案 7
3.1系统设计原理 7
3.2总体设计框图 8
3 系统的硬件设计 8
3.2 DDS芯片的选择及与单片机之间的通信 8
3.3 单片机(AT89S52)控制电路 11
3.4 液晶显示模块 14
3.5 低通滤波器的设计 16
4 信号发生器的软件设计 17
4.1 程序流程图 17
4.2 键盘扫描流程图 19
4.3 LCD的显示 21
5部分系统的仿真和调试 21
6 系统的程序代码 25
7设计心的及体会 32
8 参考文献 33
1 DDS技术的基本原理
2.1 DDS结构
1971年,美国学者J.Tierney等人撰写的“A Digital Frequency Synthesizer”-文首次提出了以全数字技术,从相位概念出发直接合成所需波形的一种新组成原理。限于当时的技术和器件产,它的性能指标尚不能与已有的技术相比,故没受到重视。近几年间,随着微电子技术的迅速发展,直接数字频率合成器(Direct Digital Frequency Synthesis简称DDS或DDFS)得到了飞速的发展,它以有别于其它频率合成方法的优越性能和特点成为现代频率合成技术中的佼佼者。具体体现在相对带宽、频率转换时间短、频率分辨率高、输出相位连续、可产生宽带正交信号及其他多种调制信号、可编程和全数字化、控制灵活方便等方面,并具有极高的性价比。DDS是直接数字式频率合成器(Direct Digital Synthesizer)的英文缩写。与传统的频率合成器相比,DDS具有低成本、低功耗、高分辨率和快速转换时间等优点,广泛使用在电信与电子仪器领域,是实现设备全数字化的一个关键技术。
直接数字频率合成器(Direct Digital Synthesizer)是从相位概念出发直接合成所需波形的一种频率合成技术。一个直接数字频率合成器由相位累加器、加法器、波形存储ROM、D/A转换器和低通滤波器(LPF)构成。DDS的原理框图如下所示:
St
Sn
N位
波形控制字W
N位
频率控制字K
相位控制字P
图2.1 DDS原理框图
其中K为频率控制字、P为相位控制字、W为波形控制字、fc为参考时钟频率,N为相位累加器的字长,D为ROM数据位及D/A转换器的字长。相位累加器在时钟fc的控制下以步长K作累加,输出的N位二进制码与相位控制字P、波形控制字W相加后作为波形ROM的地址,对波形ROM进行寻址,波形ROM输出D位的幅度码S(n)经D/A转换器变成阶梯波S(t),再经过低通滤波器平滑后就可以得到合成的信号波形。合成的信号波形形状取决于波形ROM中存放的幅度码,因此用DDS可以产生任意波形。这里我们用DDS实现正弦波的合成作为说明介绍。
2.1.1 频率预置与调节电路
K被称为频率控制字,也叫相位增量。DDS方程为:f0=fCLK/2n,f0为输出频率,fc 为时钟频率。当K=1时,DDS输出最低频率(也即频率分辨率),为fc/2n,而DDS的最大输出频率由Nyquist采样定理决定,即fc/2,也就是说K的最大值为2N-1。因此,只要N足够大,DDS可以得到很细的频率间隔。要改变DDS的输出频率,只要改变控制字K即可。
2.1.2累加器
fc
频率控制字
相位量化序列
图2.2 累加器框图
相位累加器由N位加法器与N位寄存器级联构成。每来一个时钟脉冲fc,加法器将频率控制字K与寄存器输出的累加相位数据相加,再把相加后的结果送至寄存器的数据输入端。寄存器将加法器在上一个时钟作用下继续与频率控制字进行相加。这样,相位累加器在时钟的作用下,进行相位累加。当相位累加器累加满时就会产生一次溢出,完成一个周期性的动作。
2.2.3 控制相位的加法器
通过改变相位控制字P可以控制输出信号的相位参数。令相位加法器的字长为N,当相位控制字由0跃变到P(P≠0)时,波形存储器的输入为相位累加器的输出与相位控制字P之和,因而其输出的幅度编码相位会增加P/2N,从而使最后输出的信号产生相移。
2.2.4 控制波形的加法器
通过改变波形控制字W可以控制输出信号的波形。由于波形存储器中的不同波形是分块存储的,所以当波形控制字改变时,波形存储器的输入为改变相位后的地址与波形控制字W(波形地址)之和,从而使最后输出的信号产和相移。
2.2.5 波形存储器
用相位累加器输出的数据作为波形存储器的取样地址,进行波形的相位一幅值转换,即可在给定的时间上确定输出的波形的抽样幅值。N位的寻址ROM相当于把0°~360°的正弦信号离散成具有2N个采样值的序列,若波形ROM有D位数据位,则2N个样值的幅值D位二进制数值固化在ROM中,按照地址的不同可以输出相应相位的正弦信号的幅值。
相位—幅度变换原理图如下图所示:
地址
相位量化序列
波形幅度量化序列
(数据)
图2.3 相位—幅度变换原理图
2.2.6 D/A转换器
D/A转换器的作用是把合成的正弦波数字量转换成模拟量。正弦幅度量化序列S(n)经D/A转换后变成了包络为正弦波的阶梯波S(t)。需要注意的是,频率合成器对D/A转换器的分辨率有一定的要求,D/A转换器的分辨率越高,合成的正弦波S(t)台阶数就越多,输出的波形的精度也就越高。
2.2.7 低通滤波器
对D/A输出的阶梯波S(t)进行频谱分析,可知S(t)中除主频fo外,还存在分布在fc,2fc等等的两边±fo处的非谐波分量,幅值包络为辛格函数。因此,为了取出主频f0,必须在D/A转换器的输出端接入截止频率为fc/2的低通滤波器。
2.2 DDS数学原理
设有一频率为的余弦信号:
现在以采样频率对进行采样,得到的离散序列为:
其中为采样周期。
对应的相位序列为
从上式可以看出相位序列呈线性,即相邻的样值之间的相位增量是一个常数,而且这个常数仅与信号的频率有关,相位增量为:
因为信号频率与采样频率之间有以下关系:
其中与为两个正整数,所以相位的增量也可以完成:
由上式可知,若将的相位均匀的分为等份,那么频率为的余弦信号以频率采样后,它的量化序列的样品之间的量化相位增量为一个不变值。
根据上述原理可以构造一个不变量为量化相位增量的量化序列:
然后完成从到另一个序列的映射,由构造序列:
公式(2—1)
公式(2-1)是连续信号经采样频率为采样后的离散时间序列,根据采样定理,当时,经过低通滤波器平滑后,可唯一恢复出。
可见,通过上述变换不变量将唯一的确定一个单频率模拟余弦信号:
该信号的频率为:
公式(2—2)
公式(2—2)就是直接数字频率合成(DDS)的方程式,在实际的DDS中,一般取,于是DDS方程就可以写成:
公式(2—3)
根据公式(2—3)可知,要得到不同的频率只要通过改变的具体数值就可以了,而且还可以得到DDS的最小频率分辨率(最小频率间隔)为当时的输出频率:
可见当参考频率始终一定是,其分辨率由相位累加器的位数决定,若取,,则,即分辨率可以达到,这也是最低的合成频率,输出频率的高精度DDS的一大优点。
由奈奎斯特准则可知,允许输出的最高频率,即,但实际上在应用中受到低通滤波器的限制,通常,以便于滤波镜像频率,一般:
由此可见DDS的工作频率带较宽,可以合成从直流到的频率信号,同时它的输出相位连续,频率稳定度高。
2 总体设计方案
3.1系统设计原理
本文提出的采用DDS作为信号发生核心器件的全数控函数信号发生器设计方案, 根据输出信号波形类型可设置、输出信号幅度和频率可数控、输出频率宽等要求,选用了美国A/D公司的AD9850 芯片,并通过单片机程序控制和处理AD9850的32位频率控制字, 再经放大后加至以数字电位器为核心的数字衰减网络, 从而实现了信号幅度、频率、类型以及输出等选项的全数字控制。
本系统主要由单片机、DDS直接频率信号合成器、数字衰减电路、真有效值转换模块、A/D转换模块、数字积分选择电路等部分组成。单片机AT89S52是整个系统关键部分,通过对键盘进行扫描读入相位信息,经转换后输出到芯片AD9850,输出波形。键盘输入的数字信息经AT89S52控制的LCD1602显示
3.2总体设计框图
系统构成如下图3.1所示。
LCD1602
键盘
单片机
AD9850
低通滤波器
信号输出
图3.1 系统框图
3 系统的硬件设计
因为本课题的功能电路与相关部件较多,为了便于研制期间的调试与最终
成品的产业化,所以系统的最后实现采用了模块化的思想,即先把各个相关的电路与部件做成相互独立的分离模块,而系统的功能则是通过各模块间的级联来完成的。下面将分别叙述各功能模块及其中所用到的器件、电路以及在系统设计、调试过程中应该注意的问题。
3.2 DDS芯片的选择及与单片机之间的通信
信号的产生与控制部分电路由DDS片AD9851与单片机AT89S52组成, 用户通过键盘输入的信号要求被AT89S52接收,并经其处理后将计算出的控制字传送给AD9851,由AD9851产生频率幅度可控的信号。下面以AD9851芯片为中心加以讨论。
3.2.1 DDS芯片选择及引脚图
本系统采用了美国模拟器件公司生产的高集成度产品 AD9851 芯片。AD9851 是在 AD9850 的基础上,做了一些改进以后生成的具有新功能的 DDS 芯片。AD9851 相对于 AD9850 的内部结构,只是多了一个 6 倍参考时钟倍乘器,当系统时钟为 180MHz 时,在参考时钟输入端,只需输入 30MHz 的参考时钟即可。AD9851 是由数据输入寄存器、频率/相位寄存器、具有 6 倍参考时钟倍乘器的 DDS 芯片、10位的模/数转换器、内部高速比较器这几个部分组成。其中具有 6 倍参考时钟倍乘器的 DDS 芯片是由 32 位相位累加器、正弦函数功能查找表、D/A 变换器以及低通滤波器集成到一起。这个高速 DDS 芯片时钟频率可达 180MHz, 输出频率可达 70 MHz,分辨率为 0.04Hz。
AD9851采用28引脚的SSOP表面封装,其引脚排列如图3-5所示,各引脚定义如下:
D0~D7:8 位数据输入口,可给内部寄存器装入 40 位控制数据。
PGND:6 倍参考时钟倍乘器地。
PVCC:6 倍参考时钟倍乘器电源。
W-CLK:字装入信号,上升沿有效。
FQ-UD:频率更新控制信号,时钟上升沿确认输入数据有效。
FREFCLOCK:外部参考时钟输入。
CMOS/TTL 脉冲序列可直接或间接地加到 6 倍参考时钟倍乘器上。在直接方式中,输入频率即是系统时钟;在 6 倍参考时钟倍乘器方式,系统时钟为倍乘器输出。
AGND:模拟地。
AVDD:模拟电源(+5V)。
DGND:数字地。
DVDD:数字电源(+5V)。
RSET、DAC:外部复位连接端。
VOUTN:内部比较器负向输出端。
VOUTP:内部比较器正向输出端。
VINN:内部比较器的负向输入端。 图3-5 AD9851管脚示意图
VINP:内部比较器的正向输入端。
DACBP:DAC 旁路连接端。
IOUTB: “互补”DAC 输出。
IOUT:内部 DAC 输出端。
RESET:复位端。低电平清除 DDS累加器和相位延迟器为 0Hz 和 0 相位,同时置数据输入为串行模式以及禁止 6 倍参考时钟倍乘器工作。
3.2.2 AD9851的串、并行通信
AD9851的串行操作有两种数据传送方式,即从最高位开始传送和从最低位开始传送,这是由控制寄存器1的第8位来决定的。默认状态为低电平,此时先传送最高位,若为高电平则先传送最低位。串行操作的时序如图3-6所示。
图3-6 控制字串行输入时序图
在串行输入方式,W-CLK上升沿把25引脚的一位数据串行移入,当移动40位后,用一个FQ_UD脉冲即可更新输出频率和相位。图3-7是相应的控制字串行输入的控制时序图。AD9851的复位(RESET)信号为高电平有效,且脉冲宽度不小于5个参考时钟周期。AD9851的参考时钟频率一般远高于单片机的时钟频率, 因此AD9851的复位(RESET)端可与单片机的复位端直接相连。
图3-7 控制字并行输入的时序图
在并行装入方式中,通过8位总线D0-D7将可数据输入到寄存器,在重复5次之后再在FQ-UD上升沿把40位数据从输入寄存器装入到频率/相位数据寄存器(更新DDS输出频率和相位),同时把地址指针复位到第一个输入寄存器。接着在W-CLK的上升沿装入8位数据,并把指针指向下一个输入寄存器,连续5个W-CLK上升沿后, W-CLK的边沿就不再起作用,直到复位信号或FQ-UD上升沿把地址指针复位到第一个寄存器。
3.3 单片机(AT89S52)控制电路
AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash 存储器。使用ATMEL公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、有效的解决方案。AT89S52具有以下标准功能:8k字节Flash、256字节RAM、32 位I/O 口线、看门狗定时器、2个数据指针、三个16 位定时器/计数器、一个6向量2级中断结构、全双工串行口、片内晶振及时钟电路。另外,AT89S52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
一般单片机需外接一个时钟电路和一个复位电路,其设计为下:
3.3.1 时钟电路
图3-8 时钟电路
XTAL1是片内振荡器的反相放大器输入端,XTAL2则是输出端,使用外部振荡器时,外部振荡信号应直接加到XTAL1,而XTAL2悬空。内部方式时,时钟发生器对振荡脉冲二分频,如晶振为12MHz,时钟频率就为6MHz。晶振的频率可以在1MHz-24MHz内选择。电容取30PF左右。AT89C52中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。这个放大器与作为反馈元件的片外石英晶体或者陶瓷谐振器一起构成自激振荡器。片外石英晶体或者陶瓷谐振器及电容C1、C2接在放大器的反馈回路中构成并联振荡电路。对外接电容C1、C2虽然没有十分严格的要求,但电容容量的大小会轻微影响振荡频率的高低、振荡器工作的稳定性、起振的难易程序及温度稳定性,这里采用电容30pF,晶振采用11.0592MHz。
3.3.2 复位电路
AT89C52的外部复位电路有上电自动复位和手动按键复位。上电复位电容充电来实现。手动按键复位又分为按键电平复位和按键脉冲复位。按键电平复位电路是在普通RC复位电路的基础上接一个有下拉电阻100K、上拉电容10μf接VCC,电源由开关接至复位脚(和上拉电容并联),上拉电容支路负责在“上电”瞬间实施复位;开关通过100K下拉电阻分压器,保证对单片机实施按键电平复位。电路图如下图所示:
图3-9 复位电路
3.3.3 单片机控制电路图
图3-10 单片机控制电路原理图
P0口:P0口是一个8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻辑电平。对P0端口写“1”时,引脚用作高阻抗输入。当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。在这种模式下,P0具有内部上拉电阻。在flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。程序校验时,需要外部上拉电阻。
P1口:P1 口是一个具有内部上拉电阻的8 位双向I/O 口,P1 输出缓冲器能驱动4个TTL逻辑电平。对P1 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流。此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.0/T2)和时器/计数器2的触发输入(P1.1/T2EX),在flash编程和校验时,P1口接收低8位地址字节。P2 口:P2 口是一个具有内部上拉电阻的8 位双向I/O 口,P2 输出缓冲器。能驱动4个TTL 逻辑电平。对P2 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流。在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX @DPTR)时,P2 口送出高八位地址。在这种应用中,P2口使用很强的内部上拉发送1。在使用8位地址(如MOVX @RI)访问外部数据存储器时,P2口输出P2锁存器的内容。在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。
3.3.4 单片机与AD9851的接口
单片机与AD9851的接口既可采用并行方式,也可采用串行方式,但为了充分发挥芯片的高速性能,应在单片机资源允许的情况下尽可能选择并行方式,本文重点介绍其并行方式的接口。P3.1 I/O方式并行接口I/ O方式的并行接口电路比较简单,但占用单片机资源相对较多,图3-11是I/O方式并行接口的电路图,AD9851的数据线D0~D7与P1口相连, FQ_UD和W_CLK分别与P2.3(10引脚)和P2.4(11引脚)相连,所有的时序关系均可通过软件控制实现。
图3.11 AT89S52与AD9851的电路连接图
3.4 液晶显示模块
3.4.1 LCD1602的主要性能
1602型LCD可以显示2行16个字符,有8位数据总线D0~D7和RS,R/W,EN三个控制端口,工作电压为5V,并且具有字符对比度调节和背光功能[6]。
1602型LCD的接口信号说明,如表3.1所示:
表3.1 LCD1602接口说明
编号
符号
引脚说明
编号
符号
引脚说明
1
VSS
电源地
9
D2
Data I/O
2
VDD
电源正极
10
D3
Data I/O
3
VL
液晶显示偏压信号
11
D4
Data I/O
4
RS
数据/命令选择端(H/L)
12
D5
Data I/O
5
R/W
读写选择端(H/L)
13
D6
Data I/O
6
E
使能信号
14
D7
Data I/O
7
D0
Data I/O
15
BLA
背光源正极
8
D1
Data I/O
16
BLK
背光源负极
读状态:输入:RS=L,RW=H,E=H 输出:D0~D7=状态字
读数据:输入:RS=H,RW=H,E=H 输出:无
写指令:输入:RS=L,RW=L,D0~D7=指令码,E=高脉冲 输出:D0~D7=数据
写数据:输入:RS=H,RW=L,D0~D7=数据,E=高脉冲 输出:无
3.4.2 LCD与单片机的连接
图3-12 LCD与单片机的接口电路
在实际的接线中,1602的DB0—DB7与89S52的P0口相接,RS与P3.5相接,R/W与P3.6相接,E与P3.7相接。VL与地之间接一个10K的滑动变阻器来到1602初始显示的调节。
3.5 低通滤波器的设计
为了使输出的频率不受外界和一些杂波的干扰,需用一个低通滤波器(LPF)滤除高次谐波。常用的滤波器的频率响应有三种:巴特沃斯型(Butterworth),切比雪夫型 (Chebyshev)和椭圆型 (Cauer)。其中巴特沃斯滤波器通带最平坦,它的通带内没有纹波,在靠近零频处,有最平坦通带,趋向阻带时衰减单调增大,缺点是从通带到阻带的过渡带最宽,对于带外干扰信号的衰减作用最弱,过渡带不够陡峭,因此它适用于对通带要求较高,而去除的频率离通带较远的情况;切比雪夫滤波器在通带内衰减在零值和一个上限值之间做等起伏变化,阻带内衰减单调增大,带内有起伏,但过渡带比较陡峭;椭圆滤波器不仅通带内有起伏,阻带内也有起伏,而且过渡带陡峭。比较起来,椭圆滤波器性能更好,本设计中采的是椭圆滤波器。具体电路图如图3-13所示。
图3-13 滤波电路
4 信号发生器的软件设计
在应用系统中,系统软件的设计是建立在具体硬件电路基础之上,根据系统功能要求可靠地实现系统的各种功能。好的软件设计能够充分发挥微控制器的运算和逻辑控制功能,从而提高仪器的精度和使用的方便性。
4.1 程序流程图
通过程序预置频率,并实现对频率步进的控制,处理用户由键盘键入的频率值,判断是否超出范围,生成频率控制字,经并行方式送入DDS,合成用户所需的频率,并通过程序实现频率的显示。程序流程图如下:
结束
AT89C52初始化H
AD9851初始化
键盘扫描
正弦波
LCD1602初始化
开始
N
Y
图4-1 程序流程图
4.2 键盘扫描流程图
键盘扫描
按键s1是否按下
选中千位
按键s1是否按下
选中百位
按键s1是否按下
选中十位
按键s1是否按下
选中个位
否
是
是
否
否
是
否
是
图4-2 按键1扫描流程图
如图所示,键盘初始化后扫描键盘,依次扫描3个按键,每个按键都编有延时去抖的程序,如果s1键按每按下一次下,则通过LCD中看出选中千位、百位、十位和各位中的哪一位,并通过s2和s3来改变相应的数值。
键盘扫描
按键s2是否按下
频率加一
否
是
键盘扫描
按键s3是否按下
频率减一
否
是
图4-3 按键2、3的扫描流程图
键盘扫描
按键s4是否按下
相位加32
否
是
图4-3 按键4的扫描流程图
如果s2键按下,频率加一。
如果s3键按下,则频率减一。
如果s4键按下,则相位增加32。
4.3 LCD的显示
图4-4 1602的显示流程图
本系统采用的1602的液晶显示,可显示两行数据,每行16个数据。首先根据其指令编码对其进行初始化。但要注意,1602是一个慢显示,所以对其读写数据需要一定的延时,以待其完全接收。在显示时,首先根据其地址分配,设定第一行的起始位置,再显示第一行的内容。第二行显示同理。
5部分系统的仿真和调试
在仿真过程中,由于在proteus元件库中没有AD9851芯片,也没有其他的DDS芯片可以代替,所以在仿真过程中,我只做了LCD的显示模块的仿真,其仿真结果如下:
开始仿真,LCD上第一行会显示P: 第二行会显示f:
图5-1 仿真结果1
当按键s1第一次按下时, 再通过按键s2和s3调节千位数值,并会LED上显示一个频率的千位数值。
图5-2 仿真结果2
当按键s1第二次按下时, 再通过按键s2和s3调节千位数值,并会LED上显示一个频率的千位和百位数值。
图5-3 仿真结果3
当按键s1第四次按下时, 再通过按键s2和s3调节千位数值,并会LED上显示一个频率的数值。
图5-4 仿真结果4
当按键s4第一次按下时,则可以增加相位。
图5-5 仿真结果5
当按键s4第二次按下时,则可以增加相位22.5。
图5-6 仿真结果6
6 系统的程序代码
# include <reg51.h>
# include <stdio.h>
# include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit ad9850_w_clk =P2^2; //P2.2口接ad9850的w_clk脚/PIN7
sbit ad9850_fq_up =P2^1; //P2.1口接ad9850的fq_up脚/PIN8
sbit ad9850_rest =P2^0; //P2.0口接ad9850的rest脚/PIN12
sbit ad9850_bit_data =P2^3; //P1.7口接ad9850的D7脚/PIN25
uint ge,shi,bai,qian,flag;
double timer;
uchar temp=0,temp1=0;
uint a[]={0x30,0x30,0x30,0x2e,0x30,0xdf}; //相位数据结果保存
sbit lcdrs=P1^7 ;
sbit lcdrw=P1^6;
sbit lcde=P2^4;
sbit s1=P1^0;
sbit s2=P1^1;
sbit s3=P1^2;
sbit s4=P1^3;
sbit e=P3^7;
void ad9850_reset_serial(void)
{
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;
}
void ad9850_wr_serial(unsigned char w0,double frequence)
{
unsigned char i,w;
long uint y;
double x;
//计算频率的HEX值
x=4294967295/125;//适合125M晶振
//如果时钟频率不为180MHZ,修改该处的频率值,单位MHz !!!
frequence=frequence/1000000;
frequence=frequence*x;//*34.359738368; //;
y=frequence;
//写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;
}
void delay(uint n) //延时程序
{
uint i,j;
for(i=0;i<n;i++)
for(j=0;j<110;j++);
}
void write_com(uchar com) //液晶控制指令子程序
{
lcdrs=0;
P0=com;
delay(5);
lcde=1;
delay(5);
lcde=0;
}
void write_data(uchar date) //液晶数据输入子程序
{
lcdrs=1;
P0=date;
delay(5);
lcde=1;
delay(5);
lcde=0;
}
void display(uchar t) //初始化显示子程序
{ uint phase;
uchar j;
phase=22.5*t;
a[0]=phase/100+48;
a[1]=phase%100/10+48;
a[2]=phase%10+48;
a[4]=48+5*(temp&0x01);
write_com(0x80+0X02);
for(j=0;j<6;j++)
{
write_data(a[j]);
delay(10);
}
}
void keyscan() //键盘检测
{
if(s1==0)
{
delay(25);
if(s1==0)
flag++;
write_com(0x0f);
while(!s1);
}
if(flag==4)
{
if(s2==0)
delay(70);
if(s2==0)
{ while(!s2);
ge++;
if(ge==10)
ge=0;
}
if(s3==0)
delay(70);
if(s3==0)
{ while(!s3);
ge--;
if(ge==-1)
ge=9;
}
write_com(0x80+0x45);
write_data(0x30+ge);
}
else if(flag==3)
{
if(s2==0);
delay(70);
if(s2==0)
{ while(!s2);
shi++;
if(shi==10)
shi=0;
}
if(s3==0);
delay(70);
if(s3==0)
{ while(!s3);
shi--;
if(shi==-1)
shi=9;
}
write_com(0x80+0x44);
write_data(0x30+shi);
}
else if(flag==2)
{
if(s2==0)
delay(70);
if(s2==0)
{ while(!s2);
bai++;
if(bai==10)
bai=0;
}
if(s3==0)
delay(70);
if(s3==0)
{ while(!s3);
bai--;
if(bai==-1)
bai=9;
}
write_com(0x80+0x43);
write_data(0x30+bai);
}
else if(flag==1)
{
if(s2==0)
delay(70);
if(s2==0)
{ while(!s2);
qian++;
if(qian==10)
qian=0;
}
if(s3==0)
delay(70);
if(s3==0)
{ while(!s3);
qian--;
if(qian==-1)
qian=9;
}
write_com(0x80+0x42);
write_data(0x30+qian);
}
else //if(flag>=5)
{
flag=0;
write_com(0x0c);
timer=(qian*1000+bai*100+shi*10+ge);
}
if(s4==0)
{
delay(25);
if(s4==0)
{
temp1+=0x10;
temp++;
while(!s1);
delay(100);
while(!s1);
if(temp1>=0xf0)
{ temp=0;
temp1=0; }
}
display(temp);
}
}
void init()
{
lcdrw=0;
lcde=0;
e=1;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80+0x00);
write_data(0x70); //写p
write_data(0x3a);
write_com(0x80+0x40); //写f
write_data(0x66);
write_data(0x3a);
}
main()
{
init();
ad9850_reset_serial();
while(1)
{ keyscan();
ad9850_wr_serial(temp1,timer);
}
}
7设计心的及体会
通过这次专业课程设计,使我深刻地认识到学好专业知识的重要性,也理解了理论联系实际的含义,并且检验了大学三年的学习成果,进一步加深了我对专业知识的了解和认识以及动手的能力。虽然在这次设计中对于所学知识的运用和衔接还不够熟练,作品完成的还不是很出色。但是我将在以后的工作和学习中继续努力、不断完善。这个设计是对我们过去所学知识的系统提高和扩充的过程,为今后的发
展开阅读全文