题目:
.
毕 业 设 计 (论 文)
基于51单片机的儿童早教故事机的设计
.
毕业设计(论文)原创性声明
本人郑重声明:所提交的毕业设计(论文),是本人在导师指导下,独立进行研究工作所取得的成果。除文中已注明引用的内容外,本毕业设计(论文)不包含任何其他个人或集体已经发表或撰写过的作品成果。对本研究做出过重要贡献的个人和集体,均已在文中以明确方式标明并表示了谢意。
论文作者签名: 日期: 年 月 日
学位论文版权使用授权书
本学位论文作者完全了解学校有关保障、使用学位论文的规定,同意学
校保留并向有关学位论文管理部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权省级优秀学士学位论文评选机构将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。
本学位论文属于
1、保密□,在_____年解密后适用本授权书。 2、不保密□。
(请在以上相应方框内打“√”)
目 录
.
.
摘 要 ............................................................................ I Abstract ........................................................................ II 1 绪 论........................................................................... 1
1.1 我国儿童早教机发展现状及发展趋势 ....................................... 1
1.2 国外现状 .................................................................. 2 1.3 儿童早教故事机的发展趋势 ................................................ 2 1.4 课题研究的目的和意义 ................................................... 2
2 方案比较 ....................................................................... 3
2.1 主控单元的选择 .............................................................. 3
2.2 液晶显示模块的选择 ....................................................... 3 2.3 语音模块的选择 ........................................................... 4
3 系统硬件设计 ................................................................. 6
3.1 总体方案设计 .............................................................. 6 3.2 主控单元模块 .............................................................. 6 3.3 液晶显示屏 ................................................................ 7 3.4 80C52单片机的的封装和引脚 .............................................. 8 3.5 红外遥控器 ................................................................ 9 3.6 独立键盘 .................................................................. 9 3.7 电源 ....................................................................... 9 3.8 语音模块 ................................................................. 10
4 软件设计 ...................................................................... 12
4.1 音乐播放主控流程图 ...................................................... 12
4.2 音乐播放子程序流程图 .................................................... 14 4.3 LCD1602显示子程序流程图 ................................................ 15 4.4 语音模块工作流程图 ...................................................... 15
5 实物操作 ...................................................................... 17
5.1.开机未播放音乐下的状态 ................................................. 17 5.2工作状态下的单片机状态 .................................................. 17 5.3 按键功能测试 ............................................................. 18 5.4 红外遥控器功能测试 ...................................................... 19
结论 ............................................................................. 20 参考文献 ........................................................................ 21
.
.
基于51单片机的儿童早教故事机的设计
摘 要:当今社会,父母对孩子的早期教育相当重视,如何更完善、更系统的把知识教授给孩子,儿童早教故事机就是一个很好的选择。本课题介绍了一种以STC89C52单片机为控制核心的儿童早教故事机,通过keil软件编写的程序实现早教故事机的音乐播放功能,用户可以凭借独立按键或红外遥控器来选择播放歌曲顺序,功率放大器和喇叭可以控制音量大小,同时LCD1602显示屏可以显示歌曲名称数码管显示歌曲序号。除此之外,单片机外接WT588D语音模块、8002功率放大器以及喇叭可以实现其人声讲故事的功能,增加其趣味性,使其整体更适合儿童倾听和玩耍。
本论文详细描述了儿童早教故事机的国内外发展现状,对课题设计所需要的多种元件的方案比较,对所选用的元件绘制了硬件设计电路、软件流程图并编写了相关的程序。论文最后加入了设计成果的实物演示图。
关键词:STC89C52单片机;WT588D语音模块;红外遥控器;LCD1602显示屏;功率放大器
.
.
Design of early childhood story machine based
on 51 single chip
Abstract: In today's society, the parents to the child's early education very seriously, how to be more perfect, more systematic the knowledge taught to children, early childhood story.This paper introduces a children story machine based on single-chip microcomputer STC89C52 machine is a good choice.Through the keil software written procedures to achieve early childhood story machine music playback function, the user can by virtue of the independent button or IR remote controller connected to choose to play the song sequence, power amplifier and the loudspeaker can control the volume size and LCD1602 display can display song name digital tube display song number.In addition, the SCM connected WT588D voice module and 8002 power amplifier and a speaker can achieve its voice to tell the story, increase the interest, make the whole more suitable for children to listen and play.
This paper described in detail the development status about early childhood story machine at home and abroad, various elements of the design issues need compared for the selected components drawn hardware circuit design, software flow chart and the preparation of the relevant procedures. Finally joined the design results of the demo map. Keywords:STC89C52 microcontroller; WT588D voice module; infrared remote control; LCD1602 display; power amplifier
.
.
.
.
1 绪 论
当今社会,我国人口基数大、儿童出生率高 ,但是家中的青壮劳动力因为忙于工作没时间去教育孩子,看孩子的主要是孩子的祖父母。祖辈的文化程度比较低,没办法很好的教育孩子,也不知道如何更好地教孩子,所以,对于这样的家庭来说,经济实惠而且功能比较多的儿童早教机是一个很好的对孩子进行早期教育的选择。而儿童早教机大体上有什么功能呢?首先是可以讲故事和播放音乐,孩子发育早期是一个学习语言的重要时期,都是周围说什么他们会学什么,而且音乐的节拍更加的生动,可以让孩子发育初期就了解什么是韵律。儿童早教故事机的语音切换大多是通过按键和红外遥控器来控制的,这个早期就锻炼孩子对阿拉伯数字的认识了解。现在的早教故事机大多是触摸屏,从而代替纸张,更加环保,而且幼儿操作比较容易。综上所述,儿童早教故事机对于孩子早期教育是很好的选择。
简单来说:儿童早教故事机实现了儿童娱乐及儿童教育等重要功能。功能简单易懂、操作简便、价格便宜,适合各种家庭使用。
1.1 我国儿童早教机发展现状及发展趋势
在当前社会,不管哪个国家地区都很重视儿童早期的教育,毕竟孩子是祖国的花朵,未来的栋梁。由于现在贸易的全球化和科技发展的迅速等原因,这就让儿童早教故事机进入了一个快速发展的状态,在这一情况下,儿童早教故事机的发展在国际上有一定的相似性。但是大体来说儿童早教机经历了以下几代的改进:首先是最初的早教故事机产品:插学习卡的儿童早教故事机;但是这类早教机操作起来比较繁琐,孩子一般因为年龄原因是很难学会使用方法,还需要占用家长工作的时间。另外需要插上辅助学习卡才能用,所以学习卡都要保管好,但是因为学习卡比较小所以容易丢失。除此之外,学习卡里面内容是固定的,并不是说一张卡就能包含很多内容,一张卡用的时间久了,里面的内容就显得单调无聊了。所以这一类的早教故事机很快被淘汰了,没有被用户持续使用。
第二代产品:第二代的早教故事机是现在大多数店面还有销售的一类早教故事机。其功能详情如下:(1)语言训练:里面有智能模块可以和孩子进行简单的聊天,给孩子讲故事,培养孩子的语言表达能力。
(2)早期的英语启蒙:早教故事机语音功能中增加了讲英语的功能,虽然只是比较简单的单词教育和日常对话,但是不能忽视儿童早期英语启蒙学习中的重要性,这在上学之后对英语的兴趣和喜爱具有决定性的作用。上学之后经过英语启蒙的孩子对英语学习的兴趣和所得到成绩相对于没有启蒙的孩子都要优秀。
(3)可爱的外观设计:现在一些早教故事机外观都是卡通图案,而且体积小,在方便孩子携带玩耍的同时,增加孩子对美的认识、对颜色的识别。
(4)益智故事:开拓了幼儿的视野,挖掘孩子的潜能,是一种很好的教育方式。可以扩宽孩子思维的模式,在听故事同时能够培养孩子善恶观,了解事物的是非黑白,无论是成
.
.
人还是少儿,都可以从故事中学习到为人处世的方法。
(5)儿童歌曲:不止是简单的纯音乐播放,还有人声伴唱,语音更生动美妙,可以让孩子学习一些儿歌同时增加其对韵律和节奏的感觉。
可以说,这已经是功能相当丰富的了,是市场上较为常见的产品了。
1.2 国外现状
国外主要开发到现在的第三代(也是我国现阶段主流进口产品)。(1)第三代产品在第二代早教机的基础上增加了彩色显示屏,让幼儿可以更直观的看动画视频和文字,从而增强宝宝对教学资料的理解能力和接受度。(2)机身的内存也从原来的1G扩大到4G 或8G及16G以上,从而可以下载更多的教育内容,使平时的儿童生活更加丰富多彩。(3)电池在原先的基础上进行升级,由原来的AAA干电池,升级为更环保,更安全的可循环充电锂电池(或聚合物电池),增加了基于电池的保护电路,从而更安全可靠。(4)外形体积越来越小,方便幼儿的随身携带。
1.3 儿童早教故事机的发展趋势
将来的儿童早教故事机不仅仅局限于幼儿的娱乐和教育功能,更注重儿童的安全考虑。其中,儿童早教故事机更趋向于选择环保和绿色健康的材料,为了增加儿童对色彩的分辨率以及对美好事物的理解,设计的更加可爱、多姿多彩。增加其安全功能,比如环境温度过高的情况下早教机进行声音报警并且联系家长手机发送报警短信提示。增加距离感应器,当儿童跟随父母出行并距离父母较远时单片机报警引起父母警觉,有效防止孩子走失。增加远程视频通话的功能,当孩子想念父母时可以通过简单按键实时与父母视频通话。并且如现在连接手机的智能腕表一样,给孩子带一个连接早教机的智能手环连接,实时检测孩子体温和心率等身体情况,让父母随时了解孩子的健康状况。
1.4 课题研究的目的和意义
本课题的任务是一个基于STC89C52单片机的儿童早教故事机的设计,它是以STC89C52单片机作为主控模块,通过编写好的程序下载到单片机中,本设计编写的歌曲共有5首歌曲,外接喇叭播放歌曲,独立按键和红外遥控器选择歌曲进行播放,同时LCD1602液晶显示屏显示歌曲名字,数码管显示歌曲序号。通过外接WT588D语音模块,8002功率放大器和喇叭进行人声发音以实现其讲故事的功能。
.
.
2 方案比较
2.1 主控单元的选择
单片机的类型选择具有至关重要的地位,内存的大小、工作速率的快慢、应用范围的大小和成本的高低等都是需要考虑的因素。由于本课题要求用51单片机,所以我们选择两种方案进行比较论证。
方案一
AT89C52是一款低电压,高性能单片机,其特点主要功能是:可与MCS51指令系统完全兼容;有8K可反复擦拭的内存(超过1000); 32个双向I / O串行端口; 256 * 8位的内部存储器; 3位可编程定时器/计数器中断;控制0-24MHz的时钟频率;它的串行中断有两个,外部中断源有两个,中断源有8个;读写中断口线2个,具有软件可以设置睡眠和唤醒的功能,在低功耗的空闲模式和掉电模式下; 还有PDIP,PQFP,TQFP和PLCC等几种封装,以适应不同产品的要求[1]。
AT89C52是一个8位微处理器,PDIP封装引脚AT89C52引脚图使用行业标准。标准的C51工作内核,引脚的排列方式和内部能运行的功能与一般的8xC52单片机相同。其主要功能包括:集成电路,数据存储和外部接口模块初始化内部寄存器,发送和接收红外遥控信号[2]。
方案二
采用STC89C52RC作为控制器。具有超强抗干扰,超低功耗,且能兼容AT89S51,管脚定义一样,无需编程器,无需仿真器,只要用TTL线就能烧录,支持在线下载程序,下载程序比较方便,外设丰富,寿命长,价格便宜,编程简单,加密性强等特性。[3]。
STC89C52单片机的构造:在总共40个引脚中专用于主电源引脚有2个,可以外接晶振的引脚有2个,控制或与其它电源复用的引脚有4个,其他的32条是控制输入输出I/O引脚[4]。
综上所述AT89C52和STC89C52相比,基本功能相同,同样的晶振频率,后者的速度比前者快,同时后者下载程序方面,直接串口就可以下载,前者需要使用专用的编程器,后者比较流行,前者已经停产十几年了。所以我们选用STC89C52单片机。
2.2 液晶显示模块的选择
LCD是液晶显示器的缩写,液晶显示器本身是不发光的,而是液晶通过通电处理后改变光线通过的方向,达到显示字体的效果。
方案一
LCD12864显示块是点阵液晶显示模块,就是由128*64个液晶显示点组成的一个128列*64行的阵列,所以也就叫成了12864。每一位二进制数都是对应着一个相应的显示点,当输出程序为0时表示灭,为1时就表示亮,当对应的储存单元存入了这些写好的点阵信息后,就可以进行相对的显示。但是是显示点在存储器中的信息和地址液晶屏上的位置之
.
.
间的关系就成了应用的问题关键。LCD12864显示屏是一种单中文字库的4位/8位并行的显示屏、一线或多线串行接口的方式。显示屏显示的分辨率为128×64,内置8129个16*16的汉字和128个16*8点ASCII字符集,利用该模块灵活的接口方式和简单、方便的操作指令,可构成全中文人机互交图形界面[5]。
方案二
LCD1602显示器,这就是简单应用的工业字符型液晶,LCD1602显示屏是指即可显示两行,每行可以显示16个字符的液晶显示模块(显示数字或者字符),显示内容是16乘以2的字符,这样能够让最多16X02即32个字符同时显示,分辨率为5×7。每个显示点都对应着有一位二进制数,和LCD12864相同,当输出程序为0时表示灭,为1时就表示亮。LCD1602液晶也被叫做LCD1602字符型的液晶显示屏,它经常被用来显示字母、数字和符号等。在每个字符之间有一个点距的间隔,每行之间也有间隔,起到了控制字符间距和行间距,让显示更清楚,但是正也因为这些设计让它不能很好的显示图形[6]。
综上所述,LCD12864显示屏相对比功能是比较强大的,由于我们只是显示歌曲名字,所以在选择液晶屏幕方面,LCD1602显示屏已经够用了,而且更加实惠。
2.3 语音模块的选择
语音模块可以连接单片机、功率放大器和喇叭发出人声。通过连接下载模块可直接把需要的音频下载到语音模块中,然后连接单片机通过更改编程控制语音模块播放其中的语音音频。
方案一
ISD1802语音模块,它的正常工作电压为3到5V,按住录音按键不放可以自主进行录音,当松开时,就可播放已经录制好的音频,录入的时间越短其音质越好。播放方式为循环播放,除非断电,否则播放不停。可外接话筒,进行人声放音,其音质相比通常的话筒要好一些。
方案二
WT588D语音模块:WT88D语音模块具有功能多,音质好,应用范围广等特点,而且WT588D语音模块弥补了以往各种单片机功能少、应用范围小的缺点,除此之外,它的应用模式也比较多,如:MP3控制模式、按键控制模式、按键组合控制模式、并口控制模式、一线串口控制模式、三线串口控制模式以及三线串口控制控制端口扩展输出模式,这让其几乎可用于任何领域。另外,WT588D语音模块音质也颇为不错,支持6MHz到20MHz音频模式的加载,这个芯片的特点就是能够将加载好的音频的音质几乎能够完整无损的播放出来。WT588D voiceChip软件是WT588D系列语音单片机模块一个相对应配套的加载软件,它能够使语音模块中的语音加载或者删除变得简单,也能通过此软件反复擦除模块的内容是模块应用更加多样化。其次,WT588D语音模块可控制的语音地址位能达到220个,达到播放音频更多的效果。另外SPI-FLASH存储器是WT588D语音模块这一系列里本来就内置好的,应用WT588D系列语音单片的用户,SPI-FLASH存储器也可根据用户想要用的实际用处进行外置,只需要更换SPI-FLASH里面的内容比如众多的控制模式或者更换里面的语音
.
.
组合的方式,就能完全实现操作方式和内容的切换[7]。
综上所述,因为WT588D语音模块相对于其他的语音模块功能更强大完善,音质更好,可反复更换其中的内容等特点,更适合我们的要求。
.
.
3 系统硬件设计
3.1 总体方案设计
本设计是以STC89C52单片机作为主控模块,通过编写好的程序下载到单片机中,外接喇叭播放歌曲,独立按键和红外遥控器选择歌曲进行播放,同时LCD1602液晶显示屏显示歌曲名字,数码管显示歌曲序号。通过外接WT588D语音模块,8002功率放大器和喇叭进行人声发音以实现其讲故事的功能[8]。如图3.1所示
独立键盘 STC89C52单片机 扬声器电路 LCD1602显示屏 语音模块 红外遥控器 图3.1 总体方案图
3.2 主控单元模块
最小单片机系统一般应包括:单片机,晶振电路和复位电路。STC89C52微控制器复位电路最小系统极性的大小直接影响MCU复位时间的大小,一般为10〜30uF,更大STC89C52系统最小容量值需要在更短的时间内复位。 STC89C52单片机最小系统晶体可以使用6MHz或11.0592MHz,同时更高频率的晶振也可以在正常频率下使用。STC89C52晶体芯片系统的振荡频率直接影响正常工作状态下的芯片处理速度,更大的频率意味着有更快的处理速度。 STC89C52单片机SCM系统振荡电容MC2,MC3一般采用15〜33pF的,并和晶振尽可能接近。 P0口是开漏输出,需要添加阻力,当其作为输出端口的时候,阻力一般是10K。最小单片机系统,其实就是能使单片机工作的最小元件工作系统[9]。
(1)复位电路:当系统上电后,复位电路开始工作,就是为了让电源接入后消除按键按下后产生的抖动。所以只有在电源电流稳定后才撤销复位,并且只有VCC电平比较高时才会复位成功。
(2)晶振电路:在单片机中这是非常重要的部件,单片机的运作需要时钟频率,而晶振是产生时钟频率的部件,它产生的频率越高,单片机工作速度越快。通常为了达到系统的稳定性,一个单片机中的部件都是共用一个晶振[10]。如图3.2所示:
.
.
.
3.3所示
3.3 液晶显示屏
图3.2单片机最小电路图
但是控制原理是一样的,本课题用的是16脚的,多出来的两个脚是接背光电源的。如图
复位电路提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等,液晶显示器
要就是消耗在电极和驱动IC上,所以消耗小[11]。常见的LCD1602有14脚和16脚之分,
通过电极改变液晶分子状态达到显示的目的,所以它的重量也比较轻,同理,它的能耗主
LCD显示屏工作在5V的电压下,可以通过调节屏幕的对比度来显示字符,内部自带的
.
图3.3 LCD1602电路图
3.4 80C52单片机的的封装和引脚
80C51系列单片机的封装形式一般采用的是双列直插式( DIP40)封装形式。QFP44(Quad Flat Pack)形式和LCC(Leaded Chip Caiier)。这里仅介绍常用的总线型DIP40封装。
40个引脚按引脚功能大致可分为4个种类:2个电源、2个时钟、4个控制和32个I/O引脚[12]。如图3.4所示: (1) 电源:
VCC :芯片的电源,接+5V电压; VSS: 接地端;
图3.4 STC89C52单片机封装引脚图
.
.
3.5 红外遥控器
这是一种集红外线接收和放大于一体进行红外接收外送信号的遥控器,不需要再外接任何元件,就能完成红外线接收和输出并兼容TTL电平信号的所有工作,适合与各种红外遥控器和红外数据进行传输,而且它的体积和普通的塑封三极管大小一样[13]。如图3.5所示:
图3.5红外遥控器电路图
3.6 独立键盘
本课题设计成果是除了红外遥控器之外也可以用单片机独立按键控制音乐循环播放,单片机的每个按键都是工作于一个单独的I / O口线,而且当按下一个按键,I/O接口工作而别的I/O接口的工作状态不受到影响。因此,通过检测输入线的电平状态可以容易的确定哪个键被按下,键盘工作方式采用定时扫描方式,采用定时器T0定时[14]。如图3.6所示:
图3.6独立按键电路图
3.7 电源
系统直流9V或者12V电池供电,由一片LM7805芯片将9V/12V电源稳压在5V上。5V电源能给所有芯片和电路供电。在我们使用滤波电容器的电源电路中,其主要目的是为了消除使用该系统的滤波电容器的干扰,提高系统的抗干扰能力[15]。如图3.7所示:
.
.
图3.7电源电路图
3.8 语音模块
WT588D系列语音单片机的优点是相比其他的语音模块可用的功能更多、发声之后的音色更好、可以长时间工作,这也弥补了以前的一些语音模块的不足之处,所以在很多场合都可见到它的应用设计[16]。作为一般以语音为基础的芯片,支持音质为6K~20K采样频率的音频加载。本课题采用的控制模式为三线串口模式,通过扫描有按键按下,就用三线串口程序调用一段语言模块中的语音达到发声的目的[17]。如图3.8所示:
.
.
图3.8WT588D电路图
.
.
4 软件设计
4.1 音乐播放主控流程图
电路以STC89C52为主控制器,主程序对单片机实现初始化设置后,采用单片机自带的
独立键盘来实现对播放的控制,然后子程序对播放切换进行判断,得到按键中断后进行播放并进入歌曲曲目识别的子程序,进行歌曲曲目判断。确定歌曲曲目后,数码管显示歌曲序列,1602LCD显示歌名。
在播放音乐的过程中,根据按键中断的子程序判断音乐是否切换,如未切换,则播放继续,如要切换歌曲,则切换为下一首,当音乐结束时程序跳回初始识别子程序[18]。如图4.1所示:
.
.
开始 系统初始化 扫描按键得到键值 判断键值 LCD显示播放的歌曲 蜂鸣器(喇叭)发音 切换歌曲 扫描键盘 YES 切换键是否按下 NO 继续发声 结束 图4.1音乐播放主控流程图
.
.
4.2 音乐播放子程序流程图
开始播放自定义的音乐程序时,指针指向乐谱的的第一个字节,第一个字节被分成高低字节,高位字节是相应定时器音符音高常数,低字节的音符对应的1/4拍的节拍数,并启动定时器0中断在模式1,由定时器定时常数得到相应音高,设置1/4节拍的延时子程序,由节拍次数得到节拍,然后读取音乐的下一个字节,循环下去就会演奏出精彩、和谐的音乐[19]。如图4.2所示:
.
开始程序 指向乐谱第一个字节 拆分字节的高低字节 由高字节得音高对应定时器定时常数 由低字节得到节拍对应节拍次数 启动定时器0 延时节拍时间 关闭定时器0 读取下一个乐谱字节 字节是00H吗? NO YES 程序循环 图4.2音乐播放子程序图
.
4.3 LCD1602显示子程序流程图
当按下电源键,LCD出现开始页面music stop,当有键按下,系统进入歌曲子程序并分辨歌曲名字,LCD显示;当歌曲播放完毕,LCD返回初始页面。如图4.3所示:
开始 LED显示music stop NO 数字键按下 YES 调music1~music5子程序,并顺序自动播放,并显示英文歌名 系统返回 图4.3 LCD1602显示流程图
4.4 语音模块工作流程图
开始播放下载好的语音模块程序时,单片机判断键值,经过功率放大器调节播放声音的大小然后喇叭发声,独立键盘来实现对播放的控制,在播放音乐的过程中,根据按键中断判断音乐是否切换,如未切换,则播放继续,如果切换歌曲,则切换为下一首,当播放结束时,返回初始化。如图4.4所示:
.
.
开始 扫描按键得到键值 判断键值 语音模块 功率放大器调节音量 切换语音 扫描键盘 YES 切换键是否按下 NO 继续发声 结束
图4.4 语音模块流程图
.
.
5 实物操作
5.1 开机未播放音乐下的状态
在单片机中下载好程序并连接好电路后打开电源,音乐不播放,数码管闪烁,LCD1602显示器显示“music player STOP PLAY!!!”如图5.1所示。
液晶屏显示音乐播放器停止工作 数码管闪烁 喇叭未发声
图5.1 开机状态实物图
5.2 工作状态下的单片机状态
LCD显示屏显示music player和歌曲名称,数码管显示正在播放的歌曲的序号,外接的喇叭发声并可凭借功率放大器控制音量大小。如图5.2所示。
.
.
图5.2 工作状态下的液晶显示实物图
5.3 按键功能测试
按下按键,音乐更换,数码管显示歌曲序号更换,LCD显示屏歌曲名称更换。如图5.3所示。
图5.3 按键测试实物图
.
.
5.4 红外遥控器功能测试
检测到红外遥控器有按键按下,歌曲更换,数码管显示歌曲序号更换,液晶显示屏歌曲名称更换。如图5.4所示。
.
图5.4 红外遥控器功能实物图
.
结论
我设计的儿童早教故事机采用STC89C52单片机为主控元件,价格比较便宜、性能比较完善。采用喇叭为外接的播放器件,音质方面比较蜂鸣器要好一点,但是歌曲播放的是简单的节拍,没有人声歌唱功能,音质好的的音频也不能播放,与现在流行的WAV、MP3等音乐质量很好的系统相比,它就不是一个好的选择。单片机的外形比较大,外观也不漂亮,相对于现在发展的各类外形小巧漂亮的可随身携带的电子设备相比有很大的缺陷,这是本设计的不足。
本设计因为时间不足、语音模块下载及调试语音程序比较繁琐原因未能实现其语音模块人声发声讲故事的功能,表示十分遗憾,敬请各位老师谅解。
.
.
参考文献
2009.
[1] 刘海成.单片机及应用系统设计原理与实践[J]北京:北京航空航天大学出版社,
[2] 郭天祥.新概念51单片机C语言教程-入门、提高、开发、拓展全攻略[M].北京:
电子工业出版社,2009.
[3] 江力. 单片机原理与应用技术[D]. 北京:清华大学出版社,2006
[4] 陈明焚.8051单片机课程设计实训教材[M].北京:清华大学出版社,2005.
[5] 裴岩,刘利民.单片机系统综合设计与实践[J].内蒙古:内蒙古大学出版社,2003. [6] 求是科技.8051系列单片机C程序设计完全手册[M].北京:人民邮电出版社,2006. [7] 任文,孔庆彦.C语言程序设计[M].北京:机械工业出版社,2009.5
[8] 清源科技. Protel99SE电路原理图与PCB设计及仿真[M].北京:机械工业出版社,2011. [9] 刘润景,张丽娜,丁莉.基于PROTEUS的电路及单片机设计与仿真(第2版)[M].北京:北京航空
航天大学出版社,2010.
[10] 丁明亮,唐前辉.51单片机应用设计与仿真—基于Keil C与Proteus[J].北京:北京航空航天 大学出版社,2009.2
[11] 黄智伟.全国大学生电子设计竞赛电路设计(第2版) [J].北京:北京航空航天大学出版 社,2011.
[12] 黄智伟. 全国大学生电子设计竞赛技能训练(第2版)[J].北京:北京航空航天大学出版 社,2011.
[13] 黄智伟. 全国大学生电子设计竞赛系统设计(第2版)[J].北京:北京航空航天大学出版 社,2011.
[14] 黄智伟. 全国大学生电子设计竞赛制作实训(第2版)[J].北京:北京航空航天大学出版 社,2011.
[15] 徐淑华,程退安,姚万生.单片机微型机原理及应用[M].哈尔滨:哈尔滨工业大学出版社.2005 [16] 裴岩,刘利民.单片机系统综合设计与实践[J].内蒙古:内蒙古大学出版社,2003.
[17] Ljung,Lennard.Theory And Practice of Recursive Identification[M].The MIT press,1983. [18] Ljung,Lennard.Theory And Practice of Recursive Identification[M].The MIT press,1983. [19] Dallas Semiconductor Data Book.DS18B20 programmable resoluting l-wire digital thermometer[S].
[S.l.]:Dallas Semiconductor.
.
.
致 谢
毕业设计之所以那么顺利的完成,感谢院领导们为我们制定的时间任务安排以及提供
实验室等学习场地,使毕业设计有条不紊的进行。同时感谢我的导师高嵩老师每周坚持不懈的给我们辅导。在这几个月里,我学到了许多东西,我的导师也教会我如何把一件事情快速有效的完成,在毕业设计期间 虽然遇到很多困难,但是庆幸导师在我旁边为我指点迷津、解决困难。在此真诚的感谢院领导的关怀和导师的帮助。
我的论文题目是基于51单片机的儿童早教故事机的设计,刚开始拿到这个题目时,这对于在大学生活里生活的懵懵懂懂的我是相当困惑的,清晰的题目中却带着我满满的迷惑,从哪里开始入手,怎么进行编程和怎么操作单片机?我几乎都是一无所知,毕竟大学4年学习的内容相对比较片面,没有真正的了解一些专业方面的知识。幸好高嵩老师秉承的严谨的教学态度,严格要求我每周做完相应的任务指标,给了我一个清晰的通往胜利的道路。并且学校的领导为了给我们一个良好的做毕业设计的环境,专门给我们提供了实验室,从而使我们能在一个安静的环境中专注的作者自己的设计,非常谢谢学校领导的关心。虽然毕业设计时间很紧迫,设计要求很严格,但是我在其中学到了很多东西,首先,做事有计划性,把一件难事分为许多件小事,做好时间规划,一步步的完成,最后,就会成功。另外,做事情坚持不懈,当我们遇见困难时,不要第一时间就想着“我不行”,而是想尽办法克服困难,克服自己内心的恐惧和负面情绪,人生中总是遇见自己未曾见到的高峰,但是不能止步不前,而是努力攀登。在这几个月的时间中,我也逐渐认识到了自身的不足,以前的我遇见学习问题第一时间的想到的是请求同学老师帮忙解决,但是经过这次毕业设计我开始学会了自己去解决问题,比如这次毕业设计用到的protel软件,keil软件和用语音模块等。然后尝试自己去画电路图,自己去编写程序,虽然过程很艰难,但是当成功的笑容挂在嘴角时,突然发现这些都是值得的。
如何成功,如何实现自己的梦想,一步一个脚印,不耍小聪明,就会发现你会学的比别人更多,比别人更快。在这毕业之际,感谢老师,感谢校领导,感谢给我帮助的同学和此致
敬礼
参考文献的作者,真正让我学习到了属于自己专业的知识。
.
.
附录A
#include #define uchar unsigned char #define uint unsigned int #define lcd1602 P0 //1602数据接口连接 sbit IR=P3^2; //红外遥控器接口 sbit key1=P3^2 ; //按key1可切换歌曲 sbit key2=P3^3;//按key2可切换歌曲 sbit fm=P1^2;//蜂鸣器连续的IO口 sbit lcd1602rs=P2^4; //1602RS接口连接 sbit lcd1602rw=P2^5; //1602RW接口连接 sbit lcd1602en=P2^6; //1602EN接口连接 unsigned char a[20]=\"Music Player \"; unsigned char b[20]=\"STOP PLAY!!!!! \"; unsigned char s1[20]=\"Song:LaoDongGR \" ; unsigned char s2[20]=\"Song:WeiYi \"; unsigned char s3[20]=\"Song:ClassMate Y \" unsigned char s4[20]=\"Song:HuLuWa \" ; unsigned char s5[20]=\"Song:QiKaiDeSheng \" ; unsigned char b1[20]=\"STOP PLAY!!!!! \"; uchar irtime; //红外用全局变量 bit irpro_ok,irok; unsigned char IRcord[4]; unsigned char irdata[33]; uchar count1;//花样标志 uchar count2;//歌曲标志 uchar timeh,timel,i; void delay11(uint z); void delay_ms(uint ms ) { uint j; for(ms;ms>0;ms--) for(j=120;j>0;j--); . ; . } static void delay(unsigned int us) { while(us)us--; } void Delay1us(unsigned char n) //@12.000MHz { unsigned char i; for(i=0;i /*液晶显示*/ bit lcd1602busy(void) { bit busy; lcd1602rs=0; //指令 lcd1602rw=1; //读取 lcd1602en=1; //开始 Delay1us(5); busy=(bit)(lcd1602&0x80); Delay1us(5); lcd1602en=0; return busy;//返回结果 } void lcd1602writecmd(unsigned char cmd) //lcd写指令 { while(lcd1602busy()); lcd1602rs=0; //指令 lcd1602rw=0; //写入 lcd1602en=1; //使能 Delay1us(5); lcd1602=cmd; //准备命令 Delay1us(5); lcd1602en=0; //使能 } void lcd1602writedata(unsigned char mydata) //lcd1602写数据 { while(lcd1602busy()); . . lcd1602rs=1; //数据 lcd1602rw=0; //写入 lcd1602en=1; //使能 Delay1us(5); lcd1602=mydata; //准备数据 Delay1us(5); lcd1602en=0; //写入 } void lcd1602setpos(unsigned char pos) //设置字符位置 { lcd1602writecmd(pos|0x80); //D7位 置1 Delay1us(5); } void lcd1602int(void) //液晶初始化设置 { lcd1602writecmd(0x38); //8位总线 双行显示 5x7的点阵字符 Delay1us(5); lcd1602writecmd(0x0c); //开显示,无光标,无闪烁 Delay1us(5); lcd1602writecmd(0x01); //清显示 Delay1us(5); } void lcddisplay(void) { unsigned char i=0; lcd1602int(); delay_ms(2); while(a[i]!='\\0') { lcd1602setpos(i); lcd1602writedata(a[i]); lcd1602setpos(0x40+i); lcd1602writedata(b[i]); i++; } } /**************红外显示************/ void Ir_work(void); void Ircordpro(void); void tim0_isr (void) interrupt 1 using 1 { irtime++; //用于计数2个下降沿之间的时间 } void TIM0init(void)//定时器0初始化 . . { TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值 TH0=0x00; //重载值 TL0=0x00; //初始化值 ET0=1; //开中断 TR0=1; } void EX0init(void) { IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2) EX0 = 1; //使能外部中断 EA = 1; //开总中断 } void EX0_ISR (void) interrupt 0 //外部中断0服务函数 { static unsigned char i; //接收红外信号处理 static bit startflag; //是否开始处理标志位 if(startflag) { if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+4.5ms i=0; irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1 irtime=0; i++; if(i==33) { irok=1; i=0; } } else { irtime=0; startflag=1; } } void Ir_work(void)//红外键值散转程序 { switch(IRcord[2])//判断第三个数码值 { case 0x0c:count2++;break; case 0x18:count2=0;break; case 0x5e:;break; case 0x08:;break; case 0x1c:;break; . . case 0x5a:;break; case 0x42:;break; case 0x52:;break; case 0x4a:;break; default:break; } irpro_ok=0;//处理完成标志 } void Ircordpro(void)//红外码值处理函数 { unsigned char i, j, k,cord,value; k=1; for(i=0;i<4;i++) //处理4个字节 { for(j=1;j<=8;j++) //处理1个字节8位 { cord=irdata[k]; if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差 value=value|0x80; if(j<8) { value>>=1; } k++; } IRcord[i]=value; value=0; } irpro_ok=1;//处理完毕标志位置1 } uchar code ldzgr[]={ //劳动最光荣 0x52,0x82,0x82,0x52,0x62,0x62,0x54,0x32,0x52,0x12,0x32,0x28, //太阳光,金亮亮,雄鸡唱三唱; 0x52,0x84,0x52,0x62,0x62,0x54,0x52,0x81,0xA1,0x92,0x52,0x88, //花儿 醒来了,鸟儿忙梳妆 0x83,0x91,0x82,0x52,0x62,0x62,0x54,0x33,0x81,0x62,0x52,0x12,0x32,0x24, //小喜鹊 造新房,小蜜蜂 采蜜糖 0x12,0x11,0x21,0x32,0x51,0x51,0x62,0x52,0x84,0x82,0x51,0x61,0x84,0xA4,0x92, 0x52,0x86,0x02, //幸福的生活从哪里来?要靠劳动来创造 0x52,0x81,0x81,0x82,0x52,0x62,0x61,0x81,0x54,0x32,0x51,0x61,0x53,0x31,0x12, 0x32,0x24, . . //青青的叶儿 红红的花,小蝴蝶 贪玩耍 0x52,0x82,0x82,0x52,0x62,0x62,0x54,0x51,0x61,0x81,0xA1,0x92,0x52,0x88, //不爱劳动 不学习,我们大家不学它 0x83,0x91,0x82,0x52,0x62,0x62,0x54,0x33,0x81,0x62,0x52,0x12,0x32,0x24, //要学喜鹊 造新房,要学蜜蜂 采蜜糖 0x12,0x11,0x21,0x32,0x52,0x82,0x52,0x68,0x52,0x61,0x61,0x84,0xA4,0x92,0x52, 0x84,0xff//歌曲结束符号 //劳动的快乐 说不尽,劳动的创造 最光荣 }; uchar code wy[]={ //唯一[10] 0x33,0x53,0x63,0x53,0x63,0x73,0x63,0x33,0x53,0x03,0x53,0x53,0x53,0x43,0x44, 0x52,0x43,0x33,0x22,0x14,0x38, //我的天空多么的清新,透明的承诺是过去的空气 0x04,0x43,0x43,0x43,0x33,0x23,0x13,0x38,0x03,0x13,0x23,0x13,0x33,0x26,0x04, 0x33,0x23,0x13,0x2c,0x04, //牵着我的手是你,但你的笑容却看不清 0x33,0x53,0x63,0x53,0x63,0x73,0x63,0x33,0x55,0x03,0x53,0x53,0x53,0x43,0x44, 0x52,0x43,0x33,0x23,0x13,0x35, //是否一颗星星变了心,从前的愿望也全都被抛弃 0x04,0x43,0x43,0x43,0x33,0x23,0x13,0x33,0x54,0x83,0x83,0x93,0xA3,0x92,0x81, 0x63,0x62,0xA3,0x93,0x83,0x96,0x04,0x04, //最近我无法呼吸,连自己的影子也都想逃避 0xA4,0x94,0x82,0x82,0x82,0x52,0x82,0x92,0xA4, //Ba By 你就是我的唯一 0x72,0x72,0x72,0x52,0x72,0x82,0x94,0x04,0xA2,0xA2,0xB2,0xA2,0x82,0x92, //两个世界都变心,回去谈何容易 0x04,0xA4,0x94,0x82,0x82,0x82,0x52,0x82,0x92,0xA4, //确定 你就是我的唯一 0x72,0x72,0x72,0x52,0x72,0x82,0x92,0xA2,0x84,0x64,0x03,0x51,0xB2,0xA2,0x82, 0x61,0x51, //独自对着电话说我爱你,我真的爱你 0x04,0xA4,0x94,0x82,0x82,0x82,0x82,0x72,0x82,0x52,0x32,0x68, //BABY 我已不能多爱你一些 0x02,0xA4,0x94,0x82,0x82,0x82,0x82,0x72,0x82,0x54,0x42,0x66,0xff //其实 早已超过了爱的极限 }; uchar code tzdn[]={ //同桌的你[11] 0x56,0x56,0x32,0x42,0x52,0x76,0x66,0x56,0x52,0x22,0x32,0x46,0x16,0x26,0x04, //前奏 0x52,0x52,0x52,0x52,0x32,0x42,0x56,0x86,0x62,0x62,0x62,0x62,0x42,0x62,0x56, 0x04, //明天你是否会想起,昨天你写的日记 0x52,0x52,0x52,0x52,0x72,0x62,0x52,0x44,0x02,0x42,0x42,0x42,0x42,0x33,0x21, 0x16,0x02, //明天你是否还惦记,曾经最爱哭的你 0x82,0x82,0x82,0x82,0x52,0x32,0x86,0x82,0xA4,0x92,0x92,0x92,0x93,0x81,0x72, . . 0x66,0x02, //谁娶了多愁善感的你,谁看了你的日记 0x72,0x72,0x72,0x72,0x72,0x82,0x96,0x54,0x02,0x72,0x72,0x82,0x92,0x82,0x72, 0x16,0x02, //谁把你的长发盘起,谁给你做的嫁衣 0x84,0x82,0x82,0x52,0x62,0x86,0xA6,0x94,0x92,0x92,0x82,0x72,0x66,0x74,0x72, 0x72,0x72,0x82,0x96,0x56, //啦……,啦……,啦…… 0x72,0x72,0x82,0x92,0x82,0x72,0x86,0x94,0x92,0x92,0x62,0x72,0x96,0xB6,0x94, 0x92,0x92,0x82,0x72,0x66, //啦……,啦……,啦…… 0x72,0x72,0x72,0x72,0x72,0x82,0x96,0x56,0x72,0x72,0x82,0x92,0x82,0x72,0x96, 0x86,0xff //啦……,啦……,啦……,啦…… }; uchar code hlw[]={ //小小葫芦娃 0x83,0x63,0x51,0x61,0x03,0x81,0x61,0x51,0x81,0x63,0x01,0x81,0x61,0x63,0x51, 0x63,0x01,0x61,0x81,0x61,0x51,0x81,0x63,0x03, //前奏 0x12,0x12,0x35,0x11,0x12,0x31,0x02, //葫芦娃,葫芦娃 0x62,0x62,0x61,0x51,0x62,0x51,0x12,0x31,0x02, //一根藤上七朵花 0x81,0x61,0x61,0x51,0x65,0x51,0x12,0x21,0x02, //风吹雨打都不怕 0x75,0x51,0x32,0x58, //啦啦啦啦 0x81,0x01,0x61,0x61,0x51,0x51,0x62,0x61,0x01, //叮当当冬冬当当 0x52,0x11,0x32,0x02,0x81,0x01,0x61,0x61,0x51,0x51,0x61,0x61,0x01,0x51,0x11, 0x22,0x02, //葫芦娃,叮当当冬冬当当,七朵花 0x35,0x11,0x62,0x18, //啦啦啦啦 0x31,0x52,0x61,0x31,0x52,0x61, //葫芦娃,葫芦娃 0x85,0x01,0x71,0x52,0x65,0x02,0xff //七朵花 }; uchar code qkds[]={ //旗开得胜 0xA2,0x82,0x92,0xA1,0x81,0x03,0x81,0xC1,0xB1,0xA1,0x91,0xA2,0x82,0x92,0xA1, 0x91,0x04,0xA2,0x82,0x92,0xA1,0x81,0x03,0x81,0xC1,0xB1,0xA1,0x91,0xA2,0x82, 0x92,0xA1,0x91,0x94,0x04, //哦!哦!哦!哦! 0x01,0xA2,0x91,0xA1,0x91,0x82,0x01,0x62,0x81,0x81,0x61,0x52,0x01,0xA2,0xA1, 0xC2,0xC2,0x01,0x92,0x81,0xA1,0x91,0x81,0x61, . . //痛快自在,热血澎湃,别问由来,星可以摘 0x01,0xA2,0x91,0xA1,0x91,0x82,0x01,0x62,0x81,0x81,0x61,0x51,0x31,0x01,0xA2, 0xA1,0xC2,0xC1,0x91,0x01,0x92,0x81,0xA1,0x91,0x82, //see the champions,take the fleld now,unify us ,make us feel proud 0x01,0xA2,0x91,0xA1,0x91,0x82,0x01,0x62,0x81,0x81,0x61,0x52,0x01,0xA2,0xA1, 0xC2,0xC2,0x01,0x92,0x81,0xA1,0x91,0x81,0x61, //头昂起来,畅爽开怀,天涯不过,你我胸怀 0x01,0xA2,0x91,0xA1,0x91,0x81,0x61,0x01,0x62,0x81,0x81,0x61,0x51,0x31,0x01, 0xA2,0xA1,0xC1,0xA1,0x92,0x01,0x92,0x81,0xA1,0x91,0x82, //celebration it surrounds us , every nation all around us 0x82,0x81,0x81,0xA2,0xC1,0xD1,0x02,0xD1,0xD1,0xD1,0xD1,0xD1,0xD1,0xC1, 0xA2,0x91,0x02,0x81,0x81,0x82,0x81,0x81,0xA1,0xA1,0xC1,0xD1,0x02,0xD1,0xD1, 0xD1,0xD1,0xD1,0xD1,0xC1,0xA2,0x91, //青春是一首歌,迎着光让我们一起唱,看世界就在我们脚下,把梦踢到天际无限0x03,0xA1,0xA1,0x91,0x81,0x61,0x81,0x82,0x91,0xA1,0x91,0x82,0xB1,0xB2,0xB1, 0xA1,0x91,0x92,0xA1,0xA2,0xA1,0x91,0x81,0x82,0x91,0x92,0xA1,0x91,0x81,0x72, //一起唱,汗让梦茁壮,你让我成长,旗像风翅膀,你给我力量 0x83,0x81,0x91,0x81,0x72,0x83,0x81,0x91,0x81,0x72,0x83,0x81,0x91,0x81,0x72, 0x83,0x81,0x91,0x81,0x72, //flag so wave your flag now wave your flag now wave your flag now wave your 0x81,0x82,0x91,0xA1,0x91,0x82,0xB1,0xB2,0xB1,0xA1,0x91,0x92,0xA1,0xA2, 0xA1,0x91,0x81,0x72, //汗让梦茁壮,你让我成长,旗像风翅膀,你给我力量 0x83,0x81,0x91,0x81,0x72,0x83,0x81,0x91,0x81,0x72,0x83,0x81,0x91,0x81,0x72, 0x83,0x81,0x91,0x81,0x72,0x83,0x81,0x91,0x81,0x72, //flag so wave your flag now wave your flag now wave your flag now wave your flag now wave your 0xA2,0x82,0x92,0xA1,0x81,0x03,0x81,0xC1,0xB1,0xA1,0x91,0xA2,0x82,0x92,0xA1, 0x91,0x04,0xA2,0x82,0x92,0xA1,0x81,0x03,0x81,0xC1,0xB1,0xA1,0x91,0xA2,0x82, 0x92,0xA1,0x91,0x93,0x91,0xA1,0x91,0x81,0x61, //哦!哦!哦!哦!一起唱 0x02,0xA1,0x91,0xA1,0x91,0xA1,0x91,0xA1,0x91,0x84,0x04,0xff //世界沸腾我们一起唱 }; //简谱音调对应的定时器初值,适合11.0592M的晶振 uchar code cuzhi[]={ 0xff,0xff,//占位 0xFC,0x8E,//中央C调1-7 0xFC,0xED, 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 }; uchar yinyue[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x0,0x0};//将音调转化为LED样式 void delay1(uint z);//延时1MS void delay(uint z);//延时165MS,即十六分音符 void song(); void beep();//蜂鸣器叫一声 void tube(); /*void key() { if(key1==0) //播放暂停 { delay_ms(50); if(key1==0) { count2++;if(count2>5)count2=0; while(!key1); } } if(key2==0) //暂停音乐 { delay_ms(50); if(key2==0) { count2=0; while(!key2); } } }*/ uchar code num[6]={0x3f,0x06,0x5b,0x4f,0x66,0x6d}; . . main() { count1=1;//流水灯显示第一种花样 count2=0;//不唱歌 P0=num[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) { // key(); /* switch(count2) { case 0:; break; case 1:strcpy(b,s1); break; case 2:strcpy(b,s2); break; case 3:strcpy(b,s3); break; case 4:strcpy(b,s4); break; case 5:strcpy(b,s5); break; } */ lcddisplay(); //显示结果到液晶屏 song();delay_ms(50); } } void int0() interrupt 0 { EA=0;//关总中断 delay1(10);//去抖 if(key1==0) { count2++;//不让蜂鸣器唱歌 TR0=0; . . if(count2==6) count2=0; switch(count2) { case 0:strcpy(b,b1); break; case 1:strcpy(b,s1); break; case 2:strcpy(b,s2); break; case 3:strcpy(b,s3); break; case 4:strcpy(b,s4); break; case 5:strcpy(b,s5); break; } lcddisplay(); } EA=1;//开总中断 } void int1() interrupt 2 { EA=0;//关总中断 delay1(100);//去抖 if(key2==0) { count1=0;//流水灯无花样 TR0=1; i=0;//从头开始唱 count2++; if(count2==6) count2=0; } switch(count2) { case 0:strcpy(b,b1); break; case 1:strcpy(b,s1); break; case 2:strcpy(b,s2); break; case 3:strcpy(b,s3); break; case 4:strcpy(b,s4); break; case 5:strcpy(b,s5); break; } lcddisplay(); EA=1;//开总中断 } void timer0() interrupt 1 //用于产生各种音调 { TH0=timeh; TL0=timel; fm=~fm; } void song() . . { uint temp; uchar jp;//jp是简谱 i=0; while(count2) { if(count2==0) { break; } if(count2==1)//选曲 temp=ldzgr[i]; if(count2==2) temp=wy[i]; if(count2==3) temp=tzdn[i]; if(count2==4) temp=hlw[i]; if(count2==5) temp=qkds[i]; if(temp==0xff) break; switch(count2) { case 0:P0=num[0]; break; case 1:P0=num[1]; break; case 2:P0=num[2]; break; case 3:P0=num[3]; break; case 4:P0=num[4]; break; case 5:P0=num[5]; break; } jp=temp/16; //取数的高4位 P1=yinyue[jp]; if(jp!=0) { timeh=cuzhi[jp*2]; timel=cuzhi[jp*2+1]; } else { TR0=0; fm=1;//关蜂鸣器 } delay11(temp%16); //取数的低4位 TR0=0; //唱完一个音停10MS . . fm=1; delay1(10); TR0=1; i++; } TR0=0; fm=1; } void delay11(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; } . . 附录B . . . 因篇幅问题不能全部显示,请点此查看更多更全内容