电子琴单片机课设.docx
《电子琴单片机课设.docx》由会员分享,可在线阅读,更多相关《电子琴单片机课设.docx(25页珍藏版)》请在冰豆网上搜索。
电子琴单片机课设
摘要
本系统利用单片机AT89S52采用程序设计方法产生锯齿波、正弦波、矩形波三种波形,再通过D/A转换器DAC0832将数字信号转换成模拟信号,滤波放大,能产0.1Hz—50Hz的波形。
通过键盘来控制三种波形的类型选择、频率变化,系统大致包括信号发生部分、数/模转换部分二部分,其中尤其对数/模转换部分和波形产生和变化部分进行详细论述。
关键词单片机、AT89S52、DAC0832、,频率
Abstract
thissystemcapitalizeonAT89S52,itmakesuseofcentralprocessortogeneratethreekindsofwaves,theyaretrianglewave,anduseD/Aconversionmodule,wavegeneratemodule,itcanhavethe0.5Hz-50Hzprofile.Inthissystemitcancontrolwaveformchoosing,frequency,range,canhavethesinewave,thesquare-wave,thetriangularwave.Simultaneouslymayalsotakethefrequencymeasurementfrequency,.thisdesignincludestwomodules.TheyareD/Aconversionmodule,wavegeneratemodule.Inthisdesign,thewavegeneratorintowaveformmoduleandD/Aconversionmodulearediscussedindetail.
keywordSCM、AT89S52、DAC0832、frequency
目录
摘要I
AbstractII
1引言1
2系统设计2
2.1电子琴方案选取2
2.2电子琴的原理与总体结构2
2.2.1单片机的外部引脚说明3
2.3电子琴模块设计5
2.3.1键盘的方案选择6
2.3.2音频放大7
2.3.3时钟电路分析8
2.3.4复位电路的论证和分析8
2.4电子琴C语言设计9
2.4.1系统程序流程9
2.4.2程序清单10
结论13
致谢14
参考文献15
附录16
1引言
我们所处的时代是一个知识爆炸的新时代。
新产品、新技术层出不穷,电子技术的发展更是日新月异。
或以毫不夸张的说,电子技术的应用无处不在,电子技术正在不断地改变着我们的生活,改变着我们的世界。
单片机是为满足工业控制而设计的,具有良好的实时控制用灵活的嵌入品质,近年来在智能仪器仪表、机电一体化产品,实时工业控制、分布系统的前端模块和家用电器等领域都获得了极为广泛的应用。
单片机作为一片集成电路芯片,它自身没有开发功能,必须借助开发机完成应用系统的硬件故障和软件错误的排除,高度完的程序还要固化到单片机内部或外部程序存储器芯片中。
80C51系列单片机应用广泛,生产量大,在单片机领域里具有重要影响。
其它新型单片机产品的出现,使单片机领域出现了日新月异的景象。
设计任务和目的:
基于单片机的简易低频信号源的设计。
用单片机设计出一个简易低频信号源。
此信号源完成产生正弦波、三角波和方波功能。
该低频信号源基本功能:
能输出0.1-50Hz的正弦波、三角波和方波信号,其中正弦波和三角波信号可以用按键选择输出,输出信号的频率可以在0.1-50Hz范围内任意调整。
由于要求的输出信号频率较低,因此考虑使用单片机作为控制器,用中断查表发完成波形数据的输出,再用D/A转换器输出规定的波形信号。
方波信号直接由单片机的端口输出。
训练目标:
熟练使用Keil开发环境,具备编写单片机程序(汇编语言或C语言)的初步能力,通过完成本课题的软硬件设计,使同学们了解单片机实例的整个开发流程。
2系统设计
2.1低频信号源方案选取
经过考虑,我们确定方案如下:
利用AT89S52单片机采用程序设计方法产生三角波波、正弦波、矩形波三种波形,再通过D/A转换器DAC0832将数字信号转换成模拟信号,滤波放大,通过键盘来控制三种波形的类型选择。
通过单片机控制D/A,输出三种波形。
此方案输出的波形不够稳定,抗干扰能力弱,不易调节。
但此方案电路简单、成本低。
2.2低频信号源原理与总体结构
8051单片机根据不同的按键产生不同的波形,并经过信号放大,整形。
系统整体方案如图所示:
正正弦波
(三角波)
方波
图2.1系统原理框图
此次设计应用的单片机为80C51,设计中主要应用了他的P1口、P3.0、P3.1、P3.2、P3.7、复位RST口、片选口、外接晶振引脚和P1.0口,单片机80C51的外部引脚配置如图2.2所示,
图2.251系列的外部引脚配置
2.2.1单片机的外部引脚说明
VCC:
供电电压。
GND:
接地。
P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门流。
当P1口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。
P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为第八位地址接收。
P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89S51的一些特殊功能口,如下表所示:
表2.1P3口的第二功能
P3口引脚
第二功能
P3.0
RXD(串行口输入)
P3.1
TXD(串行口输出)
P3.2
INT0(外部中断0输入)
P3.3
INT1(外部中断1输入)
P3.4
T0(定时器0外部脉冲输入)
P3.5
T1(定时器1外部脉冲输入)
P3.6
WR(外部数据存储器写脉冲输出)
P3.7
RD(外部数据存储器读脉冲输出)
P3口同时为闪烁编程和编程校验接收一些控制信号。
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
2.2.2DAC0832外部引脚说明
DAC0832是目前应用较为广泛的8位D/A转换芯片之一。
它具有与微机接口简便、易于操作控制和使用灵活等优点。
DAC0832采用R-2RT型网络转换法。
其主要参数如下:
分辨率为8位,转换时间为1μs,满量程误差为±1LSB,参考电压为(+10~-10)V,供电电源为(+5~+15)V,逻辑电平输入与TTL兼容。
它由两级缓冲寄存器(8位输入寄存器,8位DAC寄存器)和DA转换电路组成,可直接与CPU总线连接。
输入寄存器用来所存数据总线上输入的数据。
当输入锁存允许ILE、片选信号CS和写WR1同时有效时,数据总线(DI7~DI0)上的数据送数据寄存器锁存。
当传送控制XFER和写WR同时有效时,输入寄存器中的数据送DAC转换器,然后由DA转换电路进行转换,最后在Iout1和Iout2端获得模拟量输出[2]。
VREF为参考电压输入端,用来将外部基准电压与片内T型电阻网络连接。
Rfb为反馈信号输入,片内已有反馈电阻,因此只需由Rfb端接入反馈信号即可。
图2.3DAC0832引脚图
2.3低频信号源设计
2.3.1总体设计
2.3.2键盘的方案选择
此系统琴键输入是通过独立式键盘来完成的。
由于8051单片机的八位I/O口足以能实现控制波形的输出,并且独立式键盘的编程容易易懂,结构简单,实现起来方便,而且每个按键单独占有一根I/O接口线,每个I/O口的工作状态互不影响,所以采用独立式键盘。
P3.0~P3.2口分别对应琴键1~7输入,如下图所示。
图2.4键盘电路
关于键盘的抖动问题的分析和解决
当用手按下一个键时,如图3所示,往往按键在闭合位置和断开位置之间跳几下才稳定到闭合状态的情况;在释放一个键时,也回会出现类似的情况。
这就是抖动。
抖动的持续时间随键盘材料和操作员而异,不过通常总是不大于10ms。
很容易想到,抖动问题不解决就会引起对闭合键的识别。
用软件方法可以很容易地解决抖动问题,这就是通过延迟10ms来等待抖动消失,这之后,在读入键盘码
图2.5键抖动信号波形
2.3.3数模转换模块设计
数模转换模块是该系统的核心部分,如果该部分设计不当,则无法进行数字信号和模拟信号的转换。
由于DAC0832的输入寄存器和DAC寄存器的不同控制方式,即有三种工作方式:
一是单缓冲方式,数据先进过输入寄存器,然后再经过DAC寄存器,最后在送入D/A转换电路。
二是双缓冲方式,即数据进入两级缓冲器后进入D/A转换电路。
三直通方式,即是数据直接送入D/A转换电路。
,由于本系统只有一路模拟信号输出,即只产生出一路波。
故采用单缓冲方式,这样可以提高DAC0832的吞吐量。
将AT89C51的P0口的输出口与DAC0832的8条数字输入口相连接,由于WR1和WR2端与AT89C51的写信号端相连,同时接低电平,使得8个数字输入信号可先经过内部输入寄存器,然后在到DAC寄存器中,最后进入转换电路,这样就可以得到单缓冲方式。
CPU每对AT89C51执行一次写操作,数据就进入DAC寄存器,则从示波器上的模拟信号就会随之变化。
其连接方式如图3-3:
图3-3DAC0832与AT89C51连接图
2.3.4时钟电路分析
此系统的时钟电路设计是采用的内部方式,即利用芯片内部的振荡电路。
MCS-51内部有一个用于构成振荡器的高增益反相放大器。
引脚XTAL1和XTAL2分别是此放大器的输入端和输出端。
这个放大器与作为反馈元件的片外晶体谐振器一起构成一个自激振荡器。
外接晶体谐振器以及电容CX1和CX2构成并联谐振电路,接在放大器的反馈回路中。
对外接电容的值虽然没有严格的要求,但电容的大小会影响震荡器频率的高低、震荡器的稳定性、起振的快速性和温度的稳定性。
因此,此系统电路的晶体振荡器的值为6MHz,电容应尽可能的选择陶瓷电容,电容值约为22μF。
在焊接刷电路板时,晶体振荡器和电容应尽可能安装得与单片机芯片靠近,以减少寄生电容,更好地保证震荡器稳定和可靠地工作。
图6为复位电路的原理图。
图2.7单片机片内振荡电路
2.3.5复位电路的论证和分析
MS-51的复位是由外部的复位电路来实现的。
片内复位电路是复位引脚RST通过一个斯密特触发器与复位电路相连,斯密特触发器用来抑制噪声,它的输出在每个机器周期的S5P2,由复位电路采样一次。
复位电路通常采用上电自动复位和按钮复位两种方式,此电路系统采用的是上电与按钮复位电路,如图7所示。
当时钟频率选用6MHz时,C取22μF,Rs约为200Ω,Rk约为1KΩ。
2.4电子琴C语言设计
2.4.1系统程序流程
N
Y
查表子程序流程
波型产生子程序流程
2.4.2程序清单
#include"reg51.h"
#defineucharunsignedchar
#defineuintunsignedint
#definekeyP3
#definedataoutP1
ucharcodesin_tab[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};
ucharcodethr_tab[256]=
{0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,
0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,
0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,
0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,
0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf,
0xbf,0xbe,0xbd,0xbc,0xbb,0xba,0xb9,0xb8,
0xb7,0xb6,0xb5,0xb4,0xb3,0xb2,0xb1,0xb0,
0xaf,0xae,0xad,0xac,0xab,0xaa,0xa9,0xa8,
0xa7,0xa6,0xa5,0xa4,0xa3,0xa2,0xa1,0xa0,
0x9f,0x9e,0x9d,0x9c,0x9b,0x9a,0x99,0x98,
0x97,0x96,0x95,0x94,0x93,0x92,0x91,0x90,
0x8f,0x8e,0x8d,0x8c,0x8b,0x8a,0x89,0x88,
0x87,0x86,0x85,0x84,0x83,0x82,0x81,0x80,
0x7f,0x7e,0x7d,0x7c,0x7b,0x7a,0x79,0x78,
0x77,0x76,0x75,0x74,0x73,0x72,0x71,0x70,
0x6f,0x6e,0x6d,0x6c,0x6b,0x6a,0x69,0x68,
0x67,0x66,0x65,0x64,0x63,0x62,0x61,0x60,
0x5f,0x5e,0x5d,0x5c,0x5b,0x5a,0x59,0x58,
0x57,0x56,0x55,0x54,0x53,0x52,0x51,0x50,
0x4f,0x4e,0x4d,0x4c,0x4b,0x4a,0x49,0x48,
0x47,0x46,0x45,0x44,0x43,0x42,0x41,0x40,
0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,
0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,
0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,
0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,
0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,
0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,
0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f,};
uintdataTHHL=65536;
uchardatakeyword,n=0;
bdatasinthr;
sbitsin_thr=sinthr^0;
sbitww=key^7;
keyscan()
{keyword=key&0x07;
if(keyword!
=0x07)
{while((key&0x07)!
=0x07);
switch(keyword)
{case6:
{if(THHL>=65536)THHL=65536;else{THHL=THHL+255;}break;}
case5:
{if(THHL<=500)THHL=0;else{THHL=THHL-255;}break;}
case3:
{sin_thr=~sin_thr;break;}
default:
{break;}}}}
clearmen()
{key=0xff,dataout=0x00;THHL=65536;
TH1=THHL/256;TL1=THHL%256;
TMOD=0x11;ET1=1;TR1=1;EA=1;}
main()
{clearmen();
while
(1)
{keyscan();
}}
voidtime_intt1(void)interrupt3
{EA=0;TR1=0;TH1=THHL/256;TL1%256;TR1=1;
if(sin_thr){dataout=sin_tab[n];}
else{dataout=thr_tab[n];}
if(n>=255){n=0;}else{n++;}
ww=~ww;
EA=1;}
结论
本研究通过制作电子琴,将几个模块很好的融合起来,对使用单片机设计简易电子琴进行了分析,并介绍了基于单片机电子琴系统硬件组成。
利用单片机产生不同频率来获得我们要求的音阶,将程序烧入芯片,调试成功后,最终可随意弹奏想要表达的音乐。
说明一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,于是我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可,然后我们利用功放电路来将音乐声音放大。
不足之处有:
1.可弹奏的音符数较少,只能在一定范围内满足用户需要。
可通过改进键盘识别模块和发生模块来增加其复杂度。
2.音量不可调。
可通过改进功放电路,即在lm386的1脚和8脚间增加一直外界电阻和电容,将3脚与地之间的电阻换为10k的变阻,即可调节其放大增益。
3.在制作实物过程中,由于器件的缺乏,我将设计中的LM386器件改成了三极管代替,为了方便接线和控制采用了独立式键盘来完成的。
由于8051单片机的八位I/O口足以能实现控制C调各音