80c51单片机课程设计word文档良心出品
第3章 80C51单片机指令系统及程序设计

PUSH direct POP direct PUSH 0E0H POP 0D0H
直接地址
PUSH Acc POP PSW
第3章 80C51单片机指令系统及程序设计
单片机原理与应用
3.2.2 算术运算类指令(24条)
——普通加法指令(4条)
Rn ADD A , direct
@Ri #data
ADD ADD ADD ADD
#data16
addr16 addr11 direct Rel
Bit
(X) ←
位寻址区的直接寻址位
X地址单元中的内容,或X作为间接寻址寄存器时所指单元的内容 将 ← 后面的内容传送到前面去
第3章 80C51单片机指令系统及程序设计
单片机原理与应用
2、寻址方式
取得操作数的地址的方法叫做寻址方式。寻址 方式与计算机的存储空间结构是密切相关的。灵活运 用各种寻址方式,可以大大的提高程序的运行效率。 直接寻址 立即寻址 寄存器寻址 寄存器间接寻址 相对寻址 变址寻址 位寻址
位操作指令:2 17 条 四周期指令: 条
80C51单片机的程序设计(完整版)

第四章 80C51单片微机的程序设计 单片微机的程序设计
4.1概述 概述
4.1.1 汇编语言格式
1. 计算机语言 计算机语言——机器语言、汇编语言与高级语言 机器语言、 机器语言 程序就是为计算某一算式或完成某一工作的若干指令的有序 集合。计算机的全部工作概括起来, 集合。计算机的全部工作概括起来,就是执行这一指令序列的 过程。这一指令序列称为程序。为计算机准备这一指令前的过 过程。这一指令序列称为程序。 程称为程序设计。目前, 程称为程序设计。目前,可用于程序设计的语言基本上可分为 三种:机器语言、汇编语言和高级语言。 三种:机器语言、汇编语言和高级语言。 ⑴ 机器语言 在计算机中,所有的数符都是用二进制代码来表示的, 在计算机中,所有的数符都是用二进制代码来表示的,指令 也是用二进制代码来表示。这种用二进制代码表示的指令系统 也是用二进制代码来表示。 称为机器语言系统,简称为机器语言。 称为机器语言系统,简称为机器语言。直接用机器语言编写的 程序称为手编程序或机器语言程序。 程序称为手编程序或机器语言程序。
两种语句都由四个部分组成。其中每一部分称为域也称为字段, 两种语句都由四个部分组成。其中每一部分称为域也称为字段, 各字段之间用一个空格或字段定界符分隔, 各字段之间用一个空格或字段定界符分隔,常用的字段定界符有 冒号“ ”“逗号 逗号“ 和分号“ 冒号“:”“逗号“,”和分号“;”。其中方括号括起来的是 可选择部分。 可选择部分。
标号(也称为名字 标号 也称为名字) 域: 也称为名字 用来说明指令的地址。标号可以作为LJMP、AJMP、 用来说明指令的地址。标号可以作为 、 、 LCALL及ACALL等指令的操作数。 等指令的操作数。 及 等指令的操作数 • 在指令语句中,标号位于一个语句的开头位置,由字母和数 在指令语句中,标号位于一个语句的开头位置, 符组成, 字母打头,冒号“ 结束。 符组成 , 字母打头 , 冒号 “ : ” 结束 。 在 80C51单片微机的汇编 单片微机的汇编 语言中,标号中的字符个数一般不超过8个 若超过8个 语言中,标号中的字符个数一般不超过 个,若超过 个,则以前 面的8个为有效 后面字符不起作用。 个为有效, 面的 个为有效,后面字符不起作用。 • 不能使用本汇编语言中已经定义了的符号作标号, 不能使用本汇编语言中已经定义了的符号作标号,比如指令 助记符(如 及寄存器符号名称(如 助记符 如ADD) 、伪指令 (如END) 及寄存器符号名称 如PC) 。 如 • 一条语句可以有标号,也可以没有标号, 一条语句可以有标号,也可以没有标号,标号的有无取决于 程序中的其它语句是否需要访问该条语句。 程序中的其它语句是否需要访问该条语句。 伪指令语句与指令语句主要不同是在其名字后面没有冒号。 伪指令语句与指令语句主要不同是在其名字后面没有冒号。
(05)第五章 80C51单片机的程序设计(2)

其程序段如下: 其程序段如下:
18
START: START: MOV DPTR,#ADDR16 DPTR,#ADDR16 MOV A,40H A,40H ;40H单元内容送A 40H单元内容送A CLR C ;清CY 思路与查表类似。 本条指令 RLC A 思路与查表类似。 ;A内容左移一位(A*2) 内容左移一位(A*2 及下1条 查表:定向取数; 查表:定向取数; 指令的作 JNC TABEL:定向转移。 ,转TABEL CY=0 散转: ;若CY=0 散转 定向转移。 用? INC DPH ;若CY=1,DPH内容+1 CY=1,DPH内容 内容+ TABEL: TABEL: JMP @A+DPTR ;多分支转移 … 可以插入其它指令吗? ADDR16: ADDR16: AJMP LOOP0 LOOP0 AJMP LOOP1 LOOP1 … AJMP LOOPn
(R4)(R5)*2=[(R4)*2+(R5)*2的进位 (R4)(R5)*2=[(R4)*2+(R5)*2的进位][(R5)*2的低8位] 的进位][(R5)*2的低 的低8
6
(R4)(R5)*2=[(R4)*2+(R5)*2的进位 (R4)(R5)*2=[(R4)*2+(R5)*2的进位][(R5)*2的低8位] 的进位][(R5)*2的低 的低8
调整取数指针并取数
MOV DPTR,#TAB ;取表格首地址 取表格首地址 ADD A,DPL ;(R4)(R5)*2的低 位调整 的低8位调整 的低 位调整DPL MOV DPL,A MOV A,DPH ADDC A,R4 ;(R4)(R5)*2的高 位调整 的高8位调整 的高 位调整DPH MOV DPH,A CLR A MOVCA,@A+DPTR;取对应的第一字节 取对应的第一字节 MOV R4,A 条指令是否可以 CLR A ;准备取下一字节 这2条指令是否可以 准备取下一字节 MOV A,#01H 用某条指令替换? 用某条指令替换 INC DPTR ;调整指针 调整指针 MOVCA,@A+DPTR;取对应的第二字节 取对应的第二字节 MOV R5,A
80C51基于单片机的电梯控制器设计_毕业设计(论文)

80C51基于单片机的电梯控制器设计_毕业设计(论文)单片机技术课程设计报告课题名称基于单片机的电梯控制器设计系别理学院专业 _电子信息科学与技术_2013年 6月 20 日毕业设计(论文)原创性声明和使用授权说明原创性声明本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。
尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。
对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。
作者签名:日期:指导教师签名:日期:使用授权说明本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。
作者签名:日期:学位论文原创性声明本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。
除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。
对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。
本人完全意识到本声明的法律后果由本人承担。
作者签名:日期:年月日学位论文版权使用授权书本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。
本人授权大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。
涉密论文按学校规定处理。
作者签名:日期:年月日导师签名:日期:年月日注意事项1.设计(论文)的内容包括:1)封面(按教务处制定的标准封面格式制作)2)原创性声明3)中文摘要(300字左右)、关键词4)外文摘要、关键词5)目次页(附件不统一编入)6)论文主体部分:引言(或绪论)、正文、结论7)参考文献8)致谢9)附录(对论文支持必要时)2.论文字数要求:理工类设计(论文)正文字数不少于1万字(不包括图纸、程序清单等),文科类论文正文字数不少于1.2万字。
第五章80C51单片机的程序设计

第五章80C51单片机的程序设计
宏指令语句:用以代替汇编语言源程序中 重复使用的程序段的一种语句,由汇编程序 在汇编时产生相应的目标代码。 (2) 汇编语言语句的格式 为了使汇编语言程序清晰、明了、易读、 易懂,特对汇编语言的话句格式作了严格的 规定。 指令语句的格式为: 标号: 助记符(操作码) 操作数(参数) ;注释
第五章80C51单片机的程序设计
例: 双字节加法程序段。 设被加数存放于片内RAM的addr1(低位字 节)、addr2(高位字节),加数存放于adddr3(低 位字节)和addr4(高位字节),运算结果和数存 于addr1和addr2中。其程序段如下: START: PUSH ACC ;将A中内容进栈保护 MOV R0, #addr1 ;将addr1地址值送R0 MOV R1, #addr3 ;将addr3地址值送R1 MOV A, @R0 ;被加数低字节内容送A
程序就是为计算某一算式或完成某一工作 而编制的若干指令的有序集合。计算机的全部 工作概括起来,就是执行这一指令序列的过程。 这一指令序列称为程序。 目前,可用于程序设计的语言基本上可分 为三种:机器语言、汇编语言和高级语言。
第五章80C51单片机的程序设计
下面先对这三种语言作以简单说明,然后重点 介绍80C51单片机的汇编语言。 1 机器语言:机器语言在计算机中,所有的数符 都是用二进制代码来表示的,指令也是用二进制代 码来表示。这种用二进制代码表示的指令系统称为 机器语言系统,简称为机器语言。直接用机器语言 编写的程序称为手编程序或机器语言程序。 计算机可以识别机器语言,并加以执行。但是, 对于使用者来说,不易看懂,不便记忆,容易出错。 为了克服这些缺点,从而出现了汇编语言和高级语 言。
在编写汇编语言程序时,标号、注释并不 是所有的语句都必需的,可以缺省。对于无操 作数指令,操作数域也缺省。具体书写格式如 下: 标 号: 操作码域 操作数域 ;注释
基于80C51的八路抢答器的单片机课程设计

目录1 引言 (4)2 总体方案设计 (4)3 硬件电路设计 (5)3.1 单片机及其外围电路 (5)3.2 硬件电路组成 (6)4 系统软件设计 (10)4.1 初始化程序设计 (10)4.2 主程序设计 (11)4.3 倒计时30s子程序的设计 (12)4.4 外部中断T1中断子程序设计 (14)4.5 定时器T1中断子程序设计 (17)4.6 选手按键程序的设计 (18)4.7 数码管显示程序的设计 (19)5 系统调试和总结 (21)附录A 系统原理图 (22)附录B 源程序 (22)1 引言此次设计提出了用80C51单片机为核心控制元件,设计一个简易的抢答器,本方案以80C51单片机作为主控核心,和数码管、蜂鸣器等构成八路抢答器,利用了单片机的延时电路、按键复位电路、时钟电路、定时/中断等电路,设计的八路抢答器具有倒计时和实时显示抢答选手的号码的特点,还有复位电路,使其再开始新的一轮的答题和比赛。
它的功能实现是比赛开始,主持人读完题之后按下总开关,倒计时开始,此时数码管开始进行30s的倒计时,是选手的思考时间,倒计时完后,才允许开始抢答,若有人答题,对应的会在数码管上显示出该选手的编号并由蜂鸣器发出声音,在30s倒计时内答题无效。
2 总体方案设计接3单片机完全兼容的高性能CMOS 8位单片机,MCS-51系列单片机以其推出时间早、配套资源丰富、开发手段完善、性价比高等特点而得到了广泛的使用,是单片机的主流品种。
AT89C51的内部资源主要包括:·和MCS--51 系列完全兼容的高性能8位CPU;·4K字节可重复编程的Flash存储器;·256字节的SRAM;·4个8位的并行口,共32条I/O口线;·3个16位的定时器/计数器;·6个中断源,2个中断优先级的中断系统;·一个全双工的串行口;·内部振荡器;·可编程串行通道·低功耗的闲置和掉电模式·片内振荡器和时钟电路其最小系统主要包括复位电路,时钟电路,如下图3.1所示。
51单片机相关课程设计

51单片机相关课程设计一、课程目标知识目标:1. 理解51单片机的硬件结构,掌握其工作原理;2. 学习并掌握51单片机的指令系统,能进行基本的编程操作;3. 了解并掌握51单片机在嵌入式系统中的应用。
技能目标:1. 能够运用C语言编写简单的51单片机程序,实现基础功能;2. 学会使用仿真软件对51单片机程序进行调试,解决常见问题;3. 能结合实际需求,设计并实现简单的51单片机控制系统。
情感态度价值观目标:1. 培养学生对电子技术及编程的兴趣,激发其创新意识;2. 培养学生团队协作精神,使其在项目实践中学会沟通与分享;3. 强化学生的工程意识,使其认识到技术对社会发展的作用。
课程性质:本课程为实践性较强的课程,旨在帮助学生将理论知识与实际应用相结合,培养其动手能力和创新能力。
学生特点:学生处于高年级阶段,已具备一定的电子技术和编程基础,对单片机有一定了解,但实践经验不足。
教学要求:结合学生特点,注重理论与实践相结合,通过项目驱动教学,使学生在实践中掌握知识,提高技能。
同时,关注学生的情感态度价值观培养,引导其形成积极的学习态度和正确的价值观。
将课程目标分解为具体的学习成果,以便于教学设计和评估。
二、教学内容1. 51单片机硬件结构及原理:介绍51单片机的内部结构,包括CPU、存储器、I/O口、定时器等模块,分析其工作原理及相互关系。
相关教材章节:第一章 51单片机概述与硬件结构2. 51单片机指令系统及编程:讲解51单片机的指令集,学习C语言编程基础,编写简单的程序实现基础功能。
相关教材章节:第二章 51单片机指令系统与编程3. 仿真软件使用与程序调试:学习使用Keil、Proteus等仿真软件,进行51单片机程序的编写、编译、调试及下载。
相关教材章节:第三章 51单片机程序开发与调试4. 51单片机应用实例:分析并实践51单片机在嵌入式系统中的应用,如温度控制、灯光调节等。
相关教材章节:第四章 51单片机应用实例5. 课程项目实践:分组进行项目实践,设计并实现一个简单的51单片机控制系统,如智能小车、智能家居等。
单片机课件 教案 80C51的结构和原理

RST EA ALE PSEN
2013-7-26 9
P0
P1 P2
P3
80C51单片机主要由以下功能部件组成:
(1)8位微处理器(CPU); (2)128B数据存储器(RAM),片外可扩展到64KB; (3)4KB程序存储器(ROM/FLASH),片外可扩展到 64KB (4)21个特殊功能寄存器(SFR) (5)4个8位并行I/O口(P0口、P1口、P2口、P3口) (6)1个全双工异步串行口(UART); (7)2个16位定时器/计数器(T0,T1); (8)5个中断源的中断系统(X0,T0,X1,T1,S)。
PSW
ALU P1口驱动器
1 8 9 10
振荡器
P3口驱动器
17 18 19 20
P1.0 ~ P1.7
2013-7-26 17
RST
P3.0 ~ P3.7
XTAL2 XTAL1
VSS
2.4.1 CPU的功能单元
运算器
累加器ACC 寄存器B PSW
控制器
指令寄存器IR 译码与控制逻辑
其他寄存器
程~R7
2013-7-26
10
2.2.2 80C51的应用模式 带总线扩展引脚的产品
扩展总线的应用模式
P2 AL E P0 G OE D7 Q7 : : : : D0 Q0 AB P0
不扩展总线的应用模式
+5V 8
74LS373
89S51
P1
80C31
EA PSE N W R RD
8 8
P2 DB P3 CB 8 P3.0~P3.5 含第二功能
注:类似的还有Philips公司的 87LPC64,20引脚 8XC748/750/(751),24引脚 8X749(752),28引脚 8XC754,28引脚 等等
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机课程设计报告题目:基于51单片机发光牌与伴奏音乐系统专业班级机械111班姓名学号一、设计目的(一)、以AT89C51单片机为主体,设计一个有伴奏音乐的发光牌。
1、功能放光牌用数码管显示,分别按顺序显示出“2”、“0”、“1”、“3”的数字样。
而且不断的循环从左到右显示。
同时还伴有歌名为“同一首歌”的旋律。
发光牌由数码管进行设置,歌声的旋律则由蜂鸣器来实现。
2、效果即数码管为发光牌,同时伴有歌声发光牌效果图可如下二、硬件系统AT89C51单片机是美国ATMEL公司生产的低电压、高性能CMOS8位单片机,具有丰富的内部资源:4kB闪存、128BRAM、32根I/O口线、2个16位定时/计数器、5个向量两级中断结构、2个全双工的串行口,具有4.25~5.50V的电压工作范围和0~24MHz工作频率,使用AT89C51单片机时无须外扩存储器。
(1)、硬件总电路图如下其中AT89C51单片机的设置如下选择12MH的晶振,该单片机选用24V的电压。
其中电路图中的7447芯片中的A,B,C,D,E,F,G 引脚是引出来用来分别接四个数码管的。
其中低电平代表通电,其数码管的0~9的数字代码如下:0X01、0X12、0X24、0X38、0X41、0X52、0X64、0X78、0X81、0X92.并通过p2.0、p2.1、p2.2、p2.3引脚分别来控制四个数码管的得电顺序。
从而实现发光牌的设置和控制。
、对蜂鸣器的控制的电路介绍)2(.为般是指时钟电路引脚、其中XTAL1XTAL2在片内它是振荡器反相放大器的输接外部晶振和微调电容的一端,TAL1:X入;若使用外部时钟时,该引脚必须接地。
在片内它是振荡器反相放大器的:接外部晶振和微调电容的另一端,XTAL2 输出;若使用外部时钟时,该引脚接外部时钟的输入端。
利用这两个引脚可以对歌曲的节奏和时间进行控制。
从而演奏蜂鸣器可根据不同代码发出声音。
其中歌曲的谱音可用代码表示,出“同一首歌”的旋律。
三、软件系统protues,仿真用软件软件编程序用keil软件其中控制歌曲播放的流程图如下开始定义晶振频率12000000HZ定义普通音符演奏的长度分率音符定时器初暂音符发生中断根据调号及升降八度计来生成新的频率表、算歌曲长度算出普通音符的演奏长度结束控制歌曲的子程序的功能是可以计算出歌曲的播放时间,与各个音符的停顿。
(3)对数码管控制a、数码管的接线图如下其中数码管的放大电路端如下图所示其中连接R1端的可与p22、p20、p21、p23连接。
b、对数码管控制的流程图如下开定义延迟时间常数显示第一个数码管显示第二个数码管显示第三个数码管“1”显示第四个数”3码管“结束四、仿真结果软件来实现,其仿真电路图如下仿真效果和预期一样。
其仿真用protues五、附件程序源代码如下#include <REG52.H>#include <stdio.h>#include SoundPlay.hvoid Delay1ms(unsigned int count){unsigned int i,j;for(i=0;i<count;i++)for(j=0;j<120;j++);}65000 //定义延迟时间常数#define DELAYTIME unsigned int temp1;延时程序void delay(unsigned int temp)//{while(--temp);}同一首歌// unsigned char code Music_Same[]={0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x66, 0x18,0x03, 0x17,0x02, 0x15,0x02, 0x16,0x01, 0x15,0x02, 0x10,0x02 0x15,0x00, 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x02, 0x17,0x03, 0x18,0x03, 0x19,0x02, 0x15,0x02, 0x18,0x66, 0x17,0x03, 0x19,0x02, 0x16,0x03, 0x17,0x03, 0x16,0x00, 0x17,0x01, 0x19,0x02, 0x1B,0x02, 0x1B,0x70, 0x1A,0x03,0x1A,0x01, 0x19,0x02, 0x19,0x03, 0x1A,0x03, 0x1B,0x02,0x1A,0x0D, 0x19,0x03, 0x17,0x00, 0x18,0x66, 0x18,0x03,0x19,0x02, 0x1A,0x02, 0x19,0x0C, 0x18,0x0D, 0x17,0x030x16,0x01, 0x11,0x02, 0x11,0x03, 0x10,0x03, 0x0F,0x0C,0x10,0x02, 0x15,0x00, 0x1F,0x01, 0x1A,0x01, 0x18,0x66,0x19,0x03, 0x1A,0x01, 0x1B,0x02, 0x1B,0x03, 0x1B,0x03,0x1B,0x0C, 0x1A,0x0D, 0x19,0x03, 0x17,0x00, 0x1F,0x01,0x1A,0x01, 0x18,0x66, 0x19,0x03, 0x1A,0x01, 0x10,0x02,0x10,0x03, 0x10,0x03, 0x1A,0x0C, 0x18,0x0D, 0x17,0x03,0x16,0x00, 0x0F,0x01, 0x15,0x02, 0x16,0x02, 0x17,0x70,0x18,0x03, 0x17,0x02, 0x15,0x03, 0x15,0x03, 0x16,0x66,0x16,0x03, 0x16,0x02, 0x16,0x03, 0x15,0x03, 0x10,0x02,0x10,0x01, 0x11,0x01, 0x11,0x66, 0x10,0x03, 0x0F,0x0C,0x1A,0x02, 0x19,0x02, 0x16,0x03, 0x16,0x03, 0x18,0x66,0x18,0x03, 0x18,0x02, 0x17,0x03, 0x16,0x03, 0x19,0x00,0x00,0x00 };//********************************************************************************* **main(){InitialSound();while(1){Play(Music_Same,0,3,360);Delay1ms(500);}P2=0; //led is offwhile(1){P2=0X24;//显示2,P2口输出其BCD码和扫描码P2.temp1=DELAYTIMdelay(temp1);P2=0X01;//显示0,P2口输出其BCD码和扫描码P2.0temp1=DELAYTdelay(temp1);P2=0X12;//显示1,P2口输出其BCD码和扫描码P2.1temp1=DELAYTIME;delay(temp1);P2=0X38;//显示3,P2口输出其BCD码和扫描码P2.3temp1=DELAYTIME;delay(temp1);}}/**************************************************************************SOUNDPLAY FOR 51MCUCOPYRIGHT (c)2005 BY JJJ.--ALL RIGHTSRESERVED --File Name: SoundPlay.hAuthor: Jiang Jian JunCreated: 2005/5/16Modified: NORevision: 1.0*******************************************************************************//*说明**************************************************************************曲谱存贮格式unsigned char code MusicName{音高,音长,音高,音长...., 0,0}; 末尾:0,0 表示结束(Important)音高由三位数字组成:个位是表示1~7 这七个音符十位是表示音符所在的音区:1-低音,2-中音,3-高音;百位表示这个音符是否要升半音: 0-不升,1-升半音。
音长最多由三位数字组成:个位表示音符的时值,其对应关系是:|0 |1 |2 |3 | 4 | 5 | 6 (n): 数值||几分音符: |1 |2 |4 |8 |16 |32 |64 音符=2^n十位表示音符的演奏效果(0-2): 0-普通,1-连音,2-顿音百位是符点位: 0-无符点,1-有符点调用演奏子程序的格式Play(乐曲名,调号,升降八度,演奏速度);|乐曲名: 要播放的乐曲指针,结尾以(0,0)结束;|调号(0-11) : 是指乐曲升多少个半音演奏;|升降八度(1-3) : 1:降八度, 2:不升不降,3:升八度;|演奏速度(1-12000): 值越大速度越快;***************************************************************************/ #ifndef __SOUNDPLAY_H_REVISION_FIRST__#define __SOUNDPLAY_H_REVISION_FIRST__//**************************************************************************#define SYSTEM_OSC 12000000//定义晶振频率12000000HZ#define SOUND_SPACE 4/5 //定义普通音符演奏的长度分率,//每4分音符间隔sbit BeepIO = P3^7; //定义输出管脚unsigned int code FreTab[12] = { 262,277,294,311,330,349,369,392,415,440,466,494 }; //原始频率表unsigned char code SignTab[7] = { 0,2,4,5,7,9,11 };//1~7在频率表中的位置unsigned char code LengthTab[7]= { 1,2,4,8,16,32,64 };unsigned char Sound_Temp_TH0,Sound_Temp_TL0; //音符定时器初值暂存unsigned char Sound_Temp_TH1,Sound_Temp_TL1; //音长定时器初值暂存//************************************************************************** void InitialSound(void)BeepIO = 0;Sound_Temp_TH1 = (65535-(1/1200)*SYSTEM_OSC)/256; // 计算TL1应装入的初值(10ms的初装值)Sound_Temp_TL1 = (65535-(1/1200)*SYSTEM_OSC)%6; // 计算TH1应装入的初值TH1 = Sound_Temp_TH1;TL1 = Sound_Temp_TL1;TMOD |= 0x11;ET0 = 1;ET1= 0;TR0= 0;TR1 = 0;EA = 1;}void BeepTimer0(void) interrupt 1 //音符发生中断{BeepIO = !BeepIO;TH0 = Sound_Temp_TH0;TL0 = Sound_Temp_TL0;}//************************************************************************** void Play(unsigned char *Sound,unsigned char Signature,unsigned Octachord,unsigned int Speed){unsigned int NewFreTab[12]; //新的频率表unsigned char i,j;unsigned int Point,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength; unsigned char Tone,Length,SL,SH,SM,SLen,XG,FD;for(i=0;i<12;i++) // 根据调号及升降八度来生成新的频率表{j = i + Signature;if(j > 11){j = j-12;NewFreTab[i] = FreTab[j]*2;}elseNewFreTab[i] = FreTab[j];if(Octachord == 1)NewFreTab[i]>>=2;else if(Octachord == 3)NewFreTab[i]<<=2;}SoundLength = 0;while(Sound[SoundLength] != 0x00) //计算歌曲长度{SoundLength+=2;}Point = 0;Tone = Sound[Point];Length = Sound[Point+1]; // 读出第一个音符和它时时值LDiv0 = 12000/Speed; // 算出1分音符的长度(几个10ms)LDiv4 = LDiv0/4; // 算出4分音符的长度LDiv4 = LDiv4-LDiv4*SOUND_SPACE; // 普通音最长间隔标准TR0= 0;TR1 = 1;while(Point < SoundLength){SL=Tone_x0010_; //计算出音符SM=Tone/10_x0010_;//计算出高低音SH=Tone/100; //计算出是否升半CurrentFre =NewFreTab[SignTab[SL-1]+SH]; //查出对应音符的频率if(SL!=0){if (SM==1) CurrentFre >>= 2; //低音if (SM==3) CurrentFre <<= 2; //高音Temp_T = 65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC);//计算计数器初值Sound_Temp_TH0 = Temp_T/256;Sound_Temp_TL0 = Temp_T%6;TH0 = Sound_Temp_TH0;TL0 = Sound_Temp_TL0 + 12; //加12是对中断延时的补偿}SLen=LengthTab[Length_x0010_]; //算出是几分音符XG=Length/10_x0010_; //算出音符类型(0普通1连音2顿音)FD=Length/100;LDiv=LDiv0/SLen; //算出连音音符演奏的长度(多少个10ms)if (FD==1)LDiv=LDiv+LDiv/2;if(XG!=1)if(XG==0) //算出普通音符的演奏长度if (SLen<=4)LDiv1=LDiv-LDiv4;elseLDiv1=LDiv*SOUND_SPACE;ElseLDiv1=LDiv/2; //算出顿音的演奏长度elseLDiv1=LDiv;if(SL==0) LDiv1=0;LDiv2=LDiv-LDiv1; //算出不发音的长if (SL!=0){TR0=1;for(i=LDiv1;i>0;i--) //发规定长度的音{while(TF1==0);TH1 = Sound_Temp_TH1;TL1 = Sound_Temp_TL1;TF1=0;}}if(LDiv2!=0){TR0=0; BeepIO=0;for(i=LDiv2;i>0;i--) //音符间的间隔{while(TF1==0);TH1 = Sound_Temp_TH1;TL1 = Sound_Temp_TL1;TF1=0;}}Point+=2;Tone=Sound[Point];Length=Sound[Point+1];}BeepIO = 0;}//************************************************************************** #endif。