八音盒设计实用版.docx

上传人:b****8 文档编号:30768190 上传时间:2023-08-23 格式:DOCX 页数:32 大小:200.05KB
下载 相关 举报
八音盒设计实用版.docx_第1页
第1页 / 共32页
八音盒设计实用版.docx_第2页
第2页 / 共32页
八音盒设计实用版.docx_第3页
第3页 / 共32页
八音盒设计实用版.docx_第4页
第4页 / 共32页
八音盒设计实用版.docx_第5页
第5页 / 共32页
点击查看更多>>
下载资源
资源描述

八音盒设计实用版.docx

《八音盒设计实用版.docx》由会员分享,可在线阅读,更多相关《八音盒设计实用版.docx(32页珍藏版)》请在冰豆网上搜索。

八音盒设计实用版.docx

八音盒设计实用版

《单片机原理及应用》课程设计

—八音盒设计

 

班级:

机082-2

学号:

2008235022

姓名:

完成日期:

2011年07月09日

目录

一、单片机设计课程的目的和基本要求2

二、八音盒的设计要求3

三、关于AT89C513

3.1、对于AT89C51的性能介绍3

3.2、AT89C51的管脚介绍4

四、总体设计6

五、硬件原理及设计说明7

六、软件设计流程图7

七、程序输入窗口、编码及音乐程序9

7.1程序输入窗口9

7.2编码9

7.3音乐程序10

八、仿真和调试22

九、元器件清单23

十、电路总图24

十一、实验总结25

参考文献:

26

一、单片机设计课程的目的和基本要求

大学本科生动手能力的培养和提高时大学本科的一个重要内容。

本次课程的设计目的,是让我们通过课程设计建立起单片机应用系统的概念,根据系统设计要求,掌握初步的单片机系统设计方法,让学生的动手能力和对单片机系统从硬件系统和软件系统设计两个方面都得到实际的提高。

为今后的毕业设计打下良好的基础。

课程设计的基本要求有:

(1)在课程设计过程中,学会使用89S51单片机及相应绘图软件,根据设计要求设计,编程,运行,调试最后提供课程设计报告;

(2)课程设计应由学生本人独立完成,严禁抄袭;

(3)认真编写课程设计报告。

二、八音盒的设计要求

8051八音盒

本设计利用8051单片机结合内部定时器LCD设计一个八音盒,按下单键可以演奏预先设置的歌曲旋律。

本设计可以学习8051定时器程序设计,按键扫描及歌曲旋律简单直觉式输入法的设计方法。

其基本功能为:

1使用LCD显示器来显示目前演奏的歌曲编号;2具有16个按键操作来选择演奏哪一首歌曲;3内建10首歌曲旋律,按下单键可以演奏歌曲;4演奏时可以按键中断。

程序执行后工作指示LED闪动,表示程序开始执行,按下单键0~9便可以演奏歌曲,歌曲演奏中,可以按键中断。

三、关于AT89C51

3.1、对于AT89C51的性能介绍

AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。

该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。

由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。

它可以提供以下的功能标准:

(1)4K的字节闪烁存储器;

(2)128字节随机存取数据存储器;

(3)32个I/O口;

(4)2个16位定时/计数器;

(5)1个5向量两级中断结构;

(6)1个串行通信口;

(7)片内振荡器和时钟电路。

另外AT89C51还可以警醒OHZ的惊涛逻辑操作,并支持两种软件的节点模式。

 

3.2、AT89C51的管脚介绍

图3.1AT89C51的管脚图

VCC:

供电电压。

GND:

接地。

P0口:

P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。

当P1口的管脚第一次写1时,被定义为高阻输入。

P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。

在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。

P1口:

P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。

P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。

在FLASH编程和校验时,P1口作为低八位地址接收。

P2口:

P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。

并因此作为输入时,P2口的管脚被外部拉低,将输出电流。

这是由于内部上拉的缘故。

P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。

在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。

P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

P3口:

P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。

当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。

作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。

P3口也可作为AT89C51的一些特殊功能口,如下表所示:

口管脚备选功能

P3.0RXD(串行输入口)

P3.1TXD(串行输出口)

P3.2/INT0(外部中断0)

P3.3/INT1(外部中断1)

P3.4T0(记时器0外部输入)

P3.5T1(记时器1外部输入)

P3.6/WR(外部数据存储器写选通)

P3.7/RD(外部数据存储器读选通)

P3口同时为闪烁编程和编程校验接收一些控制信号。

RST:

复位输入。

当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。

ALE/PROG:

当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。

在FLASH编程期间,此引脚用于输入编程脉冲。

在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。

因此它可用作对外部输出的脉冲或用于定时目的。

然而要注意的是:

每当用作外部数据存储器时,将跳过一个ALE脉冲。

如想禁止ALE的输出可在SFR8EH地址上置0。

此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。

另外,该引脚被略微拉高。

如果微处理器在外部执行状态ALE禁止,置位无效。

/PSEN:

外部程序存储器的选通信号。

在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。

但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。

/EA/VPP:

当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。

注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。

在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。

XTAL1:

反向振荡放大器的输入及内部时钟工作电路的输入。

XTAL2:

来自反向振荡器的输出。

3.振荡器特性:

XTAL1和XTAL2分别为反向放大器的输入和输出。

该反向放大器可以配置为片内振荡器。

石晶振荡和陶瓷振荡均可采用。

如采用外部时钟源驱动器件,XTAL2应不接。

有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。

4.芯片擦除:

整个PEROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ALE管脚处于低电平10ms来完成。

在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。

此外,AT89C51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。

在闲置模式下,CPU停止工作。

但RAM,定时器,计数器,串口和中断系统仍在工作。

在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。

四、总体设计

(1)要产生音频脉冲,只要算出某一音频的周期(1/音频),然后将此周期除以2,即为半周期的时间,利用定时器计时这个半周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O口反相,就可在I/O脚上得到此频率的脉冲

(2)利用8051的内部定时器使其工作在计数器模式MODE1下,改变记数值TH0及TL0以产生不同频率的方法。

例如频率为523HZ,其周期T=1/523=1912微秒,因此只要令计数器定时956/1=956在每记数9次时将I/O口反相,就可得到中音D0(523HZ)。

记数脉冲值与频率的关系公式如下:

N=Fi/2/FrN:

记数值

    Fi:

内部计时一次为1微秒.故其频率为1MHZ

  Fr;要产生的频率

(3):

起记数值的求法如下:

T=65536-N=65536-Fi/2/Fr

例如:

设K=65536,F=1000000=Fi=1MHZ,求低音D0(523HZ),高音的D0(1046HZ)的记数值。

T=65536-N=65536-Fi/2/Fr=65536-1000000/2/Fr=65536-500000/Fr

低音D0的T=65536-500000/262=63627

中音D0的T=65536-500000/523=64580

低音D0的T=65536-500000/1047=65059

表4.1调个音符频率与计数值T的对照表

音符

频率

简码值(T值)

音符

频率

简码值(T值)

低IDO

262

63628

#4FA#

740

64860

#IDO#

277

63731

中5SO

784

64898

低2RE

294

63853

#5SO#

831

64934

#2RE#

311

63928

中6LA

880

64968

低3M

330

64021

#6

932

64994

低4FA

349

64103

中7SI

988

65030

#4FA#

370

64185

高IDO

1046

65058

低6SO

392

64260

#IDO#

1109

65085

#5SO#

415

64331

高2RE

1175

65110

低6LA

440

64400

#2RE#

1245

65134

#6

466

64463

高3M

1318

65157

低SI

494

64524

高4FA

1397

65178

中IDO

523

64580

#4FA#

1480

65198

#IDO#

554

64633

高5SO

1568

65217

中2RE

587

64684

#5SO#

1661

65235

#2RE#

622

64732

高6LA

1760

65252

中3M

659

64777

#6

1865

65268

中4FA

698

64820

高7SI

1967

 

五、硬件原理及设计说明

当键盘有键按下时,判断键值,启动计数器T0,产生一定频率的脉冲,驱动蜂鸣器,放出乐曲。

同时启动定时器T1,显示歌曲号。

(1)硬件电路中用

分别接S1、S2作为上、下一曲的功能键

(2)用P1.0-P1.6控制七段码a,b,c,d,e,f。

(3)用P2.0口控制喇叭。

(4)电路为12MHZ晶振频率工作,起振电路中C1,C2均为30pf。

六、软件设计流程图

 

七、程序输入窗口、编码及音乐程序

7.1程序输入窗口

图7.1keil5环境下的程序输入窗口

7.2编码

建立音乐的步骤

(1)先把乐谱的音符找出,然后建立T值表的顺序;

(2)把T值表建立在TABLE1,构成发音符的计数值放在"TABLE"。

(3)简谱码(音符)为高位,节拍为(节拍数)低四位,音符节拍码放在程序的TABLE处。

表7.1拍与节拍的对照

节拍码

节拍数

节拍码

节拍数

1

1/4节拍

1

1/8拍

2

2/4节拍

2

1/4拍

3

3/4节拍

3

3/8拍

4

1拍

4

1/2拍

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/节拍

C

3拍

C

1又1/2节拍

F

3又3/4节拍

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

简谱

发音

简谱码

T值

节拍码

节拍数

5

低音SO

1

64260

1

1/4拍

6

低音LA

2

64400

2

2/4拍

7

低音TI

3

64524

3

3/4拍

1

中音DO

4

64580

4

1拍

2

中音RE

5

64684

5

1又1/4拍

3

中音MI

6

64777

6

1又2/1拍

4

中音FA

7

64820

8

2拍

5

中音SO

8

64898

A

2又1/2拍

6

中音LA

9

64968

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

不发音

0

7.3音乐程序

OUTBITP2.0;定义音频输出端口,p2.0

NEQU6;歌曲总数

OUT_NUMEQUP1;数码管显视当前所放歌曲曲数

ORG0000H

AJMPMAIN

ORG0003H

AJMPLAST_SONG;外部中断0用于接上一曲歌按键

ORG000BH

AJMPF_T0;定时器0用于定时,作音符发生器用

ORG0013H

q4:

AJMPNEXT_SONG;外部中断1接下一曲歌按键

ORG001BH

AJMPSTART_PAUSE;定时器1用计数,这里用作中断,接开始/暂停键,初值为0ffH,方式2

ORG0030H

MAIN:

MOVSP,#60H

MOVDPTR,#TABLE;DPRT指向每首歌曲的入口地址的地址。

MOVR0,#30H;R0中存入数据30H,这里在以30H开始的单元存放每首歌曲的入口地址,其中30H,31H存放

;歌曲的节拍入口地址,32H,33H存放歌曲音符入口地址,每首歌占用四个存储存单元。

MOVR5,#00H;R5中存放表TABLE中正在执行操作的序号

MOVR6,#1;R6存放正在设置入口信息的歌曲数

SET_TAB:

MOVA,R5;设置每首歌曲的入口信息,存放在以30H开始的存储单元中。

MOVCA,@A+DPTR

MOV@R0,A

INCR5

INCR0

MOVA,R5

MOVCA,@A+DPTR

MOV@R0,A

INCR5

INCR0

MOVA,R5

MOVCA,@A+DPTR

MOV@R0,A

INCR0

INCR5

MOVA,R5

MOVCA,@A+DPTR

MOV@R0,A

INCR0

INCR5

INCR6;设置完一首歌曲后,歌曲数加一

CJNER6,#N+1,SET_TAB;是否设置完,没有便继续,否则进行下面的操作

;***********************************对中断,计数器的相关参数进行设置

MOVTMOD,#61H;计数器0工作方式1,计数器1工作方式2

MOVTH1,#0FFH;给计数器1置初值0FFH,又由于是工作方式2

MOVTL1,#0FFH;计数器计数为1,相当于一外部中断。

SETBET1;允许计数器1中断

SETBET0;允许计数器具0中断

CLRPT0;计数器0为低优先级

SETBPT1;计数器1为高优先级

SETBIT0;外部中断0为跳沿触发

SETBPX0;高优先级

SETBIT1;外部中断1为跳沿触发

SETBPX1;高优先级

SETBEX1;允许外部中断1中断

SETBEX0;允许外部中断定0中断

SETBEA;开中断总开关

SETBTR1;定时器1开始工作,作中断用

SETBOUT;音频输出端口初始化

;***********************************;设置结束

CLRF0;设置F0=0,用来作暂停/播放的标置位用

MOV22H,#01H;22H单元中存放正在播放的歌曲编号

MOVDPTR,#OUT_TAB;将正在播放的歌曲编号送数码管显视

MOVA,22H

MOVCA,@A+DPTR

MOVOUT_NUM,A

MOVR7,#00H;R7中存放歌曲总信息的入口地址

START0:

MOVR4,#00H;R4存放当前正在播放歌曲的第几个节拍数

MOVR0,#30H;30H开始的单元中存放歌曲的入口信息

MOVA,R7;将歌曲的节拍表的入口地址送到DPTR

ADDA,R0

MOVR0,A

MOVDPH,@R0

INCR0

MOVDPL,@R0

INCR0

MOVA,R4

INCR4

MOVCA,@A+DPTR;取出第一节拍数,其实第一个节拍不是歌曲的第一个节拍,而是表示几分音符

;****************************************************

MOV26H,A;将取出的音符数+节拍数保存在职26H单元中

NEXT:

MOVR0,#30H;开始取出歌曲的第一个数据

MOVA,R7

ADDA,R0

MOVR0,A

MOVDPH,@R0

INCR0

MOVDPL,@R0

INCR0

MOVA,R4

INCR4

MOVCA,@A+DPTR;放在A中

;****************************************************

JZEND0;若为0,则表示为休止符,不唱,本次音符不唱

MOVR1,A;不为0,取出节拍数

ANLA,#0FH

MOVR2,A

MOVA,R1

SWAPA

ANLA,#0FH

JNZSING;音符不为0,唱

CLRTR0;为0,不唱,关频率发生器

SJMPSING1

SING:

DECA;开始唱,进行相应的数据处理

MOVR3,A

RLA

MOVDPH,@R0

INCR0

MOVDPL,@R0

INCR0

MOVCA,@A+DPTR

MOV21H,A

MOVTH0,A

MOVA,R3

RLA

INCA

MOVCA,@A+DPTR

MOV20H,A

MOVTL0,A

SETBTR0;开唱

SING1:

LCALLDELAY;每个音符唱多久

JBF0,FOR;是否暂停,

AJMPNEXT;没有暂停,继续

FOR:

CLRTR0;暂停,不唱

JBF0,$;等待播放

AJMPNEXT;开始播放

END0:

CLRTR0;不唱

MOVA,22H;唱完处理

CJNEA,#N,WW;是不是全部歌曲都唱完

MOV22H,#01H;全部唱完,则从第一首开始再唱

MOVR7,#00H

MOVOUT_NUM,#11111001B;数码管显视第一首歌曲编号

AJMPWWW

WW:

MOVA,R7;没有全部唱完,唱下一首,歌曲的入口信息调整

ADDA,#4

MOVR7,A

INC22H

CLREA

PUSHDPH

PUSHDPL

MOVA,22H

MOVDPTR,#OUT_TAB

MOVCA,@A+DPTR

MOVOUT_NUM,A;数码管显视相应的歌曲编号

POPDPL

POPDPH

WWW:

SETBEA

AJMPSTART0;开始下一首的演唱

F_T0:

MOVTH0,21H;定时器0置初值

MOVTL0,20H

CPLOUT;频率产生

RETI

NEXT_SONG:

PUSHACC;下一曲中断程序处理,保护现场

PUSHDPH

PUSHDPL

CLREA;关中断

MOVA,22H

CJNEA,#N,Q;是最后一首吗?

MOVR7,#00H;是最后一首,则R7指向第一首,演唱第一首

MOV22H,#01H

AJMPBACK

Q:

INC22H;不是最后一首,唱下一首,R7内容加4,歌曲数加1

MOVA,R7

ADDA,#4

MOVR7,A

BACK:

MOVR4,#00H;数码管显视相应的歌曲编号

MOVA,22H

MOVDPTR,#OUT_TAB

MOVCA,@A+DPTR

MOVOUT_NUM,A

;********************************************

MOVB,R0;对下首要演唱的歌曲的几分拍进行调整,同时对R0中的内容进行保护

MOVR4,#00H

MOVR0,#30H

MOVA,R7

ADDA,R0

MOVR0,A

MOVDPH,@R0

INCR0

MOVDPL,@R0

INCR0

MOVA,R4

INCR4

MOVCA,@A+DPTR

MOV26H,A;结果存入26H单元中

DECR4

MOVR0,B;恢复R0中的内容

;********************************************

POPDPL;恢复现场

POPDPH

POPACC

SETBEA

RETI;中断返回

LAST_SONG:

PUSHACC;上一曲中断程序处理开始,保护现场

PUSHDPH

PUSHDPL

CLREA;关中断

MOVA,22H;曲目数送A

CJNEA,#1,QQ;是否是第一首

MOV22H,#N;是第一首歌曲

MOVB,#4;将R7指向最后一首歌曲

MOVA,#N-1

MULAB

MOVR7,A

AJMPBACK2;处理结束

QQ:

DEC22H

MOVA,R7;R7减4

SUBBA,#4

MOVR7,A

BACK2:

MOVR4,#00H

MOVA,22H

MOVDPTR,#OUT_TAB

MOVCA,@A+DPTR

MOVOUT_NUM,A;数码管显视相应歌曲的编号

;********************************************

MOVB,R0;对下首要演唱的歌曲的几分拍进行调整,同时对R0中的内容进行保护

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1