分享

基于0832正弦波发生器

 共同成长888 2015-03-29

基于0832正弦波发生器

基于0832正弦波发生器

一、设计题目

单片机的D/A 接口应用:用0832单片机控制生成正弦波,频率和幅值可调。

二、设计目的

设计目的:

1.了解单片微机系统中实现D/A(数字/模拟)转换的原理及方法;

2.详细了解D/A转换芯片0832的性能及编程方法;

3.了解单片机系统中扩展D/A转换的基本原理,了解单片机如何进行数据采集;

4.掌握DAC0832,AT89C51输入/输出接口电路设计方法;

5.掌握DAC0832转换实现的程序控制方法;

6.掌握单片机汇编编程技术中的设计和分析方法;

7.学会使用并熟练掌握电路绘制软件Protel99SE(或DXP);

8.掌握电路图绘制及PCB图布线技巧。

设计要求:

1、在系统掌握单片机相应基础知识的前提下,熟悉单片机最小应用系统的设计方法及系统设计的基本步骤。

2、完成所需单片机最小应用系统原理图设计绘制的基础上完成系统的电路图设计。

3、完成系统所需的硬件设计制作,在提高实际动手能力的基础上进一步巩固所学知识。

4、进行题目要求功能基础上的软件程序编程,会用相应软件进行程序调试和测试工作。

5、用AT89C51,DAC0832设计出题目所要求的正弦波实现频率和幅值可调输出,并针对实际设计过程中软、硬件设计方面出现的问题提出相应解决办法。

6、通过单片机应用系统的设计将所学的知识融会贯通,锻炼独立设计、制作和调试单片机应用系统的能力;领会单片机应用系统的软、硬件调试方法和系统的研制开发过程,为进一步的科研实践活动打下坚实的基础。

三、系统硬件图 3.1系统的硬件电路原理图

系统的硬件电路图如图1所示,从图中可以看到该电路主要有时钟电路、复位电路、D/A转换电路和运算放大电路等组成。电源电路有设备提供,在原理图上不再说明,本文简单介绍电源电路的组成原理。

图1 系统硬件电路原理图

3.2 最小系统原理图

1 8051单片机:

图2 8051引脚图

2 时钟电路

该电路主要有电容C1、C2和晶振Y1组成。其组成原理图如图3所示,图中XTAL1为芯片内部振荡电路的输入端,XTAL2为芯片内部振荡电路的输出端。

图3 时钟电路

3 复位电路

单片机通常采用的复位方式有上电复位和按钮复位两种。本次设计用的复位方式是按钮电平复位。其原理图如图4所示。当按下按钮SW时,电容对R6迅速放电,RESET端变为高电平,RESET松开后,电容通过电阻R6进行充电,RESET端恢复为低电平。

图4 复位电路

3.3 电压放大电路

电压放大电路主要有LM358组成,LM358内部包括有两个独立的、高增益、内部频率补偿的双运算放大器,适合于电源电压范围很宽的单电源使用,也适合用于双电源工作模式。电压放大电路组成如图5所示。

图5 电压放大电路

四、程序流程图

本设计程序流程图如下:

子程序流程图:

图6 程序流程图

五、系统说明与分析 5.1设计步骤

1. 理解设计任务要求(通过阅读有关资料及调查研究);

2. 对总体方案进行分析、论证;

3. 系统硬件电路的设计;

4. 系统控制软件的设计;

1)  以功能明确、相互界面能清晰分割的软件程序为基础,确定主程序流程框图;

2)  以主程序流程框图为基础,确定各模块程序算法及实现的功能,进一步确定各模块程序流程框图;

3)  根据软件流程框图,用AT89C51汇编语言编写主程序和延时子程序;

4)  系统软、硬件的调试;

5)  编写课程设计说明书;

6)  答辩验收。

5.2 D/A转换器与MCS-51单片机接口

模数转换器(D/A)就是一种把数字信号转换成为模拟电信号的器件。D/A转换是单片机应用测控系统典型的接口技术内容,D/A转换接口设计的主要任务是选择D/A集成芯片,配置外围电路及器件,实现数字量到模拟量的线性转换。

一 D/A转换器的基本原理与分类

D/A转换器用来将数字量转换成模拟量。它的基本要求是输出电压VO应该和输入数字量成正比,即:VO=D*VR 其中, VR为参考电压。

每一个数字量都是数字代码的按位组合,每一位数字代码都有一定的“权”,对应一定大小的模拟量。为了将数字量转换成模拟量,应该将其每一位都转换成相应的模拟量,然后求和既可得到与数字量成正比的模拟量。


D/A转换器可分成两大类:1.直接D/A转换器是指直接将输入的数字信号转换为输出的模拟信号。2.间接D/A转换器是先将输入的数字信号转换为某种中间量,然后再把这种中间量转换成为输出的模拟信号。其中,间接D/A转换方式在集成D/A转换器中很少使用。

二 D/A的转换器的主要指标

1.分辨率

这里指最小输出电压(对应的输入数字量只有最低有效位为“1”)与最大输出电压(对应的数字输出信号所有有效位全为“1”)之比,例如对于10位D/A转换器,其分辨率为:0.0001。分辨率越高,转换时,对应数字输入信号最低位的模拟信号电压数值越小,也就越灵敏,有时,也用数字输入信号的有效位数来给出分辨率。例如,单片集成D/A转换器AD7541的分辨率为12位,单片集成D/A转换器DAC0832的分辨率为8位等。

2.线性度

通常用非线性误差的大小表示D/A转换器的线性度。并且,把理想的输入/输出特性的偏差与满刻度输出之比的百分数,定义为非线性误差。例如,单片集成D/A转换器AD7541的线性度(非线性误差)为小于等于0.02%FSR(FSR为满刻度的英文缩写)。

3.转换精度

转换精度以最大的静态转换误差的形式给出。这个转换误差应该是非线性误差、比例系数误差以及漂移误差等综合误差。但是有的产品说明中,只是分别给出各项误差,而不给出综合误差。精度和分辨率是两个不同的概念。精度是指转换后所得的实际值对于理想值的接近程度,而分辨率是指能够对转换结果以后影响的最小输入量,对于分辨率很高的D/A转换器并不一定具有很高的精度

4.建立时间

对于一个理想的D/A转换器,其数字输入信号从一个二进制数变到另一个二进制数时,其输出模拟信号电压,应立即从原来的输出电压跳到与新的数字信号相对应的新的输出电压。但是在实际的D/A转换器中,电路中的电容、电感和开关电路会引起电路时间延迟。所谓建立时间,系指数模拟转换器中的输入代码有满度值的变化时,其输出模拟信号电压(或模拟信号电流)达到满刻度值的1/2LSB(或满刻度值差百分之多少)时所需的时间。

5.3 D/A转换器选择要点及辅助电路

选择D/A转换芯片时,主要考虑芯片的性能、结构及应用特性。在性能上必须满足D/A转换的要求;在结构和应用特性上应满足接口方便、外围电路简单、价格低廉等要求。

一、D/A转换器的选择要点

1. D/A转换芯片主要性能指标的选择

在D/A接口设计的实际应用中,在选择时主要考虑的是用位数(8位、12位)表示的转换精度和转换时间。

2. D/A转换芯片的主要结构特性与应用特性选择

D/A转换器的特性虽然主要表现为芯片内部结构的配置状况,但这些配置状况对D/A转换接口电路设计带来很大影响,主要有:

1)数字输入特性  数字输入特性包括接收数的码制、数据格式以及逻辑电平等。目前批量生产的D/A转换芯片一般都只能接收自然二进制数字代码。

2)数字输出特性  目前多数D/A转换器件均属电流输出器件,手册上通常给出的输入参考电压及参考电阻之下的满码(全l)输出电流I0。另外还给出最大输出短路电流以及输出电压允许范围。

3)锁存特性及转换控制  D/A转换器对数字量输出是否具有锁存功能将直接影响与CPU的接口设计。如果D/A转换器没有输入锁存器,通过CPU数据总线传送数字量时,必须外加锁存器,否则只能通过具有输出锁存功能的I/O给D/A送入数字量。

 4)参考源  D/A转换中,参考电压源是唯一影响输出结果的模拟参量,是D/A转换接口中的重要电路,对接口电路的工作性能、电路的结构有很大影响使用内部带有低漂移精密参考电压源的D/A转换器不仅能保证有较好的转换精度,而且可以简化接口电路。

3. D/A转换器模拟输出电压的极性

所有的D/A转换器件的输出模拟电压Vo,都可以表达成为输入数字量D(数字代码)和模拟参考电压VR的乘积。由于目前绝大多数D/A输出的模拟量均为电流量,这个电流量要通过一个反相输入的运算放大器才能转换成模拟电压输出。在这种情况下,模拟输出电压Vo与输入数字量D和参考电压VR的关系为:


当参考电压VR极性不变时,要想得到双极性的模拟输出,就必须采取四象限工作的D/A接口电路,该接口电路输出的模拟电压V0为:

不论参考电压VR的极性如何,都可以获得双极性的电压输出,在参考电压极性不变时,输出模拟电压的极性完全取决于输入数字量二进制码的最高位(MSB)。

5.4典型的D/A转换器芯片DAC0832性能介绍

DAC0830/0831/0832是8位分辩率的D/A转换集成芯片,与微处理器完全兼容。

这个系列的芯片以其价格低廉、接口简单、转换控制容易等优点,在单片机应用系统中得到了广泛的应用 这类D/A转换器由8位输入锁存器、8位DAC寄存器、八位D/A转换电路及转换控制电路构成 。

DAC0832的应用特性与引脚功能

DAC0830系列芯片是一种具有两个输入数据寄存器的8位DAC,是一个8位D/A转换器芯片,单电源供电,从+5V~+15V均可正常工作。

其主体部分为由T型状态。而模拟开关控制标准电源在T型电阻网络所产生的电流。输入的数字量通过两级缓冲器送到 D/A 转换电路。通过对这两级缓冲器进行控制,可以实现直通、单缓冲、双缓冲三种工作方式。

如果控制信号使得两级缓冲器一直处于选通状态,则 DAC0832 工作在直通方式;当输入寄存器、 DAC 寄存器中有一个直接选通,另一个受控制,则它工作在单缓冲方式;当输入寄存器、DAC 寄存器都受控制时,它工作在双缓冲方式。DAC0832属于电流型输出的 D/A 转换器。这些电流经外部运算放大器实现 I-V 变换输出模拟电压。模拟电压根据不同的外接电路又可分为单极性和双极性。

DAC0832是8位芯片,采用CMOS工艺和R-2RT形电阻解码网络, 转换结果为一对差动电流 I01和 I02输出,其主要性能参数为:

·分辨率: 8位

·单电源供电:+5V-+15V

·参考电压:-10V—+10V 

·转换时间:1us

·满刻度误差;士1LSB   

·数据输入电平与TTL电平兼容

·电流稳定时间1us;

·可单缓冲、双缓冲或直接数字输入;

·只需在满量程下调整其线性度;

·低功耗,200mW。

1)DAC0832内部结构和引脚

DAC0832的内部结构如图7所示:

图7 DAC0832的内部结构图

DAC0832引脚如图8所示,它采用20线双列直插式封装,引脚功能如下:

(1)D7~D0——转换数据输入。

(2)CS——片选信号(输入),低电平有效。

(3)ILE——数据锁存允许信号(输入),高电平有效。

(4)WR1——第一信号(输入),低电平有效。该信号与ILE 信号共同控制输入寄存器是数据直通方式还是数据锁存方式:当ILE=1和XFER=0时,为输入寄存器直通方式;当ILE=1和WR1 =1时,为输入寄存器锁存方式。

 (5) WR2 ——第2写信号(输入),低电平有效.该信号与信号合在一起控制DAC寄存器是数据直通方式还是数据锁存方式:当 WR2=0和XFER=0时,为      DAC寄存器直通方式; 当WR2=1和XFER=0时,为DAC寄存器锁存方式。                                    图8 0832引脚图

(6)XFER——数据传送控制信号(输入),低电平有效。

 (7)Iout2——电流输出“1”。当数据为全“1”时,输出电流最大;为全“0”时输出电流最小。

(8)Iout2——电流输出“2”。DAC转换器的特性之一是:Iout1 +Iout2=常数。

(9)RFB——反馈电阻端

即运算放大器的反馈电阻端,电阻(15KΩ)已固化在芯片中。因为DAC0832是电流输出型D/A转换器,为得到电压的转换输出,使用时需在两个电流输出端接运算放大器,RFB即为运算放大器的反馈电阻。

(10)Vref——基准电压,是外加高精度电压源,与芯片内的电阻网络相连接,该电压可正可负,范围为-10V~+10V。

(11)DGND——数字地

(12)AGND——模拟地

2)DAC0832工作方式          

DAC0832利用WR1 、 WR2 、ILE、XFER 控制信号可以构成三种不同的工作方式。

(1) 直通方式——WR1= WR2 =0时,数据可以从输入端经两个寄存器直接进入D/A转换器。

(2)单缓冲方式——两个寄存器之一始终处于直通,即WR1=0或WR2=0,另一个寄存器处于受控状态。

(3)双缓冲方式——两个寄存器均处于受控状态。这种  工作方式适合于多模拟信号同时输出的应用场合。

其中, 所谓单缓冲方式就是使DAC0832的两个输入寄存器中有一个(多位DAC寄存器)处于直通方式,而另一个处于受控锁存方式。

单缓冲方式连接如图9所示:

   

图9 单缓冲方式连接图

为使DAC寄存器处于直通方式,应使WR2 =0和XFER=0。为此可把这两个信号固定接地,或如电路中把WR2与WR1相连,把XFER与CS相连。为使输入寄存器处于受控锁存方式,应把WR1接80C51的WR,ILE接高电平。此外还应把CS接高位地址线或地址译码输出,以便于对输入寄存器进行选择。

在多路D/A转换的情况下,若要求同步转换输出,必须采用双缓冲方式。DAC0832采用双缓冲方式时,数字量的输入锁存和D/A转换输出是分两步进行的。

第一,CPU分时向各路D/A转换器输入要转换数字量并锁存在各自输入寄存器中。

第二,CPU对所有的D/A转换器发出控制信号,使各路输入寄存器中的数据进入DAC寄存器,实现同步转换输出。如下图10为两片DAC0832与8031的双缓冲方式连接电路,能实现两路同步输出。 DAC0832转换器输出可以分电流输出和电压输出两种形式,通常均需通过运算放大器进变换。按电压输出时,还可分单极性和双极性两种形式

5.5  8051单片机简要介绍

8051单片机包含中央处理器(CPU)、存储器(程序存储器ROM和数据存储器RAM)、定时/计数器、并行I/O接口(P1、P2、P3、P0共4个8位口)、一个双工串行接口和5个中断源等几大单元及数据总线、地址总线和控制总线三大总线等结构组成。8051与DAC0832的双缓冲方式接口电路如图10所示。DAC0832的电压输出方式如图11所示

              

图10 8051与DAC0832的双缓冲方式接口电路

图10 DAC0832的电压输出方式  
    MCS-51系列单片机中的8031、8051及8751均采用40Pin封装的双列直接DIP结构,右图是它们的引脚配置,40个引脚中,正电源和地线两根,外置石英振荡器的时钟线两根,4组8位共32个I/O口,中断口线与P3口线复用。现在我们对这些引脚的功能加

以说明:

MCS-51系列单片机的内部结构示意图如图12所示。

图12 MCS-51系列单片机的内部结构示意图

· Pin20: 接地脚。 

· Pin40: 正电源脚,正常工作或对片内EPROM烧入程序时,接+5V电源。 

· Pin19: 时钟XTAL1脚,片内振荡电路的输入端。 

· Pin18: 时钟XTAL2脚,片内振荡电路的输出端。 

8051的时钟有两种方式,一种是片内时钟振荡方式,但需在18和19脚外接石英晶体(2-12MHz)和振荡电容,振荡电容的值一般取10p-30p。另外一种是外部时钟方式,即将XTAL1接地,外部时钟信号从XTAL2脚输入。  

· 输入输出(I/O)引脚:

Pin39-Pin32为P0.0-P0.7输入输出脚,Pin1-Pin1为P1.0-P1.7输入输出脚,Pin21-Pin28为P2.0-P2.7输入输出脚,Pin10-Pin17为P3.0-P3.7输入输出脚。

· Pin9: RESET/V pd 复位信号复用脚。当8051通电,时钟电路开始工作,在RESET引脚上出现24个时钟周期以上的高电平,系统即初始复位。初始化后,程序计数器PC指向0000H,P0-P3输出口全部为高电平,堆栈指针写入07H,其它专用寄存器被清“0”。RESET由高电平下降为低电平后,系统即从0000H地址开始执行程序。然而,初始复位不改变RAM(包括工作寄存器R0-R7)的状态。

· Pin30: ALE/ 当访问外部程序器时,ALE(地址锁存)的输出用于锁存地址的低位字节。而访问内部程序存储器时,ALE端将有一个1/6时钟频率的正脉冲信号,这个信号可以用于识别单片机是否工作,也可以当作一个时钟向外输出。更有一个特点,当访问外部程序存储器,ALE会跳过一个脉冲。 

如果单片机是EPROM,在编程其间, 将用于输入编程脉冲。 

· Pin29: 当访问外部程序存储器时,此脚输出负脉冲选通信号,PC的16位地址数据将出现在P0和P2口上,外部程序存储器则把指令数据放到P0口上,由CPU读入并执行。

· Pin31: EA/V pp 程序存储器的内外部选通线,8051和8751单片机,内置有4kB的程序存储器,当EA为高电平并且程序地址小于4kB时,读取内部程序存储器指令数据,而超过4kB地址则读取外部指令数据。如EA为低电平,则不管地址大小,一律读取外部程序存储器指令。显然,对内部无程序存储器的8031,EA端必须接地。  
    ·在对8751的EPROM进行编程时,EA/Vpp 脚还需加上用于编程的电压。

5.6数码显示部分

八段LED数码管由8个发光二极管组成。基中7个长条形的发光管排列成“日”字形,另一个圆点形的发光管在显示器的右下角作为显示小数点用,它能显示各种数字及部份英文字母。LED数码管有两种不同的形式:一种是8个发光二极管的阳极都连在一起的,称之为共阳极LED数码管;另一种是8个发光二极管的阴极都连在一起的,称之为共阴极LED数码管。

四位八段数码管的引脚结构如下图13所示:

图13 四位八段数码管的引脚结构

其中S1,S2,S3,S4为字位选择端口,A,B,C,D,E,F,G,DP为字形选择端口。

在单片机应用系统中,数码管显示常用两种方法:静态显示和动态扫描显示。所谓静态显示,就是每一个显示器都要占用单独的具有锁存功能的I/O接口用于笔划段字形代码。这样单片机只要把要显示的字形代码发送到接口电路,就不用管它了,直到要显示新的数据时,再发送新的字形码。

动态扫描显示接口是单片机中应用最为广泛的一种显示方式之一。其接口电路是把所有显示器的8个笔划段A-H同名端连在一起,而每一个显示器的公共极COM是各自独立地受I/O线控制。CPU向字段输出口送出字形码时,所有显示器接收到相同的字形码,但究竟那个显示器亮,则取决于COM端,而这一端是由I/O控制的,所以就可以自行决定何时显示哪一位了。所谓动态扫描就是指我们采用分时的方法,轮流控制各个显示器的COM端,使各个显示器轮流点亮。在轮流点亮扫描过程中,每位显示器的点亮时间是极为短暂的(约1ms),尽管实际上各位显示器并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。

六、源程序

1、主程序

/*******************************************************

 //DAC0832波形控制试验

 //功能:根据按键控制输出频率和幅值可调的正弦波

*******************************************************/

#include <reg52.h>

#include <math.h>

#include <intrins.h>

#include "key.c"

#define  PI 3.14

#define  DataNum 256    //定义一个周期的点数

//#define  DAC0832 XBYTE[0x7fff] //定义端口地址

sbit WRI=P3^6;           //定义写信号的IO口

sbit CS=P2^7;           //定义片选信号的IO口

//数码管显示的编码

u_char code number_code[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xc1,0X8e};

//显示共阳极的0~9,全灭,U,F

/********延时***************/

void delay_us(u_int time)

{

 do

 {

  time--;

 } 

 while (time>1);

}    

//毫秒级延时程序 

void delay_ms(u_int time)

{

 while(time!=0)

 {

  delay_us(1000);

  time--;

  }

}

//外部中断0的服务程序

void int0_sever(void)  interrupt 0 using 1

{

 u_char i;

 g_keys=1;

 view_state();

 INT0=1;

 do

 {

 i=INT0;

 }

 while(~i); //等待P32恢复

}

//外部中断1的服务程序

void int1_sever(void)  interrupt 2 using 1

{

 u_char i;

 g_keys=2;

 view_state();

 INT1=1;

 do

 {

 i=INT1;

 }

 while(~i); //等待P33恢复

}

//演示数码管显示数字=定时器1的中断服务

/******************************************/

void time1_sever(void)  interrupt 1 using 2

{  

    u_char buffer[4],i;

    TR0 = 0;

    buffer[3]=number_code[qian];

    buffer[2]=number_code[bai];

    buffer[1]=number_code[shi];

    buffer[0]=number_code[ge];

    P1=0xff;

    P2|=0x0f; 

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

    {

     switch (i)

     {

      case 0: P1=buffer[0];P2&=0xfe;

              delay_ms(1);P2|=0x0f; break;

      case 1: P1=buffer[1];P2&=0xfd;

              delay_ms(1);P2|=0x0f; break;

      case 2: P1=buffer[2];P2&=0xfb;

              delay_ms(1);P2|=0x0f; break;

          case 3: P1=buffer[3];P2&=0xf7;

              delay_ms(1);P2|=0x0f; break;

      default: break;

     }

    }

 TH0 =0xd8;      //预置计数0初值

 TL0 =0xf0;

 TR0 =1;

}

//实现DA转换

void DAConvert(u_char Data)

{

  //EA = 0;

  CS=1;

  WRI=1;

  delay_us(2);

  CS=0;

  WRI=0;

  P0=Data;

  CS=1;

  WRI=1;

  EA = 1;

}

//正弦波数据计算

//入口:X为转换的量,MAX为幅值控制

u_int GetSinData(u_char x)

{

  u_int SinData;

  SinData=((sin(2*PI*x/DataNum)+1)/2.0)*255;

  SinData=SinData*g_max/16;   //MAX为1至16

  return SinData;

}

/**************************************/

//系统上电初始化

/**************************************/

void system_init(void)

{

    TMOD = 0x11;    // T/C0 T/C1方式 0 定时

    TH0  = 0xd8;    //预置计数0初值

    TL0  = 0xf0;

    TR0  = 1;       //开启T0计数

    IE   = 0x87;    //定时器0,外部中断0,1,CPU开中断

    IT1=1;

    IT0=1;          //选择INT0为电平触发方式

    g_state=0;

    g_keys=0;

    qian=0;

    bai=0;

    shi=0;

    ge=1;

    g_max=16;

    g_fre=10;

}

//主程序

main()

{

 u_char i=0;

 system_init();                     //系统初始化

 while (1)

 {

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

   {

    DAConvert( GetSinData(i));

    delay_us(g_fre*10);  //控制正弦波每个点的输出时间以产生一定的频率

   }

 }

}

2、按键子程序

/**************************************************  

文件名:key.c

功能描述:读取键值,并根据当前的状态执行相关的模块子程序            

适用类型:AT89S系列

设计者:刘毅

//K1=正弦波菜单键

//K2=参数修改键

//键盘接口是p3.2和p3.3

***************************************************/

#define  u_int unsigned int

#define  u_char unsigned char

//定义全局变量

u_char g_max,g_keys,g_state,g_fre;

// g_max表示幅值参数,g_keys键值,g_state系统状态,g_fre频率参数       

u_char qian,bai,shi,ge;   //数码管显示位缓存

//格式:键码+次态+执行模块

u_int code fun_zero[] ={1,1,0, 0}; //状态0:显示当前的波形代码

u_int code fun_one[]  ={1,2,2, 2,1,3, 0}; //状态1:显示正弦波幅值代码

u_int code fun_two[]  ={1,0,4, 2,2,3, 0}; //状态2:显示正弦波频率代码

/***********************************************/

//功能:进入正弦波幅值的设定

void into_scop(void)

{

 qian=11;

 bai=10;

 shi=g_max/10;

 ge=g_max%10; //LED显示U_**

}

//功能:进入正弦波频率的设定

void into_fre(void)

{

 qian=12;

 bai=10;

 shi=g_fre/10;

 ge=g_fre%10; //LED显示F_**

}

//功能:参数值的递增循环输入

void in_Parameter(void)

{

 if(g_state==1)

 {

  g_max++;

  if(g_max>16)

  g_max=1;

  shi=g_max/10;

  ge=g_max%10;

 }

 else if(g_state==2)

 {

  g_fre++;

  if(g_fre>10)

  g_fre=1;

  shi=g_fre/10;

  ge=g_fre%10;

 }

}

//功能:退出设置

void save_fre(void)

{

 qian=10;

 bai=10;

 shi=10;

 ge=2;    //显示输出正弦波的代号

}

/*******************************************

功能:根据获得的键值和当前的状态来确定下一步执行模块的次态

出口:无.

入口:无.

*******************************************/

void view_state(void)

{

  u_char i;

  u_int *p, x;

   switch (g_state)

   {

    case 0: p=&fun_zero[0];break;

    case 1: p=&fun_one[0]; break;

       case 2: p=&fun_two[0];break;

       default: break;

       }

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

  { if (g_keys==*p)     //表中的是不是和读取的键码一致.

   {

    ++p;g_state=*p;   //存放读取的状态.

       ++p;x=*p;       //附读取的执行模块的代码.

       switch (x)

    {

        case 0: into_scop();     i=3; break;   //进入正弦波幅值的设定,LED显示U_01

        case 2: into_fre();      i=3; break;   //进入正弦波频率的设定,LED显示F_01

        case 3: in_Parameter();  i=3; break;   //参数值的递增循环输入

        case 4: save_fre();      i=3; break;   //返回

     default: break;                                                                    

    }

   }

     else { if (0==*p)i=3;}

       p=p+3;

  }

}

/********************************************

入口:N

功能:延时子程序,实现(16*N+24)us的延时

系统采用11.0592MHz的时钟时,延时满足要求,其它情况需要改动

*********************************************/

void delay(u_int N) 

  {

  u_int i;

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

  }

七、总结

1、在设计系统过程中,学会用Protel DXP画原理图和PCB图。通过查阅相关的书籍,设计了电路原理图,经过仿真和反复的修改电路中元器件的参数得到了可行的电路图。

2、自己动手制作电路板,提高动手能力。在制作电路板的过程中,针对遇到的问题,查阅相关资料,咨询老师同学,寻找解决办法。

3、调试程序过程中,针对遇到的问题,寻找解决方法,同时学会利用C语言编制单片机程序。

4、经过学习单片机接口实验这门课,使自己对单片机有了更深入的了解,提高了自己的动手能力。很感谢在整个课程学习中老师和师兄们的指导,以及同班同学的热心帮助。

八、参考文献

[1] 胡汉才.单片机原理及其接口技术[M].北京:清华大学出版社,1996.

[2] 江太辉.MCS-51系列单片机原理与应用[M].广州:华南理工大学出版社,2002.

[3] 韩 雁.单片机原理及应用教程[M].北京:电子工业出版社,2003.

[4] 何立民.单片机应用系统设计系统配置与接口技术.北京:北京航空航天大学出版社,1999.

[5] 莫 力. Protel电路设计.北京:国防工业出版社,2005.

[6] 肖玲妮,袁增贵.Protel99SE.北京:清华大学出版社,2003.

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多