基于8051的多功能信号发生器.docx
《基于8051的多功能信号发生器.docx》由会员分享,可在线阅读,更多相关《基于8051的多功能信号发生器.docx(23页珍藏版)》请在冰豆网上搜索。
![基于8051的多功能信号发生器.docx](https://file1.bdocx.com/fileroot1/2022-12/7/d506a621-410f-42f7-ba67-3c83f9af10ca/d506a621-410f-42f7-ba67-3c83f9af10ca1.gif)
基于8051的多功能信号发生器
目录
第一章摘要4
第二章引言4
第三章基本原理5
3.1设计任务5
3.2设计原理5
第四章硬件原理6
4.18051单片机的内部结构6
4.2DAC0832芯片介绍7
第五章软件设计9
5.1正弦波9
5.2方波10
5.3三角波10
5.4锯齿波10
5.5调频10
第六章系统调试11
第七章结语14
参考文献资料15
附录程序整体设计16
第一章摘要
本系统是基于8051单片机的多功能信号发生器。
采用8051单片机作为控制核心,外围采用数字/模拟转换电路(DAC0832)、按键和6位数码管等。
通过按键控制可产生方波、三角波、正弦波、锯齿波等,也可通过按键改变频率,同时用数码管指示其对应的键值。
其设计简单、性能优好,具有一定实用性。
各种各样的信号是通信领域的重要组成部分,其中正弦波、三角波和方波等是较为常见的信号。
在科学研究及教学实验中常常需要这几种信号的发生装置。
为了实验、研究方便,研制一种灵活适用、功能齐全、使用方便的信号源是十分必要的。
文中简要介绍了DAC0832数模转换器的结构原理和使用方法和8051的基础理论。
文中着重介绍了如何利用单片机控制D/A转换器产生上述信号的硬件电路和软件编程。
信号频率幅度也按要求可调。
关键词:
8051DAC0832信号发生器可调频
第二章前言
波形发生器也称函数发生器,作为实验信号源,是现今各种电子电路实验设计应用中必不可少的仪器设备之一。
目前,市场上常见的波形发生器多为纯硬件的搭接而成,且波形种类有限,多为锯齿波,正弦波,方波,三角波等波形。
信号发生器作为一种常见的应用电子仪器设备,传统的可以完全由硬件电路搭接而成,如采用555振荡电路发生正弦波、三角波和方波的电路便是可取的路经之一,不用依靠单片机。
但是这种电路存在波形质量差,控制难,可调范围小,电路复杂和体积大等缺点。
在科学研究和生产实践中,如工业过程控制,生物医学,地震模拟机械振动等领域常常要用到低频信号源。
而由硬件电路构成的低频信号其性能难以令人满意。
本文是做基于单片机的信号发生器的设计,将采用编程的方法来实现三角波、锯齿波、矩形波、正弦波的发生。
根据设计的要求,对各种波形的频率进行改变输出,并将所写程序装入单片机的程序存储器中。
在程序运行中,当接收到按键的命令时,程序会根据按键的指示调用相应的服务子程序和波形发生程序,经电路的数/模转换器和运算放大器处理后,从信号发生器的输出端口输出。
本设计中需要lab2000试验箱的键盘按键和示波器的硬件配合,通过按键设定所需要的波形和频率,并通过示波器观察波形的频率、幅值电压、波形。
第三章基本原理
3.1设计任务
(1)以单片机为核心的函数信号发生器,可产生方波、三角波、正弦波、锯齿波等波形,通过键盘选择波形和调整信号频率。
(2)设计键盘输入电路,对应选择波形和改变信号频率、波形的输出电路;编制相应的程序。
波形发生器的设计所需器件:
1.lab2000试验箱(包含单片机8051系统、DAC0832一片、运算放大器)
2.PC机一台
3.示波器一台
3.2设计原理
本文要求将单片机的数字信号输出转化为模拟信号,数字信号可以通过D/A转换器转换成模拟信号,因此可通过单片机产生数字信号再转换成模拟信号的方法来获得所需要的波形。
8051单片机本身就是一个完整的微型计算机,具有组成微型计算机的各部分部件:
中央处理器CPU、随机存取存储器RAM、只读存储器ROM、I/O接口电路、定时器/计数器以及串行通讯接口等,只要将8051再配置键盘及其接口、显示器及其接口、数模转换及波形输出及其接口、示波器及其输出等四部分,即可构成所需波形发生器。
8051是整个波形发生器的核心部分,通过程序的编写和执行,产生各种各样的信号,并通过lab2000键盘进行各种波形的转换和信号频率的调节。
当数字信号经过接口电路到达转换电路,将其转换成模拟信号也就是所需要的输出波行。
第四章硬件原理
信号发生器硬件原理框图如图4-1所示。
输出
图4-1信号发生器原理框图
4.18051单片机的内部结构
典型的8051单片机芯片集成了以下几个基本组成部分。
1一个8位的CPU
2128B或256B单元内数据存储器(RAM)
34KB或8KB片内程序存储器(ROM或EPROM)
44个8位并行I/O接口P0~P3。
5两个定时/计数器。
65个中断源的中断管理控制系统。
7一个全双工串行I/O口UART(通用异步接收、发送器)
8一个片内振荡器和时钟产生电路。
图4-2单片机最小系统
4.2DAC0832芯片介绍:
DAC0832芯片具备双缓冲、单缓冲和直通三种输入方式,以便适于各种电路的需要(如要求多路D/A异步输入、同步转换等)。
在本文设计电路中DAC0832采用单缓冲接口方式,DAC0832为一个8位D/A转换器,单电源供电,在+5~+15V范围内均可正常工作。
基准电压的范围为±10V,电流建立时间为1μs,CMOS工艺,低功耗20mW。
和
接地,故DAC0832工作于直通方式。
8位输入寄存器受
和
端的信号控制,而内部结构框图如下图所示。
图4-3DAC0832内部结构
DAC0832的外部引脚及功能介绍图如下:
图4-4DAC0832引脚图
DAC0832内部结构资料:
芯片内有两级输入寄存器,使DAC0832具备双缓冲、单缓冲和直通三种输入方式,以便适于各种电路的需要(如要求多路D/A异步输入、同步转换等)。
D/A转换结果采用电流形式输出。
要是需要相应的模拟信号,可通过一个高输入阻抗的线性运算放大器实现这个供功能。
运放的反馈电阻可通过RFB端引用片内固有电阻,还可以外接。
DI0~DI7:
数据输入线,TLL电平。
ILE:
数据锁存允许控制信号输入线,高电平有效。
CS:
片选信号输入线,低电平有效。
WR1:
为输入寄存器的写选通信号。
XFER:
数据传送控制信号输入线,低电平有效。
WR2:
为DAC寄存器写选通输入线。
Iout1:
电流输出线。
当输入全为1时Iout1最大。
Iout2:
电流输出线。
其值与Iout1之和为一常数。
Rfb:
反馈信号输入线,芯片内部有反馈电阻.
Vcc:
电源输入线(+5v~+15v)
Vref:
基准电压输入线(-10v~+10v)
AGND:
模拟地,摸拟信号和基准电源的参考地.
DGND:
数字地,两种地线在基准电源处共地比较好
第五章软件设计
如下为系统整体设计流程图:
图5-1系统整体设计流程图
本文将信号发生器分为几个模块,分别设计,最后再整合在一起。
一共可分为五大模块:
正弦波模块、方波模块、三角波模块、锯齿波模块、调频模块。
5.1正弦波
由于单片机处理的都是数字信号,而正弦波是连续的信号,所以首先想到的是用D/A转换来实现模拟信号。
D/A转换是将二进制数转换成对应的电压量,即结果还是单个的数值,但是当程序运行时,由于时间很短,所以在示波器上看到的就是连续的信号,实际上是很多个点组成的。
但是这种转换的结果是呈线性增加的,而正弦波是呈弧形变化,所以只用DA转换是不能实现正弦波的。
经过我们小组讨论后,我决定用查表的方法来实现正弦波形,即把每个弧度对应的正弦值算出来,然后用变址寻址的指令来查表,当然弧度必须尽量小。
这样,就能在示波器上看到正弦波。
正弦波的模拟信号是D/A转换器的模拟量输出,其计算公式为:
(其中A=VREF)(2.1)
(其中N=1~256)(2.2)
那么对应着存放在计算机里的这一点的数据为:
(2.3)
这样一个周期被分离成256个点,对应的正弦波形的256个数据存放在以TAB为起始地址的存储器中
5.2方波
方波的实现很简单,因为我们平时实验的波形就是方波,可以用定时器T0或T1通过任意的端口来实现。
但是这样做有一个问题就是:
在后面的发挥部分中只能调频不能调幅。
所以,最好开始的时候设置一个初值(例如0FFH)然后直接输出这个值就行了,输出一段时间后,然后再重新置一个数据(例如00H),然后再输出这个数据一段时间,但是此时的时间一定要等于前面那段时间。
这样才是一个方波,如果两个时间不相同,那就相当于一个矩形波。
5.3三角波
显然,三角波的实现和正弦波有关系。
三角波形本身就是呈线性增加,因此不用查表,直接用DA转换的结果就能实现。
其设计的关键在于怎样控制幅值,不能太大,因为太大会对后面调节幅值产生影响。
5.4锯齿波
首先定义一个初值然后进行加法操作,加的步数的多少则根据要求的频率来进行。
然后加到某个数之后就再重新设置为初值,再重复执行刚刚的操作,如此循环下去。
,这个操作跟锯三角波的实现是相似的。
5.5调频
调频可以在中断程序中实现。
频率的倒数就是周期,即一个波形在示波器上所需的扫描时间。
因此,我只要调节各个波形的延迟时间,就能实现频率的调节。
第六章系统调试
将DAC0832输出的信号连接到示波器进行观察,以下为各个输出波形:
图6-1正弦信号1(T=7168Us,h=140Hz)
图6-2三角波信号1(T=8ms,h=125Hz)
图6-3方波信号1(T=2ms,h=500Hz)
图6-4锯齿波信号1(T=4ms,h=250Hz)
图6-5正弦信号2(T=11264us,h=90Hz)
图6-6三角波信号2(T=3500us,h=286Hz)
图6-7锯齿波信号2(T=2Ms,H=500Hz)
经实验可知,本任意信号发生器可通过改变键值来实现波形和频率的转换,正弦信号,三角信号,方波信号和锯齿波信号波形清晰明确,完成了所要求的任务。
但由于程序的原因,波形的各个周期并不连续,经分析是程序调用的时差问题导致的,目前这个问题还有待解决。
第七章结语
为期一周的单片机课设,感慨颇多,受益匪浅。
刚开始接到课题是一种兴奋,因为新的考验即将开始。
刚开始感觉本次课题难度不大,此时有一种莫名的庆幸和失落,庆幸自己的课题并不是毫无头绪,失落的是感觉太轻松了,会没有成就感。
当自己第一天开始做时,没有太大的感觉。
因为自己还没有真正体会到该课题的深度与难度。
第一天把几本的四种波形产生方式了解了,颇有点点成就感。
但是第二天着手攻克键盘扫描时,自己一片茫然。
好多原理没有搞清楚,造成进度很慢,同时也感觉到了一种压迫感。
自己静下心研究了的一天的键盘扫描程序,第三天把键盘扫描程序验证后这一天又匆匆的过去了。
而接下来的两天开始调理整体程序,此时才真正发现自己学艺不精,事倍功半,进度缓慢,各个模块的工呢过都能够实现,但组合到一起却总是出问题,经过仔细的分析,才发现是时序的问题。
这最后两天也是心情最压抑的两天,但是也感到过得很充实。
在老师的指导帮助下和同学共同讨论最后攻克程序的时候自己高兴地无法言表。
通过这次课程设计,使我深刻地认识到学好专业知识的重要性,也理解了理论联系实际的含义,并且检验了本学期单片机的学习成果,进一步加深了我对单片机知识的了解和认识以及动手的能力。
虽然在这次设计中对于所学知识的运用和衔接还不够熟练,作品完成的还不是很出色。
但是我将在以后的工作和学习中继续努力、不断完善。
这个设计是对我们过去所学知识的系统提高和扩充的过程,为今后的进一步学习打下了良好的基础。
希望今后能有更多的实践机会,从中不断提升自己。
参考文献
1张淑清单片机原理及应用技术国防工业出版社2010.8
2梅丽凤,王艳秋,汪毓铎,张军单片机原理及接口技术清华大学出版社2006.8
3谢宜仁,谢炜,谢东辰单片机实用技术问答人民邮电出版社2003.2
4何立民单片机应用技术选编北京航空航天大学出版社1997.10
5潘永雄新编单片机原理与应用实验西安电子科技大学出版社2005.9
6夏继强,沈德金单片机实验与实践教程北京航空航天大学出版1999.12
附录程序整体设计
OUTBITequ08002h;位控制口
OUTSEGequ08004h;段控制口
INequ08001h;键盘读入口
LEDBufequ60h;显示缓冲
NUMequ30h
CS0832equ0a000h
ljmpStart
LEDMAP:
;八段管显示码
db3fh,06h,5bh,4fh,66h,6dh,7dh,07h
db71h,71h,71h,71h,71h,71h,71h,71h
Delay:
;延时子程序
movr7,#0
DelayLoop:
djnzr7,DelayLoop
djnzr6,DelayLoop
ret
DisplayLED:
movr0,#LEDBuf
movr1,#6;共6个八段管
movr2,#00100000b;从左边开始显示
Loop:
movdptr,#OUTBIT
mova,#0
movx@dptr,a;关所有八段管
mova,@r0
movdptr,#OUTSEG
movx@dptr,a
movdptr,#OUTBIT
mova,r2
movx@dptr,a;显示一位八段管
movr6,#1
callDelay
mova,r2;显示下一位
rra
movr2,a
incr0
djnzr1,Loop
ret
TestKey:
movdptr,#OUTBIT
mova,#0
movx@dptr,a;输出线置为0
movdptr,#IN
movxa,@dptr;读入键状态
cpla
anla,#0fh;高四位不用
ret
KeyTable:
;键码定义
db16h,15h,14h,0ffh
db13h,12h,11h,10h
db0dh,0ch,0bh,0ah
db0eh,03h,06h,09h
db0fh,02h,05h,08h
db00h,01h,04h,07h
GetKey:
movdptr,#OUTBIT
movP2,dph
movr0,#Low(IN)
movr1,#00100000b
movr2,#6
anla,#0fh
movNUM,a
KLoop:
mova,r1;找出键所在列
cpla
movx@dptr,a
cpla
rra
movr1,a;下一列
movxa,@r0
cpla
anla,#0fh
jnzGoon1;该列有键入
djnzr2,KLoop
movr2,#0ffh;没有键按下,返回0ffh
sjmpExit
Goon1:
movr1,a;键值=列X4+行
mova,r2
deca
rla
rla
movr2,a;r2=(r2-1)*4
mova,r1;r1中为读入的行值
movr1,#4
LoopC:
rrca;移位找出所在行
jcExit
incr2;r2=r2+行值
djnzr1,LoopC
Exit:
mova,r2;取出键码
movdptr,#KeyTable
movca,@a+dptr
movr2,a
WaitRelease:
movdptr,#OUTBIT;等键释放
clra
movx@dptr,a
movr6,#10
callDelay
callTestKey
jnzWaitRelease
mova,r2
ret
Start:
movsp,#40h
movLEDBuf+0,#0ffh;显示8.8.8.8.
movLEDBuf+1,#0ffh
movLEDBuf+2,#0ffh
movLEDBuf+3,#0ffh
movLEDBuf+4,#0
movLEDBuf+5,#0
Mloop:
callDisplayLED;LED显示
MOVA,NUM
CALLSAOMIAO;输出波形;
callDisplayLED
TEST:
callDisplayLED
callTestKey;有键入?
jzMLOOP;无键入,继续显示
callGetKey;读入键码
anla,#0fh;显示键码
movNUM,a;将键值存入30h
movdptr,#LEDMap
movca,@a+dptr
movLEDBuf+5,a
SAOMIAO:
callDisplayLED
MOVA,NUM
CJNEA,#00H,SJBO1;跳到三角波1
;//***************正弦波1T=7168Us,h=140Hz***************************//
ZXBO1:
callDisplayLED
MOVA,#01H
MOVP1,A
MOVR7,#0FFH;正弦函数数据表共有256个数即FFH个
MOVR6,#00H
DA01:
MOVDPTR,#TAB;函数表首地址给DPTR
MOVA,R6
MOVCA,@A+DPTR
MOVDPTR,#CS0832
MOVX@DPTR,A
INCR6
DJNZR7,DA01;数据输完则返回重新检查波形选择是否改变
LCALLTEST
;//***************三角波1T=8ms,h=125Hz*****************************//
SJBO1:
callDisplayLED
CJNEA,#01H,FXBO1;跳到方波1
MOVA,#02H
MOVP1,A
MOVA,#00H
UP0:
MOVDPTR,#CS0832
MOVX@DPTR,A
INCA
CJNEA,#250,UP0;A=250跳转反之顺序执行
DOWN1:
DECA
MOVX@DPTR,A
CJNEA,#00,DOWN1;为了对称性使用相同的跳转语句
LCALLTEST
;//*************方波1T=2ms,h=500Hz********************************//
FXBO1:
callDisplayLED
CJNEA,#02H,JCBO1;跳到锯齿1
MOVA,#04H
MOVP1,A
MOVA,#250
MOVDPTR,#CS0832
MOVX@DPTR,A
LCALLDELAY1;调高1ms延时程序
MOVA,#00H
MOVX@DPTR,A
LCALLDELAY1;调低电平延时程序
LCALLTEST
;//**************锯齿波1T=4ms,h=250Hz******************************//
JCBO1:
callDisplayLED
CJNEA,#03H,ZXBO2
MOVA,#08H
MOVP1,A
MOVA,#00H
UP1:
MOVDPTR,#CS0832
MOVX@DPTR,A
INCA
CJNEA,#250,UP1;A=250跳转反之顺序执行
LCALLTEST
;//*************正弦波2T=11264us,h=90Hz****************************//
ZXBO2:
callDisplayLED
CJNEA,#04H,SJBO2
MOVA,#01H
MOVP1,A
MOVR7,#0FFH;正弦函数数据表共有256个数即FFH个
MOVR6,#00H
DA02:
MOVDPTR,#TAB;函数表首地址给DPTR
MOVA,R6
MOVCA,@A+DPTR
MOVDPTR,#CS0832
MOVX@DPTR,A
INCR6
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP;共9个
DJNZR7,DA02;数据输完则返回重新检查波形选择是否改变
LCALLTEST
;//****************三角波2T=3500us,h=286Hz****************************//
SJBO2:
callDisplayLED
CJNEA,#05H,FXBO2;跳到方波2
MOVA,#02H
MOVP1,A
MOVA,#00H
UP02:
MOVDPTR,#CS0832
MOVX@DPTR,A
INCA
CJNEA,#125,UP02;A=250跳转反之顺序执行
DOWN12:
DECA
MOVX@DPTR,A
CJNEA,#00,DOWN12;为了对称性使用相同的跳转语句
LCALLTEST
;//*************方波2T=4ms,h=250Hz**********************************//
FXBO2:
callDisplayLED
CJNEA,#09H,JCBO2;跳到锯齿波2
MOVA,#04H
MOVP1,A
MOVA,#250
MOVDPTR,#CS0832
MOVX@DPTR,A
ACALLDELAY2;调高2ms延时程序
MOVA,#00H
MOVX@DPTR,A
ACALLDELAY2;调低电平延时程序
LCALLTEST
;//******************锯齿波2T=10Ms,H=100Hz*******************************//
JCBO2:
;callDisplayLED
MOVA,#07H
MOVP1,A
MOVA,#00H
UP12:
MOVDPTR,#CS0832
MOVX@DPTR,A
INCA
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
CJNEA,#250,UP12;A=250跳转反之顺序执行
LCALLTEST
;//**************************两个延时子程序***************************//
DELAY1:
;1ms延