这个做的比较简单,原理图后来有几处修改,不要紧,是按照官方评估板修改的,574没用到不焊接(连PC机的)。原理图暂时提供pdf版本的吧,画的也不好。大家拿到资料自己学习参考就是了,不要到处发布。^-^
dds信号发生器的原理图文件
3种方式的源代码
下面是全部完整的制作资料下载:
DDS信号发生器模块制作资料.rar
(914.12 KB, 下载次数: 658)
程序编写环境:win xp+Keil uVision 3(8.18)
主要功能模块:STC89C516RD+单片机(是51内核就行),AD9850信号发生芯片,JHD529M1型12864液晶模块(带中文字库),4*4矩阵键盘
单片机IO口使用情况:
P0口接液晶显示器数据线,
P1.0接液晶的RS(CS),P1.1接液晶的RW(SLD),P1.2接液晶的E(SCLK),P1.3接液晶的PSB,P1.4接液晶的RESET
P1.5接AD9850的RESET,P1.6接AD9850的WCLK,P1.7接AD9850的FQUD
P2口接键盘,P3口接AD9850,
键盘示意图(4*4矩阵):
| 7 | 8 | 9 | set |
—————————————————————
| 4 | 5 | 6 | enter |
—————————————————————
| 1 | 2 | 3 | backspace |
—————————————————————
| . | 0 | 波形 | enter |
操作指南:
1.上电开机,显示欢迎界面
2.按“确定”键,进入频率设置界面
3.按“设置”键开始设置频率,可以使用退格键。(整数最多5位,小树最多3位)
4.按“确定”键完成输入,此时从AD9850出可以得到所要频率的波形。
5.需要重新设定频率时,重复3,4步骤即可。
部分程序源码预览:
- /*************************************************************
- **项目:AD9850信号发生器设计
- **作者:徐士斌
- **版本:1.0.0.8
- **简介:本程序接收来自4*4矩阵键盘输入的频率,并计算出相应的
- 频率控制字,写到DDS芯片AD9850中,同时在LCD12864上显示输出频率。
- *************************************************************/
- #include "lcdfun.h"
- #define uc unsigned char
- #define ui unsigned int
- #define MAXINPUT 13
- #define MAXZHENSHU 5
- #define MAXXIAOSHU 3
- sbit WCLK=P1^6;
- sbit FQUD=P1^7;
- sbit reset_9850=P1^5;
- uc i,j,t;
- uc vkey,key; //全局变量,存储检测到的/转换得到的按键值
- //input存输入的数字(input[0][]空出不用),num存输入字符个数,pdot存小数点的位置
- unsigned char input[MAXINPUT][1],num,pdot;
- unsigned char waveform=1;//输出波形,1-sin 2-方波 3-三角波(没用处)
- unsigned long zheng,xiao=0,freqctrlbyte;//输入字符的整数、小数部分,频率控制字
- unsigned long const_zheng=71,const_xiao;//常数
- unsigned long ulong1,ulong3,ulongtemp;
- const uc code CLEAR[] = {" "};
-
- uc code HELLO11[] = {"信息与通信中心"};
- uc code HELLO12[] = {"开放实验"};
- uc code HELLO21[] = {"欢迎使用"};
- uc code HELLO22[] = {"信号发生器"};
- uc code HELLO23[] = {"点击“确定”进入"};
-
- uc code HELLO32[] = {"状态:"};
- uc code HELLO33[] = {"频率设定:"};
- uc code FH1[] = {"AD9850"};
- uc code FH2[] = {"KHz"};
- uc code SZ[][1]= {0x30,0x31,0x32,0x33,0x34,0x35,0x36,
- 0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46,0x2e,0x20,};
-
- const uc code NORMAL[] = {"正常"};
- const uc code ERROR[] = {"错误"};
- const uc code SIN[]= {"正弦"};
- const uc code FANGBO[] = {"方波"};
- const uc code TRI[] = {"三角"};
- const uc code SET[] = {"设置"};
- /*************************************************************
- 延时一毫秒子程序
- *************************************************************/
- void delay(uc a)
- {
- while(a--)
- for(i=100;i>0;i--);
- }
- /*************************************************************
- 检测按键,按键值存到vkey中
- *************************************************************/
- unsigned int getkey()
- {
- uc a,b;
- while(1) //键盘扫描程序
- {
- vkey=0;
- P2=0xf0; //p2接矩阵键盘
- a=P2; //a存列信息
- if(a!=0xf0)
- {
- delay(10);
- P2=0x0f;
- b=P2; //b存行信息
- delay(10);
- switch(a|b)//c=a|b为键盘扫描的键值
- {
- case 0xee:
- {vkey=1;break;}
- case 0xde:
- {vkey=2;break;}
- case 0xbe:
- {vkey=3;break;}
- case 0x7e:
- {vkey=4;break;}
- case 0xed:
- {vkey=5;break;}
- case 0xdd:
- {vkey=6;break;}
- case 0xbd:
- {vkey=7;break;}
- case 0x7d:
- {vkey=8;break;}
- case 0xeb:
- {vkey=9;break;}
- case 0xdb:
- {vkey=10;break;}
- case 0xbb:
- {vkey=11;break;}
- case 0x7b:
- {vkey=12;break;}
- case 0xe7:
- {vkey=13;break;}
- case 0xd7:
- {vkey=14;break;}
- case 0xb7:
- {vkey=15;break;}
- case 0x77:
- {vkey=16;break; }
- default:
- {vkey=0;}
- }
- delay(200);//按键延时200ms
- return 0;
- }
- }//while(1)结束
- }
- /*************************************************************
- 显示当前输出波形形状
- *************************************************************/
- void playwaveform()
- {
- if(waveform==1)
- {Serial_DisplayStrings_WithAddress(0x9e,SIN);}
- if(waveform==2)
- {Serial_DisplayStrings_WithAddress(0x9e,FANGBO);}
- if(waveform==3)
- {Serial_DisplayStrings_WithAddress(0x9e,TRI);}
- }
- /*************************************************************
- 显示欢迎界面
- *************************************************************/
- void welcome()
- {
- clearscreen();
- Serial_DisplayStrings_WithAddress(0x90,HELLO11);//信息与通信工程中心
- Serial_DisplayStrings_WithAddress(0x8a,HELLO12);//开放实验
- delay(200);delay(200);delay(200);delay(200);
- delay(200);delay(200);delay(200);delay(200);
- delay(200);delay(200);delay(200);delay(200);
- clearscreen();
- Serial_DisplayStrings_WithAddress(0x82,HELLO21);//欢迎使用
- Serial_DisplayStrings_WithAddress(0x92,FH1);//AD9850
- Serial_DisplayStrings_WithAddress(0x89,HELLO22);//信号发生器
- Serial_DisplayStrings_WithAddress(0x98,HELLO23);//点击“确定”进入
- }
- /*************************************************************
- 显示正常工作界面
- *************************************************************/
- void hello3()
- {
- clearscreen();
- Serial_DisplayStrings_WithAddress(0x80,FH1); //AD9850
- Serial_DisplayStrings_WithAddress(0x83,HELLO22);//信号发生器
- Serial_DisplayStrings_WithAddress(0x90,HELLO33);//频率设定:
- Serial_DisplayStrings_WithAddress(0x8d,FH2);//Hz
- Serial_DisplayStrings_WithAddress(0x98,HELLO32);//状态:
- Serial_DisplayStrings_WithAddress(0x9b,NORMAL);//显示“正常”
- playwaveform(); //显示当前波形形状
- }
- /*************************************************************
- 向AD9850写入频率控制字
- *************************************************************/
- void writefreg(unsigned long freq)
- {
- unsigned char mw3=0x00,mw4=0x00;
- unsigned char mw0=0x00,mw1=0x00,mw2=0x00;
- mw4=freq&0x0ff;
- freq=freq/256;
- mw3=freq&0x0ff;
- freq=freq/256;
- mw2=freq&0x0ff;
- freq=freq/256;
- mw1=freq&0x0ff;
- mw0=0x00;
- P0=mw0;
- WCLK=0;
- WCLK=1;
-
- P0=mw1;
- WCLK=0;
- WCLK=1;
-
- P0=mw2;
- WCLK=0;
- WCLK=1;
-
- P0=mw3;
- WCLK=0;
- WCLK=1;
-
- P0=mw4;
- WCLK=0;
- WCLK=1;
- FQUD=0;
- FQUD=1;
- }
- /*************************************************************
- 将虚拟按键转换成数字按键
- *************************************************************/
- void vkey2key()
- {
- switch(vkey)
- {
- case 1:{key=7;break;}
- case 2:{key=8;break;}
- case 3:{key=9;break;}
- case 5:{key=4;break;}
- case 6:{key=5;break;}
- case 7:{key=6;break;}
- case 9:{key=1;break;}
- case 10:{key=2;break;}
- case 11:{key=3;break;}
- case 14:{key=0;break;}
- case 13:{key=16;break;}////
- default:{key=20;}
- }
- }
- /*************************************************************
- 在LCD12864上显示输入的字符
- *************************************************************/
- void displayinput()
- {
- unsigned int t=0;
- //先清相关的屏
- for( i=0x88;i<=0x8f;i++)
- { Serial_DisplayStrings_WithAddress(i,CLEAR); }
- //显示input数组内容
- Serial_Write_LCD(COMMAND,BASIC_FUNCTION);//基本指令动作
- Serial_DDRAM_Address_Set(0x88);
- for(i=1;i<=num;i++)
- Serial_Write_LCD(DATA, SZ[input[i][0]][0]);
- Serial_DisplayStrings_WithAddress(0x8d,FH2);
- }
- /*************************************************************
- 由输入的字符计算得到频率控制字
- *************************************************************/
- unsigned char input2output()
- {
- unsigned long temp=1;
- t=0; ulongtemp=0;ulong3=0;
- ulong1=0;zheng=0;
- //计算输入的整数部分
- if(pdot!=0)
- {for(i=1;i<pdot;i++)zheng=zheng*10+input[i][0];}
- else
- {for(j=1;j<=num;j++)zheng=zheng*10+input[j][0];}
- //计算输入的小数部分
- if(pdot!=0)
- {
- xiao=0;
- for(i=pdot+1,temp=100;i<=num;i++,temp/=10)
- {xiao=xiao+input[i][0]*temp;}
- }
- zheng*=1000; //整数加权
- zheng=zheng+xiao; //其实没有小数啦
- ulong1=zheng*(71);//71//42
- ulong3=zheng*0.582788267;//0.582788267//0.94967296
- freqctrlbyte=ulong1+ulong3;
- return 1;
- }
- /*************************************************************
- 确定键处理函数
- *************************************************************/
- void onok()
- {
- unsigned char result;
- result=input2output();
- if(result==1)
- writefreg(freqctrlbyte);
- Serial_DisplayStrings_WithAddress(0x9b,NORMAL);//显示状态“正常”
- }
- /*************************************************************
- 初始化AD9850
- *************************************************************/
- void init_9850()
- {
- reset_9850 = 1;
- delay(100);
- reset_9850 = 0;
- }
- /*************************************************************
- 主函数
- *************************************************************/
- void main(void)
- {
- EA=0; //全局中断不被允许
- Serial_Init_LCD();
- init_9850();
- welcome(); //hello12()
- s1: getkey();
- if(vkey==4) hello3();
- else {goto s1;}
- hello3();
- newstart:num=0;pdot=0;
- for(i=0;i<MAXINPUT;i++) input[i][0]=0x00;
- while(1)
- {
- getkey();
- if(vkey==4) //刚开始只有SET键有效,进入设置过程
- { //每次设置初始化//hello3();
- Serial_DisplayStrings_WithAddress(0x9b,SET);//显示状态“设置”
- num=0;pdot=0;for(i=0;i<MAXINPUT;i++)input[i][0]=0x00;
- displayinput();
-
- while(1)
- {
- getkey();
- switch(vkey)
- {
- case 0:
- {
- break;//由于没有按键的时候vkey一直为0,所以一般此处不做任何处理
- }
- case 4:
- {
- num=0;pdot=0;
- displayinput();
- break;
- }
- case 8:
- {
- onok(); //暂时用这个键当回车
- goto newstart;
- }
- case 12: //删除
- {
- if(num<=0){num=0;pdot=0;break;}//已经没有输入字符了
- if(num==pdot) //处理dot被删除时的情况
- {pdot=0;num--;displayinput();break;}
- num--;
- displayinput();
- break;
- }
- case 13: //按键dot位
- {
- if((num+1)>(MAXINPUT-1))break; //总字符数超出范围
- if(pdot!=0)break; //已经有小数点了
- num++;pdot=num;vkey2key();
- input[num][0]=key;
- displayinput();
- break;
- }
- case 15: //波形选择
- {
- waveform++;
- if(waveform>3)waveform=1;
- playwaveform();
- break;
- }
- case 16:
- {
- onok(); //回车,不过这个键不好用了
- goto newstart;
- break;
- }
- default:
- { if(num>=(MAXINPUT-1)){break;} //总字符数超出范围
- if((pdot!=0)&&((num-pdot)>=MAXXIAOSHU))break;//小数个数超出范围
- if((pdot==0)&&((num+1)>MAXZHENSHU))break; //整数个数超出范围
- num++;
- vkey2key();//转换
- input[num][0]=key;
- displayinput();
- }
- } //switch
- }//while
- }//if
- else continue;
- } //while
- }//main
- /************************************************************/
复制代码
下面是设计文档的预览:
第1章 绪 论 1.1课题研究的意义与作用 1.2 DDS的研究现状及发展趋势 1.3 DDS的系统简介 1.3.1 DDS的基本原理 1.3.2 DDS的能特点 1.3.3 实现AD9850信号发生系统的方案 1.4 液晶显示器及其指令介绍 1.4.1 JHD529M1概述 1.4.2 JHD529M1基本特性: 1.4.3 JHD529M1模块接口说明: 1.4.4 JHD529M1指令系统说明 第2章 信号发生系统硬件设计 2.1 系统功能实现及需求分析 2.2 主要电路设计 2.2.1正弦信号产生模块设计 2.2.2 液晶显示电路设计 2.2.3 键盘扩展电路设计 第3章 信号发生系统软件设计 3.1 程序编写及调试 3.2 程序设计思路及部分模块测试程序 3.2.1 程序设计思路 3.2.2 部分模块测试程序 第4章 系统参数性能测试及总结 4.1试验参数测试结果 4.2实验总结 致 谢 参考文献
前 言 本系统以51单片机为控制核心,由正弦信号发生模块、方波信号发生模块以及测试信号发生模块组成。采用数控的方法控制DDS芯片AD9850产生1Hz-20MHz正弦信号和方波信号。另外,本系统从简单、调整方便、功能完备为出发点,基本实现了设计中的要求,波形输出较稳定,且精度较高。本设计还配备有LCD显示屏、键盘,提供了友好的人机交互界面。
第1章 绪 论 1.1课题研究的意义与作用 1971年,美国学者j.Tierney等人撰写的" A Digital Frequency Synthesizer"-文首次提出了以全数字技术,从相位概念出发直接合成所需波形的一种新的频率合成原理。限于当时的技术和器件水平,它的性能指标尚不能与已有的技术相比,故未受到重视。近10年间,随着微电子技术的迅速发展,直接数字频率合成器(Direct Digital Frequency Synthesis简称DDS或DDFS)得到了飞速的发展,它以有别于其它频率合成方法的优越性能和特点成为现代频率合成技术中的姣姣者。具体体现在相对带宽宽、频率转换时间短、频率分辨率高、输出相位连续、可产生宽带正交信号及其他多种调制信号、可编程和全数字化、控制灵活方便等方面,并具有极高的性价比。 1.2 DDS的研究现状及发展趋势 在频率合成(FS, Frequency Synthesis)领域中,常用的频率合成技术有模拟锁相环、数字锁相环、小数分频锁相环(fractional-N PLL Synthesis)等,直接数字合成(Direct Digital Synthesis-DDS)是近年来新的FS技术。单片集成的DDS产品是一种可代替锁相环的快速频率合成器件。DDS是产生高精度、快速变换频率、输出波形失真小的优先选用技术。DDS以稳定度高的参考时钟为参考源,通过精密的相位累加器和数字信号处理,通过高速D/A变换器产生所需的数字波形(通常是正弦波形),这个数字波经过一个模拟滤波器后,得到最终的模拟信号波形。如图1-1所示,通过高速DAC产生数字正弦数字波形,通过带通滤波器后得到一个对应的模拟正弦波信号,最后该模拟正弦波与一门限进行比较得到方波时钟信号。 DDS系统一个显著的特点就是在数字处理器的控制下能够精确而快速地处理频率和相位。除此之外,DDS的固有特性还包括:相当好的频率和相位分辨率(频率的可控范围达μHz级,相位控制小于0.09°),能够进行快速的信号变换(输出DAC的转换速率300百万次/秒)。这些特性使DDS在军事雷达和通信系统中应用日益广泛。 其实,以前DDS价格昂贵、功耗大(以前的功耗达Watt级)、DAC器件转换速率不高,应用受到限制,因此只用于高端设备和军事上。随着数字技术和半导体工业的发展,DDS芯片能集成包括高速DAC器件在内的部件,其功耗降低到mW级(AD9851在3.3v时功耗为650mW),功能增加了,价格便宜。因此,DDS也获得广泛的应用:现代电子器件、通信技术、医学成像、无线、PCS/PCN系统、雷达、卫星通信。 1.3 DDS的系统简介 1.3.1 DDS的基本原理 DDS的基本原理是利用采样定理,通过查表法产生波形。DDS的结构有很多种,其基本的电路原理可用图1-2来表示。 相位累加器由N位加法器与N位累加寄存器级联构成。每来一个时钟脉冲fs,加法器将频率控制字K与累加寄存器输出的累加相位数据相加,把相加后的结果送至累加寄存器的数据输入端。累加寄存器将加法器在上一个时钟脉冲作用后所产生的新相位数据反馈到加法器的输入端,以使加法器在下一个时钟脉冲的作用下继续与频率控制字相加。这样,相位累加器在时钟作用下,不断对频率控制字进行线性相位累加。由此可以看出,相位累加器在每一个时钟脉冲输入时,把频率控制字累加一次,相位累加器输出的数据就是合成信号的相位,相位累加器的溢出频率就是DDS输出的信号频率。 用相位累加器输出的数据作为波形存储器(ROM)的相位取样地址,这样就可把存储在波形存储器内的波形抽样值(二进制编码)经查找表查出,完成相位到幅值转换。波形存储器的输出送到D/A转换器,D/A转换器将数字量形式的波形幅值转换成所要求合成频率的模拟量形式信号。低通滤波器用于滤除不需要的取样分量,以便输出频谱纯净的正弦波信号。 DDS在相对带宽、频率转换时间、高分辨力、相位连续性、正交输出以及集成化等一系列性能指标方面远远超过了传统频率合成技术所能达到的水平,为系统提供了优于模拟信号源的性能。 1.3.2 DDS的能特点 (1)输出频率相对带宽较宽
输出频率带宽为50%fs(理论值)。但考虑到低通滤波器的特性和设计难度以及对输出信号杂散的抑制,实际的输出频率带宽仍能达到40%fs。
(2)频率转换时间短
DDS是一个开环系统,无任何反馈环节,这种结构使得DDS的频率转换时间极短。事实上,在DDS的频率控制字改变之后,需经过一个时钟周期之后按照新的相位增量累加,才能实现频率的转换。因此,频率转换的时间等于频率控制字的传输时间,也就是一个时钟周期的时间。时钟频率越高,转换时间越短。DDS的频率转换时间可达纳秒数量级,比使用其它的频率合成方法都要短数个数量级。
(3)频率分辨率极高
若时钟fs的频率不变,DDS的频率分辨率就由相位累加器的位数N决定。只要增加相位累加器的位数N即可获得任意小的频率分辨率。目前,大多数DDS的分辨率在1Hz数量级,许多小于1MHz甚至更小。
(4)相位变化连续
改变DDS输出频率,实际上改变的每一个时钟周期的相位增量,相位函数的曲线是连续的,只是在改变频率的瞬间其频率发生了突变,因而保持了信号相位的连续性。
(5)输出波形的灵活性
只要在DDS内部加上相应控制如调频控制FM、调相控制PM和调幅控制AM,即可以方便灵活地实现调频、调相和调幅功能,产生FSK、PSK、ASK和MSK等信号。另外,只要在DDS的波形存储器存放不同波形数据,就可以实现各种波形输出,如三角波、锯齿波和矩形波甚至是任意的波形。当DDS的波形存储器分别存放正弦和余弦函数表时,既可得到正交的两路输出。
(6)其他优点
由于DDS中几乎所有部件都属于数字电路,易于集成,功耗低、体积小、重量轻、可靠性高,且易于程控,使用相当灵活,因此性价比极高。 DDS也有局限性,主要表现在: (1)输出频带范围有限 由于DDS内部DAC和波形存储器(ROM)的工作速度限制,使得DDS输出的最高频有限。目前市场上采用CMOS、TTL、ECL工艺制作的DDS工习片,工作频率一般在几十MHz至400MHz左右。采用GaAs工艺的DDS芯片工作频率可达2GHz左右。 (2)输出杂散大 由于DDS采用全数字结构,不可避免地引入了杂散。其来源主要有三个:相位累加器相位舍位误差造成的杂散;幅度量化误差(由存储器有限字长引起)造成的杂散和DAC非理想特性造成的杂散。 1.3.3 实现AD9850信号发生系统的方案 采用高性能DDS芯片的信号发生电路的解决方案,首先进行器件选型。随着微电子技术的飞速发展,目前各种性能优良的DDS产品不断推出,AD公司的DDS系列产品以其较高的性能价格比,目前取得了极为广泛的应用。AD公司的常用DDS芯片选用列表见表1,下面仅对比较常用的AD公司的芯片作一简单介绍。 表1 AD公司的常用DDS芯片选用列表 | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 内置12位的D/A转换器、高速比较器、线性调频和可编程参考时钟倍频器。 | | | | | 内置12位两路正交D/A转换器、高速比较器和可编程参考时钟倍频器。 | | | | | 内置10位的D/A转换器、150MHz相频检测器、充电汞和2GHz混频器。 | AD9850 采用先进的CMOS 工艺, 其功耗在3.3V 供电时仅为155mW,温度范围为-40~80℃, 采用28 脚SSOP 表面封装形式。图2.3为其组成框图。图中层虚线内是一个完整的可编程DDS系统,外层虚线内包含了AD9850的主要组成部分。AD9850内含可编程DDS系统和高速比较器,能实现全数字编程控制的频率合成。可编程DDS系统的核心是相位累加器, 它由一个加法器和一个N位相位寄存器组成,N为32;每来一个外部参考时钟,相位寄存器便以步长M递加;相位寄存器的输出与相位控制字相加后可输入到正弦查询表地址上;正弦查询表包含一个正弦波周期的数字幅度信息, 每一个地址对应正弦波中 0°~360°范围的一个相位点;查询表把输入地址的相位信息映射成正弦波幅度信号, 然后驱动DAC 以输出模拟量。 相位寄存器每过2N/M个外部参考时钟后返回到初始状态一次, 相应地正弦查询表每经过一个循环也回到初始位置, 从而使整个DDS系统输出一个正弦波。输出的正弦波周期TO = Tc2N/M,频率fout = Mfc/2N ,Tc、fc 分别为外部参考时钟的周期和频率。AD9850采用32位的相位累加器将信号截断成14 位输入到正弦查询表,查询表的输出再被截断成10 位后输入到DAC, DAC输出两个互补的电流。
图 2.3 AD9850信号发生系统组成框图 DAC满量程输出电流通过一个外接电阻RSET调节, 调节关系为ISET = 32 (1.248V/ RSET) , RSET的典型值是3.9kΩ。其系统功能结构如图2.4所示。AD9850在接上精密时钟源和写入频率相位控制字之后就可产生一个频率和相位都可编程控制的模拟正弦波输出, 此正弦波可直接用作频率信号源或经内部的高速比较器转换为方波输出。在125MHz 的时钟下, 32 位的频率控制字可使AD9850 的输出频率分辨率达0.0291Hz;并具有5位相位控制位,而且允许相位按增量180°、90°、45°、22.5°、11.25°或这些值的组合进行调整。
图 2.4 AD9850结构 1.4 液晶显示器及其指令介绍 1.4.1 JHD529M1概述 带中文字库的128X64是一种具有4位/8位并行、2线或3线串行多种接口方式,内部含有国标一级、二级简体中文字库的点阵图形液晶显示模块;其显示分辨率为128×64, 内置8192个16*16点汉字,和128个16*8点ASCII字符集.利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机交互图形界面。可以显示8×4行16×16点阵的汉字. 也可完成图形显示.低电压低功耗是其又一显著特点。由该模块构成的液晶显示方案与同类型的图形点阵液晶显示模块相比,不论硬件电路结构或显示程序都要简洁得多,且该模块的价格也略低于相同点阵的图形液晶模块。 1.4.2 JHD529M1基本特性: (1)低电源电压(VDD:+3.0--+5.5V) (2)显示分辨率:128×64点 (3)内置汉字字库,提供8192个16×16点阵汉字(简繁体可选) (4)内置 128个16×8点阵字符 (5)2MHZ时钟频率 (6)显示方式:STN、半透、正显 (7)驱动方式:1/32DUTY,1/5BIAS (8)视角方向:6点 (9)背光方式:侧部高亮白色LED,功耗仅为普通LED的1/5—1/10 (10)通讯方式:串行、并口可选 (11)内置DC-DC转换电路,无需外加负压 (12)无需片选信号,简化软件设计 (13)工作温度: 0℃ - +55℃ ,存储温度: -20℃ - +60℃ 1.4.3 JHD529M1模块接口说明: 硬件接口 管脚号 | 管脚名称 | 电平 | 管脚功能描述 | 1 | VSS | 0V | 电源地 | 2 | VCC | 3.0+5V | 电源正 | 3 | V0 | - | 对比度(亮度)调整 | 4 | RS(CS) | H/L | RS=“H”,表示DB7——DB0为显示数据 RS=“L”,表示DB7——DB0为显示指令数据 | 5 | R/W(SID) | H/L | R/W=“H”,E=“H”,数据被读到DB7——DB0 R /W=“L”,E=“H→L”, DB7——DB0的数据被写到 IR或DR | 6 | E(SCLK) | H/L | 使能信号 | 7 | DB0 | H/L | 三态数据线 | 8 | DB1 | H/L | 三态数据线 | 9 | DB2 | H/L | 三态数据线 | 10 | DB3 | H/L | 三态数据线 | 11 | DB4 | H/L | 三态数据线 | 12 | DB5 | H/L | 三态数据线 | 13 | DB6 | H/L | 三态数据线 | 14 | DB7 | H/L | 三态数据线 | 15 | PSB | H/L | H:8位或4位并口方式,L:串口方式(见注释1) | 16 | NC | - | 空脚 | 17 | /RESET | H/L | 复位端,低电平有效(见注释2) | 18 | VOUT | - | LCD驱动电压输出端 | 19 | A | VDD | 背光源正端(+5V)(见注释3) | 20 | K | VSS | 背光源负端(见注释3) | *注释1:如在实际应用中仅使用并口通讯模式,可将PSB接固定高电平,也可以将模块上的J8和“VCC”用焊锡短接。 *注释2:模块内部接有上电复位电路,因此在不需要经常复位的场合可将该端悬空。 *注释3:如背光和模块共用一个电源,可以将模块上的JA、JK用焊锡短接。 1.4.4 JHD529M1指令系统说明 模块控制芯片提供两套控制命令,基本指令和扩充指令如下: 指令表1:(RE=0:基本指令) | | | | | | | | | | | | | | | | | | | | | | | | 将DDRAM填满"20H",并且设定DDRAM的地址计数器(AC)到"00H" | | | | | | | | | | | | 设定DDRAM的地址计数器(AC)到"00H",并且将游标移到开头原点位置;这个指令不改变DDRAM 的内容 | | | | | | | | | | | | D=1: 整体显示 ON C=1: 游标ON B=1:游标位置反白允许 | | | | | | | | | | | | 指定在数据的读取与写入时,设定游标的移动方向及指定显示的移位 | | | | | | | | | | | | 设定游标的移动与显示的移位控制位;这个指令不改变DDRAM 的内容 | | | | | | | | | | | | DL=0/1:4/8位数据 RE=1: 扩充指令操作 RE=0: 基本指令操作 | | | | | | | | | | | | | | | | | | | | | | | | 设定DDRAM 地址(显示位址) 第一行:80H-87H 第二行:90H-97H | | | | | | | | | | | | 读取忙标志(BF)可以确认内部动作是否完成,同时可以读出地址计数器(AC)的值 | | | | | 将数据D7——D0写入到内部的RAM (DDRAM/CGRAM/IRAM/GRAM) | | | | | 从内部RAM读取数据D7——D0 (DDRAM/CGRAM/IRAM/GRAM) | 指令表2:(RE=1:扩充指令) | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | SR=1:允许输入垂直卷动地址 SR=0:允许输入IRAM和CGRAM地址 | | | | | | | | | | | | 选择2行中的任一行作反白显示,并可决定反白与否。初始值R1R0=00,第一次设定为反白显示,再次设定变回正常 | | | | | | | | | | | | | | | | | | | | | | | | CL=0/1:4/8位数据 RE=1: 扩充指令操作 RE=0: 基本指令操作 G=1/0:绘图开关 | | | | | | | | | | | | 设定绘图RAM 先设定垂直(列)地址AC6AC5…AC0 再设定水平(行)地址AC3AC2AC1AC0 将以上16位地址连续写入即可 | 备注:当IC1在接受指令前,微处理器必须先确认其内部处于非忙碌状态,即读取BF标志时,BF需为零,方可接受新的指令;如果在送出一个指令前并不检查BF标志,那么在前一个指令和这个指令中间必须延长一段较长的时间,即是等待前一个指令确实执行完成。
第2章 信号发生系统硬件设计 2.1 系统功能实现及需求分析 本设计采用STC89C516RD+单片机作为主要芯片来实现对AD9850芯片、液晶显示模块等外设的控制,STC89C516RD+单片机有64kflash并且保密性能十分优秀,完全可以满足本设计的要求。用液晶显示模块可以实时显示AD9850信号发生系统的工作状态(当前输出频率,控制系统运行状态),提供有好的操作界面。利用键盘的外部输入实现对输出频率的控制和设定。基于设计功能需求,本设计采用的是4×4矩阵式键盘,这样可以合理地利用硬件资源,并且编程灵活。 2.2 主要电路设计
图2.1 系统的总体框图 2.2.1正弦信号产生模块设计 正弦信号产生模块的主要部分是AD9850芯片及其外围电路的设计。芯片输出信号经过椭圆形滤波器后得到正弦波,信号送回到AD9850芯片,最终输出方波。 电路中重要的节点都可以用短路帽连接,也可以选择性的断开某部分电路。 图2.2 AD9850信号发生模块的设计 2.2.2 液晶显示电路设计 图2.3 液晶显示界面模块的硬件设计 2.2.3 键盘扩展电路设计 图2.4 键盘控制模块的硬件设计
第3章 信号发生系统软件设计 系统软件部分主要包括了具有友好的交互式操作界面,各种信号的设置和控制。正弦波产生过程为:频率设置,同步显示,数据处理,然后控制DDS芯片完成各种频率的正弦波产生;方波产生过程为:正弦波输入到AD9850后不经过比较,输出方波。(详细程序见附录) 3.1 程序编写及调试 程序编写环境:Windows xp+Keil C8.18 3.2 程序设计思路及部分模块测试程序 3.2.1 程序设计思路 单片机得到键盘的输入,并将输入内容显示到LCD屏幕上,按"确定"键后,利用输入的频率值计算得到相应的频率控制字,送到AD9850中,通过波形发生电路产生正确的波形输出。 下面为程序流程图: 图 3.1 程序流程图 3.2.2 部分模块测试程序 1.液晶显示模块控制 液晶显示模块用于同步显示用户输入结果和系统运行状态,在系统运行开始时显示欢迎界面。所有相关功能都封装在lcdfun.h头文件中。系统可以调用四个主要功能函数: void Serial_Init_LCD(void); void Serial_Write_LCD( bit b_Data_Command , unsigned char uc_Content); void Serial_DDRAM_Address_Set(uchar ucDDramAdd); void Serial_DisplayStrings_WithAddress(uchar ucAdd,uchar code *p); 这四个函数分别完成LCD初始化、写LCD、设置DDRAN地址、在LCD上显示一个字符串的功能。其他还有清屏、延时等函数。 键盘输入的字符存储在一个input数组内,变量num存输入字符个数,pdot存小数点的位置。同时提供退格键功能,并进行了相关的容错处理。本系统由于程序运行时间空余较多,故键盘通过程序扫描实现。如果改用中断实现,可以在键盘上加一个与非门即可。 通过键盘输入的字符在input2output()函数中被转换成二进制数字,然后经过简单运算,得到需要的频率控制字,保存在freqctrlbyte变量中。
第4章 系统参数性能测试及总结
4.1试验参数测试结果 - 测试仪器
·GWINSTEC 50M双踪模拟示波器;
·Tektronix 60M双通道数字示波器; 2、指标测试 (1) 正弦波指标测试 把正弦波输出端接入示波器,以1K,2K,5K,10K,50K,100K,500K,1M,2M,5M,10M,15M,20M作为测试点,得到如表3.1数据。 表 3.1 正弦波指标测试数据 期望频率 | 输出频率 | 失真度 ( 目测 ) | 1KHz | 1.14005KHz | 无 | 2KHz | 2.19247KHz | 无 | 5KHz | 5.61477KHz | 无 | 10KHz | 10.6178KHz | 无 | 50KHz | 51.6379KHz | 无 | 100KHz | 102.059KHz | 无 | 500KHz | 500.001KHz | 无 | 1MHz | 1.00000MHz | 无 | 2MHz | 2.00000MHz | 无 | 5MHz | 5.00001MHz | 无 | 10MHz | 10.00000MHz | 少许尖顶 | 15MHz | 15.00000MHz | 少许尖顶 | 20MHz | 20.00000MHz | 少许尖顶 |
由上表可见,正弦波输出频率在1KHz~500KHz带宽内输出存在频率误差,在500KHz~20MHz带宽内误差在0.001%之内。但输出频率高于10MHz时输出波形就会出现少许失真,原因可能是电路设计不足,跳线太多,造成高频干扰。 (2) 方波指标测试
把方波输出信号接入示波器,目测输出波形,测试数据如表3.2。 表 3.2 方波指标测试数据 期望频率 | 输出频率 | 失真度 ( 目测 ) | 1KHz | 1.000KHz | 轻微毛刺 | 2KHz | 2.000KHz | 轻微毛刺 | 5KHz | 5.000KHz | 轻微毛刺 | 10KHz | 10.001KHz | 轻微毛刺 | 50KHz | 50.001KHz | 少许毛刺 | 100KHz | 100.0KHz | 少许毛刺 | 500KHz | 500.0KHz | 少许毛刺 | 1MHz | 1.000MHz | 少许毛刺 | 2MHz | 2.000MHz | 毛刺变大 | 3MHz | 3.030MHz | 毛刺变大 | 5MHz | 5.000M | 毛刺变大 |
由上表可见,方波输出频率在1KHz~5MHz带宽内输出频率误差很小。但输出频率高于5MHz时输出波形就会出现很大失真,到10M以上时已经近似三角波。原因可能是滤波电路设计滤波性能存在偏差,导致轻微毛刺始终存在。 4.2实验总结 在确定了自己的开放实验题目以后,我翻阅和浏览了许多相关资料,对ad9850的功能、优点有了较多的了解,经过功能分析和可行性研究,制定了设计方案和计划。经过潜心钻研和指导老师的耐心指点,逐步完成了正弦信号输出模块、液晶显示模块、键盘输入模块等的电路设计和编程,并融合在一起,后期又不断进行改进。在完成之时,我感到收获颇丰,对STC单片机的体系结构、工作原理和编程原理有了更深的了解,达到了能初步应用的水平;熟悉了Keil C程序开发环境,已能够在Keil C集成开发环境下编写和调试各个系列单片机的模块和整体程序;熟练了PROTEL画图软件,熟悉了亿图专业流程图制作工具;在实际电路组装过程中,积累了一些经验,锻炼了动手能力。
致 谢 经过三个多月的学习和锻炼,本次开放实验基本完成并达到了预期目标。在这期间自己的自学能力、创新能力、实际动手能力、独立分析问题和解决问题的能力等都有了一个比较大的提高。在开放实验过程中不仅使自己以往所学理论知识得到巩固提高,而且在实际设计过程中获得了一些新的认识和想法,更为重要的是开拓了自己的眼界和思路,掌握了一些基本的科学研究步骤和方法,培养了自己的科学精神。 |