学 院 | 计算机与信息工程学院 | 专 业 | 计算机科学与技术 | |
课程名称 | 微机控制系统应用方向 | 题 目 | 基于单片机的电子音乐门铃 | |
完成期限 | 自2013年7月3日 至 2013年8月29日 共8周 | |||
内 容 及 任 务 | 一、项目的目的 基于单片机的电子音乐门铃设计,强化动手能力,为毕业设计做准备。 二、项目任务的主要内容和要求 1.用I/O口产生一定频率的方波,驱动蜂鸣器,发出不同的音调,从而演奏乐曲(至少三首乐曲,每首不少于30秒) 2.客人可通过门铃按键器播放音乐,并显示等待时间。 3.如果主人在家,可暂停并取消音乐播放。 三、项目设计(研究)思路 通过仿真软件PROTUES实现要求的硬件电路图,晶振电路、最小系统、数码管、按键、蜂鸣器等;软件实现按键事件、音乐播放、数码管显示等;首先实现硬件电路图,再软件处理的时候,通过中断和定时器,实现按键请求处理和计时显示处理,对于两个定时器T0和T1同时使用不是很熟悉,刚开始二者总是不能同时实现,通过针对性测试和查找资料,最终实现。 四、具体成果形式和要求 通过PROTUES仿真电路图展示项目主要功能。 | |||
进度 安排 | 起止日期 | 工作内容 | ||
7.4--7.5 | 召开小组会议,讨论设计的主要内容,进行明确的分工; | |||
7.6--8.23 | 查找参考资料,解决相关问题; | |||
8.23--8.26 | 完成仿真电路图和实现代码; | |||
8.26--8.28 | 书写设计文档。 | |||
主要参考 资料 | 1.彭伟.单片机C语言程序设计实训100例[M],电子工业出版社,2009.6. 2.谭浩强.C语言程序设计(第二版)[M],北京:清华大学出版社,1991. 3.李建忠.单片机原理及应用[M],西安电子科技大学出版社,2008.2. | |||
指导教师 意见 | (签字): 年 月 日 | |||
系(教研室)主任意见 | (签字): 年 月 日 |
学院名称: 计算机与信息工程学院
班级名称: 计科101
学生姓名: 祖 杰、 赵雷、 周来宇、 朱路平、 张毅苗
学 号:**********、**********、**********、**********、**********
题 目: 基于单片机的电子音乐门铃设计
指导教师
* ** ***
起止日期: 2013.07.03--2013.08.29
第一部分:正文部分
1 绪论
1.1 研究背景
随着人类社会的发展,人们对视觉、听觉方面的享受提出了越来越高的要求。传统的门铃由于发音单调,已经不能很好满足人们的需要,不能实现批量生产。本文设计的音乐门铃是以单片机为核心元件的电子式音乐门铃,体积小,功能强,能演奏和旋音乐,使用方便,并具有一定的商业价值。人类所接触的信息也在不断增加并且日益复杂。面对浩如烟海的信息,人们已经能够利用计算机等工具高效准确地对之进行处理,但要想将处理完的信息及时,清晰地传递给别人,还必须通过寻求更加卓越的显示技术来实现。单片机技术与数码管显示技术的结合,使信息传输交流向着智能可视化方向迅速发展。
1.2 主要工作
本设计是基于ATC51单片机的可控音乐门铃程序设计。该音乐门铃是一个依据单片机技术原理,通过PROTEUS仿真软件对硬件电路进行仿真制作以及利用KEIL软件对音乐门铃源程序进行C语言编译,而设计制作出的一个多功能音乐门铃。
1.3 研究内容
1)用I/O口产生一定频率的方波,驱动蜂鸣器,发出不同的音调,从而演奏乐曲(至少三首乐曲,每首不少于30秒)。
2)客人可通过门铃按键器播放音乐,并显示等待显示时间。
3)如果主人在家,可暂停并取消音乐。
2 系统总体方案
2.1 系统组成框图
音乐门铃的系统结构以ATC51单片机位控制核心,加上2个按键、时钟复位电路、蜂鸣器、数码管模块组成。单片机负责接收按键的输入,根据输入控制音乐播放曲目和显示等待时间以及蜂鸣器发音。系统组成框图如图2-1所示。
图2-1 系统组成框图
2.2 音乐门铃的功能结构图
音乐门铃的功能结构如图2-2所示。门铃按键是实现播放音乐的功能,可播放的曲目有4首,分别是千年之恋、寂寞沙洲冷、小小葫芦娃和同桌的你。复位按键是实现音乐停止和时间清零的功能,由主人完成操作。
图2-2 音乐门铃功能结构图
3 硬件设计
3.1 各部分硬件设计及其原理
3.1.1 ATC51简介
ATC51是一种带4K字节闪存可编程可擦除只读存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压,高性能CMOS 8位微处理器,俗称单片机。ATC2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除100次。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的ATC51是一种高效微控制器,ATC51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。外形及引脚排列如图3-1所示
图3-1 ATC51系列单片机
3.1.2 时钟振荡电路
ATC51中有一个用于构成内部振荡器的高增益反相放大器,引脚XTAL1和XTAL2分别是该放大器的输入端和输出端。这个放大器与作为反馈元件的片外石英晶体或者陶瓷谐振器一起构成自然振荡器。外接石英晶体及电容C1、C2接在放大器的反馈回路中构成并联振荡电路。对外接电容C1,C2虽然没有什么严格的要求,但电容容量的大小会轻微影响振荡频率的高低、振荡器工作的稳定性、起振的难易程序及温度稳定性。如果使用石英晶体,我们推荐电容使用30PF10PF,而如果使用陶瓷振荡器建议选择40PF10PF。用户也可以采用外部时钟。采用外部时钟的电路如图示。这种情况下,外部时钟脉冲接到XTAL1端,即内部时钟发生器的输入端,XTAL2则悬空。由于外部时钟信号是通过一个2分频触发器后作为内部时钟信号的,所以对外部时钟信号的占空比没有特殊要求,但最小高电平持续时间和最大的低电平持续时间应符合产品技术条件的要求。振荡器电路如图3-2所示:
图3-2 单片机内部、外部振荡电路
3.2 硬件电路图及功能
总体硬件电路实现功能如下,如图3-3所示。
1)电路中用P3.2、P3.3控制按键。
2)P0.0-P0.7和P2.0-2.7控制数码管的时间显示。
3)P3.7控制蜂鸣器。
图3-3 硬件电路图
4 软件设计
一般说来,单片机演奏音乐基本都是单音频率,它不包含相应幅度的谐波频率,也就是说不能像电子琴那样能奏出多种音色的声音。因此单片机奏乐只需弄清楚两个概念即可,也就是“音调”和节拍表示一个音符唱多长的时间。
4.1 音调的确定
不同音高的乐音是用C、D、E、F、G、A、B来表示,这7个字母就是音乐的音名,它们一般依次唱成DO、RE、MI、FA、SO、LA、SI,即唱成简谱的1、2、3、4、5、6、7,相当于汉字“多来米发梭拉西”的读音,这是唱曲时乐音的发音,所以叫“音调”,即Tone。把C、D、E、F、G、A、B这一组音的距离分成12个等份,每一个等份叫一个“半音”。两个音之间的距离有两个“半音”,就叫“全音”。在钢琴等键盘乐器上,C–D、D–E、F–G、G–A、A–B两音之间隔着一个黑键,他们之间的距离就是全音;E–F、B–C两音之间没有黑键相隔,它们之间的距离就是半音。通常唱成1、2、3、4、5、6、7的音叫自然音,那些在它们的左上角加上﹟号或者b号的叫变化音。﹟叫升记号,表示把音在原来的基础上升高半音,b叫降记音,表示在原来的基础上降低半音。
1)要产生音频脉冲,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半周期的时间。利用定时器计时这半个周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚上得到此频率的脉冲。
2)利用ATC51的内部定时器使其工作在计数器模式MODE1下,改变计数值TH0及TL0以产生不同频率的方法。
此外结束符和休止符可以分别用代码00H和FFH来表示,若查表结果为00H,则表示曲子终了;若查表结果为FFH,则产生相应的停顿效果。
计数脉冲值与频率的关系公式如下:
N=Fi2Fr
N:计算值; Fi:内部计时一次为1us,故其频率为1MHz;
3)其计数值的求法如下:
T=65536-N=65536-Fi2Fr
例如:设K=65536,F=1000000=Fi=1MHz,球低音DO(261Hz)。中音DO(523Hz)。高音的DO(1046Hz)的计算值
T=65536-N=65536-Fi2Fr=65536-10000002Fr=65536-500000/Fr
低音DO的T=65536-500000/262=63627
低音DO的T=65536-500000/523=580
低音DO的T=65536-500000/1047=65059
4)C调各音符频率与计数值T的对照表如表4-1所示。
表4-1 C调各音符频率与计数值T的对照表
低音 | 频率 | T | 参数 | 中音 | 频率 | T | 参数 | 高音 | 频率 | T | 参数 |
Do | 262 | 1908 | 229 | Do | 523 | 956 | 115 | Do | 1046 | 57 | 57 |
Do﹟ | 277 | 1805 | 217 | Do﹟ | 554 | 903 | 108 | Do﹟ | 1109 | 54 | 54 |
Re | 294 | 1701 | 204 | Re | 587 | 852 | 102 | Re | 1175 | 51 | 51 |
Re﹟ | 311 | 1608 | 193 | Re﹟ | 622 | 804 | 97 | Re﹟ | 1245 | 48 | 48 |
Mi | 330 | 1515 | 182 | Mi | 659 | 759 | 91 | Mi | 1318 | 45 | 45 |
Fa | 349 | 1433 | 172 | Fa | 698 | 716 | 86 | Fa | 1397 | 43 | 43 |
Fa﹟ | 370 | 1351 | 162 | Fa﹟ | 740 | 676 | 81 | Fa﹟ | 1480 | 41 | 41 |
So | 392 | 1276 | 153 | So | 784 | 638 | 77 | So | 1568 | 38 | 38 |
So﹟ | 415 | 1205 | 145 | So﹟ | 831 | 602 | 72 | So﹟ | 1661 | 36 | 36 |
La | 440 | 1136 | 136 | La | 880 | 568 | 68 | La | 1760 | 34 | 34 |
La﹟ | 4 | 1078 | 129 | La﹟ | 932 | 536 | La﹟ | 1865 | 32 | 32 | |
Si | 494 | 1012 | 121 | Si | 988 | 506 | 61 | Si | 1976 | 30 | 30 |
若要构成音乐,光有音调是不够的,还需要节拍,让音乐具有旋律(固定的律动),而且可以调节各个音的快满度。休止符表示暂停发音。
一首音乐是由许多不同的音符组成的,而每个音符对应着不同频率,这样就可以利用不同的频率的组合,加以与拍数对应的延时,构成音乐。对于单片机来说,产生不同频率的脉冲是非常方便的,利用单片机的定时/计数器来产生这样的方波频率信号。
表4-2节拍与节拍码对照
节拍码 | 节拍数 | 节拍码 | 节拍数 |
1 | 1/4拍 | 1 | 1/8拍 |
2 | 2/4拍 | 2 | 1/4拍 |
3 | 3/4拍 | 3 | 3/8拍 |
4 | 1拍 | 4 | 2/1拍 |
5 | 1又1/4拍 | 5 | 5/8拍 |
6 | 1又1/2拍 | 6 | 3/4拍 |
8 | 2拍 | 8 | 1拍 |
A | 2又1/2拍 | A | 1又1/4拍 |
C | 3拍 | C | 1又1/2拍 |
F | 3又3/4拍 |
表4-3 1/4和1/8节拍的时间设定
曲调值 | DELAY | 曲调值 | DELAY |
调4/4 | 125毫秒 | 调4/4 | 62毫秒 |
调3/4 | 187毫秒 | 调3/4 | 94毫秒 |
调2/4 | 250毫秒 | 调2/4 | 125毫秒 |
do re mi fa so la si分别编码为1~7,重音do编为8,重音re编为9,停顿编为0。播放长度以十六分音符为单位(在本程序中为165ms),一拍即四分音符等于4个十六分音符,编为4,其它的播放时间以此类推。音调作为编码的高4位,而播放时间作为低4位,如此音调和节拍就构成了一个编码。以0xff作为曲谱的结束标志,可以参考简谱码如表4-4所示。
歌曲播放的设计:先将歌曲的简谱进行编码,储存在一个数据类型为unsigned char 的数组中。程序从数组中取出一个数,然后分离出高4位得到音调,接着找出相应的值赋给定时器0,使之定时操作蜂鸣器,得出相应的音调;接着分离出该数的低4位,得到延时时间,接着调用软件延时。
表4-4 简谱对应的简谱码、T值、节拍数
简谱 | 发音 | 简谱码 | T值 | 节拍码 | 节拍数 |
5 | 低音SO | 1 | 260 | 1 | 1/4拍 |
6 | 低音LA | 2 | 400 | 2 | 2/4拍 |
7 | 低音TI | 3 | 524 | 3 | 3/4拍 |
1 | 中音DO | 4 | 580 | 4 | 1拍 |
2 | 中音RE | 5 | 684 | 5 | 1又1/4拍 |
3 | 中音MI | 6 | 777 | 6 | 1又1/2拍 |
4 | 中音FA | 7 | 820 | 8 | 2拍 |
5 | 中音SO | 8 | 8 | A | 2又1/2拍 |
6 | 中音LA | 9 | 968 | C | 3拍 |
7 | 中音TI | A | 65030 | F | 3又3/4拍 |
1 | 高音DO | B | 65058 | ||
2 | 高音RE | C | 65110 | ||
3 | 高音MI | D | 65157 | ||
4 | 高音FA | E | 65178 | ||
5 | 高音SO | F | 65217 |
5.1 检查硬件连接
在PROTUES检查各硬件管脚是否连接正确,线路逻辑是否正确,例如:晶振电路的连接,复位电路是否设计正确。
5.2 检查软件系统
1.根据系统的原理结构检查各流程图是否正确,再根据流程图来检查程序是否也正确。
2.将所有程序组织起来,在软件环境下运行,检查程序是否正确。通过对硬件和软件系统的认真检查,反复测试,如果没有出现问题即可把源程序编译成.HEX文件装载到单片机中,对硬件进行仿真。
5.3 测试结果
当有客人到来时,按下门铃按键,音乐会自动响起,同时数码管会记录等待时间并将其显示出来,如果主人在家,可以按下暂停并取消按键,即可结束音乐和等待时间,如图5-1所示。
图5-1系统运行图
总 结
单片机的设计至今为止已经进入了令人鼓舞的阶段,在进行了长达一个星期的时间的摸索与实验,使我不仅仅是对于单片机入门软件与硬件的常用设计与功能,还使我对于一项设计研究的制作过程所需要的详细步骤和具体的实现方法的力度的掌握。
当然在这次宝贵的学年设计活动中,经验才是对于我们最大的收获,而且还增强了自身对未知问题以及对知识的深化认识的能力,用受益匪浅这个词语来概括这次难忘的活动我觉得再合适不过了。但是,光是完成了作品还是不可以自我满足的,在从一开始的时候就怀着将作品制作得更加人性化,更加令人满意,更加地使功能完美又方便地被应用领域这个最终目的下,随着对单片机这门学科的认识加深,到达了拓展的程度,我想这个目的将在不远的时期内被实现。
总之,这次设计从软件编写、调试到软硬件联机调试,我们倾注了大量的时间和心血。真是曾经为程序的编写而冥思查找过,曾经为无法找出错误而郁闷苦恼过,也曾经为某一功能不能实现而犹豫彷徨过,但最终我成功了。
我不仅品味到了结果的喜悦,更明白了过程的弥足珍贵。
致 谢
感谢董再秀老师的指导,她严谨细致、一丝不苟的作风一直是工作、学习中的榜样;她循循善诱的教导和不拘一格的思路给予我无尽的启迪。
实验过程中,也对团队精神的进行了考察,让我们在合作起来更加默契,在成功后一起体会喜悦的心情。果然是团结就是力量,只有互相之间默契融洽的配合才能换来最终完美的结果。此次设计也让我明白了思路即出路,有什么不懂不明白的地方要及时请教或上网查询,只要认真钻研,动脑思考,动手实践,就没有弄不懂的知识,收获颇丰。
无论什么事经过大家的齐心协力,到最后都一定会成功的,在此首先感谢我们的组长,明确的分工,充分利用大家之所长,让整个过程简单化,也要感谢我们的指导老师,在她的帮助下我们的设计变得更加实用完善。
第二部分:参考文献
[1]李建忠.单片机原理及应用[M],西安电子科技大学出版社,2008.2.
[2]黄智伟.全国大学生电子设计竞赛系统设计[M],北京:北京航空航天大学出版社,2006.6.
[3]李广弟,朱月秀,王秀山.单片机基础[M],北京:北京航空航天大学出版社,2001.7.
[4]谭浩强.C语言程序设计(第二版)[M],北京:清华大学出版社,1991.
[5]雷思孝.凌阳单片机原理及实用技术[M],西安电子科技大学,2004.
[6]彭伟.单片机C语言程序设计实训100例[M],电子工业出版社,2009.6.
学生签名: 填表日期: 年 月 日
附录A 源代码及注释
#include #include"intrins.h" #define uchar unsigned char #define uint unsigned int sbit key1=P3^2;//按key1,,暂停并取消按键 sbit key2=P3^3;//按key2可切换歌曲,门铃按键 sbit fm=P3^7;//蜂鸣器连续的IO口 uchar count;//歌曲标志 uchar timeh,timel,i,x,num; uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; //---------------------------简谱--------------------------------------- //编程规则:字节高位是简谱,低位是持续时间, //代表多少个十六分音符 //1-7代表C调,8-E代表高八度,0代表停顿 //最后的0是结束标志 //歌曲1:千年之恋 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,0x,0xff//结束标志 }; //歌曲2:寂寞沙洲冷 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, 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}; //歌曲3:小小葫芦娃 uchar code hlw[]={ //小小葫芦娃 0x83,0x63,0x51,0x61,0x03,0x81,0x61,0x51,0x81,0x63,0x01,0x81,0x61,0x63,0x51,0x63,0x01}; //歌曲4:同桌的你 uchar code tzdn[]={ //同桌的你[11] 0x56,0x56,0x32,0x42,0x52,0x76,0x66,0x56,0x52,0x22,0x32,0x46,0x16,0x26,0x04}; //----------------------------简谱音调对应的定时器初值--------------------------- //适合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 }; void Delay1(uint z); //延时1MS void Delay(uint z); //延时165MS,即十六分音符 void song(); //播放音乐子程序 void beep(); //蜂鸣器响起 void main() { P0=0X3F; P2=0X3F; EA=1;//开总中断 EX0=1;//开外部中断0 IT0=1;//外部中断0下降沿触发方式 EX1=1;//开外部中断1 IT1=1;//外部中断1下降沿触发方式 TMOD=0x11;//定时器0工作在方式1 ET0=1;ET1=1; TR0=0;TR1=0; TH1=(65536-50000)/256; TL1=(65536-50000)%256; while(1) { if(key2==0){ song(); Delay1(1000); } } } void int0() interrupt 0 //功能:用来暂停并取消音乐 { EA=0;//关总中断 Delay1(1);//去抖 if(key1==0) { count=0;//不让蜂鸣器唱歌 TR0=0; num=0; TR1=0; P0=0X3F; P2=0X3F; } EA=1;//开总中断 } void int1() interrupt 2 //门铃按键:每按一次会自动切换音乐,计时也会从新开始 { EA=0;//关总中断 Delay1(1);//去抖 if(key2==0) { TR0=1; TR1=1; i=0;//从头开始唱 count++; if(count==5) count=1; } EA=1;//开总中断 } void timer0() interrupt 1 //用于产生各种音调 { TH0=timeh; TL0=timel; fm=~fm; } void timer1() interrupt 3 { TH1=(65536-50000)/256; TL1=(65536-50000)%256; if(++x==20) { x=0; ++num; P0=DSY_CODE[num/10]; P2=DSY_CODE[num%10]; if(num==59) num=0; } } void song() { uint temp; uchar jp;//jp是简谱 i=0; while(1) { if(count==0){ break; if(count==1) //选曲 temp=qnzl[i]; if(count==2) temp=jmszl[i]; if(count==3) temp=hlw[i]; if(count==4) temp=tzdn[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%16); //取数的低4位 TR0=0; //唱完一个音停10MS fm=1; 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; } 第三部分:指导教师评语 第四部分:成绩评定 指导教师签名: 填表日期: 年 月 日下载本文