配色: 字号:
基于单片机的DDS函数信号发生器毕业论文
2014-04-25 | 阅:  转:  |  分享 
  




本科毕业论文设计



基于单片机的DDS函数信号发生器



题目:

专业名称:

学生姓名:

学生学号:

指导老师:

毕业时间:





【内关键词ABSTRACT

Placingsignageatsignalgeneratorisoftenusedasasignal,itcanproducevariouswaveform,suchastrianglewave,sawtoothwave,rectanglewave(includingsquarewave),sinewave,andthewaveamplitudeandfrequencyadjustable,itisbecausethesignalgeneratorcanproducevariouswaveformsignal,thereforeincircuitexperimentandtestequipmentinthefieldofproductionpracticeandscienceandtechnologyhasawiderangeofapplications.

Systemmainlyincludesfourparts,powersupply,singlechipmicrocomputerminimumsystem,DDSconversion,display.ThissystemmainlyUSESthe89c51andconstituteoftheDDSconverterAD9833functionsignalgenerator,canproducesquarewave,trianglewave,sinewave,canbecontrolledbytheprogramtochangethecycleofthewaveform,andcanimplementdifferentwaveformbypressingthebuttonswitch.Outputsignalamplitudeof0-2.5V,step1KHZfrequencyisadjustable,theactualsignalfrequencythroughthefourdigitaltubedisplay.Forcontroloutputsignalamplitude,mainistouseOP07amplifierforsignalamplification.ThroughtheOP07amplifiercanmagnifyDDSoutputsignalamplitude2times,soastoachievetheoutputwaveformamplitudechangesin0to5v.



Keywords:AD9833;89C52;converter;signalgenerator















ABSTRACT III

1绪论 1

1方案论证 1

1.1单片机选择与论证 1

1.2DDS选择与论证 2

1.3显示模块 2

1.4输入按键 3

1.5、电源模块的选取 4

2硬件电路设计 4

2.1硬件设计总体框图 5

2.2系统原理框图简介 5

2.3电源电路设计 5

2.4单片机最小系统设计 8

2.4.1单片机主控电路 9

2.4.2单片机最小系统组成 9

2.5DDS输出设计 10

2.5.1芯片简介 11

2.5.2TL431简介 12

2.5.3DDS信号发生器的组成 12

2.5.4DDS原理及应用 12

2.6信号幅值放大 13

2.6.1放大原理分析 13

2.7.1数码管显示分析 15

2.8按键电路 16

3软件设计 17

3.1软件设计总流程图 17

3.2波形输出软件设计 18

3.2.1DDS器软件设计 19

3.2.2方波产生软件设计 20

3.2.3三角波产生软件设计 20

3.2.4正弦波产生软件设计 21

3.3显示程序设计 22

3.4波形频率设定 23

4、系统调试与仿真 24

4.1方波仿真图 24

4.2正弦波仿真图 25

4.3三角波仿真图 26

5结语 26

致谢 27

1绪论

1.1课题研究背景

便携式和智能化越来越成为仪器的基本要求,对传统仪器的数字化,智能化,集成化也就明显得尤为重要。平时常用信号源产生正弦波,方波,三角波等常见波形作为待测系统的输入,测试系统的性能。单在某些场合,我们需要特殊波形对系统进行测试,这是传统的模拟信号发生器和数字信号发生器很难胜任的。新型数字信号发生器,利用单片机的强大功能,设计合适的人机交互界面,使用户能够通过手动的设定,设置所需波形[1]。

1.2研究内容及意义

本文是做基于单片机的信号发生器的设计,将采用编程的方法来实现三角波、方波、正弦波的发生。根据设计的要求,对各种波形的频率进行程序的编写,通过放大器来调幅,并将所写程序装入单片机的程序存储器中。在程序运行中,当接收到来自外界的命令,需要输出某种波形时再调用相应的中断服务子程序和波形发生程序,经电路的数/模转换器和运算放大器处理后,从信号发生器的输出端口输出。

1方案论证

1.1单片机选择与论证

一、单片机选择:

方案一:采用增强型51单片机,内部自带DA

方案二:采用MCS-51系列89C52单片机

方案论证:

我们在网上找了许多增强型的的单片机,内部自带AD及DA的,但是发现一般内部自带8位的AD及DA,但是一般频率达不到要求,考虑到频率的问题,我们放弃了方案一

方案二采用89C52单片机,89C52具有32个I/O口可以满足对I\O口的需求,同时该单片机价格便宜,并且我们对此单片机比较熟悉。

综合考虑,我们选择方案二。



1.2DDS选择与论证

DDS选择

方案一:采用我们熟悉的8位DA,DAC0832.

方案二:采用DDS,AD9833.

方案三:采用内部自带基准源的12位DAMAX531



方案论证:

方案一中选择DAC0832虽符合题目的要求,但是输出精度不高,误差大, 输出的波形不圆滑,与理想的正弦波相差大,所以我们放弃方案一。

方案二AD9833为DDS,输出的精度更高,同时也可通程序改进精度,其频率最高可达30M,所以该芯片适合。

方案三中MAX531内部自带2.048V基准源,输出精度高,但价格太贵,且频率达不到我们的要求,我们放弃方案三。

综上所述,我们选择方案二[2]。





图1AD9833引脚图

1.3显示模块

方案一、采用1602液晶屏作为显示模块

方案二、采用数码管作为显示模块



方案论证:方案一中1602可以显示2行英文字符和数字,电路连接简单,占用单片机I/0口少。缺点是显示字符小,不易看清,价格太高,程序编写复杂。







图2LCD1602实物图

方案二采用数码管至少要4位,则要占用12个I/O口,数码管显示时采用动态扫描功耗较低。显示清楚,易于辨认。程序编写简单,价格低。缺点是显示信息量较少,不能显示符号。



图34位数码管实物图

综合考虑,我们决定选取方案二。





1.4、电源模块的选取

方案一、采用开关电源模块

方案二、自己制作线性电源电路

方案论证:

方案一中采用开关电源可以提高整个电流源的效率,体积也会相应的减小,但是开关电源的纹波电压大,电源的纹波电流可能会过大,达不到输出精度的要求。

方案二中自己制作线性电源,线性电源具有纹波电压低的特点。电路中一共要输出两路电源,分别是+15V,+5V我们可以用常用的线性稳压器7815、7805得到稳压的电压输出。

综合上述考虑,我们选择方案二



2硬件电路设计

2.1硬件设计总体框图



图4硬件设计总体框图

2.2系统原理框图简介

本系统主要包括:电源,单片机最小系统,按键,数码管显示,DDS器,OP07运算放大器6个部分。系统采用5V供电,用户通过按键设定选择所要输出的波形,单片机控制DDS输出相关的波形,DDS输出的信号经过运算放大器放大信号幅值,然后输出,信号的频率通过数码管显示。输出的波形类型通过LED状态灯来显示。



2.3电源电路设计



图5电源电路

供电电路采用的是直流线性稳压器组成。一般直流稳压电源的组成如图2-3所示



图6直流稳压电源组成图



分析:

交流电经过变压器变压得到电压UAC,根据单相桥式整流电路的特性,我们可以计算出整流以后的电压UO[3]。

UO是整流电路的输出端电压瞬时值在一个周期内的平均值,即

Uo=(公式一)





图2-4整流波形图



根据上图中的波形可得

UO=(公式二)

二极管正向平均电流:

桥式整流电路两组整流二极管交替导通,由上较长的波形图可以看出,流过每个二极管的平均电流等于输出电流的一半。即

(公式三)

滤波电容和整流二极管的选择,在未加滤波电容之前,整流二极管有半个周期处于导通状态,二极管的导通角θ=。而接入滤波电容后,二极管只在电容器充电时才导通,导通角θ<。由于滤波后输出平均电流增大,而二极管的导通角反而减小,所以流过二极管的瞬时电流很大。这对管子的寿命极为不利。因此必须选用较大容量的整流二极管。通常应选择其电大平均整流电流IF大于负载电流IO的2-3倍[4]。

整流滤波后的直流电压UI接在输入端和公共端之间,在输出端可以获得稳定的输出电压UOUT,正常工作时,输入输出电压差为2-3V。

图2-2中,若7815输出的电压接7805,则7805两端的电压差为10V,若流过7805的电流过大,则7805上的功耗就会很大,发热量大时,若没有很好的散热措施,很容易将7805烧坏,所以必须加一个稳压块7809进行缓冲,这个7805两端的电压差变为4V,这样在7805上消耗的功率就会相应的变小,功率也会变小[5]。

图2-2中电解电容的作用是改善负载的瞬态响应,瓷片电容主要是抵消因为长线传输引起的电感效应;

用一片7815得到稳定电压+15V给集成运算放大器供电,7809输出的9V再经一片7805得到5V的输出,供给单片机和DDS等数字芯片。

供给功率管的电源采用另外一个供电电路,主要是为了防止数字电路与模拟大功率器件之前的相互干扰。

















图7PCB地线布线规则

同时在PCB走线时,将数字地和模拟地分开走线,最后通过一个0欧电阻连在一起。最大限度的减小相互之间的干扰。



2.4单片机最小系统设计

本系统主要采用AT89C52单片机,AT89C52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。使用Atmel公司高密度非易失性存储器技术制造,与工业80C52产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89C52为众多嵌入式控制应用系统提供高灵活、有效的解决方案[6]。

2.4.1单片机主控电路



图8单片机最小系统

图2-6中,LED1-LED4是输出波形状态指示灯,P0口接的是数码管的段,P2口低4位接数码管的位选,高三位接DDS器AD9833,SW1-SW6是接按键,X1,X2是单片机时钟电路,RST是单片机复位电路。



2.4.2单片机最小系统组成

单片机最小系统是指单片机能工作的最基本的系统,89C52单片机的最小系统主要包括以下几个部分:4V-5.5V的数字电源,时钟,复位,此外由于我们是从单片机内部存储器读取程序,所以单片机的EA引脚必须接为高电平。电源部分是通过7805三端稳压芯片得到5V电源。在单片机的电源端必须接一个瓷片电容,主要起退耦作用,以使单片机能稳定工作。时钟电路主要是提供单片机内部,产生单片机所必须的时钟频率,单片机的一切指令的执行都是建立在这个基础上的,晶振的提供的时钟频率越高,那单片机的运行速度也就越快。复位电路电容端一个高电平信号,,即RST端的高电平时间。另外,在复位期间,端口引脚处于随机状态,复位后,系统将端口置为全“l”态。如果系统在上电时得不到有效的复位,则程序计数器PC将得不到一个合适的初值,因此,CPU可能会从一个未被定义的位置开始执行程序



2.5DDS输出设计

DDS输出主要采用DDS控制芯片AD9833。AD9833是一款低功耗、可编程波形发生器,可以产生正弦波、三角波、方波。

输出频率和相位可软件编程,很容易调整,而不需要外部组件。频率寄存器是28位的,如果是25M的时钟源,经过编程可以得到0.1Hz的时钟;同样如果是1M的时钟源,可以得到0.004Hz的时钟。AD9833通过3线串口进行写操作。串口工作时钟频率高达40M,并与DSP和微处理器标准兼容。其工作电压在2.3V~5.5V之间。AD9833还具有休眠功能,可使没被使用的部分休眠,减少该部分的电流损耗,例如,若利用AD9833输出作为时钟源,就可以让DAC休眠,以减小功耗,该电路采用10引脚MSOP型表面贴片封装,体积很小。





图9AD9833引脚图



2.5.1芯片简介



AD9833是ADI公司生产的一款低功耗,可编程波形发生器,能够产生正弦波、三角波、方波输出。波形发生器广泛应用于各种测量、激励和时域响应领域,AD9833无需外接元件,输出频率和相位都可通过软件编程,易于调节,频率寄存器是28位的,主频时钟为25MHz时,精度为0.1Hz,主频时钟为1MHz时,精度可以0.004Hz[7]。

2.5.2DDS信号发生器的组成

AD9833是一块完全集成的DDS(DirectDigitalFrequencySynthesis)电路,仅需要1个外部参考时钟、1个低精度电阻器和一个解耦电容器就能产生高达12.5MHz的正弦波。除了产生射频信号外,该电路还广泛应外于各种调制解调方案。这些方案全都用在数字领域,采用DSP技术能够把复杂的调制解调算法简化,而且很精确[9]。



2.5.3DDS原理及应用

AD933的核心是28位的相位累加器,它由加法器和相位寄存器组成,每来1个时钟,相位寄存器以步长增加,相位寄存器的输出与相位控制字相加后输入到正弦查询表地址中。正弦查询表包含1个周期正弦波的数字幅度信息,每个地址对应正弦波中0°-360°范围内的1个相位点。查询表把输入的地址相位信息映射成正弦波幅度的数字量信号,去DAC输出模拟量,相位寄存器每经过228/M个MCLK时钟后回到初始状态,相应地正弦查询表经过一个循环回到初始位置,这样就输出了一个正弦波。输出正弦波频率为:fOUT=M(fMCLK/228)(1)其中,M为频率控制字,由外部编程给定,其范围为0≤M≤228-1。VDD引脚为AD9833的模拟部分和数字部分供电,供电电压为2.3V-5.5V。AD9833内部数字电路工作电压为2.5V,其板上的电压调节器可以从VDD产生2.5V稳定电压,注意:若VDD小于等于2.7V,引脚CAP/2.5V应直接连接至VDD。

图14数码管显示电路



2.6.1数码管显示分析

显示电路为四位数码管,用来显示实时波形的频率。通过数码管上的显示,我们可以清楚的知道当前波形的频率,以及工作的状态。并可以通过按键来调节实时的工作频率。在实际的单片机系统中,往往需要多位显示。动态显示应用非常广泛是一种最常见的多位显示方法,。

用数码管显示测得的数据,数码管有8段而每段必需占用一个单片机的IO口,所以一位数码管必须占个单片机IO口,本次设计采用4位数码管,则需要32个I/O口,而89C52单片机的I/O口只有32个。动态显示能够很好的解决数码管占用单片机IO口过多的问题。

所有数码管的段选全部连接在一起,如何能显示不同的内容呢?动态显示的原理是多位数码管,交替来进行显示,利用人的视觉暂留效果使人看到好像有多个数码管同时显示。

在编程时,要用单片机控制段选和位选,所谓的位选是选中其中一个数码管,然后利用单片机输出段码,需要显示的数字就能显示在这位数码管上了,延时一段时间后,再选中另一个数码管,再输出对应的段码,高速交替。

在动态显示程序中,各个位的延时时间长短是非常重要的,如果延时时间长,则会出现闪烁现象;如果延时时间太短,则会出现显示发暗且有重影。

静态驱动就是给单独每一个LED供电。这样每个LED都有足够的电流,亮度也相应的比较高。动态扫描驱动就是把本来供给一个LED灯的电流,同时分给了N个灯,所以它的亮度会有所降低。当然在同时供给两个led灯电流时不是平均的分配电流,而是led间扫描期间电流不断地交替,扫描的频率依据单片机的速度决定,也就是说各位的数码管上的电流在扫描频率内是供个其中一个led,在下一个扫描频率内是供给了另一个led[12]。若我们想让这个4位数码管的每段工作时的电流为8mA.Uled为正常工作时的电压取1.7V。所以我们选取100欧的限流电阻。这样每个LED工作时的电流约为8mA.在保证LED能亮的同时不会被烧坏。

2.7按键电路

图2-14为键盘接口电路的原理图,图中按键在未按下时,通过一个电阻接到高电平,当按下时,按键导通。连接单片机的IO口接地变成低电平。当单片机检测到按键变为低电平时,进行频率的切换。





图15按键电路

3软件设计

3.1软件设计总流程图



图16软件流程图

D9833有一个标准串行接口,可以与一些微处理器直接连接,用外部串行时钟来往自身写数据和控制信息,串行时钟频率最高可达40MHz,在写操作的过程中可能是连续的,也可能一直保持高电平或低电平。如果有数据/控制信息写入AD9833,FSYNC在16位信息写进AD9833的过程中一直保持低电平。FSYNC信号显示16位信息被写入AD9833。

3.2波形输出软件设计

当数据传输要到AD9833时,P3.3置低电平。80C51/80L518-bit字节形式传输数据,所以每次传输只需要SCLK下降沿。为把数据写入AD9833,第个8-bit数据传输完毕以后P3.3依然要保持低电平,接着初始化下一个字节的的写操作。结束后,P3.3被置高电平。在两次写操作的过程中,SCLK必须一直保80C51/80L51本来是以LSB在前的格式输出串行数据的。但是AD9833首先接受的是MSB(目标寄存器写时,首先4个MSB是控制信息,接下来4个是地址,8个LSB才是数据)。因此,80C51/80L51的传输例程必须考虑到这点,重新安排位序,让MSB先输出



3.2.1方波产生软件设计

frequency_fun(500000,0x4000);//设定reg0为500k

frequency_fun(100000,0x8000);//设定reg1为100k

write_ad9833_d16(0x2002);//调用reg0频率数据,输出三角波

display_data[3]=10;display_data[2]=5;display_data[1]=0;display_data[0]=0;

delay10s();

write_ad9833_d16(0x2802);//reg1

display_data[3]=10;display_data[2]=1;display_data[1]=0;display_data[0]=0;

delay10s();

frequency_fun(50000,0x4000);//50k,reg0

frequency_fun(20000,0x8000);//20k,reg1

write_ad9833_d16(0x2002);//reg0

display_data[3]=10;display_data[2]=10;display_data[1]=5;display_data[0]=0;

delay10s();

write_ad9833_d16(0x2802);//reg1

display_data[3]=10;display_data[2]=10;display_data[1]=2;display_data[0]=0;

delay10s();

frequency_fun(10000,0x4000);//10k,reg0

frequency_fun(5000,0x8000);//5k,reg1

write_ad9833_d16(0x2002);//reg0

display_data[3]=10;display_data[2]=10;display_data[1]=1;display_data[0]=0;

delay10s();

write_ad9833_d16(0x2802);//reg1

display_data[3]=10;display_data[2]=10;display_data[1]=10;display_data[0]=5;

delay10s();

frequency_fun(2000,0x4000);//2k,reg0

frequency_fun(1000,0x8000);//1k,reg1

write_ad9833_d16(0x2002);//reg0

display_data[3]=10;display_data[2]=10;display_data[1]=10;display_data[0]=2;

delay10s();

write_ad9833_d16(0x2802);//reg1

display_data[3]=10;display_data[2]=10;display_data[1]=10;display_data[0]=1;

delay10s();



//输出方波波形

frequency_fun(1000000,0x4000);//500k,reg0

frequency_fun(200000,0x8000);//100k,reg1

write_ad9833_d16(0x2020);//reg0

display_data[3]=10;display_data[2]=5;display_data[1]=0;display_data[0]=0;

delay10s();

write_ad9833_d16(0x2820);//reg1

display_data[3]=10;display_data[2]=1;display_data[1]=0;display_data[0]=0;

delay10s();

frequency_fun(100000,0x4000);//50k,reg0

frequency_fun(40000,0x8000);//20k,reg1

write_ad9833_d16(0x2020);//reg0

display_data[3]=10;display_data[2]=10;display_data[1]=5;display_data[0]=0;

delay10s();

write_ad9833_d16(0x2820);//reg1

display_data[3]=10;display_data[2]=10;display_data[1]=2;display_data[0]=0;

delay10s();

frequency_fun(20000,0x4000);//10k,reg0

frequency_fun(10000,0x8000);//5k,reg1

write_ad9833_d16(0x2020);//reg0

display_data[3]=10;display_data[2]=10;display_data[1]=1;display_data[0]=0;

delay10s();

write_ad9833_d16(0x2820);//reg1

display_data[3]=10;display_data[2]=10;display_data[1]=10;display_data[0]=5;

delay10s();

frequency_fun(4000,0x4000);//2k,reg0

frequency_fun(2000,0x8000);//1k,reg1

write_ad9833_d16(0x2020);//reg0

display_data[3]=10;display_data[2]=10;display_data[1]=10;display_data[0]=2;

delay10s();

write_ad9833_d16(0x2820);//reg1

display_data[3]=10;display_data[2]=10;display_data[1]=10;display_data[0]=1;

delay10s();

}

}t

图18方波

方波电平变化为0到最大幅值,所以让单片机控制DDS输出在最大与最小之间变化,这样不可以产生一个方波。

3.2.3三角波产生软件设计

voidsanjiao()

{

frequency_fun(500000,0x4000);//设定reg0为500k

frequency_fun(100000,0x8000);//设定reg1为100k

write_ad9833_d16(0x2002);//调用reg0频率数据,输出三角波

display_data[3]=10;display_data[2]=5;display_data[1]=0;display_data[0]=0;

delay10s();

write_ad9833_d16(0x2802);//reg1

display_data[3]=10;display_data[2]=1;display_data[1]=0;display_data[0]=0;

delay10s();

frequency_fun(50000,0x4000);//50k,reg0

frequency_fun(20000,0x8000);//20k,reg1

write_ad9833_d16(0x2002);//reg0

display_data[3]=10;display_data[2]=10;display_data[1]=5;display_data[0]=0;

delay10s();

write_ad9833_d16(0x2802);//reg1

display_data[3]=10;display_data[2]=10;display_data[1]=2;display_data[0]=0;

delay10s();

frequency_fun(10000,0x4000);//10k,reg0

frequency_fun(5000,0x8000);//5k,reg1

write_ad9833_d16(0x2002);//reg0

display_data[3]=10;display_data[2]=10;display_data[1]=1;display_data[0]=0;

delay10s();

write_ad9833_d16(0x2802);//reg1

display_data[3]=10;display_data[2]=10;display_data[1]=10;display_data[0]=5;

delay10s();

frequency_fun(2000,0x4000);//2k,reg0

frequency_fun(1000,0x8000);//1k,reg1

write_ad9833_d16(0x2002);//reg0

display_data[3]=10;display_data[2]=10;display_data[1]=10;display_data[0]=2;

delay10s();

write_ad9833_d16(0x2802);//reg1

display_data[3]=10;display_data[2]=10;display_data[1]=10;display_data[0]=1;

delay10s();AU

}



T



图19三角波

SINROM可以被旁路,从NCO来的截平的数字输出就可以送到DAC。这样输出就不再是正弦波,DAC会产生一个10-bit线性三角函数。要从VOUT管脚获得三角波输出,需要把MODE(D1)位置为1。要使用这个管脚,就要把SLEEP12都置为0。

3.2.4正弦波产生软件设计

voidvout_sin()//输出正弦波

{

//输出正弦波形

frequency_fun(500000,0x4000);//设定reg0为500k

frequency_fun(100000,0x8000);//设定reg1为100k

write_ad9833_d16(0x2000);//调用reg0频率数据,输出500k正弦波

display_data[3]=10;display_data[2]=5;display_data[1]=0;display_data[0]=0;//数码管显示500

delay10s();//延时10秒

write_ad9833_d16(0x2800);//调用reg1频率数据,输出100k正弦波

display_data[3]=10;display_data[2]=1;display_data[1]=0;display_data[0]=0;//

delay10s();//

frequency_fun(50000,0x4000);//50k,reg0

frequency_fun(20000,0x8000);//20k,reg1

write_ad9833_d16(0x2000);//reg0

display_data[3]=10;display_data[2]=10;display_data[1]=5;display_data[0]=0;/

delay10s();//

write_ad9833_d16(0x2800);//reg1

display_data[3]=10;display_data[2]=10;display_data[1]=2;display_data[0]=0;/

delay10s();//

frequency_fun(10000,0x4000);//10k,reg0

frequency_fun(5000,0x8000);//5k,reg1

write_ad9833_d16(0x2000);//reg0

display_data[3]=10;display_data[2]=10;display_data[1]=1;display_data[0]=0;/

delay10s();//

write_ad9833_d16(0x2800);//reg1

display_data[3]=10;display_data[2]=10;display_data[1]=10;display_data[0]=5

delay10s();//

frequency_fun(2000,0x4000);//2k,reg0

frequency_fun(1000,0x8000);//1k,reg1

write_ad9833_d16(0x2000);//reg0

display_data[3]=10;display_data[2]=10;display_data[1]=10;display_data[0]=2

delay10s();//

write_ad9833_d16(0x2800);//reg1

display_data[3]=10;display_data[2]=10;display_data[1]=10;display_data[0]=1;//

delay10s();//}





图20正弦波

INROM的用途是把频率和相位寄存器中的相位信息转换成在输出端产生正弦波的幅度信息。要从VOUT管脚获得正弦波输出,就要把MDOE(D1)位和OPBITEN(D5)位置为0[14]。



3.3显示程序设计

switch(state)

{ case0:

wei1=wei2=wei3=wei4=1;//关位选

seg=BCD[display_data[0]];//第一位数据码管显示数据

wei1=0;wei2=1;wei3=1;wei4=1;//打开第一位数码管

state=1;//进入下一状态

break;

//以下同理第一位数码管

case1:

wei1=wei2=wei3=wei4=1;

seg=BCD[display_data[1]];

wei1=1;wei2=0;wei3=1;wei4=1;

state=2;

break;



case2:

wei1=wei2=wei3=wei4=1;

seg=BCD[display_data[2]];

wei1=1;wei2=1;wei3=0;wei4=1;

state=3;

break;



case3:

wei1=wei2=wei3=wei4=1;

seg=BCD[display_data[3]];

wei1=1;wei2=1;wei3=1;wei4=0;

state=0;

break;

}

显示部分采用4位数码管,为动态显示原理,4位数交替显示。为了能让单片机更有效的执行显示程序,故把显示程序放入中断程序里面执行,这样可以在按键时避免因为按键的延时而让单片机不能执行显示程序,从而造成在按键时会出现数码管抖动的现象发生。

3.4波形频率设定

voidTimer0_isr(void)interrupt1using1

{



if(K1==0)

{scan3++;

if(scan3==10)scan3=9;

f1=scan310+scan2;

}

if(K2==0)

{scan3--;

if(scan3<0)scan3=0;

f1=scan310+scan2;

}

if(K5==0)

{scan2++;

if(scan2==10)scan2=9;

f1=scan310+scan2;

}

if(K6==0)

{scan2--;

if(scan2<0)scan2=0;

f1=scan310+scan2;

}

}

voidISR_Key(void)interrupt0using1

{//EX0=0;

if(K3==0)

wave++;

if(wave==5)wave=1;

}

4、系统调试与仿真

软件部分主要采用keil结合C语言来编写,上位机采用VB语言来编写。KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。

4.1方波仿真图































图20方波仿真图





4.2正弦波仿真图



图21正弦波仿真图

4.3三角波仿真图

图22三角波仿真图



5结语

Highprecisionprogrammablepowersupply[J]AustrianPatentOffice2011.6











附:



1.源程序



#include

#include

#definecount1000

sbitSCLK=P2^1;//定义端口

sbitDIN=P2^2;

sbitCS=P2^0;



unsignedinttemp;//中间变量

unsignedintf1,f2,f3,f4;

constseven_seg_point[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//有小数点的数码管显示

unsignedcharcounter[4]={0xef,0xdf,0xbf,0x7f};//定义位选



/定义按键/

sbitK1=P3^0; //方波

sbitK2=P3^1; //三角波

sbitK3=P3^2; //正弦波

sbitK4=P3^3; //锯齿波

sbitK5=P3^4; //频率加

sbitK6=P3^5; //频率减

//sbitK5=P1^6; //步进

//sbitK6=P1^7; //确认输出

unsignedintnum,wave=1;//中间变量

unsignedcharj=0;//j_片选,vout_电压输出

charscan1,scan2,scan3,scan4;

unsignedcharseven_seg[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};



/

TI10位DDSAD9833的驱动程序----------------------------------------------------

调用方式:voidAD9833(unsignedintDDS)

函数说明:TI10位DDSAD9833的驱动程序

--------------------------------------------------------------------------------

/

voidAD9833(unsignedintDDS)//DDS子函数

{

unsignedchari;

DDS<<=6;

CS=0;

SCLK=0;



for(i=0;i<12;i++)

{

DIN=(bit)(DDS&0x8000);

SCLK=1;

DDS<<=1;

SCLK=0;

}



CS=1;

SCLK=0;

for(i=0;i<12;i++);//12位数值转换成串行输给DDS芯片

}



voiddelay(intx)//延时

{

inti,j;

for(i=0;i
}

voidvout_sin()//输出正弦波

{

floatx,vout;//用于正弦波发生器

for(x=-3.1415;x<3.1415;x+=0.05)//正弦波发生器

{

vout=256(1+sin(x))/2; //输出值Vout必须大于0

temp=(unsignedint)vout;

AD9833(temp);

//delay(2);

delay(2);

}

P1=0xfe;

}



/三角波/

voidsanjiao()

{

unsignedinti;

for(i=0;i<256;i++)

{

temp=i;

AD9833(temp);

}

for(i=256;i>0;i--)

{

temp=i;

AD9833(temp);

}

P1=0xfb;

}



/锯齿波/

voidjuchi()

{

temp++;

if(temp==256)temp=0;

AD9833(temp);

delay(f1);

P1=0xfd;

}

/方波/

voidfangbo()

{

AD9833(256);

delay(f1);

AD9833(0);

delay(f1);

P1=0xf7;



}



voidTimer1_ISR(void)interrupt3using1

{

unsignedcharj;

EA=0;//禁止全局中断

TR1=0;

P2=counter[j]&0xf0;

//delay(2);

switch(j)

{case0:P0=0xff;delay(2);P0=seven_seg[scan1];break;

case1:P0=0xff;delay(2);P0=seven_seg[scan2];break;

case2:P0=0xff;delay(2);P0=seven_seg[scan3];break;

case3:P0=0xff;delay(2);P0=seven_seg[scan4];break;

default:break; //j为其他情况是跳出循环

}

j++;

if(j==4)j=0;

TH1=0xEC;//定时5ms

TL1=0x78;

EA=1;

TR1=1;

}



voidInit_Timer0(void)

{

TMOD|=0x01;

TH0=(65536-25000)/256; //Initvalue//

TL0=(65536-25000)%256;

TH1=0xEC;//定时5ms

TL1=0x78;

EA=1;

ET1=1;

TR1=1;//interuptenable//

ET0=1;//enabletimer0interrupt//

TR0=1;

EX0=1;//外部中断0开

IT0=1;//边沿触发

}



main()

{

f1=f2=f3=f4=0;

Init_Timer0();

while(1)

{

switch(wave)

{

case1:vout_sin();break;

case2:juchi();break;

case3:sanjiao();break;

case4:fangbo();;break;

}

}

}

voidTimer0_isr(void)interrupt1using1

{



if(K1==0)

{scan3++;

if(scan3==10)scan3=9;

f1=scan310+scan2;

}

if(K2==0)

{scan3--;

if(scan3<0)scan3=0;

f1=scan310+scan2;

}

if(K5==0)

{scan2++;

if(scan2==10)scan2=9;

f1=scan310+scan2;

}

if(K6==0)

{scan2--;

if(scan2<0)scan2=0;

f1=scan310+scan2;

}

}

voidISR_Key(void)interrupt0using1

{//EX0=0;

if(K3==0)

wave++;

if(wave==5)wave=1;

}

广西师范大学2011届本科生毕业论文(设计)















广西师范大学2011届本科生毕业论文(设计)

























数字线路接地



模拟线路接地





III



18







献花(0)
+1
(本文系毕业论文大...首藏)