基于单片机的电子音乐盒 - 图文

更新时间:2024-05-03 07:42:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

课 程 设 计 任 务 书

1.设计目的: 在学习专业基础课和专业课的基础上,主要在电子仪器、微机综合设计与实践、单片机与A/D和D/A和光、计、电综合应用等几个方面开展实践活动,巩固所学知识、培养动手能力。 2.设计内容和要求(包括原始数据、技术参数、条件、设计要求等): 1. 查阅资料,了解单片机控制单音喇叭发声原理。 2. 设计基于单片机的电子音乐盒。 3.通过按钮可选择不同的音乐。 4.其他创新功能。 每位同学分工不同 3.设计工作任务及工作量的要求〔包括课程设计计算说明书(论文)、图纸、实物样品等〕: 1)设计说明书符合要求; 2)相应器件的工作原理及应用; 3)系统的硬件原理图和制版图; 4)基于实验箱调试成功的系统软件程序和界面; 5)仿真结果 6)参考文献原文不少于15篇。

课 程 设 计 任 务 书

4.主要参考文献: ? 要求按国标GB 7714—87《文后参考文献著录规则》书写,例: 1 傅承义,陈运泰,祁贵中.地球物理学基础.北京:科学出版社,1985 (5篇以上) 5.设计成果形式及要求: 设计说明书及相关电路图 6.工作计划及进度: 2016年6 月12日 ~ 2016年6月14日:查相关的资料,熟悉单片机(或者FPGA、DSP、ARM)开发环境; 6 月15 日 ~ 6月18日:在教师指导下完成系统方案和电路设计; 6月19 日 ~ 6月28日:完成程序的调试,仿真,系统的优化; 6月 29日~ 6月30日::完成课程设计说明书的纂写和修改; 7月 1日 : 答辩 系主任审查意见: 签字: 年 月 日

目录

1引言 .............................................................. 3 2系统总体设计 ...................................................... 3

2.1系统组成框图................................................. 3 2.2音乐盒的功能结构图及说明..................................... 4 2.3 电子琴的功能结构图及说明 .................................... 4 2.4设计软件..................................................... 5

2.4.1 proteus............................................... 5 2.4.2 keil.................................................. 5

3 硬件设计.......................................................... 6

3.1 AT89C51简介................................................. 6 3.2 复位电路和时钟电路 .......................................... 7

3.2.1 复位电路.............................................. 8 3.2.2 时钟电路.............................................. 8 3.3 按键电路 ................................................... 9 3.4 4*4矩阵键盘电子琴.......................................... 9 3.5 数码管 ..................................................... 10 4软件设计 ......................................................... 10

4.1软件各功能模块的流程图设计及思路说明........................ 11 4.2 电子音乐的产生 ............................................ 12

4.2.1 音频脉冲的产生....................................... 12 4.2.2 音乐节拍 ............................................ 14 4.2.3 移调................................................. 15 4.2.4 音乐编码............................................. 16 4.2.5 歌曲播放设计......................................... 17 4.3 源程序代码 ................................................ 19 5 仿真............................................................ 19

5.1 硬件电路的仿真............................................. 19 5.2 软件电路的仿真............................................. 19

第 1 页 共 32 页

5.3 联调....................................................... 20 5.4仿真结果 ................................................... 20 6 课设心得......................................................... 21 7 参考文献......................................................... 21 附录1:源程序代码 ................................................. 21 附录2:PCB图...................................................... 20

第 2 页 共 32 页

1引言

音乐盒又称八音盒。音乐盒的起源,可追溯至中世纪欧洲文艺复兴时期。当时为使教会的的钟塔报时,而将大小的钟表上机械装置,被称为“可发出声音的组钟”。 1796年由瑞士钟表匠安托?法布尔发明,转动盒内的链环,可自动演奏音乐。这是最古老的音乐盒。1992年,中国第一台具有知识产权的八音琴在韵升诞生。

现代科技的发展为我们提供了更方便快捷的制作音乐盒的方式,不用经过繁琐的工艺,可以利用单片机自己制作一个简单的电子音乐盒,很有意义。

本文设计的电子音乐盒,就是基于单片机芯片设计制作的电子音乐盒。体积小巧,音质优美且能演奏和弦音乐。电子音乐盒以点为动力,制作工艺简单,且可批量生产,因此价格便宜。基于单片机芯片制作的电子式音乐盒,控制功能很强大,可根据需要选歌,使用方便。根据存储容量的大小,可以尽可能多的存储歌曲。另外,可以设计彩灯外观效果,使小小的音乐盒达到愉悦身心的目的。

2系统总体设计

2.1系统组成框图

音乐盒的系统结构以AT89C51单片机位控制核心,4*4矩阵键盘,加上2个按键、时钟复位电路、蜂鸣器、数码管6模块组成。单片机负责接收按键的输入,根据的输入按键所对应的音符蜂由鸣器发音。系统组成框图如图2.1所示。

图2.1 系统组成框图

第 3 页 共 32 页

2.2音乐盒的功能结构图及说明

本次设计主要设计了两个标志位,count1、count2,对应按键电路的key1、 key2,key1用来暂停歌曲,并实现 4*4矩阵键盘电子琴弹奏功能,key2用于切换本音

乐盒内的四首歌曲。功能结构图如下图2.2所示。

图2.2 电子音乐盒功能框图

2.3电子琴的功能结构图及说明

电子琴的功能结构如图2.3所示。4*4键盘按下获取相应的键值和音符有DO到XI高低音共16个音。并在数码管上显示。

图2.3电子琴功能结构图

第 4 页 共 32 页

2.4设计软件

本设计主要使用两个软件,proteus、keil。用proteus进行硬件电路设计,用keil进行软件设计,使用proteus和keil进行联调,等程序功能都实现且调试好了之后,实现电子音乐盒的设计与制作。 2.4.1 proteus

Proteus软件是英国Labcenter electronics公司出版的EDA工具软件。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具。Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台。且在编译方面,它支持IAR、Keil和MPLAB等多种编译器。可以与他们进行联调,结合使用。 2.4.2 keil

Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。使用C语言编程,Keil是很好的选择。

Keil公司是一家业界领先的微控制器(MCU)软件开发工具的独立供应商。Keil公司由德国慕尼黑的Keil Elektronik GmbH和美国德克萨斯的Keil Software Inc公司联合运营。Keil公司制造和销售种类广泛的开发工具,包括ANSI C编译器、宏汇编程序、调试器、连接器、库管理器、固件和实时操作系统核心(real-time kernel)。Keil C51编译器自1988年引入市场以来成为事实上的行业标准,并支持超过500种8051变种。Keil公司在2005年被ARM公司收购。而后ARM Keil推出基于uVision界面,用于调试ARM7,ARM9,Cortex-M内核的MDK-ARM开发工具,用于为控制领域的开发。在使用单片机C语言开发时,

第 5 页 共 32 页

大多使用keil编程,与proteus进行联调,达到软硬件结合的目的。

3 硬件设计

本设计主要是以单片机AT89C51芯片为核心,由复位电路,时钟电路,按键电路,蜂鸣器,LED流水灯,LCD1602和数码管电路组成的,实现的功能如下,电路图如图3.1所示。

a) P3.2,P3.3控制按键 b) P1.0-P1.7控制4*4矩阵键盘 c) P3.7控制蜂鸣器 d) P2..0~P2.7数码管显示

e) 电路为11.0592MHZ晶振频率工作,起振电路中C1、C2均为30PF

图3.1 电路图

3.1 AT89C51简介

AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。

第 6 页 共 32 页

由于将多功能8位CPU和闪速存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C51是它的一种精简版本。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。管脚图如图3.2所示。

图3.2 AT89C51管脚

AT89C51的主要特性

a) 与MCS-51 兼容

b) 4K字节可编程FLASH存储器 c) 寿命:1000写/擦循环 d) 数据保留时间:10年 e) 全静态工作:0Hz-24MHz f) 三级程序存储器锁定 g) 128×8位内部RAM h) 32可编程I/O线 i) 两个16位定时器/计数器 j) 5个中断源 k) 可编程串行通道 l) 低功耗的闲置和掉电模式 m) 片内振荡器和时钟电路

3.2 复位电路和时钟电路

时钟电路和复位电路共同组成了单片机的最小系统,即最少的元件组成的单片机可以工作的系统。是单片机应用中不可缺少的一部分,若没有最小系统,好多的设计将不能完美运行。图3.3为本设计的复位电路和时钟电路。

第 7 页 共 32 页

图3.3 复位电路和时钟电路

3.2.1 复位电路

复位电路我们本来在方案选择的时候有两种选择的,上电复位和按扭复位,上电复位是利用电容充电来实现的,而按扭复位是电源对外节电容的充电使RST为高电平,复位松开后,电容通过下拉电阻放电,使RST恢复低电平。为了制作软件的方便我们还是选择用按扭复位,因为它比较直观。 3.2.2 时钟电路

单片机晶振的作用是为单片机系统提供基本的时钟信号,单片机晶振提供的时钟频率越高,单片机的运行速度就越快,单片机的一切指令的执行都是建立在单片机晶振提供的时钟频率。没有晶振,就没有时钟周期,没有时钟周期,就无法执行程序代码,单片机就无法工作。

89系列的时钟信号由两种方式产生,一种是利用芯片内部的震荡电路,产生时钟信号的内部方式,一种是时钟信号有外部引入的外部方式。内部时钟方式为:89系列单片机内部有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端,其频率范围为1.2~12MHz,这个放大器与作为反馈元件的片外石英晶体或者陶瓷谐振器一起构成自然振荡器。89系列单片机虽然有内部震荡电路,但要形成时钟,必须外接元件.外接晶振以及电容C2,C3构成并联谐振电路,接在放大器的反馈回路中,这种方式称为内部时钟方式。对外接电容C2,C3没有严格的要求,石英晶体的电容值一般使

第 8 页 共 32 页

所示

表4.2.1 C调音符频率计数值T的关系

低音 频率 T Do Re Mi Fa So La Si

262 294 330 349 392 440 494

62018 62401 62491 62895 63184 63441 63506

中音 频率 T Do Re Mi Fa So La Si

523 587 659 698 784 880 988

63773 63965 64137 64215 64360 64488 64603

高音 频率 T Do Re Mi Fa So La Si

1046 64654 1175 64751 1318 64836 1397 64876 1568 64948 1760 65012 1976

65067

本设计中,在11.0592MHz频率下,中央C调1~7和高8度1~7的计数值T即初值的十六进制数数值为:

uchar code chuzhi[]={0xff,0xff,//占位

0xFC,0x8E,0xFC,0xED,0xFD,0x43,0xFD,0x6A,0xFD,0xB3,0xFD,0xF3,0xFE,0x2D, 0xFE,0x47,0xFE,0x76,0xFE,0xA1,0xFE,0xC7,0xFE,0xD9,0xFE,0xF9,0xFF,0x16}; 4.2.2 音乐节拍

若要构成音乐,光有音调是不够的,还需要节拍,让音乐具有旋律(固定的律动),而且可以调节各个音的快满度。Beat,简单说就是打拍子,就像我们听音乐不自主的随之拍手或跺脚。若1拍实0.5s,则1/4 拍为0.125s。至于1拍多少s,并没有严格规定,只要听的悦耳就好。音持续时间的长短即时值,一般用拍数表示。休止符表示暂停发音。

在音乐中,最小的音符为十六分音符,即四分之一拍,所以只要延时函数设置为十六分音符的时间(165MS),其他的音符延时其的整数倍,就可得到相应的节拍。

十六分音符的延时函数为 void delay(uint z) { uint x,y;

for(x=z;x>0;x--)

for(y=19000;y>0;y--);}

一首音乐是由许多不同的音符组成的,而每个音符对应着不同频率,这样就可以利用不同的频率的组合,加以与拍数对应的延时,构成音乐。了解音乐的一

第 14 页 共 32 页

些基础知识,我们可知产生不同频率的音频脉冲即能产生音乐。对于单片机来说,产生不同频率的脉冲是非常方便的,利用单片机的定时/计数器来产生这样的方波频率信号。因此,需要弄清楚音乐中的音符和对应的频率,以及单片机定时计数的关系。

每个音符使用1个字节,字节的高4位代表音符的高低,低4位代表音符的节拍,表4.2为节拍码的对照。如果1拍为0.4秒,1/4拍实0.1秒,只要设定延迟时间就可求得节拍的时间。假设1/4拍为1DELAY,则1拍应为4DELAY,以此类推。所以只要求得1/4拍的DELAY时间,其余的节拍就是它的倍数,如表4.3为1/4和1/8节拍的时间设定。

表4.2.2.1 节拍码的对照

节拍码 1

2 3 4 5 6 8 A C F

节拍数 1/4拍 2/4拍 3/4拍 1拍 1又1/4拍 1又1/2拍 2拍 2又1/2拍 3拍 3又3/4拍

节拍码 1 2 3 4 5 6 8 A C

1/8节拍的时间设定 曲调值 调4/4 调3/4 调2/4

DELAY 62毫秒 94毫秒 125毫秒

节拍数 1/8拍 1/4拍 3/8拍 2/1拍 5/8拍 3/4拍 1拍 1又1/4拍 1又1/2拍

表4.2.2.2 1/4和1/8节拍的时间设定

1/4节拍的时间设定 曲调值 调4/4 调3/4 调2/4

DELAY 125毫秒 187毫秒 250毫秒

4.2.3 移调

一般的歌曲有3/8、2/4、3/4、4/4等节拍类型,但不管有几拍,基本上是在C调下演奏的。如果是C调,则音名唱Do,音名D唱Re,音名E唱Mi,音名F唱Fa,音名G唱So,音名A唱La,音名B唱Ti等。但并不是所有的歌曲都是在C调下演奏的,还有D调,E调,F调,G调等。D调是将C调各音符上升一个频率实现的,即C调下的音名D在D调下唱Do,C调下的音名E在D调下唱Re,C大调各音名F在D调下升高半音符F#唱Mi,C调下的音名G在

第 15 页 共 32 页

D调下唱Fa,C调下的音名A在D调下唱So,C调下的音名B在D调下唱La,C调下的音名C在D调下升高半音符C#唱Ti。这种改变唱法成为移调。

E调是在D调的基础上进行移调的,而F调是在E调的基础上进行移调的??各大调音符与音名的关系如表4.4所示。

表4.2.3 各大调音符与音名的关系

音调 C调 D调 E调 F调 G调 A调 B调

Do C D E F G A B

Re D E F# G A B C

Mi E F# G# A B C# D

Fa F G A B C D E

So G A B C D E F

La A B C D E F# G

Ti B C D E F# G# A

4.2.4 音乐编码

本设计以音乐简谱进行编码。简谱中的1~7,分别编码为1~7,重音1~7,分别编码8、9、A、B、C、D、E。停顿编为0,结束标志为FF。

简谱节拍的对应关系也是编码的关键。在简谱中,全音符是在数字后面加三根延时线的音符,其时值等于四分音符的四倍,打满四拍就得一个全音符。若延时函数为165ms,即十六分音符的时间,则一个全音符需要16次延时。可分为两个8次延时。可编码为0x08,0x08。二分音符是在数字后面加了一根延时线的音符,分音符时值是四分音符的两倍,打两拍得一个二分音符。将其编码为8。而四分音符在简谱里就是不带延时线,没有减时线单单的一个音符,以四分音符为一拍,也就是手打一拍就是一个四分音符的时值。将其编码为4。八分音符是在数字下面划了一根减时线的音符;八分音符时值等于四分音符的一半,而以四分音符为一拍的话,那八分音符也就是半拍。 在本次设计中将其编码为2。十六分音符在简谱里是在数字下面划了两根减时线的音符;十六分音符时值等于四分音符的四分之一,也就是四分之一拍。将其编码为1。符点音符在音符后面加个符点,等于把这个音符的时值再延长它本身时值的一半。比如符点四分音符,时值等于四分音符加八分音符的时值。休止符最好的理解就是你把它当一个音符看待,但是是没有音高的音符,因为它时值也是跟一般音符一样标记的。可编码成0。

第 16 页 共 32 页

举例1:音调do,发音长度为两拍,即二分音符,将其编码为0x18。 举例2:音调re,发音长度为半拍,即八分音符,将其编码为0x22 4.2.5 歌曲播放设计

将歌曲的简谱进行编码后,储存在一个数据类型为unsigned char 的数组中。音乐播放程序从数组中取出一个数,然后分离出高4位得到音调,接着找出相应的值赋给定时器0,使之定时操作蜂鸣器,得出相应的音调;接着分离出该数的低4位,得到延时时间,这样就建立了音乐库。表4.5为简谱对应的简谱码、T值及节拍数。

表4.2.5 简谱对应的简谱码、T值和节拍数

简谱 5 6 7 1 2 3 4 5 6 7 1 2 3 4 5

发音 低音SO 低音LA 低音TI 中音DO 中音RE 中音MI 中音FA 中音SO 中音LA 中音TI 高音DO 高音RE 高音MI 高音FA 高音SO

简谱码 1 2 3 4 5 6 7 8 9 A B C D E F

T值 64260 64400 64524 64580 64684 64777 64820 64898 64968 65030 65058 65110 65157 65178 65217

节拍码 1 2 3 4 5 6 8 A C F

节拍数 1/4拍 2/4拍 3/4拍 1拍

1又1/4拍 1又1/2拍 2拍

2又1/2拍 3拍

3又3/4拍

本次设计一共可播放4首歌曲,分别为《千年之恋》、《寂寞沙洲冷》、《七子之歌》和《感恩的心》,在这里我以《千年之恋》为例,说明一下简谱与编码的对应关系,其他四首歌曲的数据编码将在附录中显示。图4.2为歌曲《千年之恋》的简谱。

第 17 页 共 32 页

图4.2 歌曲《千年之恋》简谱

根据上述规则,《千年之恋》的简谱编码为 uchar code qnzl[]={ //千年之恋

0x12, 0x22, 0x34, 0x84, 0x74, 0x54, 0x38, 0x42, 0x32, 0x22, 0x42, 0x34, 0x84, 0x72, 0x82, 0x94, 0xA8, 0x08, //前奏

0x32, 0x31, 0x21, 0x32, 0x52, 0x32, 0x31, 0x21, 0x32, 0x62, //竹林的灯火 到过的沙漠

0x32, 0x31, 0x21, 0x32, 0x82, 0x71, 0x81, 0x71, 0x51, 0x32, 0x22, //七色的国度 不断飘逸风中

0x32, 0x31, 0x21, 0x32, 0x52, 0x32, 0x31, 0x21, 0x32, 0x62, //有一种神秘 灰色的旋涡

0x32, 0x31, 0x21, 0x32, 0x83, 0x82, 0x71, 0x72, 0x02, //将我卷入了迷雾中

0x63, 0xA1, 0xA2, 0x62, 0x92, 0x82, 0x52, //看不清的双手

0x31, 0x51, 0x63, 0x51, 0x63, 0x51, 0x63, 0x51, 0x62, 0x82, 0x7C, 0x02, //一朵花传来谁经过的温柔

0x61, 0x71, 0x82, 0x71, 0x62, 0xA2, 0x71, 0x76, //穿越千年的伤痛

0x61, 0x71, 0x82, 0x71, 0x62, 0x52, 0x31, 0x36, //只为求一个结果

第 18 页 共 32 页

0x61, 0x71, 0x82, 0x71, 0x62, 0xA3, 0x73, 0x62, 0x53, //你留下的轮廓 指引我

0x42, 0x63, 0x83, 0x83, 0x91, 0x91, //黑夜中不寂寞

0x61, 0x71, 0x82, 0x71, 0x62, 0x0A2, 0x71, 0x76, //穿越千年的哀愁

0x61, 0x71, 0x82, 0x71, 0x62, 0x52, 0x31, 0x36, //是你在尽头等我

0x61, 0x71, 0x82, 0x71, 0x62, 0xA3, 0x73, 0x62, 0x53, //最美丽的感动 会值得

0x42, 0x82, 0x88, 0x02, 0x74, 0x93, 0x89, 0xff//结束标志 //用一生守候 }

4.3 源程序代码

见附录1

5 仿真

5.1 硬件电路的仿真

在PROTUES检查各硬件管脚是否连接正确,线路逻辑是否正确,例如:晶振电路的连接,复位电路是否设计正确。 5.2 软件电路的仿真

1.根据系统的原理结构检查各流程图是否正确,再根据流程图来检查程序是否也正确。

2.将所有程序组织起来,在软件环境下运行,检查程序是否正确。通过对硬件和软件系统的认真检查,反复测试,如果没有出现问题即可把源程序编译成HEX文件装载到单片机中,对硬件进行仿真

第 19 页 共 32 页

5.3 联调

在keil中, 在Debug中的Use选择Proteus VSM Simulator, 即使用Proteus进行调试。

在proteus中, 双击单片机芯片, 在程序文件选择keil生成的HEX文件的路径, 即把HEX文件装入单片机中, 点击运行, 进行仿真, 就实现了联调。在联调时, 点击功能键, 看程序所涉及的功能是否都能实现, 不能实现的功能, 检查修改相应的程序, 重复上述动作, 直至完成所有设计的功能。 5.4 仿真结果

proteus仿真结果如图5.1所示:

图5.1 proteus仿真结果示意图

单片机仿真结果如图5.2所示

第 20 页 共 32 页

图5.2 单片机仿真结果示意图

6 课设心得

设计简单原理介绍:一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系设置正确即可。

在这个程序中,弹奏音乐的程序是用定时/计数器T0来完成的,播放音乐程序则也是是用定时/计数器T0来完成的。

在调试成功后,可任意弹奏自己想要的旋律。同时可以播放和切换4首歌曲,但是也有不足之处的,声音杂音时而有点大,不稳定。

经过本次课程设计,我们对于C语言多了一层了解,其次,对单片机的学习更加深入,并加强了自身的动手能力。当然在这次课程设计活动中,经验才是对于我们最大的收获,而且还增强了自身对未知问题以及对知识的深化认识的能力,受益匪浅。

7 参考文献

1 高锋.单片微型计算机原理与接口技术[M].北京:科学出版社,2003 2 吴金戌,沈庆阳,郭庭吉.8051单片机实践与应用[M].北京:清华大学出版

第 21 页 共 32 页

社,2002

3 余文俊.8051C语言学习[M].北京:中国水利水电出版社,2003 4 贾金玲 .单片机原理及应用[M].成都:电子科技大学出版社 ,2004 5 王东峰,王会良,董冠强.单片机C语言应用百例[M].北京:电子工业出版社,2009

6 周润景.基于Protues的电路及单片机系统设计与仿真[M].北京:北京航空航天大学出版社,2006

第 22 页 共 32 页

附录1:

源程序代码:

#include

#define uchar unsigned char #define uint unsigned int //sbit duan=P3^6;

sbit key1=P3^2;//按key1可暂停歌曲 sbit key2=P3^3;//按key2可切换歌曲 sbit fm=P3^6;//蜂鸣器连续的IO口 sbit KK=P2^0; //点亮一个数码管 uchar count2=0;//歌曲标志 uchar timeh,timel,i;

/***********************************************************/

uchar code DSY_table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80, //0~8 0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x8f}; //9,A~F

uint code tone_delay_table[]={ 64021,64103,64260,64400,64524,64580,64684,

64777,64820,64898,64968,65030,65058,65110,65157,65178}; //个音符对应的延时

uchar keyno; //定义按键得到的初值 void delay_ms(uchar x) //延时子函数 { uchar i; while(x--)

for(i=0;i<120;i++); }

void keys_scan() //键盘扫描子函数 { uchar tmp,k;

P1=0x0f; //高四位置0 ,放入四行 delay_ms(2);

//按键后00001111将变成0000xxxx,x中1个为0,3个仍为1 //下面的异或操作会把3个1变成0,唯一的0变成1 tmp=P1^0x0f;

//判断按键发生于0~3列中的哪一列 switch(tmp)

{case 1:k=0; break; case 2:k=1; break;

case 4:k=2; break; case 8:k=3; break;

default:return;//无按键按下 }

P1=0xf0; //低四位置0,放入四列 delay_ms(2);

tmp=(P1>>4)^0x0f; //按键后11110000将变成xxxx0000,x中1个为0,3个仍为1,

第 23 页 共 32 页

将高四位移至低四位,并将其中唯一的0 变成1,其余为0 //对0~3行分别附加其初始值0,4,8,12 switch(tmp)

{case 1:k+=0; break; case 2:k+=4; break; case 4:k+=8; break; case 8:k+=12; break; default:return;}

keyno=k; //将k的值赋给keyno由数码管输出 }

//---------------------------简谱--------------------------------------- //编程规则:字节高位是简谱,低位是持续时间, //代表多少个十六分音符

//1-7代表中央C调,8-E代表高八度,0代表停顿 //最后的0是结束标志

uchar code qnzl[]={ //千年之恋

0x12,0x22,0x34,0x84,0x74,0x54,0x38,0x42,0x32,0x22,0x42,0x34,0x84,0x72,0x82,0x94,0xA8,0x08,

0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,

0x32,0x31,0x21,0x32,0x82,0x71,0x81,0x71,0x51,0x32,0x22, 0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62, 0x32,0x31,0x21,0x32,0x83,0x82,0x71,0x72,0x02, 0x63,0xA1,0xA2,0x62,0x92,0x82,0x52,

0x31,0x51,0x63,0x51,0x63,0x51,0x63,0x51,0x62,0x82,0x7C,0x02, 0x61,0x71,0x82,0x71,0x62,0xA2,0x71,0x76, 0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36,

0x61,0x71,0x82,0x71,0x62,0xA3,0x73,0x62,0x53, 0x42,0x63,0x83,0x83,0x91,0x91,

0x61,0x71,0x82,0x71,0x62,0x0A2,0x71,0x76, 0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36,

0x61,0x71,0x82,0x71,0x62,0xA3,0x73,0x62,0x53, 0x42,0x82,0x88,0x02,0x74,0x93,0x89,0xff//结束标志 };

uchar code jmszl[]={ //寂寞沙洲冷

0x12,0x12,0x22,0x32,0x31,0x22,0x21,0x22,

0x21,0x31,0x51,0x52,0x31,0x52,0x61,0x15,0x14,

0x51,0x52,0x31,0x52,0x62,0x13,0x11,0x13,0x32,0x28,0x08,0x28, 0x31,0x32,0x31,0x32,0x11,0x21,0x51,0x52,0x51,0x52, 0x51,0x51,0x31,0x32,0x31,0x32,0x81,0x72,0x63,

0x62,0x71,0x81,0x72,0x61,0x61,0x52,0x31,0x21,0x32,0x51,0x54, 0x22,0x12,0x11,0x12,0x11,0x12,0x12,0x14,0x26,0x32,0x26,

0x32,0x61,0x51,0x51,0x31,0x31,0x21,0x31,0x51,0x61,0x51,0x31,0x51, 0x02,0x32,0x81,0x81,0x81,0x81,0x62,0x52,0x34, 0x31,0x81,0x81,0x81,0x61,0x91,0x82,

第 24 页 共 32 页

0x51,0x51,0x51,0x51,0x31,0x61,0x53,

0x21,0x11,0x21,0x11,0x22,0x11,0x21,0x26,

0x32,0x61,0x51,0x51,0x31,0x31,0x21,0x31,0x51,0x61,0x51,0x31,0x51,0x52, 0x31,0x31,0x81,0x81,0x81,0x61,0x91,0x81,0x61,0x31,0x56,

0x32,0x32,0x81,0x81,0x81,0x81,0x91,0x81,0x61,0x81,0x61,0x51,0x31,0x51,0x34, 0x21,0x31,0x51,0x31,0x21,0x11,0x61,0x21,0x16, 0xff//结束标志 };

uchar code qizige[]={ //七子之歌

0x54,0x32,0x52,0x32,0x54,0x62,0x52,0x32,0x62,0x54, 0x14,0x12,0x22,0x34,0x52,0x32,0x02,0x32,0x58,

0x52,0x52,0x62,0x52,0x32,0x54,0x52,0x62,0x52,0x82,0x62,0x58, 0x14,0x52,0x32,0x22,0x12,0x24,0x32,0x54,0x2,0x22,0x34,0x1f,0x18,

0x04,0x54,0xa4,0x92,0x81,0x62,0x52,0x54,0x62,0x64,0x52,0x62,0x81,0xa2,0x82,0x9c,

0x02,0x52,0xa4,0x92,0x81,0x62,0x52,0x54,0x62,0x64,0x52,0x64,0xa2,0x92,0x9f, 0xa4,0x92,0x81,0x62,0x52,0x54,0x84,0x62,0x52,0x32,0x22,0x14, 0x04,0x22,0x32,0x58,0x58,0x04,0x52,0x62,0x8f, 0xff//结束标志 };

uchar code ganen[]={ //感恩的心

0x12,0x14,0x22,0x32,0x54,0x32,0x84,0x72,0x62,0x54, 0x02,0x62,0x62,0x52,0x54,0x12,0x22,0x32,0x28,

0x12,0x14,0x22,0x32,0x54,0x32,0x84,0x92,0x82,0x54, 0x32,0x24,0x21,0x61,0x54,0x22,0x32,0x12,0x18,

0x22,0x24,0x12,0x24,0x11,0x21,0x34,0x32,0x21,0x31,0x34,

0x12,0x22,0x22,0x22,0x11,0x21,0x22,0x64,0x52,0x52,0x32,0x38,

0x31,0x52,0x51,0x52,0x31,0x51,0x58,0x31,0x82,0x81,0x82,0x31,0x61,0x68, 0x62,0x62,0x62,0x51,0x61,0x64,0x61,0x82,0x61,0x9c,

0x52,0xa4,0x92,0xa4,0x32,0x84,0x72,0x64,0x62,0x94,0x82,0x94,

0x61,0x81,0x92,0x91,0x91,0x92,0x81,0xa1,0xa2,0x92,0x94, 0x52,0xa4,0x92,0xa4,0x32,0x84,0x72,0x64, 0x52,0x62,0x81,0x81,0x82,0x92,0xa2,0x94,0x82,0x72,0x82,0x88, 0xff//结束标志 };

//----------------------------简谱音调对应的定时器初值---------------------------

//适合11.0592M的晶振 uchar code cuzhi[]={ 0xff,0xff,//占位

0xFC,0x8E,//中央C调1-7 0xFC,0xED,

第 25 页 共 32 页

0xFD,0x43, 0xFD,0x6A, 0xFD,0xB3, 0xFD,0xF3, 0xFE,0x2D,

0xFE,0x47, //高八度1-7 0xFE,0x76, 0xFE,0xA1, 0xFE,0xC7, 0xFE,0xD9, 0xFE,0xF9, 0xFF,0x16 };

void delay1(uint z); //延时1MS

void delay(uint z); //延时165MS,即十六分音符void song();

void beep();//蜂鸣器叫一声 void main() {

P0=0xbf; KK=0;

count2=0; //不唱歌 EA=1;//开总中断

EX0=1;//开外部中断0

IT0=1;//外部中断0下降沿触发方式 EX1=1;//开外部中断1

IT1=1;//外部中断1下降沿触发方式 TMOD=0x01;//定时器0工作在方式1 TH0=0; TL0=0; ET0=1; while(1) {

if(count2!=0) {

song();

delay1(1000); }

if(count2==0)

{ keys_scan(); //矩阵键盘无限扫描 P1=0xf0; if(P1!=0xf0) {

第 26 页 共 32 页

P0=DSY_table[keyno]; TR0=1; }

if(P1==0XF0) {TR0=0; }

delay_ms(2); } } }

void int0() interrupt 0 {

EA=0;//关总中断 delay1(1);//去抖 if(key1==0) {

count2=0; //暂停音乐 TR0=0; } EA=1; }

void int1() interrupt 2 {

TR0 = 0;

delay1(1);//去抖 if(key2==0) {

i=0;//从头开始唱 count2++; TR0=~TR0; if(count2==5) count2=0; } }

void timer0() interrupt 1 //用于产生各种音调{

if(count2==0) {

TH0=tone_delay_table[keyno]/256; TL0=tone_delay_table[keyno]%6;

第 27 页 共 32 页

fm=~fm; }

if(count2!=0) {

TH0=timeh; TL0=timel; fm=~fm; } }

void song() {

uint temp;

uchar jp;//jp是简谱 i=0; while(1)

{ if(count2==0) {

break; }

if(count2==1) //选曲 temp=jmszl[i]; if(count2==2)

temp=qnzl[i]; if(count2==3)

temp=qizige[i]; if(count2==4)

temp=ganen[i]; if(temp==0xff) break;

jp=temp/16; //取数的高4位 if(jp!=0) {

timeh=cuzhi[jp*2]; timel=cuzhi[jp*2+1]; } else { TR0=0;

fm=1;//关蜂鸣器 }

delay(temp); //取数的低4位 TR0=0; //唱完一个音停10MS fm=1;

第 28 页 共 32 页

delay1(10); TR0=1; i++; }

TR0=0; fm=1; }

void delay(uint z) //延时165MS,即十六分音符 { uint x,y;

for(x=z;x>0;x--)

for(y=19000;y>0;y--); }

void delay1(uint z) //延时1MS { uint x,y;

for(x=z;x>0;x--)

for(y=112;y>0;y--); }

void beep() //蜂鸣器叫一声 { uchar i;

for(i=0;i<50;i++) { fm=~fm; delay1(1); } fm=1; }

第 29 页 共 32 页

附录2:

PCB图:

第 30 页 共 32 页

本文来源:https://www.bwwdw.com/article/z3mg.html

Top