1、1第一章 前言伴随着科技的发展和时代的进步,人们对生活质量的要求也越来越高,由以前简单的追求温饱和物质财富转向更高层面的精神追求!而这一切催生了智能仪器的发展,音乐则是人们娱乐生活的重要组成部分,目前市场上出现了许许多多的音乐播放器,而人们对播放器的功能需求也越来越广泛,本文将设计一个基于单片机的音乐播放器,通过对其全面的介绍与分析,让大家了解音乐播放器的原理!第二章: 简易音乐播放器的功能和原理说明音乐播放器,可以通过单片机板子上的数字按键对音乐播放的曲目进行控制,并且通过 LED 灯将播放的音乐加以区分,在播放音乐的同时点亮 LED 灯,让人知道现在正在播放的音乐曲目,从而实现简单的音乐播
2、放功能!表 1 需求分析名称 简易音乐播放器目的 实现简单的特定音乐播放功能输入 单片机板子上的数字按键输出 扬声器,LED 灯功能 (1) 接收按键开关的信号,并将信号送入单片机(2) 处理得到的结果通过 LED 信号灯进行显示,并通过扬声器播放音乐(3) 可以播放 4 首程序中写好的音乐性能 基于单片机的扬声器和程序的软件设计功能说明:这次设计是依据单片机技术原理,通过硬件电路设计以及软件的编译而设计的一个简单的音乐播放器,可以通过按键选择播放四首歌曲(歌曲自选,只要将想要播放的歌曲的乐谱写入程序中即可)同时点亮相应的 LED灯,并用它来指示当前播放的歌曲序列,只能实现简单的音乐播放功能。
3、原理说明:这个音乐播放器主要有晶振电路,复位电路,LED 电路,按键电路以及扬声器组成。它利用单片机产生乐曲音符,再把乐曲音符翻译成计算机音乐语言,接着用单片机进行信息处理,再通过蜂鸣器或喇叭放出音乐。音乐的产生主要是通过单片机的 I/O 口输出高低不同的脉冲信号来控制扬声器发音。通常利用单片机的内部定时器 0,工作在方式 1 下,再改变计数初值 TH0和 TL0 来产生不同频率。当控制歌曲按键按下时,按照预先存放在单片机中的2程序,就会自动判断键值,然后启动计数器,按照程序产生一定频率的脉冲,接着通过 uln2003 芯片驱动扬声器,播放出乐曲。该硬件电路中用P3.0,P3.1,P3.2,P
4、3.3 控制四个按键, “0”,“1”, “2”, “3”分别控制四首音乐。P1.0,P1.1,P1.2,P1.3 控制四个 LED 灯,它们分别对应四个按键,用来显示正在播放的歌曲,并用 P2.3 来控制扬声器,电路为 12MHz 晶振频率工作,起振电路中 C1 和 C2 为 22pf。第三章: 系统硬件电路设计1:硬件体系结构设计该简易音乐播放器主要有单片机核心芯片 89C52,LED 发光二极管,扬声器,晶振电路,按键电路,复位电路组成,通过芯片引脚输出定时器产生的各种固定频率的方波信号,然后在经由扬声器产生各种频率的声音。另外,该方案使用的是单片机板子的内部振荡电路,89C52 芯片的
5、 X1,X2 引脚外接石英晶体。它的系统组成如图所示。89C52芯片复位电路按键电路扬声器LED显示(1) 晶振电路部分 晶振的作用是给电路提供工作信号脉冲的,其实就是单片机的工作速度。本次设计选用 12M 晶振,则单片机的工作速度就是每秒 12M。与此同时,也要注意单片机的工作频率范围。(2) 复位电路部分 当系统出现问题时可以重置系统,解决一些问题(3) LED 显示部分 显示系统在各种不同条件下的状态(4) 89C52 芯片 整个设计的核心,接收和处理信号及程序晶体振荡电路3(5) 按键电路部分 作为系统的输入(6) 扬声器部分 用于发出不同频率的音调形成歌曲2 硬件电路设计硬件电路分为
6、单片机芯片最小系统(包括时钟电路,复位电路) ,扬声器电路,按键电路和 LED 电路等(1) 单片机 89C52 芯片最小系统设计AT89C52是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。AT89S52具有以标准功能:8k字节Flash,256字节RAM,32 位I/O 口线,看
7、门狗定时器,2 个数据指针,三个16 位定时器/计数器,一个 6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。它的引脚图如图 2 所示图 2主要性能参数:与MCS-51单片机产品兼容48K字节在系统可编程Flash存储器1000次擦写周期全静态操作:0Hz 33Hz三级加密程序存储器32个可编程I/O口线三个16位定时器/计数器八个中断源全
8、双工UART串行通道低功耗空闲和掉电模式掉电后中断可唤醒看门狗定时器双数据指针掉电标识符引脚介绍:VCC : 电源GND: 地P0 口:P0口是一个8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻辑电平。对P0 端口写“1” 时,引脚用作高阻抗输入。当访问外部程序和数据存储器时,P0口也被作为低8位地址/ 数据复用。在这种模式下,P0具有内部上拉电阻。在 flash编程时, P0口也用来接收指令字节;在程序校验时,输出指令字节。程序校验时,需要外部上拉电阻。P1 口:P1 口是一个具有内部上拉电阻的8 位双向I/O 口,p1 输出缓冲器能驱动4 个TTL 逻辑电平。对P1 端口写
9、“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。此外,P1.0和 P1.2分别作定时器 /计数器2的外部计数输入(P1.0/T2 )和时器/计数器2的触发输入(P1.1/T2EX),具体如下表所示。在 flash 编程和校验时, P1 口接收低 8 位地址字节。P2 口:P2 口是一个具有内部上拉电阻的8 位双向I/O 口,P2 输出缓冲器能驱动4 个TTL 逻辑电平。对P2 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)
10、。在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX DPTR)时,P2 口送出高八位地址。在这种应用中,P2 口使用很强的内部上拉发送1。在使用58位地址(如MOVX RI)访问外部数据存储器时,P2口输出P2 锁存器的内容。在flash编程和校验时, P2口也接收高8位地址字节和一些控制信号。P3 口:P3 口是一个具有内部上拉电阻的8 位双向I/O 口,p2 输出缓冲器能驱动4 个TTL 逻辑电平。对P3 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流P3口亦作为AT89S52 特殊功能(
11、第二功能)使用,如下表所示。在 flash 编程和校验时, P3 口也接收一些控制信号。RST: 复位输入。晶振工作时,RST 脚持续2 个机器周期高电平将使单片机复位。看门狗计时完成后,RST 脚输出96 个晶振周期的高电平。特殊寄存器AUXR( 地址8EH)上的DISRTO位可以使此功能无效。DISRTO默认状态下,复位高电平有效。ALE/PROG:地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8 位地址的输出脉冲。在flash 编程时,此引脚( PROG)也用作编程输入脉冲。在一般情况下,ALE 以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。然而,特别强调,
12、在每次访问外部数据存储器时,ALE脉冲将会跳过。如果需要,通过将地址为8EH的SFR的第0位置“1 ”,ALE 操作将无效。这一位置“1”,ALE 仅在执行 MOVX 或MOVC指令时有效。否则,ALE 将被微弱拉高。这个ALE 使能标志位(地址为8EH的SFR 的第0位)的设置对微控制器处于外部执行模式下无效。PSEN:外部程序存储器选通信号(PSEN )是外部程序存储器选通信号。当 AT89S52从外部程序存储器执行外部代码时, PSEN在每个机器周期被激活两次,而在访问外部数据存储器时,PSEN将不被激活。EA/VPP:访问外部程序存储器控制信号。为使能从0000H 到FFFFH的外部程
13、序存储器读取指令,EA必须接GND。为了执行内部程序指令,EA应该接VCC。在 flash 编程期间, EA 也接收 12 伏 VPP 电压。XTAL1:振荡器反相放大器和内部时钟发生电路的输入端。XTAL2:振荡器反相放大器的输出端。该最小系统包括时钟电路,复位电路。在内部时钟电路中,必须在 X1 和 X2 引脚两端跨接石英晶体振荡器和两个微调电容从而形成振荡电路,按照单片机的板子 C1 和 C2 取的是 22pf,而晶振的频率取值在 1.2MHz 和 12MHz 之间。复位电路就和电脑的重启部分差不多,当电脑使用中出现死机,按下重启按钮电脑内部的程序从头执行,其中,电容大小为 10uf,电
14、阻大小为 10K。6它在设计中电路图如图 3图 3(2) LED 电路设计四个 LED 灯(发光二极管)分别由 P1.0P1.3 控制 ,播放第一首歌时 D0 点亮,第二、三首歌时 D1、D2 点亮,第四首歌时 D3 亮,电阻的阻值由单片机板子上的电阻值决定。它的电路原理图如图 4图 4(3)扬声器电路设计由于本设计基于单片机板子,所以扬声器电路取自板子的设计,将信号通过一个名为 uln2003 的芯片进行放大,并推动扬声器发出声音也即音乐。 高耐压、大电流复合晶体管 ULN2003 是高耐压、大电流复合晶体管阵列,由七个硅 NPN 复合晶体管组成。它是大电流驱动阵列 ,多用于单片机、智能仪表
15、、PLC,数字量输出卡等控制电路中。可直接驱动继电器等负载。在 5V 的工作电压下它能与 TTL 和 CMOS 电路 直接相连,可以直接处理原先需要标准逻辑缓冲7器来处理的数据。还具有电流增益高、工作电压高、温度范围宽、带负载能力强等特点,适应于各类要求高速大功率驱动的系统。完全可以用来驱动扬声器发声!它的引脚图如图 5 所示。下附引脚介绍图 5引脚介绍:引脚 1:CPU 脉冲输入端,端口对应一个信号输出端。引脚 2:CPU 脉冲输入端。引脚 3:CPU 脉冲输入端。引脚 4:CPU 脉冲输入端。引脚 5:CPU 脉冲输入端。引脚 6:CPU 脉冲输入端。引脚 7:CPU 脉冲输入端。引脚 8
16、:接地。引脚 9:该脚是内部 7 个续流二极管负极的公共端,各二极管的正极分别接各达林顿管的集电极。用于感性负载时,该脚接负载电源正极,实现续流作用。如果该脚接地,实际上就是达林顿管的集电极对地接通。引脚 10:脉冲信号输出端,对应 7 脚信号输入端。参考电路接法引脚 11:脉冲信号输出端,对应 6 脚信号输入端。引脚 12:脉冲信号输出端,对应 5 脚信号输入端。引脚 13:脉冲信号输出端,对应 4 脚信号输入端。引脚 14:脉冲信号输出端,对应 3 脚信号输入端。8引脚 15:脉冲信号输出端,对应 2 脚信号输入端。引脚 16:脉冲信号输出端,对应 1 脚信号输入端。扬声器电路在设计中的电
17、路图如图 6 所示:图 6(4)按键电路设计单片机应用系统中的人机对话通道是用户为了对应用系统进行干预以及了解应用系统运行状态所设置的通道,主要有键盘,显示器等通道接口,为了控制系统的工作状态以及向系统中输入数据,应用系统设置键盘,借助键盘向系统输入程序,置数,送操作命令,控制程序的执行等。本设计采用 4 个按钮来实现选择歌曲的播放,电路的连接选用单片机板子上的电路。 “0”、 “1”“2”、 “3”分别由单片机引脚 P3.0, P3.1,P3.2,P3.3 控制,它的设计电路图如图 7 所示。9图 7第四章: 软件系统设计1:主程序在本设计中,主程序是整个软件模块的核心,它实现对程序的初始化
18、以及各个函数的调用。void main( )uchar key;P2=0; P0=0X00;while(1)key=keyscan(); /调用键盘扫描扫描函数,switch(key)case 0xee:P0=EL0;P1=0xfe; /LED 灯 D0 点亮yy1(); /播放第一首音乐break; case 0xde:P0=EL1;P1=0xfd; /LED 灯 D1 点亮yy2(); /播放第二首音乐break; case 0xbe:P0=EL2; P1=0xfb; /LED 灯 D2 点亮yy3(); /播放第三首音乐break; case 0x7e:P0=EL3;P1=0xf7; /
19、LED 灯 D3 点亮yy4(); /播放第四首音乐break; 10系统结构框图否是否 否 否是 是 是 是播放 播放 播放 播放 结束 结束 结束 结束开始系统初始化有键按下“0”键“1”键“2”键“3”键播放第一首歌,点亮 D0播放第二首歌,点亮 D1播放第三首歌,点亮 D2播放第四首歌,点亮 D3112:键盘扫描程序在主程序中,需要调用键盘扫描程序,该程序可以对键盘的键值进行扫描,确保我们再输入键值后,系统单片机能够接收并作出相应的处理。uchar keyscan(void) /键盘扫描函数,使用行列反转扫描法uchar cord_h,cord_l;/行列值中间变量P3=0x0f; /
20、行线输出全为 0cord_h=P3 /读入列线值if(cord_h!=0x0f) /先检测有无按键按下delay(100); /去抖if(cord_h!=0x0f)cord_h=P3 /读入列线值P3=cord_h|0xf0; /输出当前列线值cord_l=P3 /读入行线值return(cord_h+cord_l);/键盘最后组合码值return(0xff); /返回该值结构框图:是开始有键按下延迟 100ms逐行逐列扫描并确定按键的键值调用按键相应的子程序123:音乐播放函数该音乐播放函数包含了音乐播放的规律,能够确保音乐按照乐谱播放。void yy1(void)unsigned char
21、 k,i;TMOD=1; /置 CT0 定时工作方式 1EA=1;ET0=1;/IE=0x82 /CPU 开中断,CT0 开中断 while(1)i=0; while(i 第一首歌:世上只有妈妈好code uchar sszymmh= 6,2,3, 5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1,6,2,4, 3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1,6,1,1, 5,2,1, 3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2,5,2,1, 6,2,1, 3,2,2, 2,2,2, 1,2,4, 5,2
22、,3, 3,2,1,2,2,1, 1,2,1, 6,1,1, 1,2,1, 5,1,6, 0,0,02 第二首歌 美丽的神话code uchar mldsh= 6,1,2, 3,2,2, 7,1,3, 6,1,1, 1,2,1, 2,2,1, 1,2,1, 3,2,4, 6,1,2, 6,2,2, 5,2,1, 6,2,1, 5,2,1, 2,2,1, 4,2,1, 3,2,1, 3,2,2, 6,1,2, 6,2,2, 5,2,1, 6,2,1, 5,2,1, 6,2,1, 5,2,2, 2,2,1, 3,2,4, 1,2,4, 6,1,2, 3,2,2, 2,2,3,7,1,1, 6,1,
23、8, 6,1,2, 3,2,2, 7,2,3, 7,1,1, 6,1,1, 1,2,1, 2,2,1, 1,2,1, 3,2,4, 6,1,2, 6,2,2, 5,2,1, 6,2,1, 5,2,1, 2,2,1, 4,2,1, 3,2,1, 3,2,6, 6,1,2, 6,2,2, 5,2,1, 2,2,1, 3,2,1, 4,2,1, 3,2,2, 2,2,2, 1,2,4, 6,2,2, 2,2,2, 161,2,3, 7,1,1, 6,1,6, 6,1,1, 7,1,1, 1,2,1, 2,2,1, 3,2,1, 1,2,1, 7,2,2, 5,1,2, 6,1,1, 1,2,1, 2
24、,2,1, 3,2,13 第三首歌 两只老虎code uchar lzlh= 1,2,2, 2,2,2, 3,2,2, 1,2,2, 1,2,2, 2,2,2, 3,2,2, 1,2,2, 3,2,2, 4,2,2, 5,2,4, 3,2,2, 4,2,2, 5,2,4, 5,2,1,6,2,1, 5,2,1, 4,2,1, 3,2,2, 1,2,2, 5,2,1,6,2,1, 5,2,1, 4,2,1, 3,2,2, 1,2,2, 2,2,2, 5,1,2, 1,2,4, 2,2,2, 5,1,2, 1,2,4,1,2,2, 2,2,2, 3,2,2, 1,2,2, 1,2,2, 2,2,2
25、, 3,2,2, 1,2,2, 3,2,2, 4,2,2, 5,2,4, 3,2,2, 4,2,2, 5,2,4, 5,2,1,6,2,1, 5,2,1, 4,2,1, 3,2,2, 1,2,2, 5,2,1,6,2,1, 5,2,1, 4,2,1, 3,2,2, 1,2,2, 2,2,2, 5,1,2, 1,2,4, 2,2,2, 5,1,2, 1,2,4;4第四首歌 生日歌 code uchar srg= 5,1,1, 5,1,1, 6,1,2, 5,1,2, 1,2,2, 7,1,4, 5,1,1, 5,1,1, 6,1,2, 5,1,2, 2,2,2, 1,2,4, 5,1,1, 5,
26、1,1, 5,2,2, 3,2,2, 1,2,2, 7,1,1, 6,1,1, 4,2,1, 4,2,1, 3,2,2, 1,2,2, 2,2,2, 1,2,4 ;5 音阶频率表/ 音阶频率表 高八位code uchar FREQH=0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8, 0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, /1,2,3,4,5,6,7,8,i0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,17 ;/ 音阶频率表 低八位code uch
27、ar FREQL=0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, /1,2,3,4,5,6,7,8,i0xEE,0x44, 0x6B,0xB4,0xF4,0x2D, 0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,;六: 系统调试及总结硬件电路和软件程序设计完成后,在单片机上连接好硬件电路,然后将由软件产生的程序 Hex 文件拷入单片机的 AT89C51 芯片,然后在按键面板上选择按键,看能否播放程序中的音乐,同时注意观察相应的LED 灯能否点亮,实验结果证明设计成功。
28、本设计没有考虑到音乐的暂停播放功能,因此选择按键后必须等待音乐全部播放完毕,然后断开电源再接通电源重新选择播放的曲目。在程序调试的过程中,由于编程中出现的一些错误,导致软件的Hex 文件一直不能生成,但是经过仔细检查,最终成功写好程序。除此之外,在使用 PROTEL 软件画硬件电路时,也由于硬件电路元件的特殊性,遇到了许多困难,无奈多方查询资料,终于解决问题。另外在编写乐谱程序也颇为不易,上网查阅了很多资料才基本将一首简单的音乐 C 程序代码编写出来。总之,虽然调试过程遇到很多问题,但经过集体努力,最终调试成功。基本实现设计预定的功能,可以用按键控制四首音乐的播放,并在播放的同时点亮了相应的
29、LED 灯。设计成功。18附录一系统硬件电路图:19附录二系统软件总程序:#include /包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit speaker=P23; /定义音乐输出端口,需要连接到对应的喇叭#define uchar unsigned char#define uint unsigned intuchar timer0h,timer0l,time;code uchar sszymmh= 6,2,3, 5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1,6,2,4, 3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,
30、2,2, 1,2,1,6,1,1, 5,2,1, 3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2,5,2,1, 6,2,1, 3,2,2, 2,2,2, 1,2,4, 5,2,3, 3,2,1,2,2,1, 1,2,1, 6,1,1, 1,2,1, 5,1,6, 0,0,0;/世上只有妈妈好code uchar mldsh= 6,1,2, 3,2,2, 7,1,3, 6,1,1, 1,2,1, 2,2,1, 1,2,1, 3,2,4, 6,1,2, 6,2,2, 5,2,1, 6,2,1, 5,2,1, 2,2,1, 4,2,1, 3,2,1, 3,2,2, 6,1,2,
31、6,2,2, 5,2,1, 6,2,1, 5,2,1, 6,2,1, 5,2,2, 2,2,1, 3,2,4, 1,2,4, 6,1,2, 3,2,2, 2,2,3,7,1,1, 6,1,8, 6,1,2, 3,2,2, 7,2,3, 7,1,1, 6,1,1, 1,2,1, 2,2,1, 1,2,1, 3,2,4, 6,1,2, 6,2,2, 5,2,1, 6,2,1, 5,2,1, 2,2,1, 4,2,1, 3,2,1, 3,2,6, 6,1,2, 6,2,2, 5,2,1, 2,2,1, 3,2,1, 4,2,1, 3,2,2, 2,2,2, 1,2,4, 6,2,2, 2,2,2,
32、1,2,3, 7,1,1, 6,1,6, 6,1,1, 7,1,1, 1,2,1, 2,2,1, 203,2,1, 1,2,1, 7,2,2, 5,1,2, 6,1,1, 1,2,1, 2,2,1, 3,2,1;/美丽的神话code uchar lzlh= 1,2,2, 2,2,2, 3,2,2, 1,2,2, 1,2,2, 2,2,2, 3,2,2, 1,2,2, 3,2,2, 4,2,2, 5,2,4, 3,2,2, 4,2,2, 5,2,4, 5,2,1,6,2,1, 5,2,1, 4,2,1, 3,2,2, 1,2,2, 5,2,1,6,2,1, 5,2,1, 4,2,1, 3,2,2
33、, 1,2,2, 2,2,2, 5,1,2, 1,2,4, 2,2,2, 5,1,2, 1,2,4,1,2,2, 2,2,2, 3,2,2, 1,2,2, 1,2,2, 2,2,2, 3,2,2, 1,2,2, 3,2,2, 4,2,2, 5,2,4, 3,2,2, 4,2,2, 5,2,4, 5,2,1,6,2,1, 5,2,1, 4,2,1, 3,2,2, 1,2,2, 5,2,1,6,2,1, 5,2,1, 4,2,1, 3,2,2, 1,2,2, 2,2,2, 5,1,2, 1,2,4, 2,2,2, 5,1,2, 1,2,4;/两只老虎code uchar srg= 5,1,1, 5
34、,1,1, 6,1,2, 5,1,2, 1,2,2, 7,1,4, 5,1,1, 5,1,1, 6,1,2, 5,1,2, 2,2,2, 1,2,4, 5,1,1, 5,1,1, 5,2,2, 3,2,2, 1,2,2, 7,1,1, 6,1,1, 4,2,1, 4,2,1, 3,2,2, 1,2,2, 2,2,2, 1,2,4 ;/生日歌/ 音阶频率表 高八位code uchar FREQH=0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8, 0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, /1,2,3,4,5,6,7,8,i0xFC,0
35、xFD,0xFD,0xFD,0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,21 ;/ 音阶频率表 低八位code uchar FREQL=0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, /1,2,3,4,5,6,7,8,i0xEE,0x44, 0x6B,0xB4,0xF4,0x2D, 0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,;uchar const EL=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x
36、7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;/0-F/*/* 函数声明 */*/ uchar keyscan(void); /键盘扫描void delay1(uint i); /演示程序void delay2(unsigned char t);void yy1(void) ; /定义音乐函数 1void yy2(void) ; /定义音乐函数 2void yy3(void) ; /定义音乐函数 3void yy4(void); /定义音乐函数 4 /*/* 主函数 */*/void main()uchar key;P2=0; P0=0X00;
37、while(1)key=keyscan(); /调用键盘扫描,22switch(key)case 0xee:P0=EL0;P1=0xfe; /票yy1();break; case 0xde:P0=EL1;P1=0xfd;yy2();break; case 0xbe:P0=EL2;P1=0xfb;yy3();break; case 0x7e:P0=EL3;P1=0xf7;yy4();break; /*/* 键盘扫描程序 */*/uchar keyscan(void) /键盘扫描函数,使用行列反转扫描法uchar cord_h,cord_l;/行列值中间变量P3=0x0f; /行线输出全为 0co
38、rd_h=P3 /读入列线值if(cord_h!=0x0f) /先检测有无按键按下delay1(100); /去抖if(cord_h!=0x0f)23cord_h=P3 /读入列线值P3=cord_h|0xf0; /输出当前列线值cord_l=P3 /读入行线值return(cord_h+cord_l);/键盘最后组合码值return(0xff); /返回该值/*/* 延时程序 */*/void delay1(uint i) /延时函数while(i-);void delay2(unsigned char t)unsigned char t1;unsigned long t2;for(t1=0
39、;t1t;t1+)for(t2=0;t28000;t2+);TR0=0;/*/* 定时器中断函数 */ /*/void t0int() interrupt 1TR0=0;speaker=!speaker;TH0=timer0h;TL0=timer0l;TR0=1;24/*/*/* 音乐处理函数 */ /*/void song()TH0=timer0h;TL0=timer0l;TR0=1;delay2(time); /*/* 音乐播放函数 */*/ void yy1(void)unsigned char k,i;TMOD=1; /置 CT0 定时工作方式 1EA=1;ET0=1;/IE=0x82
40、 /CPU 开中断,CT0 开中断 while(1)i=0; while(i100) /音乐数组长度 ,唱完从头再来 k=sszymmhi+7*sszymmhi+1-1;timer0h=FREQHk;timer0l=FREQLk;time=sszymmhi+2;i=i+3;song(); void yy2(void) unsigned char k,i;TMOD=1; /置 CT0 定时工作方式 125EA=1;ET0=1;/IE=0x82 /CPU 开中断,CT0 开中断 while(1)i=0; while(i150) /音乐数组长度 ,唱完从头再来 k=mldshi+7*mldshi+1
41、-1;timer0h=FREQHk;timer0l=FREQLk;time=mldshi+2;i=i+3;song();void yy3(void)unsigned char k,i;TMOD=1; /置 CT0 定时工作方式 1EA=1;ET0=1;/IE=0x82 /CPU 开中断,CT0 开中断 while(1)i=0; while(i150) /音乐数组长度 ,唱完从头再来 k=lzlhi+7*lzlhi+1-1;timer0h=FREQHk;timer0l=FREQLk;time=lzlhi+2;i=i+3;song(); void yy4(void) unsigned char k
42、,i;26TMOD=1; /置 CT0 定时工作方式 1EA=1;ET0=1;/IE=0x82 /CPU 开中断,CT0 开中断 while(1)i=0; while(i150) /音乐数组长度 ,唱完从头再来 k=srgi+7*srgi+1-1;timer0h=FREQHk;timer0l=FREQLk;time=srgi+2;i=i+3;song();参考文献:单片机原理与接口技术(第 3 版)李朝青 编著 北京航空航天大学出版社智能仪器设计基础(第 2 版) 史建房 等编著 电子工业出版社 C 程序设计 (第四版) 谭浩强 著 清华大学出版社AT52 单片机板子的电路图和芯片资料以及程序基于 OrCad16.3 的电子电路分析与设计 谭阳红 编著 国防教育出版社Uln2003 芯片: http:/