课
程
设
计
姓名:
学号:
班级:
组员:
目 录
1 设计题目.....................................................3
2 概述 3
21单片机数字音乐盒关介绍 3
22 设计务 5
3总体方案证设计 7
31 单片机选取 7
32 LED显示方式 8
33 系统总体结构框图 8
4 系统硬件设计 9
41 AT89C51 芯片功硬件连接 9
42 LED显示器 11
43 键盘 12
44 音频输出部分 12
45 整体硬件电路 14
46原理说明........................14
5 系统软件设计 15
51 模块设计 15
52 外部中断源系统设计 16
53 基显示模块设计 19
54 系统初始化程序 19
55音调节拍编码确定方法 19
6 调试结果 21
61 系统总电路图 21
总 结 22
参考文献 23
附件.............................24
1设计题目
基C51音乐发生器设计
1 概述
21单片机数字音乐盒关介绍
电子音乐已广泛应社会生活领域类型音乐卡片CDMP3 等种样制作原理相声音通振动产生单片机某IO引脚定频率循环置1清0引脚便产生定频率方波该方波通放作扬声器便产生定频率声音改变输出方波频率产生声音改变通控制输出方波时间长短声音长短控制根乐谱单片机产生电子音乐音乐中关键两素音符节拍单片机控制音乐发生器系统硬件电路软件两部分构成利单片机控制电子音乐发生器软硬件具独特优点系统开发周期短成低电路制作容易更换歌曲时硬件电路需作修改需修改软件实现软件编程时51系列单片机汇编语言C51语言实现时根通软件改变节拍延时时间增加电子音乐趣味性
211发音原理介绍
发音原理:播放段音乐需两元素音调音符首先解应音调音调声音频率决定时声音强度关定强度纯音音调频率升降升降定频率纯音低频纯音音调声强增加降高频纯音音调强度增加升外音符频率基面容样发音原理初步解
音符发音音频脉利单片机部定时器计数器0工作模式1定时中断然控制P03引脚输出音乐算出某音频周期(1频率)然周期2半周期时间利定时器计时半周期时间计时输出脉IO反相然重复计时半周期时间IO反相IO脚频率脉
212 音符频率产生
音符定时器初始值:
例:中音1(do)音频523HZ周期T1523s1912
定时器计数器0定时时间:T219122956
定时器956计数值定时时间机器周期9561956(时钟频率12MHZ)
装入T0计数器初值6553695664580
64580装入T0寄存器中启动T0工作计数956次时产生溢出中断进入中断服务时次P03引脚输出值进行取反中音DO(523HZ)音符音频51单片机部定时器工作计数器模式0改变计数初值TH0TL0产生频率
表11C调音符频率计数初值T表:
表11 C调音符频率计数初值T表
音符
频率(Hz)初值()
音符
频率(Hz)初值()
低1DO
26263627
中1DO
52364580
低2RE
29463835
中2RE
58964687
低3M
33064021
中3M
66164780
低4FA
35064107
中4FA
70064822
低5SO
39364264
中5SO
78664900
低6LA
44164402
中6LA
88264969
低7SI
49564526
中7SI
99065031
高1DO
104265056
高5SO
156865217
高2RE
124565134
高6LA
176065252
高3M
131865157
高7SI
196765282
高4FA
139765178
213 节拍频率产生
节拍产生编码:
音乐中节拍延时时间产生例1拍04s14拍01s类推假设14拍执行次延时程序12拍执行两次延时程序求出14拍延时时间余节拍倍数方便节拍数进行编码计算乐谱节拍编程时延时时间表13表14示
表13 节拍数编码表
14拍延时时间节拍编码节拍应表
18拍延时时间节拍编码节拍应表
节拍编码
节拍
节拍编码
节拍
节拍编码
节拍
节拍编码
节拍
1
14
6
64
1
18
6
68
2
24
8
84
2
28
8
88
3
34
A
104
3
38
A
108
4
44
C
124
4
48
C
128
5
54
F
154
5
58
表14 乐谱节拍编程时时间延时表
乐谱节拍
14拍延时时间
乐谱节拍
18拍延时时间
44
125 ms
44
62 ms
34
187 ms
34
94 ms
24
250 ms
24
125 ms
22 设计务
着类社会发展视觉听觉方面享受提出越越高求音乐盒带美回忆提高精神文化享受传统音乐盒机械型体积笨重发音单调实现批量生产文设计音乐盒单片机核心元件电子式音乐盒体积重量轻演奏旋音乐功方便批量生产具定商业价值
设计基单片机控制数字音乐盒设计单片机AT89C51芯片LED数码核心辅必电路构成单片机数字音乐盒
该设计数字电路完成设计电路相复杂概需十片数字集成块功赖数字电路功模块组合实现焊接程较复杂成非常高单片机设计制作完成功实现通软件编程完成降低硬件电路复杂性成降低该设计中采单片机利AT89C51低功耗高性CMOS型8位单片机片带4KBFlash存储器允许系统改写编程器编程外 AT89C51指令系统引脚8051完全兼容片128B RAM32条IO口线216位定时计数器5中断源全双工串行口等
该设计中利单片机IO口产生定频率方波驱动蜂鸣器发出种音调演奏乐曲够LCD显示信息键盘单片机应系统中实现单片机输入数传送命令等功工干预单片机手段设计采4*4键盘16*2 LCD七段显示数码LED
开机钮时英文欢迎提示字符播放时显示歌曲序号(名称)演奏程中通功键选择乐曲暂停播放
3总体方案证设计
设计基单片机数字音乐盒设计单片机AT89C51芯片LED数码核心辅必电路构成单片机电子数字音乐盒求利IO口产生定频率方波驱动蜂鸣器发出音调采LCD显示信息演奏乐曲开机时英文欢迎提示字符播放时显示歌曲序号(名称)通功键选择乐曲暂停播放设计采4*4键盘16*2 LCD七段显示数码LED面模块设计逐进行证较
31 单片机选取
首先选择单片机中普遍MCS51系列中AT89C2051美国ATMEL公司生产低电压高性CMOS 8位单片机片含2k bytes反复擦写读程序存储器(PEROM)128bytes机数存储器(RAM)器件采ATMEL公司高密度非易失性存储技术生产兼容标准MCS51指令系统片置通8位中央处理器Flash存储单元功强AT89C2051单片机应许高性价应场合
性:
l MCS51产品兼容
l 2KB重编程FLASH存储器(1000次)
l 276V电压范围
l 全静态工作:0Hz24KHz
l 2级程序存储器保密锁定
l 128*8位部RAM
l 15条编程IO线
l 两16位定时器计数器
l 6中断源
l 编程串行通道
l 高精度电压较器(P10P11P36)
l 直接驱动LED输出端口
完成核心功——音频输出需IO口额外功LED移位显示根选单片机剩余IO口进行设计AT89C2051足满足基求20引脚体积巧部2k字节程序存储器容量适中低压低频工作条件价格低廉容易购
综次设计选择AT89C2051单片机
32 LED显示方
选取七段数码播放数字音符i(i12…7)时候第i数码显示i显示时间该音节拍时间相选动态显示
33 系统总体结构框图
4系统硬件设计
设计中AT89C51单片机七段数码蜂鸣器等硬件电路常元器件
41 AT89C51 芯片功硬件连接
AT89C51种带4K字节闪烁编程擦读存储器低电压高性CMOS8位微处理器俗称单片机该器件采ATMEL高密度非易失存储器制造技术制造工业标准MCS51指令集输出脚相兼容功8位CPU闪烁存储器组合单芯片中ATMELAT89C51种高效微控制器嵌入式控制系统提供种灵活性高价廉方案
411特性:
·MCS51 兼容
·4K字节编程闪烁存储器
·寿命:1000写擦循环
·数保留时间:10年
·全静态工作:0Hz24Hz
·三级程序存储器锁定
·128*8位部RAM
·32编程IO线
·两16位定时器计数器
·5中断源
·编程串行通道
·低功耗闲置掉电模式
·片振荡器时钟电路
412 脚说明(图31): 图31
VCC:供电电压 GND:接
P0口:P0口8位漏级开路双IO口脚吸收8TTL门电流P1口脚第次写1时定义高阻输入P0够外部程序数存储器定义数址第八位FIASH编程时P0 口作原码输入口FIASH进行校验时P0输出原码时P0外部必须拉高
P1口:P1口部提供拉电阻8位双IO口P1口缓器接收输出4TTL门电流P1口脚写入1部拉高作输入P1口外部拉低电时输出电流部拉缘FLASH编程校验时P1口作第八位址接收
P2口:P2口部拉电阻8位双IO口P2口缓器接收输出4TTL门电流P2口写1时脚部拉电阻拉高作输入作输入时P2口脚外部拉低输出电流部拉缘P2口外部程序存储器16位址外部数存储器进行存取时P2口输出址高八位出址1时利部拉优势外部八位址数存储器进行读写时P2口输出特殊功寄存器容P2口FLASH编程校验时接收高八位址信号控制信号
P3口:P3口脚8带部拉电阻双IO口接收输出4TTL门电流P3口写入1部拉高电作输入作输入外部拉低电P3口输出电流(ILL)拉缘P3口作AT89C51特殊功口表示:
口脚 备选功
P30 RXD(串行输入口)
P31 TXD(串行输出口)
P32 INT0(外部中断0)
P33 INT1(外部中断1)
P34 T0(记时器0外部输入)
P35 T1(记时器1外部输入)
P36 WR(外部数存储器写选通)
P37 RD(外部数存储器读选通)
P3口时闪烁编程编程校验接收控制信号
RST:复位输入振荡器复位器件时保持RST脚两机器周期高电时间
ALEPROG:访问外部存储器时址锁存允许输出电锁存址位字节FLASH编程期间引脚输入编程脉时ALE端变频率周期输出正脉信号频率振荡器频率16作外部输出脉定时目然注意:作外部数存储器时跳ALE脉想禁止ALE输出SFR8EH址置0时 ALE执行MOVXMOVC指令ALE起作外该引脚略微拉高果微处理器外部执行状态ALE禁止置位效
PSEN:外部程序存储器选通信号外部程序存储器取指期间机器周期两次PSEN效访问外部数存储器时两次效PSEN信号出现
EAVPP:EA保持低电时期间外部程序存储器(0000HFFFFH)否部程序存储器注意加密方式1时EA部锁定RESETEA端保持高电时间部程序存储器FLASH编程期间引脚施加12V编程电源(VPP)
XTAL1:反振荡放器输入部时钟工作电路输入
XTAL2:反振荡器输出
421 LED显示器结构
常LED显示器8段段应1发光二极种显示器阳极阴极两种:阴极LED显示器发光二极阴极连接起通常公阴极接某发光二极阳极高电时发光二极点亮相应段显示样阳极LED显示器发光二极阳极连接起通常公阳极接正电压某发光二极阴极接低电时发光二极点亮相应段显示LED显示器显示符号数字段发光二极点亮样LED提供代码代码LED相应段发光显示字型该代码称段码
7段发光二极加1数点位计8位提供LED显示器段码正1B段字节中位应关系表31:
表31 8段LED结构外形
位码位
D1
D2
D3
D4
D5
D6
D7
D8
0xfe
0xfd
0xfb
0xf7
0xef
0xdf
0xbf
0x7f
段码
0
1
2
3
4
5
6
7
0x3f
0x06
0x5b
0x4f
0x66
0x6d
0x7d
0x07
422 LED显示器工作原理
NLED显示块拼接成N位LED显示器图LED显示器结构原理图32
NLED显示器N位选线8*N位 根段码线
段码线控制显示字符字型位选线LED显示块中
段公端控制该LED显示位亮暗LED显示器
静态显示动态显示两种
43 键盘
键盘设置选歌键进行次中断采优先级解码芯片74LS148中断源信号作中断
44 音频输出部分
整输出部分100uF电容两S9013 NPN三极蜂鸣器喇叭组成原理图右图示:
100uF电容滤波两NPN三极起放信号作蜂鸣器喇叭表现出信号P37口控制蜂鸣器输出显示电路图34示:
图34 输出显示电路
45 整体硬件电路
46 原理说明:
键盘键时判断键值触发外部0中断选择应播放曲目时8段数码动态显示播放数字音符sw1暂停播放快进快退触发外部1中断时曲子循环前进活快退5音符
5系统软件设计
51 模块设计
模块系统软件框架结构化程序设计般
两种方式法核心框架构建合理否关系程序终功少性坏系统模块程序框图图6示:
图 6
52 外部中断源系统设计
设计中中断源采外部中断0外部中断1方式均负跳变效
(1)定时器计数器
工作方式寄存器TMOD选择定时器计数器工作方式工作模式格式表41:
TMOD
D7
D6
D5
D4
D3
D2
D1
D0
GATE
M1
M0
GATE
M1
M0
T1方式字段
T0方式字段
表41
面表42TMOD位进行说明:
门控位—GATE
工作方式选择位—M1M0
M1
M0
工作方式
0
0
方式013位定时器计数器
0
1
方式116位定时器计数器
1
0
方式28位常数动重新装载定时器计数器
1
1
方式3仅适T0
表42
中设计中采方式116位定时器计数器
—计数器模式定时器模式选择位
0定时器模式
1计数模式
定时器计数器控制寄存器TCON格式表43:
TCON
D7
D6
D5
D4
D3
D2
D1
D0
TF1
TR1
TF0
TR0
IE1
IT1
IE0
ITO
表43
位功:
TF1TF0—计数溢出标志位计数器溢出时该位置1
TR1TR0—计数运行控制位
521外部中断1实现快进快退
快进快退键进入外部1中断通读取P3^4P3^5电判断m值
void int1() interrupt 2 外部1中断快进快退
{
TR00
if(p340&p351) m1 快进
if(p341&p350) m0 快退
}
程序中会通m值判断快进快退
if(m1)
{c(c+5*3)159次前进活着退5音符取余会超普子长度
m3
}
else if(m0)
{c(c5*3)159
m3
}
522外部中断0实现歌曲选择
选择听歌曲键会进入外部0中断通读取P0口状态确定status值
void int0() interrupt 0 外部0中断选择歌曲
{
c0 换曲子时头播放
status0X07&P0
}
程序中通判断status值选择播放曲子
switch(status)
{
case 1……
case 2……
……
}
53 基显示模块设计
P1count[table[c]]
P2bitcode[table[c]1]
动态显示播放音符应数字谱
54 系统初始化程序
unsigned char k
p000
TMOD0X01
EA1EX01EX11 开外部01中断定时器0中断
ET01ET11 外部中断01脉触发方式负跳变效
IT01
c0
55音调节拍编码确定方法
般说单片机演奏音乐基单音频率包含相应幅度谐波频率说电子琴样奏出种音色声音单片机奏乐需弄清楚两概念音调节拍表示音符唱长时间
451曲子编码
段编码例
table[] 乐谱
{611 511 613 121 221 321 000 }
编码3组组应音符611例:
第数代表音符6代表数字谱6La
第二数代表音调1表示低音理2表示中音3表示高音
第三数代表节拍1表示节拍处半拍理2表示1拍31半拍42拍
ktable[c]+7*table[c1]1 找音调
BTH0th0[k]
BTL0tl0[k]
timetable[c+2] 找节拍
低中高音7循环k代表音符位置611
k6+7*01低音6频率th0[k](频率高八位)tl0[k](频率低八位)中寻
th0[] 音调频率高八位
{0xf20xf30xf50xf50xf60xf70xf8 低音
0xf90xf90xfa0xfa0xfb0xfb0xfc 中音
0xfc0xfc0xfd0xfd0xfd0xfd0xfe 高音
0xfe0xfe0xfe0xfe0xfe0xfe0xff} 超高音
tl0[] 音调频率低八位
{0x420xc10x170xb60xd00xd10xb6 低音
0x210xe10x8c0xd80x680xe90x5b 中音
0x8f0xee0x440x6b0xb40xf40x2d 高音
0x470x770xa20xb60xda0xfa0xe6} 超高音
定时器0中断产生方波放出音调
void time0() interrupt 1 using 0定时中断产生音调
{
TR00
p00~p00
TH0BTH0
TL0BTL0
TR01
}
6调试结果
61 系统总电路图
总 结
首先感谢老师教学C51熟悉起身喜欢音乐准备课程设计马想道做音乐播放器出编写喜欢曲子图书馆里找书容易理解程序原程序循环播放音乐次基础进行改变先加入外部0中断联合switch语句实现时选择曲子功插进暂停功然加入8段数码动态显示曲子程序加入外部1中断快进快退语句
程中没设置外部0中断负跳变效时没发现困恼午知突然想没设置负跳变效余没障碍细节需反复调试修改
制作程愉快
参考文献
姜志海单片机C语言程序设计应——基Proteus仿真(第2版)电子工业出版社2011
附件
总程序
#include
sbit p00P0^3
sbit p20P3^0
sbit p34P3^4
sbit p35P3^5
unsigned int tcm3
unsigned char time
unsigned char keytmpstatus0
unsigned char BTH0BTL0
unsigned char code count[]{0x3f0x060x5b0x4f0x660x6d0x7d0x07 段码
0x7f0x6f0x770x7c0x390x5e0x790x710x400x00}
unsigned char code bitcode[]{0xfe0xfd0xfb0xf70xef0xdf0xbf0x7f} 位码
code unsigned char th0[]{0xf20xf30xf50xf50xf60xf70xf8 音调频率高八位
0xf90xf90xfa0xfa0xfb0xfb0xfc
0xfc0xfc0xfd0xfd0xfd0xfd0xfe
0xfe0xfe0xfe0xfe0xfe0xfe0xff}
code unsigned char tl0[]{0x420xc10x170xb60xd00xd10xb6 音调频率低八位
0x210xe10x8c0xd80x680xe90x5b
0x8f0xee0x440x6b0xb40xf40x2d
0x470x770xa20xb60xda0xfa0xe6}
code unsigned char table[] 羽根
{611 511 613 121 221 321 221 121 221 121 511 613
611 511 613 121 221 321 221 121 221 321 323
521 621 523 621 521 321 221 321 221 121 511 612
611 511 611 321 612
611 321 611 511 613
121 221 321 221 121 511 613 000
}
code unsigned char table1[] 奏曲
{331 231 331 631 331 231 331 631 331 231 331 631
331 231 721 521 331 231 331 631 331 231 331 631 532
611 711 122 322 222 121 711 611 711 121 711 611 511 612
321 321 321 321 322 121 221 321 221 321 521 421 321 322 121 321
222 612 121 321 222 522 711 511
121 121 121 121 621 721 132 721 131 721 621 521 221
131 131 131 131 621 721 132 721 131 721 621 521 621 721
000
}
code unsigned char table2[] 夏日星
{321 321 321 221 322 521 321 223 321 224
121 121 121 121 611 123 221 221 221 321 224
323 321 322 521 321 223 321 124 713 711 712 611 511 616
321 321 321 221 322 521 321 223 321 224
121 121 121 121 611 123 221 221 221 321 224
323 321 322 521 321 223 321 124 713 711 712 611 511 616
000
}
code unsigned char table3[]{621 721 133 721 132 332 724 321 321 623 521 622 132 524 321 321 423 321 421 133 天空城
323 131 131 131 723 421 422 722 724 621 721 133 721 132 332 724 321 321 623 521 622 132
524 321 422 131 721 722 131 231 231 331 132 132 721 621 621 722 522 623 131 231 333 231 333 532
234 521 521 131 721 132 332 334 621 721 132 722 231 231 133 521 522 432 332 232 132
335 332 634 532 532 331 231 132 131 232 131 231 231 532 334 332
634 534 331 231 134 131 232 131 231 231 722 624
000
}
void int0() interrupt 0 外部0中断选择歌曲
{
c0 换曲子时头播放
status0X07&P0
}
void int1() interrupt 2 外部1中断快进快退
{
TR00
if(p340&p351) m1 快进
if(p341&p350) m0 快退
}
void delay(unsigned char t) 延迟函数
{
unsigned char t1
unsigned long t2
for(t10t1
for(t20t2<8000t2++){}
}
}
void time0() interrupt 1 using 0定时中断产生音调
{
TR00
p00~p00
TH0BTH0
TL0BTL0
TR01
}
void sing() 唱歌
{
if(table[c3]8)
{TR00} 遇休止符暂停
else
{
TH0BTH0
TL0BTL0
TR01
}
delay(time)
time0 程序跳出循环检查否暂停
P20XFF 关闭显示器
}
void main() 函数
{
unsigned char k
p000
TMOD0X01
EA1EX01EX11 开外部01中断定时器0中断
ET01ET11 外部中断01脉触发方式负跳变效
IT01
c0
while(1)
{
switch(status)
{
case 1
if(p201) 检查否暂停
{
TR00
}
else if(p200)
{
time1
}
while(time)
{
if(m1)
{c(c+5*3)159 次前进活着退5音符取余会超普子长度
m3
}
else if(m0)
{c(c5*3)159
m3
}
if (table[c]0)
{
c0 播放结束头播放
}
else if(table[c]0)
{
ktable[c]+7*table[c+1]1 找音调
BTH0th0[k]
BTL0tl0[k]
timetable[c+2] 找节拍
P1count[table[c]]
P2bitcode[table[c]1]
cc+3
sing()
}
}
break
case 2
if(p201) 检查否暂停
{
TR00
}
else if(p200)
{
time1
}
while(time)
{
if(m1)
{c(c+5*3)273
m3
}
else if(m0)
{c(c5*3)273
m3
}
if (table1[c]0)
{
c0 播放结束头播放
}
else if(table1[c]0)
{
ktable1[c]+7*table1[c+1]1
BTH0th0[k]
BTL0tl0[k]
timetable1[c+2]
P1count[table1[c]] 显示数字简谱
P2bitcode[table1[c]1] 选中应位
cc+3
sing()
}
}
break
case 3
if(p201) 检查否暂停
{
TR00
}
else if(p200)
{
time1
}
while(time)
{
if(m1)
{c(c+5*3)213
m3
}
else if(m0)
{c(c5*3)213
m3
}
if (table2[c]0)
{
c0 播放结束头播放
}
else if(table2[c]0)
{
ktable2[c]+7*table2[c+1]1
BTH0th0[k]
BTL0tl0[k]
timetable2[c+2]
P1count[table2[c]]
P2bitcode[table2[c]1]
cc+3
sing()
}
}
break
case 4
if(p201) 检查否暂停
{
TR00
}
else if(p200)
{
time1
}
while(time)
{
if(m1)
{c(c+5*3)348
m3
}
else if(m0)
{c(c5*3)348
m3
}
if (table3[c]0)
{
c0 播放结束头播放
}
else if(table3[c]0)
{
ktable3[c]+7*table3[c+1]1 找音调
BTH0th0[k]
BTL0tl0[k]
timetable3[c+2] 找节拍
P1count[table3[c]]
P2bitcode[table3[c]1]
cc+3
sing()
}
}
break
defaultTR00 免会断播放前音
break
}
}
}
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档