单片机课程设计——八音盒

上传人:Sc****h 文档编号:137798343 上传时间:2022-08-19 格式:DOC 页数:38 大小:983KB
返回 下载 相关 举报
单片机课程设计——八音盒_第1页
第1页 / 共38页
单片机课程设计——八音盒_第2页
第2页 / 共38页
单片机课程设计——八音盒_第3页
第3页 / 共38页
点击查看更多>>
资源描述
单片机原理及应用课程设计- 八音盒设计 -院系:机电汽车工程学院姓名:班级:机101-4班组长:组员:指导教师:完成时间:姜风国2013年6月5 日单片机课程设计目录一、课程设计任务书3二、设计项目简介32.1总体设计思路32.2音符产生方法32.3节拍产生方法42.4核心器件简介52.5任务分工7三、 系统功能简介.8四、电路原理图84.1硬件电路设计框图 .104.2键盘控制电路 .104.3LCD 显示电路 .114.4晶振和复位电路 .114.5扬声器和闪烁电路 124.6播放和停止电路 12五、 程序框图13六、程序清单166.1主函数 main.c.166.2功能函数fun.c186.3数据函数data.c276.4主函数变量定义336.5功能函数相关变量定义.336.6数据函数相关变量定义34七、总结35参考文献:.36- 2 -单片机课程设计摘要近年来随着科技的飞速发展, 单片机的应用正在不断地走向深入。 当今,利用单片机控制音乐播放举不胜举,而利用单片机存储音乐,控制播放最为广泛,它具有功能多、价格优、外围电路简单等特点,很受音乐爱好者和音乐芯片制造商的青睐。本设计主要是应用单片机的原理和控制理论来设计音乐播放器的硬件电路,并利用 C 语言进行软件程序设计。 通过控制单片机内部的定时器产生不同频率的方波, 驱动蜂鸣器发出不同音调的音乐,再利用延时来控制发音时间的长短。 把乐谱转化成相应的定时常数就可以从发音设备中演奏出悦耳动听的音乐。最后利用编程软件 uVision3 和仿真软件 PROTEUS 对该音乐播放器进行仿真,完全实现所需功能。关键词89C51 单片机;矩阵键盘;蜂鸣器;LCD ;八音盒- 3 -单片机课程设计一、课程设计任务书本设计利用 89C51 单片机结合内部定时器以及外接LCD 和矩阵键盘设计了一个八音盒,按下单键可以演奏预先设置的歌曲旋律。本设计可以学习89C51 定时器程序设计,按键扫描及歌曲旋律简单直觉式输入法的设计方法。其基本功能为: 1、使用 LCD 显示器来显示目前演奏的歌曲编号; 2、具有 16 个按键操作来选择演奏哪一首歌曲; 3、内建 10 首歌曲旋律,按下单键可以演奏歌曲; 4、演奏时可以按键中断。程序执行后工作指示 LED 闪动,表示程序开始执行, 按下单键 09 便可以演奏歌曲, 歌曲演奏中,可以按键中断。二、设计项目简介1、设计思路: 选用 ATMEL 公司 89C51 单片机,它具有 16KB 的内部 ROM, 2 个定时器 /计数器, 2 个外部中断。 通过中断实现歌曲的播放和暂停。 通过定时实现 LED 闪烁和音乐频率的变化。 通过键盘实现歌曲的选择。2、音符产生方法:不同的音调有不同的频率。频率不同,音调也就不同。利用定时器,使其工作在模式 0,定时中断,然后控制 P3.7 引脚的输出每次取反,就可以在 P3.7 的引脚输出相应的方波频率。改变计数初值,就改变了频率。 定时器的定时时间等于半个周期, 定时时间到就输出脉冲取反, 重复此过程,就可在 P3.7 引脚得到一音频的脉冲。如: C 调中音 1 的频率 =523HZ,周期 T=1/523=1912us;定时器的定时时间为: T/2=1912/2us=956us;则其计数初值为: TH0=(8192-C)/32;TL0=(8192-C)%32 ;下面是音符及其程序中对应的编码表 2.1 音符编码表音符音符编码音符音符编码音符音符编码低音 1l_dao中音 1dao高音 1h_dao低音 2l_re中音Re高音 2h_re- 4 -单片机课程设计低音 3l_mi中音Mi高音 3h_mi低音 4l_fa中音Fa高音 4h_fa低音 5l_sao中音Sao高音 5h_sao低音 6l_la中音La高音 6h_la低音 7l_xi中音Xi高音 7h_xi3、节拍产生方法:音乐中的节拍用延时时间产生。假设 1/4 拍执行一次延时程序, 1/2 拍就执行两次延时程序,所以只要求出 1/4 延时时间,其余的节拍就是他的倍数。 为方便记谱,将节拍数也进行编码, 如下:表 2.2 节拍编码表节拍 节拍编码 (基本延时次数)1/411/223/434/44建立曲谱编码表,例如:简谱编码: re,sao,mi,re,mi,sao,mi,re,dao,re,re,sao,re,mi,sao,mi,re,dao,l_la,dao,dao,mi,re,mi,l_sao,re,l_xi,l_la,l_sao,l_la,dao,re,l_xi,l_la,l_sao,l_mi,l_sao,0xff节拍编码: 4,4,2,2,4,2,2,2,2,8,4,4,4,2,2,2,2,2,2,8,4,4,2,2,4,2,2,2,2,4,- 5 -单片机课程设计6,2,2,2,2,2,164、核心器件简介( 1)AT89C51 的性能介绍AT89C51 是一种带 4K 字节闪烁可编程可擦除只读存储器,高性能 CMOS8 位微处理器,俗称单片机。该器件采用 ATMEL 高密度非易失存储器制造技术制造, 与工业标准的 MCS-51 指令集和输出管脚相兼容。由于将多功能 8 位 CPU 和闪烁存储器组合在单个芯片中, ATMEL 的 AT89C51 是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。它可以提供以下的功能标准:1) 4K 的字节闪烁存储器;2)128 字节随机存取数据存储器;3)32 个 I/O 口;4)2 个 16 位定时 /计数器;5)1 个串行通信口;6)片内振荡器和时钟电路。( 2)蜂鸣器蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。1) 压电式蜂鸣器 压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。有的压电式蜂鸣器外壳上还装有发光二极管。多谐振荡器由晶体管或集成电路构成。当接通电源后( 1.515V 直流工作电压) ,多谐振荡器起振 ,输出 1.52.5kHZ 的音频信号,阻抗匹配器推动压电蜂鸣片发声。压电蜂鸣片由锆钛酸铅或铌镁酸铅压电陶瓷材料制成。在陶瓷片的两面镀上银电极,经极化和老化处理后,再与黄铜片或不锈钢片粘在一起。2) 电磁式蜂鸣器 电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。( 3)矩阵键盘单片机系统中 ,若使用按键的数量比较多时,通常选用用矩阵式键盘。矩阵式键由行线和列线构成,按键位于行、列线的交叉点上, 键盘矩阵是由四行四列构成,矩阵的四列和P2 口的低四位相连,四行与P2 口的高四位相连。其键盘识别方法如下:1) 判断键盘中有无键按下将全部行线置低电平, 然后检测列线的状态。 只要有一列的电平为- 6 -单片机课程设计低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4 根行线相交叉的4 个按键之中。若所有列线均为高电平,则键盘中无键按下。2) 判断闭合键所在的位置 在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平, 即在置某根行线为低电平时, 其它线为高电平。 在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。 若某列为低, 则该列线与置为低电平的行线交叉处的按键就是闭合的按键( 4)LCD1602 液晶显示器简介工业字符型液晶,能够同时显示16X02 即 32 个字符。(16 列 2 行)1602 液晶也叫 1602 字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个 5X7 或者 5X11 等点阵字符位组成, 每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用。1602LCD 是指显示的内容为16X2,即可以显示两行,每行16 个字符液晶模块(显示字符和数字)。 基本内容如下:- 7 -单片机课程设计5、任务分工(1)系统总体设计及调试方面- 臧(2)键盘扫描程序编辑方面- 刘(3) LCD 显示程序编辑方面 - 臧(4)中断程序及 protues仿真调试方面 - 周(5)扬声器、二极管闪烁程序以及protues硬件电路设计- 王(6)歌曲搜集整理、歌曲播放程序及文档编写- 林 、李 、刘三、系统功能简介1、此 80C51 八音盒有矩阵式键盘共十个按键,09 按键用于选择歌曲,通过P2 口与单片机相连。2、LCD 通过用于显示,显示当前正在播放的歌曲编号。P0 口输出编号, P1.4、P1.5、P1.6 用于控制 LCD 。3、有中断按键,在单片机播放旋律时可以按外部中断1 键实现歌曲暂停,再按中断T0 实现歌曲暂停后的播放。4、 LED 灯连接在 P1.7 口,用 LED 灯闪烁指示单片机处于工作状态。5、歌曲音调经 P3.7 口的喇叭播放出来。四、电路原理图- 8 -单片机课程设计电路原理图设计结果如下:图 4.1 电路原理图- 9 -单片机课程设计具体设计如下:4.1硬件电路设计框图LCD 显示电路键盘控89C51扬声器电路制单片机电路LED 闪烁电路4.2键盘控制电路图 4.2 键盘控制电路-10-单片机课程设计按键功能:0 9 键:十首歌曲选择键,按下某个按键可播放对应的歌曲。键盘中断通过三输入与门引入外部中断 0。4.3LCD 显示电路图 4.3 LCD 显示电路用 P1.4 P1.6 作为 LCD的 RS、R/W、E 的控制信号用 P0.0-P0.7 作为 LCD的 D0-D7 的控制信号4.4晶振和复位电路图 4.4晶振和复位电路-11-单片机课程设计XTAL1 和 XTAL2 的两端用来连接石英晶体和外接电容,即用来连接片内 OSC 的定时反馈回路。石英起振后应能在XTAL2 线上输入一个 3V 左右的正弦波,以便使片内的电路按石英晶振相同频率自激振荡。4.5扬声器和闪烁电路图闪烁电路通过 P1.7 口驱动图 扬声器通过 P3.7 驱动4.6播放和停止电路播放中断通过T0 中断引入单片机;暂停中断通过外部中断1 引入单片机。图 4.6播放和停止电路五、程序框图-12-单片机课程设计主程序开始定时器 T1、T2 初始化外部中断0、 1 的初始化LCD 初始化键盘扫描While(1)无限循环键盘扫描Switch判断Case:musicdefault-13-单片机课程设计键盘扫描开始全列置零,全行扫描判断是否有键按下否是全列置零,全行扫描去抖延时行赋值全列置零,全行扫描列赋值计算键值结束-14-单片机课程设计音符播放程序开始LCD 清屏显示歌曲编号是判断是否是标志位否计数器赋初值启动定时器控制节拍延时关闭定时器播放下一个音符结束-15-单片机课程设计六、程序清单 :6.1主函数 main.c#include main.h#include data.c#include fun.c/*函数功能:键盘扫描中断服务程序(外部中断0)*/void int0()interrupt 0BZ=0;keyscan();/*函数功能:歌曲播放与暂停中断服务程序(外部中断1 和计数器 T0 中断)*/void int1()interrupt 2uchar temp;while(!bz);k=1;TR0=0;while(k)temp=bf;if(temp=0)delayms(5);temp=bf;if(temp=0)while(!bf);k=0;TR0=1;break;/*函数功能:定时器1 的中断服务程序*/void timer1()interrupt 3-16-单片机课程设计LED=!LED;keyscan();/*函数功能:定时器T0 的中断服务子程序,使P3.7 引脚输出音频的方波*/void Time0(void ) interrupt 1 using 1sound=!sound;/ 将 P3.7 引脚输出电平取反,形成方波TH0=(8192-C)/32;/可证明这是 13 位计数器 TH0 高 8 位的赋初值方法TL0=(8192-C)%32;/ 可证明这是 13 位计数器 TL0 低 5 位的赋初值方法/*函数功能:主函数*/void main(void)initialT012();/LED 灯、定时器 T1、T2 初始化initial();/外部中断 0 和 1 的初始化LCD();/LCD 初始化 */while(1)BZ=1;switch(keynum)case 0x00: music0();break;case 0x01: music1();break;case 0x02: music2();break;case 0x03: music3();break;case 0x04: music4();break;case 0x05: music5();break;case 0x06: music6();break;case 0x07: music7();break;case 0x08: music8();break;case 0x09: music9();break;default : break;-17-单片机课程设计6.2功能函数fun.c用于播放歌曲、 LCD 以及中断初始化#include main.h#include fun.h#include data.h/*函数功能: 歌曲 0好人一生平安 */ void music0(void)LCD(); WriteData(m);WriteData(u);WriteData(s);WriteData(i); WriteData(c);WriteData( );WriteData(0);WriteData(!);i=0;/从第 1 个音符 f0 开始播放while(f0i!=0xff)/只要没有读到结束标志就继续播放if(BZ=0)break;C=460830/f0i;TH0=(8192-C)/32;/可证明这是 13 位计数器 TH0 高 8 位的赋初值方法TL0=(8192-C)%32;/ 可证明这是 13 位计数器 TL0 低 5 位的赋初值方法TR0=1;/ 启动定时器 T0for(j=0;jJP0i;j+)/控制节拍数delay();/ 延时 1 个节拍单位TR0=0;/关闭定时器 T0i+;/播放下一个音符/*函数功能:歌曲 1保卫黄河*/void music1(void) LCD(); WriteData(m);WriteData(u);WriteData(s);WriteData(i);WriteData(c);WriteData( );WriteData(1);WriteData(!); i=0; /从第 1 个音符 f0 开始播放while(f1i!=0xff)/只要没有读到结束标志就继续播放if(BZ=0)break;C=460830/f1i;TH0=(8192-C)/32;/可证明这是 13 位计数器 TH0 高 8 位的赋初值方法TL0=(8192-C)%32;/ 可证明这是 13 位计数器 TL0 低 5 位的赋初值方法-18-单片机课程设计TR0=1;/ 启动定时器 T0for(j=0;jJP1i;j+)/控制节拍数delay();/ 延时 1 个节拍单位TR0=0;/关闭定时器 T0i+;/播放下一个音符/*函数功能:歌曲 2毕业歌*/void music2() LCD(); WriteData(m);WriteData(u);WriteData(s);WriteData(i);WriteData(c);WriteData( );WriteData(2);WriteData(!); i=0; /从第 1 个音符 f0 开始播放while(f2i!=0xff)/ 只要没有读到结束标志就继续播放if(BZ=0)break;C=460830/f2i;TH0=(8192-C)/32;/可证明这是 13 位计数器 TH0 高 8 位的赋初值方法TL0=(8192-C)%32;/ 可证明这是 13 位计数器 TL0 低 5 位的赋初值方法TR0=1;/ 启动定时器 T0for(j=0;jJP2i;j+)/控制节拍数delay();/ 延时 1 个节拍单位TR0=0;/关闭定时器 T0i+;/播放下一个音符/*函数功能:歌曲 3沂蒙山小调*/ void music3()LCD(); WriteData(m);WriteData(u);WriteData(s);WriteData(i); WriteData(c);WriteData( );WriteData(3);WriteData(!);i=0;/从第 1 个音符 f0 开始播放while(f3i!=0xff)/ 只要没有读到结束标志就继续播放if(BZ=0)break;-19-单片机课程设计C=460830/f3i;TH0=(8192-C)/32;/可证明这是 13 位计数器 TH0 高 8 位的赋初值方法TL0=(8192-C)%32;/ 可证明这是 13 位计数器 TL0 低 5 位的赋初值方法TR0=1;/ 启动定时器 T0for(j=0;jJP3i;j+)/控制节拍数delay();/ 延时 1 个节拍单位TR0=0;/关闭定时器 T0i+;/播放下一个音符/*函数功能:歌曲4 套马杆*/void music4()LCD();WriteData(m);WriteData(u);WriteData(s);WriteData(i);WriteData(c);WriteData( );WriteData(4);WriteData(!);i=0;/从第 1 个音符 f0 开始播放while(f4i!=0xff)/ 只要没有读到结束标志就继续播放if(BZ=0)break;C=460830/f4i;TH0=(8192-C)/32;/可证明这是 13 位计数器 TH0 高 8 位的赋初值方法TL0=(8192-C)%32;/ 可证明这是 13 位计数器 TL0 低 5 位的赋初值方法TR0=1;/ 启动定时器 T0for(j=0;jJP4i;j+)/控制节拍数delay();/ 延时 1 个节拍单位TR0=0;/关闭定时器 T0i+;/播放下一个音符/*函数功能:歌曲5军港之夜*/void music5()LCD(); WriteData(m);WriteData(u);WriteData(s);WriteData(i); WriteData(c);WriteData( );WriteData(5);WriteData(!);i=0;/从第 1 个音符 f0 开始播放while(f5i!=0xff)/ 只要没有读到结束标志就继续播放if(BZ=0)break;C=460830/f5i;-20-单片机课程设计TH0=(8192-C)/32; /可证明这是 13 位计数器 TH0 高 8 位的赋初值方法 TL0=(8192-C)%32; / 可证明这是 13 位计数器 TL0 低 5 位的赋初值方法TR0=1;/启动定时器 T0for(j=0;jJP5i;j+)/ 控制节拍数delay();/延时 1 个节拍单位TR0=0;/关闭定时器 T0i+;/播放下一个音符/*函数功能:歌曲6童年*/void music6() LCD(); WriteData(m);WriteData(u);WriteData(s);WriteData(i);WriteData(c);WriteData( );WriteData(6);WriteData(!); i=0; /从第 1 个音符 f0 开始播放while(f6i!=0xff)/ 只要没有读到结束标志就继续播放if(BZ=0)break;C=460830/f6i;TH0=(8192-C)/32;/可证明这是 13 位计数器 TH0 高 8 位的赋初值方法TL0=(8192-C)%32;/可证明这是 13 位计数器 TL0 低 5 位的赋初值方法TR0=1;/启动定时器 T0for(j=0;jJP6i;j+)/ 控制节拍数delay();/延时 1 个节拍单位TR0=0;/关闭定时器 T0i+;/播放下一个音符/*函数功能:歌曲 7爱情买卖*/ void music7()LCD(); WriteData(m);WriteData(u);WriteData(s);WriteData(i); WriteData(c);WriteData( );WriteData(7);WriteData(!);i=0;/从第 1 个音符 f0 开始播放while(f7i!=0xff)/ 只要没有读到结束标志就继续播放if(BZ=0)break;C=460830/f7i;TH0=(8192-C)/32;/可证明这是 13 位计数器 TH0 高 8 位的赋初值方法-21-单片机课程设计TL0=(8192-C)%32;/ 可证明这是 13 位计数器 TL0 低 5 位的赋初值方法TR0=1;/启动定时器 T0for(j=0;jJP7i;j+)/控制节拍数delay();/延时 1 个节拍单位TR0=0;/关闭定时器 T0i+;/播放下一个音符/*函数功能:歌曲 8荷塘月色*/void music8() LCD(); WriteData(m);WriteData(u);WriteData(s);WriteData(i); WriteData(c);WriteData( );WriteData(8);WriteData(!);i=0;/从第 1 个音符 f0 开始播放while(f8i!=0xff)/ 只要没有读到结束标志就继续播放if(BZ=0)break;C=460830/f8i;TH0=(8192-C)/32;/可证明这是 13 位计数器 TH0 高 8 位的赋初值方法TL0=(8192-C)%32;/ 可证明这是 13 位计数器 TL0 低 5 位的赋初值方法TR0=1;/ 启动定时器 T0for(j=0;jJP8i;j+)/控制节拍数delay();/ 延时 1 个节拍单位TR0=0;/关闭定时器 T0i+;/播放下一个音符/*函数功能:歌曲9 我们走在大路上*/void music9()LCD(); WriteData(m);WriteData(u);WriteData(s);WriteData(i);WriteData(c);WriteData( );WriteData(9);WriteData(!); i=0; /从第 1 个音符 f0 开始播放while(f9i!=0xff)/ 只要没有读到结束标志就继续播放if(BZ=0)break;C=460830/f9i;TH0=(8192-C)/32;/可证明这是 13 位计数器 TH0 高 8 位的赋初值方法TL0=(8192-C)%32;/ 可证明这是 13 位计数器 TL0 低 5 位的赋初值方法-22-单片机课程设计TR0=1;/ 启动定时器 T0for(j=0;jJP9i;j+)/控制节拍数delay();/延时 1 个节拍单位TR0=0;/关闭定时器 T0i+;/播放下一个音符/*函数功能: LCD 预处理函数*/void LCD(void)LcdInitiate();/调用 LCD 初始化函数WriteAddress(0x04);/将显示地址指定为第1 行第 5 列/*函数功能:键盘扫描程序(利用P2 口,给 keynum 赋值 )*/ void keyscan()uchar lnum,rnum;/定行号和列号P2=0x0F;/全列置零,全行扫描if(P2&0x0F)!=0x0F) delayms(10); /消抖延时 if(P2&0x0F)!=0x0F)/*-以下确定行号 -*/if(P2=0x07)lnum=3;if(P2=0x0B)lnum=2;if(P2=0x0D)lnum=1;if(P2=0x0E)lnum=0;/*-以下确定列号 -*/P2=0xF0;/全行置零,全列扫描if(P2&0xF0)!=0xF0)if(P2=0xE0)rnum=0;if(P2=0xD0)rnum=1;if(P2=0xB0)-23-单片机课程设计rnum=2;if(P2=0x70)rnum=3;keynum=lnum*4+rnum;/计算键值switch(keynum)case 0x0a: pause();break;case 0x0b: play();break;default : break;/*函数功能:外部中断初始化程序*/void initial() /*初始化外部中断 0*/IT0=1;/外部中断为下降沿触发EA=1;/打开中断总开关EX0=1;/打开中断 0 开关PX0=0;/中断 0 为低优先级/*初始化外部中断1*/IT1=1;/外部中断为下降沿触发EX1=1;/打开中断 1 开关PX1=1;/中断 1 为高优先级/*函数功能:定时器初始化程序*/void initialT012() TMOD=0x10;TH0=0x00;TL0=0x00;PT1=0;ET1=1;TR1=1;ET0=1;/定时器 T0 中断允许PT0=1;/*-24-单片机课程设计函数功能:判断液晶模块的忙碌状态返回值: result。result=1,忙碌 ;result=0,不忙*/uchar BusyTest(void)bit result;RS=0; /根据规定, RS 为低电平, RW 为高电平时,可以读状态 RW=1;E=1;/E=1,才允许读写_nop_();/空操作_nop_();_nop_();_nop_(); /空操作四个机器周期,给硬件反应时间 result=BF; /将忙碌标志电平赋给 resultE=0;return result;/*函数功能:将模式设置指令或显示地址写入液晶模块入口参数: dictate*/ void
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 幼儿教育


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!