基于单片机的电子贺卡设计.docx
《基于单片机的电子贺卡设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的电子贺卡设计.docx(31页珍藏版)》请在冰豆网上搜索。
基于单片机的电子贺卡设计
基于单片机的电子贺卡设计
引言
如今,电子技术获得了飞速的发展,现代电子产品几乎渗透了社会的各个领域。
目前,单片机正朝着高性能个多品种方向发展趋势将是进一步想着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路装化等几个方面发展。
单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。
相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。
概括的讲:
一块芯片就成了一台计算机。
它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。
同时,学习使用单片机是了解计算机原理与结构的最佳选择。
单片机内部也用和电脑功能类似的模块,比如CPU,内存,并行总线,还有和硬盘作用相同的存储器件,不同的是它的这些部件性能都相对我们的家用电脑弱很多,不过价钱也是低的,一般不超过10元即可。
单片机具有体积小、功耗低、控制功能强、扩展灵活、微型化和使用方便等优点,广泛应用于仪器仪表中,结合不同类型的传感器,可实现诸如电压、功率、频率、湿度、温度、流量、速度、厚度、角度、长度、硬度、元素、压力等物理量的测量。
采用单片机控制使得仪器仪表数字化、智能化、微型化,且功能比起采用电子或数字电路更加强大。
例如精密的测量设备(功率计,示波器,各种分析仪)。
目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。
因此,单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。
利用单片机实现音乐播放有很多要点,例如外部电路简单,控制方便等,因而备受广大单片机爱好者的喜爱。
通过音乐发声器的设计方案,掌握C语言的编程方法。
并熟练的运用AT89C52单片机定时器产生固定频率的方波信号,推动喇叭发出旋律,按下单键可以演奏预先设置的歌曲旋律,最重要的是自己还可以通过程序设计输入自己喜欢的歌曲来演奏,本设计采用简易音阶编码直觉式输入法方便设计音乐旋律。
三、音乐基础知识
3.1音乐基础
音作为一种物理现象,是由于物体振动而产生的,振动产生的声波作用于人耳,听觉系统将神经冲动传达给大脑,进而产生听觉。
人耳能听到的声音频率大约在11—20000Hz,而音乐使用的音一般在27—4100Hz。
乐音体系中各音级的名称叫做音名,被广泛采用的是CDEFGAB(doremifasolasi则多用于歌唱,称为唱名)。
乐音体系中音高关系的最小计量单位叫做半音,两个半音构成一个全音。
乐音中有几十个高低不同的音,但是最基本只有这七个音,其他高、低音名都是在这个基础上变化出来的。
乐谱表上用来表示正在进行的音的长短的符号,叫做音符。
不同的音符代表不同的长度。
音符有以下几种:
全音符、二分音符、四分音符、八分音符、十六分音符、三十二分音符、六十四分音符。
此外,还有附点音符,它就是指带附点的音符,所谓附点就是记在音符右边的小圆点,表示增加前面音符时值的一半。
音持续的长短即时值,一般用拍数表示,休止符表示暂停发音。
一首音乐就是由许多不同的音符组成的,而每一个音符对应着不同的频率,这样就可以利用不同的频率的组合,加以拍数对应的延时来构成不同的音乐。
3.2音调脉冲和音乐节拍的实现
3.2.1音调脉冲的产生
音调表示一个音符唱多高的频率,和平时所说的“音高”十分类似。
这是音乐学中的名词,在音乐中常把中央C上方的A音定为标准音高,其频率f=440Hz。
其余音均通过和其比较获得。
如果f1和f2两个音符的频率相差一倍时,也即f2=2×f1时,则称f2比f1高一个倍频程。
音符1(低音do)与音符i(中音do),……,等之间正好相差一个倍频程,在音乐学中一般称其相差一个八度音。
音乐中规定,在一个八度音内,共有12个半音。
以1—八音区为例,这12个半音分别是:
1—#1、#1—2、2—#2、#2—3、3—4、4—#4,#4—5、5—#5、#5—6、6—#6、#6—7、7—i。
由于人耳的听觉效果是非线性的,因此这12个音阶的分度基本上是以对数关系来划分的。
要让单片机产生音频脉冲,只要计算出某一音频的周期,将此周期除以2得到半周期,利用定时器对此半周期进行定时,每当定时时间到,将P1.7口线上的电平取反,从而得到所需要的音频脉冲。
产生音频的定时器初值计算公式如下:
式中,k根据单片机工作方式确定,可为13(方式0)、16(方式1)、8(方式2),
fosc为单片机工作频率,
为希望产生的音频。
例如中音DO的频率为523Hz,若单片机的工作频率为12MHz,定时器T0设置为工作方式1,按以上公式计算得定时器初值为64580;高音DO的频率为1047Hz,计算定时器初值为65058。
3.2.2音乐节拍的产生
节拍表示一个音符唱多长的时间,同样是音乐学中的名词。
在一张完整乐谱的开头,都有如1=C、1=G……等的标识。
例如图3-2所示为1=C的节拍示意图。
这里的、用来表示节拍,而1=C、1=G表示一个乐谱的曲调,简单地说就是跟音调有关系。
图3-2节拍示意图
可以通过延时程序来产生不同的节拍。
如果1拍为0.4秒,则1/4为0.1秒,只要设定延时时间就可以求得节拍时间。
例如一段延时程序Delay为1/4拍,则一拍只要调用4次Delay程序,依此类推。
3.2.3音符码表的编制
编写一段音乐的音符码表时,先把乐谱的音符找出,按表3-1建立对应的音调码码及定时器初值表,按表3-2建立节拍码表。
每个音符使用1个字节,字节的高4位存放音符的音调码,低4位存放音符的节拍码。
表3-1与音符对应的音调码表和定时器初值表(fosc=12MHz)
简谱
发声
音调码
定时器初值
5
低音SO
1
FB04
6
低音LA
2
FB90
7
低音SI
3
FC09
1
中音DO
4
FC44
2
中音RE
5
FCAC
3
中音ME
6
FD09
4
中音FA
7
FD34
5
中音SO
8
FD82
6
中音LA
9
FDC8
7
中音SI
A
FE06
1
高音DO
B
FE22
2
高音RE
C
FE56
3
高音ME
D
FE85
4
高音FA
E
FE9A
5
高音SO
F
FEC1
不发音
0
用C语言将音调码表和定时器初值表表示出来即为:
ucharcodeTABLE[]={//音符对应的定时器初值表
0xfb,0x04,0xfb,0x90,0xfc,0x09,0xfc,0x44,
0xfc,0xac,0xfd,0x09,0xfd,0x34,0xfd,0x82,
0xfd,0xc8,0xfe,0x06,0xfe,0x22,0xfe,0x56,
0xfe,0x85,0xfe,0x9a,0xfe,0xc1};
表3-2节拍码表
节拍码
节拍数
1
1/4拍
2
2/4拍
3
3/4拍
4
1拍
5
1又1/4拍
6
1又2/4拍
8
2拍
A
2又2/4拍
C
3拍
F
3又3/4拍
按照上述原理可以编写出“AmazingGrace”乐曲的音符码表。
“AmazingGrace”的简谱如下:
5.|1-31|3-2|1-6.|5.-5.|1-31|3-2|5--|5-|
3|5·353|1-5.|6·116.|5.-5.|1-31|3-2|1--|1-|
对应的音符码表为:
ucharcodeGRACE[]={//《奇异恩典》音符码表
0x14,0x48,0x62,0x42,0x68,0x54,0x48,0x24,0x18,
0x14,0x48,0x62,0x42,0x68,0x54,0x8c,0x88
0x64,0x86,0x62,0x82,0x62,0x48,0x14,0x26,0x42,0x42,0x22,0x18,
0x14,0x48,0x62,0x42,0x68,0x54,0x4c,0x48,0x00};
3.3主程序流程图
如图3-3所示为主程序流程图。
N
Y
图3-3主程序流程图
3.4发声模块程序设计
如图3-4所示为发声模块程序流程图。
Y
N
NY
图3-4发声模块程序流程图
3.5按键模块程序设计
本设计中采用4个按键来控制音乐的播放:
Key0控制上一曲播放;Key1开始播放;Key2控制下一曲播放;Key3暂停播放。
主程序中放置了3首歌曲,分别是"AmazingGrace";"OdeToJoy";"HappyBirthday"。
进入主程序后,判断开始键是否按下,若按下,则按顺序循环播放这3首歌曲。
开始播放后,通过控制4个按键来控制歌曲的播放。
图3-5为按键模块程序流程图
N
N
Y
YY
N
N
Y
图3-5按键模块程序流程图
四、硬件电路设计
硬件电路主要由AT89C52单片机、三极管音频功放电路(图中为理想原件,有三极管的音频放大可以增加声音效果)和蜂鸣器部分组成,电路结构比较简单。
仿真图如下图所示:
4.1主要器件
4.1.1微处理器
AT89C52的功能全部兼容MCS-51,并且还有程序加密等功能,相对而言更加实用。
AT89C52单片机是美国ATMEL公司生产的低电压,高性能CMOS8位微控制器,片内含8KB的可反复擦写的只读程序存储器和256字节的随机存取存储器,器件采用ATMEL公司的高密度、非易失性存储技术生产,与标准MCS-51指令系统及805日1产品引脚兼容,片内置通用8位中央处理器(CPU)和Flash存储单元,其强大的功能更适合较为复杂的控制应用场合。
其主要工作特性是:
片内程序存储器内含8KB的Flash程序存储器,可擦写寿命为1000次;片内数据存储器内含256字节的RAM;具有32根可编程I/O口线;具有3个可编程定时器;中断系统是具有8个中断源、6个中断矢量、2级优先权的结构;串行口是具有一个全双工的可编程串行通信口;具有一个数据指针DPTR;低功耗工作模式有空闲模式和掉电模式;具有可编程的3级程序锁定位;AT89C52工作电源电压为5(1±0.2)V,且典型值为5V;AT89C52最高工作频率为24MHZ。
下图为AT89C51单片机的实物图与引脚图:
图4-2AT89C52单片机的实物图与引脚图
引脚功能描述如下:
P0口:
—8位、漏极开路的双向I/O口。
当使用片外存储器及外扩I/O口时,P0口作为低字节地址/数据复用线。
在编程时,P0口可用于接收指令代码字节;在校验时,P0口可输出指令字节(须外加上拉电阻)。
P0口也可做通用I/O口使用,但需加上拉电阻,变为准双向口。
当作为普通输入时,应将输出锁存器置1。
P0口可驱动8个TTL负载。
P1口:
—8位、准双向I/O口,具有内部上拉电阻。
P1口是为用户准备的I/O口双向口。
在编程和校验时,可用做输入低8位地址。
用做输入时,应先将输出锁存器置1。
P1口可驱动4个TTL负载。
P2口:
—8位、准双向I/O口,具有内部上拉电阻。
当使用片外存储器或外扩I/O口时,P2口输出高8位地址。
在编程/校验时,P2口可接收高字节地址和某些控制信号。
P2口也可做普通I/O口使用。
用做输入时,应先将输出锁存器置1。
P1口可驱动4个TTL负载。
P3口:
—8位、准双向I/O口,具有内部上拉电阻。
P3口可做普通I/O口使用。
用作输入时,应先将输出锁存器置1。
在编程/校验时,P3口接收某些控制信号。
它可驱动4个TTL负载。
RST:
复位输入。
晶振工作时,RST脚持续2个机器周期高电平将使单片机复位。
看门狗计时完成后,RST脚输出96个晶振周期的高电平。
特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能无效。
DISRTO默认状态下,复位高电平有效。
ALE/PROG:
地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8位地址的输出脉冲。
在flash编程时,此引脚(PROG)也用作编程输入脉冲。
在一般情况下,ALE以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。
然而,特别强调,在每次访问外部数据存储器时,ALE脉冲将会跳过。
如果需要,通过将地址为8EH的SFR的第0位置“1”,ALE操作将无效。
这一位置“1”,ALE仅在执行MOVX或MOVC指令时有效。
否则,ALE将被微弱拉高。
这个ALE使能标志位(地址为8EH的SFR的第0位)的设置对微控制器处于外部执行模式下无效。
PSEN:
外部程序存储器选通信号(PSEN)是外部程序存储器选通信号。
当AT89S52从外部程序存储器执行外部代码时,PSEN在每个机器周期被激活两次,而在访问外部数据存储器时,PSEN将不被激活。
EA/VPP:
访问外部程序存储器控制信号。
为使能从0000H到FFFFH的外部程序存储器读取指令,EA必须接GND。
为了执行内部程序指令,EA应该接VCC。
在flash编程期间,EA也接收12伏VPP电压。
XTAL1:
振荡器反相放大器和内部时钟发生电路的输入端。
XTAL2:
振荡器反相放大器的输出端。
4.1.2开关元件
独立按键是51单片机应用系统中最常用的人机交互通道之一,它通常用于给用户提供向51单片机输入信息的通道。
独立按键的基本工作原理是:
按键按下时接通两个点,放开时则断开这两个点。
按照结构可以把按键分为两类:
触点式开关按键,如机械式开关、导电橡胶式开关等;无触点式开关按键,如电气式按键,磁感应按键等。
本设计的控制电路采用4个独立按键,如图4.1.2所示。
从左至右:
Key0与P1.0口相连,播放上一曲;Key1与P1.1口相连,开始播放;Key2与P1.2口相连,播放下一曲;Key3与P1.3口相连,暂停播放。
当按键按下时,接口接收到低电平,从而实现对音乐器的控制。
图4.1.2控制电路
4.2发声驱动电路
蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。
图2-4所示为蜂鸣器实物图。
图2-4蜂鸣器实物图
蜂鸣器按其结构主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。
压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。
多谐振荡器由晶体管或集成电路构成。
当接通电源后(1.5~15V直流工作电压),多谐振荡器起振,输出1.5~2.5kHZ的音频信号,阻抗匹配器推动压电蜂鸣片发声。
压电蜂鸣片由锆钛酸铅或铌镁酸铅压电陶瓷材料制成。
在陶瓷片的两面镀上银电极,经极化和老化处理后,再与黄铜片或不锈钢片粘在一起。
电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。
接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场。
振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。
蜂鸣器按其是否带有信号源又分为有源和无源两种类型。
有源蜂鸣器只需要在其供电端加上额定直流电压,其内部的震荡器就可以产生固定频率的信号,驱动蜂鸣器发出声音。
无源蜂鸣器可以理解成与喇叭一样,需要在其供电端上加上高低不断变化的电信号才可以驱动发出声音。
用单片机控制蜂鸣器发出不同频率的声音,最好采用无源的蜂鸣器,如果用有源蜂鸣器,可以会因为二种不同频率声音(有源蜂鸣器本身固有发音频率与单片机驱动频率)互相叠加,造成效果混乱、发音不清。
4.3电路工作原理
当按下按键,P1.0口输出音乐脉冲,脉冲信号首先经过由电容C1和C2组成的回路输入到单片机XTAL1XTAL2.输入信号经过晶振处后,从Vout输出,送入到P0.0脚。
并且串联一个限流电阻R2,用以保护蜂鸣器的正常工作。
经过此电路后,单片机发出的不同频率的音频信号就可以通过蜂鸣器发出想要的歌曲。
五、软件设计
软件设计是指在硬件电路的基础上,以程序的形式实现算法,进而实现音乐播放器的功能。
软件是整个控制系统设计的核心,采用模块化设计,具有充分的灵活性,在硬件结构不变的情况下,只需要改变软件就能实现一些不同的功能,满足用户多样性需求。
本系统采用模块化的编程思想,把整个软件系统化分为多个功能模块,主程序通过调用各个子程序来完成各个功能的实现。
软件的程序主要由主程序、发声模块程序、控制模块程序、LCD1602显示程序组成。
本设计使用KeilμVison3软件完成程序的编写和调试。
5.1软件开发平台
KeilμVison系列是德国KeilSoftware公司推出的51系列兼容单片机软件开发系统。
μVison3是集成的可视化Windows操作界面,其提供了丰富的库函数和各种编译工具,能够对51系列单片机以及和51系列兼容的绝大部分类型的单片机进行设计。
KeilμVison系列可以支持单片机C51程序设计语言,也可以直接进行汇编语言的设计与编译。
目前,Keil公司已经被ARM公司收购,成为ARM旗下的产品。
KeilμVison系列的集成开发环境最高版本是μVison3,版本号为V8.08。
KeilμVison系列是一个非常优秀的编译器,受到广大单片机设计者的广泛使用。
其主要特点如有:
支持汇编语言、C51语言等多种单片机设计语言;可视化的文件管理,界面友好;支持丰富的产品线,除了51及其兼容内核的单片机外,还新增加了对ARM内核产品的支持;具有完善的编译连接工具;具备丰富的仿真调试功能,可以仿真串口、并口、A/D、D/A、定时器/计数器以及中断等资源,同时也可以和外部仿真器联合进行在线调试;内嵌RTX-51实时多任务操作系统;支持在一个工作空间中进行多项目的程序设计。
支持多级代码优化。
5.2详细的程序设计
详细的程序设计如下:
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitSPEAK=P1^7;//定义蜂鸣器输出端口
sbitKey0=P1^0;//定义独立按键
sbitKey1=P1^1;
sbitKey2=P1^2;
sbitKey3=P1^3;
sbitRS=P2^0;//定义控制引脚
sbitRW=P2^1;
sbitE=P2^2;
ucharbeat,tl,th;//定义节拍和T0初值变量
ucharcodeTABLE[]={//音符对应的定时器初值表
0xfb,0x04,0xfb,0x90,0xfc,0x09,0xfc,0x44,
0xfc,0xac,0xfd,0x09,0xfd,0x34,0xfd,0x82,
0xfd,0xc8,0xfe,0x06,0xfe,0x22,0xfe,0x56,
0xfe,0x85,0xfe,0x9a,0xfe,0xc1};
ucharcodeGRACE[]={//《奇异恩典》音符码表
0x14,0x48,0x62,0x42,0x68,0x54,0x48,0x24,0x18,
0x14,0x48,0x62,0x42,0x68,0x54,0x8c,0x88,
0x64,0x86,0x62,0x82,0x62,0x48,0x14,0x26,0x42,0x42,0x22,0x18,
0x14,0x48,0x62,0x42,0x68,0x54,0x4c,0x48,0x00};
ucharcodeJOY[]={//《欢乐颂》音符码表
0x64,0x64,0x74,0x84,0x84,0x74,0x64,0x54,0x44,0x44,0x54,0x64,0x66,0x52,0x58,
0x64,0x64,0x74,0x84,0x84,0x74,0x64,0x54,0x44,0x44,0x54,0x64,0x56,0x42,0x48,
0x54,0x54,0x64,0x44,0x54,0x62,0x72,0x64,0x44,0x54,0x62,0x72,0x64,0x54,0x44,0x54,0x18,
0x64,0x64,0x74,0x84,0x84,0x74,0x64,0x54,0x44,0x44,0x54,0x64,0x56,0x42,0x48,0x00};
ucharcodeHAPPY[]={//《生日快乐》音符码表
0x82,0x01,0x81,0x94,0x84,0xB4,0xA4,0x04,
0x82,0x01,0x81,0x94,0x84,0xC4,0xB4,0x04,
0x82,0x01,0x81,0xF4,0xD4,0xB4,0xA4,0x94,
0xE2,0x01,0xE1,0xD4,0xB4,0xC4,0xB4,0x04,
0x82,0x01,0x81,0x94,0x84,0xB4,0xA4,0x04,
0x82,0x01,0x81,0x94,0x84,0xC4,0xB4,0x04,
0x82,0x01,0x81,0xF4,0xD4,0xB4,0xA4,0x94,
0xE2,0x01,0xE1,0xD4,0xB4,0xC4,0xB4,0x04,
0x00};
ucharcodeGRACE_Name[]="AmazingGrace";
ucharcodeJOY_Name[]="OdeToJoy";
ucharcodeHAPPY_Name[]="HappyBirthday";
voidTimer0_Initialize();
voidDelay_1ms(ucharms);
voidDelay(uchar);
voidKey_Scan(char*numz,uchar*kz);
ucharBusy_Check();
voidLCD_Write_Command(ucharcmd);
voidLCD_Initialize();
voidShow_String(ucharx,uchary,uchar*str);
voidmain()
{
ucharm,m1,k=0;//定义临时变量
charnum=0;
char*numz;
uchar*kz;
uchar*p[3];
uchar*q[3];
numz=#
kz=&k;
p[0]=GRACE;p[1]=JOY;p[2]=HAPPY;
q[0]=GRACE_Name;q[1]=JOY_Name;q[2]=HAPPY_Name;
Timer0_Initialize();
LCD_Initialize();
while(Key1);
Delay_1ms(5);
while(Key1);
while
(1)
{
while(*(p[num]+k)!
=0)//判断取得的音符码是否为结束码
{
beat=*(p[num]+k)&0x0f;//取节拍码
m=_crol_(*(p[num]+k),4)&0x0f;//取音调码
if(m!
=0)//判