单片机波形发生器.docx

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

单片机波形发生器.docx

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

单片机波形发生器.docx

单片机波形发生器

单片机课程设计报告书

 

课题名称

波形发生器设计

姓  名

段永乐

学 号

20106475

院、系、部

电气工程系

专 业

电子信息工程

指导教师

高迎霞、孙秀婷

 

2013年7月8日

波形发生器设计

20106475段永乐

一、设计目的ﻫ 本次设计是以单片机为基础,设计输出多种波形的波形发生器。

联系使用各个接口芯片(如STC89C52、DAC0832等)的功能特性及接口方法,并能运用其实现一个简单的微机应用系统功能器件。

二、设计要求

1、设计一个能产生方波、三角波、梯形波、锯齿波、正弦波的波形发生器。

  

2、产生指定波形可以通过DAC来实现,不同波形产生实质上是对输出的二进制数字量进行相应改变来实现的。

方波信号可以利用定时器中断产生的,每次中断时,将输出的信号按位反即可;三角波信号是将输出的二进制数字信号依次加1,达到0xff时依次减1,并实时将数字信号经D/A转换得到;锯齿波信号是将输出的二进制数字信号依次加1,达到0xff时置为0x00,并实时将数字信号经D/A转换得到的;梯形波是将输出的二进制数字信号依次加1,达到0xff时保持一段时间,然后依次减1直至0x00,并实时将数字信号经D/A转换得到的;正弦波可以预先写出正弦波表,通过读出表中的值然后经D/A转换后输出。

      

3、用按键来控制输出的波形,如课设计5个按键S0、S1、S2、S3、S4,按一次S1键不断输出三角波等。

        

4、用一位数码管显示波形代码:

如输出方波,显示代码“1”。

三、硬件电路设计

3.1系统结构框图

波形发生器系统主要由主单片机芯片、按键数码管显示以及D/A转换几部分组成。

系统结构框图如图3-1所示。

波形选择按键模块:

通过外部中断0计数来选择波形的种类。

频率选择按键模块:

通过外部中断1计数来选择波形的延时时间来实现。

数码管显示模块:

采用共阴极数码管,段码高电平有效,位码低电平有效。

D/A转换模块:

将查表的到的数字信号转换为模拟信号输出,再将模拟信号通过运算放大器,转换为电压输出。

波形输出模块:

将D/A转换完后的结果接上示波器观察波形,还可以通过改变频率来观测不同频率的波形。

单片机模块:

存放本实验用到的各种波形子程序、外部中断子程序、主程序、

段码表、波形转换数表。

图3-1系统结构框图

3.2STC89C52单片机介绍

图3-2STC89C52引脚图

其工作频率范围:

0~40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz。

用户应用程序空间4KROM。

片上集成512字节RAM。

它利用ISP技术写入程序,开发方便。

内部RSM用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据;ROM用以存放程序、一些原始数据和表格;I/O口为四个8位并行I/O口,既可以做输入,也可以做输出。

总共40个引脚,电源用2个(VCC和GND),晶振用2个,复位1个,EA/Vpp用1个,29引脚PSEN和30引脚ALE位外扩数据/程序存储器时才有特定用处,还有四个P端口,每个端口各有8个引脚。

其引脚如图3-2所示。

3.3数码管显示电路

数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。

在本次设计中使用的是动态显示驱动,采用共阴极数码管,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,哪个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,由于此次设计只选择一个数码管点亮,给定位码一个固定值,将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮,再选通段码使其显示代表波形的数字。

数码管显示电路图如图3-3所示。

图3-3数码管显示电路

3.4 D/A转换及I/V转换电路

D/A转换器将数字信息转换成与数值成正比的电压/电流。

本设计采用T型解码网络D/A转换。

选用DAC0832作为单元器件。

使用DAC0832的单缓冲方式。

DAC0832是电流输出型的转换器,要通过示波器来显示波形,必须接入运算放大电路。

D/A转换及I/V转换电路如图3-4所示。

3-4D/A转换及I/V转换电路

3.5系统电路原理图

元件选择:

5V电源,主单片机芯片STC89C52,DAC0832一片,锁存器74HC753两个,八位数码管六个,按键两个,运算放大器三个,反相器及电阻若干。

系统电路原理图如图3-6所示。

3-5系统电路原理图

四、程序流程图设计

4.1主程序流程图

主程序流程图如图4-1所示。

图4-1主程序流程图

通过独立按键产生下降沿,使外部中断INT0,INT1有效。

INT0控制波形的种类,INT1控制频率的选择。

波形种类的显示通过LED灯显示,因为只使用一位二极管,则只需将位码赋固定值,通过查表显示段码值。

本实验开始就使LED灯显示0,调用波形子程序,通过示波器显示方波的波形。

通过对波形种类按键的计数,即中断子程序中size计数,来实现在主程序中对波形种类的选择,从而调用相应的波形产生程序,通过示波器显示波形,波形的频率可以通过频率改变按键改变,来实现不同频率波形的产生。

4.2波形产生及频率变化流程图

波形产生及频率变化流程图如图4-2所示。

ﻫ图4-2波形产生及频率变化流程图

本框图实现了显示不同频率波形和波形种类的数码管显示。

数码管和不同波形的显示,通过外部中断0计数来实现,数码管的显示,将位码赋一固定值,段码通过调用段码表的值来实现。

波形的显示,通过查表,将表的内容赋给8032转换器的地址,进行数模转换得到模拟值,再进行延时、循环,从而的到几个周期的波形。

波形的频率,通过外部中断1计数来实现,通过改变波形的显示时间,从而达到了改变频率的目的。

五、程序设计

#include"reg52.h"

#define ucharunsigned char

#define uint unsigned int

#defineLEDLen6

xdataunsigned charOUTBIT _at_0x8002; //位控制口

xdataunsignedchar OUTSEG_at_  0x8004;   //段控制口

xdataunsignedchar  CS0832_at_0xa000;

uchar code dofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示段码值01234567

uchar size=0;////波形选择

ucharff1=0;////频率

uint ff=1;

uintcodesintab[64]={0x80,0x8c,0x98,0xa5,0xb0,0xbc,0xc7,0xd1,0xda,0xe2,0xea,0xf0,0xf6,0xfa,0xfd,0xff,0xff,0xff,0xfd,0xfa,0xf6,0xf0,0xea,0xe3,0xda,0xd1,0xc7,0xbc,0xb1,0xa5,0x99,0x8c,0x80,0x73,0x67,0x5b,0x4f,0x43,0x39,0x2e,0x25,0x1d,0x15,0xf,0x9,0x5,0x2,0x0,0x0,0x0,0x2,0x5,0x9,0xe,0x15,0x1c,0x25,0x2e,0x38,0x43,0x4e,0x5a,0x66,0x73};

uint code tri[64]={0x80,0x88,0x90,0x98,0xA0,0xA8,0xB0,0xB8,0xC0,0xC8,0xD0,0xD8,0xE0,0xE8,0xF0,0xF8,0xFF,0xF8,0xF0,0xE8,0xE0,0xD8,0xD0,0xC8,0xC0,0xB8,0xB0,0xA8,0xA0,0x98,0x90,0x88,0x80,0x78,0x70,0x68,0x60,0x58,0x50,0x48,0x40,0x38,0x30,0x28,0x20,0x18,0x10,0x08,0x00,0x08,0x10,0x18,0x20,0x28,0x30,0x38,0x40,0x48,0x50,0x58,0x60,0x68,0x70,0x78};

uint codefang[64]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

uintcode saw[64]={0x04,0x08,0x0B,0x10,0x14,0x18,0x1B,0x20,0x24,0x28,0x2B,0x30,0x34,0x38,0x3B,0x40,

0x44,0x48,0x4B,0x50,0x54,0x58,0x5B,0x60,0x64,0x68,0x6B,0x70,0x74,0x78,0x7B,0x80,0x84,0x88,0x8B,0x90,0x94,0x98,0x9B,0xA0,0xA4,0xA8,0xAB,0xB0,0xB4,0xB8,0xBB,0xC0,0xC4,0xC8,0xCB,0xD0,0xD4,0xD8,0xDB,0xE0,0xE4,0xE8,0xEB,0xF0,0xF4,0xF8,0xFB,0xFF};

uintcodeti[64]={0x80,0x88,0x90,0x98,0xA0,0xA8,0xB0,0xB8,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xB8,0xB0,0xA8,0xA0,0x98,0x90,0x88,0x80,0x78,0x70,0x68,0x60,0x58,0x50,0x48,0x40,0x38,0x30,0x28,0x20,0x18,0x10,0x08,0x00,0x08,0x10,0x18,0x20,0x28,0x30,0x38,0x40,0x48,0x50,0x58,0x60,0x68,0x70,0x78};

/////////延时函数//////////

void delay(uchart)

{

 uinti;

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

}

////////正弦波////////////

voidsin()

{

uchara;

for(a=0;a<64;a++)

{

 CS0832=sintab[a];

  delay(ff);

//////////三角波/////////////

 voidsanjiao()

{

uchara;

for(a=0;a<64;a++)

 {

 CS0832=tri[a];

  delay(ff);

 }

///////方波/////////////

 voidfangbo()

{

uchara;

for(a=0;a<64;a++)

{

 CS0832=fang[a];

delay(ff);

}

///////////锯齿波//////////

voidjuchibo()

{

uchara;

for(a=0;a<64;a++)

 CS0832=saw[a];

 delay(ff);

  }

}

///////梯形波/////////////

voidtixing()

{

uchar a;

for(a=0;a<64;a++)

{

  CS0832=ti[a];

 delay(ff);

}

}

//外部中断0子函数

voidint0() interrupt 0

{

size++;//中断一次加1

 if(size>=5)size=0;

}

//外部中断1子函数

int1()interrupt2

{

 ff1++;//中断一次加1

if(ff1>2)ff1=0;

}

voidinint()

IT0=1; //下降沿触发

 EX0=1;   //开中断0

 IT1=1;  //下降沿触发

EX1=1;   //开中断1

 EA=1;   //开总中断

}

voidmain(void)

inint();

while

(1)

{

switch(size)

 {case0:

OUTBIT=0x20;OUTSEG= dofly[0];fangbo();break; //方波

   case 1:

OUTBIT=0x20;OUTSEG=dofly[1];sanjiao();break;//三角波   

case2:

OUTBIT=0x20;OUTSEG=dofly[2];sin();break;//正弦波 

 case3:

OUTBIT=0x20;OUTSEG= dofly[3];juchibo();break;  //锯齿波 

 case 4:

OUTBIT=0x20;OUTSEG=dofly[4];tixing();break;  //梯形波

 default:

OUTBIT=0x20;OUTSEG= dofly[0];fangbo(); 

  }

  switch(ff1)

 { case0:

ff=1;break;

   case 1:

ff=3;break;

 case2:

ff=5;break;

case3:

ff=5;break;

case4:

ff=3;break;

default:

ff=1;

}

}

}

6、设计总结

通过程序执行,得到仿真结果如图6-1、6-2、6-3、6-4、6-5所示。

不按键时,数码管显示0,产生方波。

数码管显示与波形如图6-1所示。

图6-1方波

当按键次数为1时,数码管显示1,产生三角波。

数码管显示与波形如图6-2所示。

图6-2三角波

当按键次数为2时,数码管显示2,产生正弦波。

数码管显示与波形如图6-3所示。

图6-3 正弦波

当按键次数为3时,数码管显示3,产生锯齿波。

数码管显示与波形如图6-4所示。

图6-4 锯齿波

当按键次数为4时,数码管显示4,产生梯形波。

数码管显示与波形如图6-5所示。

图6-5 梯形波

通过本次试验设计,实现了波形发生器的基本功能,波形的显示调用通过事先设定好的数表,将数表中的值通过循环程序逐一通过DAC0832转换器,转换为电流值输出,再经过运算放大器转换为电压,接入示波器显示波形。

波形的频率通过改变调用数表中的一个值之后的延时时间来实现。

数码管显示的段码通过查表得到,位码设为一固定值来实现。

以前的实验设计多采用汇编语言来实现,但本次设计要求采用C语言来实现波形发生器,因此遇到了不少问题,但是通过老师和同学的帮助和自己的努力,这些问题都解决了,顺利的完成了本次课程的设计,在此谢谢老师和同学们的帮助。

七、参考文献

[1] 高峰.单片微型计算机原理与接口技术.科学出版社,2007.

[2]潘永雄,沙河,刘向阳.电子线路CAD实用教程[M].西安:

西安电子科技大学社,2001.13-118.

[3]朱定华,戴汝平等,单片微机原理与应用[M].北京交通大学出版社,清华大学出版社.

[4]彭介华.电子技术课程设计指导[J].北京:

高等教育出版社,1997.

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

当前位置:首页 > 幼儿教育

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

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