基于单片机和dac0832的波形发生器.docx

上传人:b****5 文档编号:6203025 上传时间:2023-01-04 格式:DOCX 页数:8 大小:211.59KB
下载 相关 举报
基于单片机和dac0832的波形发生器.docx_第1页
第1页 / 共8页
基于单片机和dac0832的波形发生器.docx_第2页
第2页 / 共8页
基于单片机和dac0832的波形发生器.docx_第3页
第3页 / 共8页
基于单片机和dac0832的波形发生器.docx_第4页
第4页 / 共8页
基于单片机和dac0832的波形发生器.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

基于单片机和dac0832的波形发生器.docx

《基于单片机和dac0832的波形发生器.docx》由会员分享,可在线阅读,更多相关《基于单片机和dac0832的波形发生器.docx(8页珍藏版)》请在冰豆网上搜索。

基于单片机和dac0832的波形发生器.docx

基于单片机和dac0832的波形发生器

基于单片机和dac0832的波形发生器

目录

一、内容摘要

二、设计任务

三、元器件说明

四、硬件电路设计

五、程序编译

 

一、内容摘要

波形发生器是一种常用的信号源,广泛的应用于电子电路、自动控制系统和教学实验等领域,是现代测试领域内应用最为广泛的通用仪器之一。

在研制、生产、测试和维修各种电子元件、部件以及整机设备时,都需要有信号源。

由它产生不同频率不同波形的电压、电流信号并加到被测器件或设备上,用其他仪器观察。

测量被测仪器的输出响应,以分析确定它们的性能参数。

信号发生器是电子测量领域中最基本、应用最为广泛的一类电子仪器。

它可以产生多种波形信号,如方波、锯齿波、三角波等,因而广泛应用于通信、雷达、导航、宇航等领域。

本次课程设计使用的AT89C51单片机构成的发生器可产生三角波,正弦波和方波,波形的周期可用程序改变,并可根据需要选择单极性输出或双极性输出,具有线路简单、结构紧凑、性能优越等特点。

此设计给出了源代码,通过仿真测试,其性能指标达到了设计要求。

二、设计任务

利用DAC0832输出正弦波信号(用示波器观察输出波形),初始频率为50Hz,变频采用“+”、“-”键控制,实时测量输出信号的频率值,并分析和实测输出信号的频率范围。

具体完成以下任务:

1.完成系统的方案设计,给出系统框图。

2.完成系统的硬件设计,给出硬件电路图和系统资源分配表。

3.完成系统的软件设计,给出程序流程图和程序编写。

4.运用Proteus仿真软件对所设计的系统进行调试和仿真,直到预定的功能全部仿真通过,给出仿真结果。

5.准确、高质量地进行印刷电路板的焊接。

6.完成课程设计报告。

三、元器件说明

◆知识简介:

DAC0832当今世界在以电子信是8位分辨率的D/A转换集成芯片,与微处理器完全兼容,这个系列的芯片以其价格低廉、接口简单、转换控制容易等优点,在单片机应用系统中得到了广泛的应用。

这类D/A转换器由8位输入锁存器,8位DAC寄存器,8位DA转换电路及转换控制电路构成。

1、DAC0832的引脚及功能:

DAC0832是8分辨率的D/A转换集成芯片。

与微处理器兼容。

这个DA芯片以其价格低廉、接口简单、转换控制容易等优点,在单片机应用系统中得到广泛的应用。

D/A转换器由8位输入锁存器、8位DAC寄存器、8位D/A转换电路及转换控制电路构成。

◆应用特性:

·DAC0832是微处理器兼容型D/A转换器,可以充分利用微处理器的控制能力实现对D/A转换的控制。

这种芯片有许多控制引脚,可以和微处理器控制线相连,接受微处理器的控制,如ILE、/CS、/WR1、/WR2、/XFER端。

·有两级锁存控制功能,能够实现多通道D/A的同步转换输出。

·DAC0832内部无参考电压源;须外接参考电压源。

·DAC0832为电流输入型D/A转换器,要获得模拟电压输出时,需要外加转换电路。

◆各引脚功能说明:

D0~D7:

8位数据输入线,TTL电平,有效时间应大于90ns(否则锁存器的数据会出错);

ILE:

数据锁存允许控制信号输入线,高电平有效;

CS:

片选信号输入线(选通数据锁存器),低电平有效;

WR1:

数据锁存器写选通输入线,负脉冲(脉宽应大于500ns)有效。

由ILE、CS、WR1的逻辑组合产生LE1,当LE1为高电平时,数据锁存器状态随输入数据线变换,LE1的负跳变时将输入数据锁存;

XFER:

数据传输控制信号输入线,低电平有效,负脉冲(脉宽应大于500ns)有效;

WR2:

DAC寄存器选通输入线,负脉冲(脉宽应大于500ns)有效。

由WR2、XFER的逻辑组合产生LE2,当LE2为高电平时,DAC寄存器的输出随寄存器的输入而变化,LE2的负跳变时将数据锁存器的内容打入DAC寄存器并开始D/A转换。

IOUT1:

电流输出端1,其值随DAC寄存器的内容线性变化;

IOUT2:

电流输出端2,其值与IOUT1值之和为一常数;

Rfb:

反馈信号输入线,改变Rfb端外接电阻值可调整转换满量程精度;

Vcc:

电源输入端,Vcc的范围为+5V~+15V;

VREF:

基准电压输入线,VREF的范围为-10V~+10V;

AGND:

模拟信号地

DGND:

数字信号地

◆DAC0832三种数据输入方式:

 

(1)双缓冲方式:

即数据经过双重缓冲后再送入D/A转换电路,执行两次写操作才能完成一次D/A转换。

 

(2)单缓冲方式:

不需要多个模拟量同时输出时,可采用此种方式。

(3)直通方式:

此时两个寄存器均处于直通状态,因此要将

端都接数字地,ILE接高电平,使LE1、LE2均为高电平,致使两个锁存寄存器同时处于放行直通状态,数据直接送入D/A转换电路进行D/A转换。

2.CPU芯片—AT89C51

1.AT89C51概述

AT89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,俗称单片机。

单片机的可擦除只读存储器可以反复擦除1000次。

该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。

2.AT89C51引脚说明

AT89C51单片机引脚图如图3-2所示。

它有40个引脚,其中包含2个专用于主电源的引脚,2个外接晶体的引脚,4个控制或与其它电源复用的引脚,以及32条输入输出I/O引脚。

四、设计原理

D/A转换器产生各种波形的原理:

利用D/A转换器输出的模拟量与输入数字量成正比关系这一特点,将D/A转换器作为微机输出接口,CPU通过程序向D/A转换器输出随时间呈现不同变化规律的数字量,则D/A转换器就可输出各种各样的模拟量,如方波、三角波、锯齿波、正弦波等。

仿真电路图(输出正弦波、三角波,锯齿波)

仿真图:

三角波:

锯齿波:

正弦波:

五:

程序编译

主程序:

#include

sbitkey2=P2^2;

sbitkey1=P2^1;

sbitkey0=P2^0;

charflag;  //波型输出标置变量

bittime;

unsignedchari;

int num;

 voidfrequency();

voiddelay(intz)//延时 z毫秒

          {

        intx,y;

        for(x=z;x>0;x--)

     for(y=124;y>0;y--);

   }          

unsignedcharsin(unsignedcharx)//正弦波

{

unsignedcharcodesin_tab[]={0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae, //上半周  

                               0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8,

                               0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf4,

                               0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfd,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff,

                               0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfd,0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,

                               0xf6,0xf4,0xf3,0xf2,0xf0,0xef,0xed,0xec,0xea,0xe8,0xe6,0xe4,0xe2,0xe0,0xde,0xdc,

                               0xda,0xd8,0xd5,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb3,

                               0xb0,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99,0x96,0x92,0x8f,0x8c,0x89,0x86,0x83, 0x80,

 

                               0x80,0x7d,0x7a,0x76,0x73,0x70,0x6d,0x6a,0x67,0x64,0x61,0x5e,0x5b,0x58,0x55,0x52,//下半周期

                               0x4f,0x4c,0x49,0x46,0x43,0x41,0x3e,0x3b,0x39,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27,

                               0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x14,0x12,0x10,0x0f,0x0d,0x0c,0x0b,

                               0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x03,0x02,0x02,0x01,0x01, 0x00,0x00,0x00,

          0x00,0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0b,0x0c,0x0d,

        0x0f,0x10,0x12,0x13,0x15,0x17,0x18,0x1a,0x1c,0x1e,0x20,0x23,0x25,0x27,0x2a,0x2c,

        0x2e,0x30,0x33,0x35,0x38,0x3b,0x3d,0x3e,0x40,0x43,0x46,0x48,0x4b,0x4e,0x51,0x54,

          0x57,0x5a,0x5d,0x5f,0x60,0x63,0x66,0x69,0x6b,0x6d,0x6f,0x72,0x74,0x76,0x78,0x7a,0x7e,0x80};

  returnsin_tab[x];

}

voidDAC0832(unsignedcharx)

{

 

 P1=x;

}

voidmain()

{

chard;

d=1;

TMOD=0X02;

num=10;

TH0=256-num; //num用来控制采样一个点所用的时间

TL0=256-num;

ET0=1;    //按键接于外部中断0,与中断1

EA=1;

TR0=1;

flag=2;    //开始时有输出

i=0;

 while

(1)

 {

   if(key2==0) //按一下key3,d自加1

 {

  delay(5);

  if(key2==0)

   {

    while(!

key2);

  d++;

  if(d==21)//当d=21,d变为1

  d=1;

    }

  }

   frequency();

     if(time==1)

 {    

      time=0;

    if(i>255)

       i=0;

    else

      i=i+d;//设置采样间隔

    switch(flag)    //当按键1的为输出三角波,按键2时输出正弦波

      {

       case0:

DAC0832(i);break;//当flag=0时,锯齿波

       case1:

             if(i>127)//当flag=1时,三角波

             DAC0832(255-i);

             else

             DAC0832(i);

             break;

       case2:

DAC0832(sin(i));//当flag=2时,正弦波

             break;

       default:

 break;

       }

  }

  }

 }

voidtime0()interrupt1

TH0=256-num;

TL0=256-num;

 time=1;

}

  voidfrequency() 

      {   

     if(key0==0)// //key0控制flag,频率选择

          { 

             delay(5);

            if(key0==0)//再次检测

             {  

       while(!

key0); //等待按键释放

                flag++; //按一下加1

      if(flag==3)//大于2返回0

                flag=0;       

    }

   }

  if(key1==0) //检测P21是否按下

     {

   delay(5);

            if(key1==0)//再次检测

             {

    while(!

key1);

              num=num+10; //按一下减10

    if(num==250)//小于5,返回5

    num=10;             

     } 

   }      

    }

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 交规考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1