最新版波形发生器实验报告.docx
《最新版波形发生器实验报告.docx》由会员分享,可在线阅读,更多相关《最新版波形发生器实验报告.docx(23页珍藏版)》请在冰豆网上搜索。
最新版波形发生器实验报告
单片机课程设计报告
波形发生器
2014年02月23日
1、用户需求
1、产生三角波、方波、正弦波信号
2、输出信号的频率和幅度可以通过按键来改变,,分析波形产生的最高频率。
2、设计任务
基于AT89C51的波形发生器主要功能如下:
(1)可以三产生角波、方波、正弦波信号并通过按键控制。
(2)输出信号的频率和幅度可以通过按键来改变,分析波形产生的最高频率。
(3)以单片机为核心,经过D/A转换和放大电路的处理,最后输出信号。
3、原理框图及说明
根据设计任务,设计如下框图:
图1、原理框图
电源部分,为单片机提供5V稳压电源;8位按键提供给用户用来选择需要输出的波形,以及修改频率及方波占空比;数码管显示所选择的的波形代号,1代表正弦波,2代表方波,3代表锯齿波,4代表三角波;幅度调节电路用来调节输出波形的幅度;D/A转换及放大电路可以将数字信号转换成模拟信号输出我们所需要的波形;显示电路则是将波形显示在屏幕上。
89C51上电后,扫描P1口,判断是否有键按下,进行相应的操作。
根据原理框图,设计电路图如附件1.
设置的3位按键分别为S1代表正弦波,S2代表方波,S3代表锯齿波,S4代表三角波,
S5代表增加方波占空比,S6代表减小方波占空比,S7代表增加频率,S8代表减小频率。
4、主要电路说明、元件选择及参数计算
简易函数信号发生器原件清单如下:
原件名称
型号
数量\个
用途
原件名称
型号
数量\个
用途
单片机
AT89S52
1
控制核心
集成块
DAC0832
1
数模转换
晶振
12MHz
1
晶振电路
集成块
uA470
1
放大电路
电容
30pF
2
晶振电路
电阻
100KῺ
2
放大电路
电解电容
22uF\10V
1
复位电路
电阻
50KῺ
1
放大电路
电阻
10KῺ
1
复位电路
电源
12V/0.5A
1
放大电路
排阻
10KῺ*10
1
电源
+5V/0.5A
1
提供+5V
按键
9
选择波形、复位键、调节方波空占比、调节频率
4.1主控芯片单片机的介绍
(1)AT89C51的引脚如图2.2所示。
AT89C51单片机的40个引脚可分为:
电源引脚2根、时钟引脚两根、控制引脚4根、输入/输出引脚32根。
各引脚功能描述如下:
(1)主电压引脚
●VCC:
电源端,正常工作时接+5V电源
●VSS:
接地端
(2)时钟引脚
●XTAL1:
内部振荡电路的反相放大器的输入端,接外部晶振和微调电容的一端。
采用外部时钟电路时,对HMOS型工艺的单片机而言,此引脚应接地;对CHMOS型而言,此引脚应接外部时钟的输入端。
●内部振荡电路的反相放大器的输出端,接外部晶振和微调电容的另一端。
采用外部时钟电路时,对HMOS型工艺的单片机而言,此引脚应接外部时钟的输入端;对CHMOS型而言,此引脚悬空。
(3)控制引脚
●RST/VPD:
复位信号/备用电源输入引脚。
当振荡运行时,RST引脚保持2个机器周期的高电平后,就可以使8051完成复位工作。
该引脚的第二功能是VPD,即备用电源的输入端,具有掉电保护功能。
在主电源VCC掉电期间,该引脚可接+5V备用电源,由VPD向内部RAM提供备用电源,保持内部RAM中的数据不丢失。
●ALE/PROG:
地址锁存允许信号/编程脉冲输入端。
当CPU访问片外存储器时,ALE输出信号控制锁存P0口的低8位地址,从而实现P0口的数据与低位地址的分时复用。
当8051上电正常工作后,ALE端以不变频率(振荡器频率的fosc/6)周期性地输出正脉冲信号。
该脉冲可用作对外输出的时钟,或用于定时目的。
该引脚的第二功能PROG是做编程脉冲的输入端。
●PSEN:
外部程序存储器读选通信号端,低电平有效。
●EA/Vpp:
内部ROM和外部ROM选择端/编程电压输入端。
当EA接高电平时,CPU访问片内ROM,但当PC值超过0FFFH时,将自动转去执行片外ROM指令;当EA接低电平时,CPU访问片外ROM。
该引脚的第二功能是Vpp是作为编程电压的输入端。
(4)输入/输出引脚
●P0.0~P0.7:
P0口的8位口线。
P0口是一个8位漏极开路型双向I/O,既可作地址/数据总线使用,又可作通用的I/O口使用。
当CPU访问片外存储器时,P0口分时先作低8位地址总线,后作双向数据总线,P0口能以吸收电流的方式驱动8个LSTTL电路。
●P1.0~P1.7:
P1口的8位口线。
P1口是一个带有内部上拉电阻的8位准双向I/O口。
作为通用的I/O口,它能驱动4个LSTTL负载。
●P2.0~P2.7:
P2口的8位口线。
P2口是一个带有内部上拉电阻的的8位准双向I/O口。
当CPU访问片外存储器时,P2口输出高8位地址总线,与P0口配合,组成16位片外存储器单元地址。
P2口驱动4个LSTTL负载。
(5)DAC0832是8位CMOS数/模转换芯片,其特点如下:
●分辨率8位的并行D/A转换器。
●双列直插式(DIP)封装,CMOS低功耗(功耗为20mW)器件。
●单电源供电。
参考电压为-10V~+10V,从+5V~+15V均可正常工作。
●电流输出型芯片,需外接运算放大器。
●电流建立时间为1us。
●片内二级数据缓存,数据输入可采用双缓冲、单缓冲和直通方式。
数/模转换器DAC0832由1个8位数据寄存器、1个8位DAC寄存器、1个8位D/A转换器和控制逻辑组成。
DAC0832各引脚功能:
●D7~D0:
8位数字量输入端,接CPU数据线D7~D0。
●IOUT1:
模拟电流输出端1,输出值随DAC寄存器内容线性变化。
●IOUT2模拟电流输出端2,IOUT1+IOUT2=常数。
一般情况下,在单极性输出时,IOUT2接地,在双极性输出时IOUT2接运算放大器。
●Vref:
参考电压输出端。
Vref可以外接一个正电压,也可以接一个负电压,范围为-10V~+10V。
参考电压决定数字量0~255(00H~FFH)转化出来的模拟量电压值的幅度。
●Rfb:
反馈电阻输出引脚。
DAC0832是电流输出,为了取得电压输出,需在电流输出端接运算放大器,构成I/V转换电路。
DAC0832内部已经有反馈电阻,所以Rfb端可以直接与外部运算放大器相连,相当于将一个反馈电阻接在运算放大器的输出端和输入端之间。
●Vcc:
电源电压。
AGND:
模拟量地。
DGND:
数字量地。
●CS:
片选信号,低电平有效。
当CS=0时,DAC0832工作。
●ILE:
输入锁存器允许信号,高电平有效。
●WR1:
写控制信号1,低电平有效。
WR2:
写控制信号2,低电平有效。
●XFER:
数据传送信号,低电平有效。
4.2复位与振荡电路
对于MCS-51一般的晶振可以在1.2MHZ—12MHZ之间选择,这是电容C可以对应的选择10pf-30Pf。
一条引脚接在XTAL1,另一条接在XTAL2。
复位电路如图2,由C3和R1构成。
由于51单片机为低电平复位,图示电路利用电容的特性,在刚刚外加5V电源时RST脚的电压为低。
选择12MHz晶体,C1、C2、C3选择30pF电容,R1选择10K电阻。
图2、复位与振荡电路
4.3显示电路
显示元件选择8段LED数码管,共阳极。
段选信号经过上拉电阻接到51的P0口,位选信号由按键接至P1.0到P1.3提供,因此得到数码管L1显示分别为1、2、3、4.
显示数码管与P0口对应表
显示数码管
显示1
显示2
显示3
显示4
P0口
0xF9
0xA4
0xB0
0x99
图2、显示电路
4.4按键电路
由于89C51的P1口内部有上拉电阻,为简化电路,用按键开关直接接对应引脚P1.0、至P1.7到地。
其中P1.0接正弦波按键,p1.1接方波按键,p1.2接锯齿波按键,p1.3接三角波按键,p1.4接增加方波占空比按键,p1.5接减小方波占空比按键,p1.6接增加频率按键,p1.7接减小频率按键。
当按键按下,P1口为零,进行选择。
图4、按键电路
4.5D/A转换及放大电路
为了将数字信号转换成模拟信号得到我们需要的波形,在P2口接入用于D/A转换的DAC0832芯片,并接入uA741运放用于将信号放大。
图5、输出驱动电路
4.6调幅电路
通过滑动变阻器的调节,调节电压,从而使波形的振幅发生变化。
5、软件规划
5.1软件流程图
5.2软件划分
根据设计要求,先定义按键对应的端口,在定义各波形输出点的电压值,编写波形函数及按键控制函数,完成程序的设计。
设计的全局变量:
(1)定义按键变量:
sbits1=P1^0;sbits2=P1^1;sbits3=P1^2;sbits4=P1^3;sbits5=P1^4;sbits6=P1^5;sbits7=P1^6;sbits8=P1^7;
(2)定义全局变量:
uintd1,d2;uints,p;uintn;
(3)定义正弦波各个输出点的电压值:
ucharcodesintab[256]
(4)定义锯齿波各输出点的电压值ucharcodejctab[128]
(5)定义三角波各输出点的电压值ucharcodesjtab[256]
(6)初始化变量:
d1=10;d2=10;n=0;p=4;P0=0xff;P1=0xff;
设计函数如下:
(1)主函数main()
,调用各函数显示输出的波形。
程序循环。
(2)延时函数delay(uchark)
功能:
等待显示器反应
(3)产生正弦波函数sin()
功能:
扫描P2口,产生正弦波。
(4)产生方波函数fang()
功能:
扫描P2口,产生方波。
(5)产生锯齿波juchi()
功能:
扫描P2口,产生锯齿波。
(6)产生三角波tran()
功能:
扫描P2口,产生三角波
(7)键盘控制函数boxingkey()
功能:
设置按键的控制功能,返回到具体的函数中。
6、测试(测试方案设计、测试记录、结果分析)
制作完成后,进行如下测试,结果合格。
功能要求
功能描述
测试结果
(1)按键是否满足设计的功能
S1按下,显示正弦波
数码管显示1,示波器显示正弦波
S2按下,显示方波
数码管显示2,示波器显示方波
S3按下,显示锯齿波
数码管显示3,示波器显示锯齿波
S4按下,显示三角波
数码管显示4,示波器显示三角波
S5按下,方波占空比增加
方波占空比增加
S6按下,方波占空比减小
方波占空比减小
S7按下,频率增加
波形频率增加
S7按下,频率减小
波形频率减小
幅度是否能调节
调节滑动变阻器,幅度改变
波形幅度能够改变
测试结果:
1、按下按键1,数码管显示1,示波器输出正弦波
2、按下按键2,数码管显示2,示波器输出方波。
3、按下按键3,数码管显示3,示波器输出锯齿波‘
4、按下按键4,数码管显示4,示波器输出三角波。
5、按下按键5,方波占空比增加。
6、按下按键6,方波占空比减小。
7、按下按键7,波形频率增加,以正弦波为例。
8、按下按键8,波形频率减小,以正弦波为例。
9,使用调节幅度变阻器,可使波形幅度发生改变,以正弦波为例。
7、体会与感想
一周的课程设计结束了,本次课程设计的题目是波形发生器,虽然时间不是很长,但在这短短的时间里,我学到了很多的东西,首先学会了用keil软件来编程以及用proteus软件来仿真,也知道了一个单片机的工作过程,还复习了单片机的一系列内容,包括:
复位电路、时钟电路、数码管与单片机的接口等。
对于一些器件的工作原理也有了进一步的了解,如:
89C51单片机,数码管等。
对于软件程序和硬件电路的结合,更加深刻体会了单片机系统的妙处。
与此同时,还在对一些硬件的使用上,电路板的设计上有了很大的进步,对今后的学习有很大的帮助。
在实验过程中,我遇到了一些问题
(1)初次使用keil软件及proteus软件,对其熟练地掌握有一些困难,在电路原理图的设计过程中总是出现错误,对元件的名称有许多的不了解。
但在同学和老师的帮助下找到了正确的元件。
(2)在程序的设计上也遇到了问题,对于C语言掌握的不是特别熟练,导致出现了许多的语法错误,在一些细节上也出现了错误,丢失了一些符号。
(3)在仿真过程中,程序与电路图不对应,需要对照着修改,电路图也可能不能实现自己所需要的功能。
(4)在连接电路过程中,总是出现波形失真或不稳定的现象,但在我们的共同努力下,调出了一个较好的方波。
但本次课程设计我学会了很多,明白了更多的道理,总的来说有以下收获:
(1)对波形发生器有了深刻的认识,明白了波形器的原理,了解了我们所用的函数发生器的原理,我们生活中的许多事物都可以通过自身实践来明白
(2)通过对电路的设计,对51系列单片机的原理和功能有了进一步的了解,学到了更多的电路知识,如复位电路的原理,晶振电路的作用,上拉电阻的功能,熟悉了DAC0832芯片的原理和功能,认识了uA741运放器,并且能对其进行应用。
(3)通过原理图的绘制,学会了proteus软件的使用,并且能用它完成一些简单的电路设计,并且对元器件的封装有了一定的了解和认识。
(4)通过自己动手设计,增强了自身的实践动手能力,对电路原理的应用有了更深刻的认识。
(5)在仿真阶段,尤其是在硬件电路的检查阶段,有很深的体会,有时候一个简单的错误就有可能造成电路无法正常工作,通过找错排错,更加熟悉了电路的原理和51单片机的工作原理。
通过本次课程设计,我看到了自身还存在许多不足,在实践动手能力方面比较弱,对一些电路知识掌握得不是很好,对程序设计有很多的缺陷,还好在寻求别的同学和老师的帮助下,完成了课程设计。
附1、原理图
附2、程序清单
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbits1=P1^0;//输出正弦波
sbits2=P1^1;//输出方波
sbits3=P1^2;//输出锯齿波
sbits4=P1^3;//输出三角波
sbits5=P1^4;//增加方波正占空比
sbits6=P1^5;//增加方波负占空比
sbits7=P1^6;//增加频率
sbits8=P1^7;//减小频率
uintd1,d2;
uints,p;
uintn;
ucharcodesintab[256]={//正弦波各个输出点的电压值
0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,
0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,
0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5,
0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,
0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,
0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5,
0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,
0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,
0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,
0xf5,0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,
0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,
0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,
0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,
0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99,
0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,
0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,
0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51,
0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,
0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,
0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16,
0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,
0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,
0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,
0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15,
0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,
0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,
0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e,
0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66,
0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80
};
ucharcodejctab[128]=//设定锯齿波各输出点的电压值
{
0x00,0x02,0x04,0x06,0x08,0x0a,0x0c,0x0e,
0x10,0x12,0x14,0x16,0x18,0x1a,0x1c,0x1e,
0x20,0x22,0x24,0x26,0x28,0x2a,0x2c,0x2e,
0x30,0x32,0x34,0x36,0x38,0x3a,0x3c,0x3e,
0x40,0x42,0x44,0x46,0x48,0x4a,0x4c,0x4e,
0x50,0x52,0x54,0x56,0x58,0x5a,0x5c,0x5e,
0x60,0x62,0x64,0x66,0x68,0x6a,0x6c,0x6e,
0x70,0x72,0x74,0x76,0x78,0x7a,0x7c,0x7e,
0x80,0x82,0x84,0x86,0x88,0x8a,0x8c,0x8e,
0x90,0x92,0x94,0x96,0x98,0x9a,0x9c,0x9e,
0xa0,0xa2,0xa4,0xa6,0xa8,0xaa,0xac,0xae,
0xb0,0xb2,0xb4,0xb6,0xb8,0xba,0xbc,0xbe,
0xc0,0xc2,0xc4,0xc6,0xc8,0xca,0xcc,0xce,
0xd0,0xd2,0xd4,0xd6,0xd8,0xda,0xdc,0xde,
0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xee,
0xf0,0xf2,0xf4,0xf6,0xf8,0xfa,0xfc,0xfe
};
ucharcodesjtab[256]=//设定三角波各输出点的电压值
{
0x00,0x02,0x04,0x06,0x08,0x0a,0x0c,0x0e,
0x10,0x12,0x14,0x16,0x18,0x1a,0x1c,0x1e,
0x20,0x22,0x24,0x26,0x28,0x2a,0x2c,0x2e,
0x30,0x32,0x34,0x36,0x38,0x3a,0x3c,0x3e,
0x40,0x42,0x44,0x46,0x48,0x4a,0x4c,0x4e,
0x50,0x52,0x54,0x56,0x58,0x5a,0x5c,0x5e,
0x60,0x62,0x64,0x66,0x68,0x6a,0x6c,0x6e,
0x70,0x72,0x74,0x76,0x78,0x7a,0x7c,0x7e,
0x80,0x82,0x84,0x86,0x88,0x8a,0x8c,0x8e,
0x90,0x92,0x94,0x96,0x98,0x9a,0x9c,0x9e,
0xa0,0xa2,0xa4,0xa6,0xa8,0xaa,0xac,0xae,
0xb0,0xb2,0xb4,0xb6,0xb8,0xba,0xbc,0xbe,
0xc0,0xc2,0xc4,0xc6,0xc8,0xca,0xcc,0xce,
0xd0,0xd2,0xd4,0xd6,0xd8,0xda,0xdc,0xde,
0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xee,
0xf0,0xf2,0xf4,0xf6,0xf8,0xfa,0xfc,0xfe,
0xfe,0xfc,0xfa,0xf8,0xf6,0xf4,0xf2,0xf0,
0xee,0xec,0xea,0xe8,0xe6,0xe4,0xe2,0xe0,
0xde,0xdc,0xda,0xd8,0xd6,0xd4,0xd2,0xd0,
0xce,0xcc,0xca,0xc8,0xc6,0xc4,0xc2,0xc0,
0xbe,0xbc,0xba,0xb8,0xb6,0xb4,0xb2,0xb0,
0xae,0xac,0xaa,0xa8,0xa6,0xa4,0xa2,0xa0,
0x9e,0x9c,0x9a,0x98,0x96,0x94,0x92,0x90,
0x8e,0x8c,0x8a,0x88,0x86,0x84,0x82,0x80,
0x7e,0x7c,0x7a,0x78,0x76,0x74,0x72,0x70,
0x6e,0x6c,0x6a,0x68,0x66,0x64,0x62,0x60,
0x5e,0x5c,0x5a,0x58,0x56,0x54,0x52,0x50,
0x4e,0x4c,0x4a,0x48,0x46,0x44,0x42,0x40,
0x3e,0x3c,0x3a,0x38,0x36,0x34,0x32,0x30,
0x2e,0x2c,0x2a,0x28,0x26,0x24,0x22,0x20,
0x1e,0x1c,0x1a,0x18,0x16,0x14,0x12,0x10,
0x0e,0x0c,0x0a,0x08,0x06,0x04,0x02,0x00
};
voiddelay(uchark)//延时函数
{
ucharj