电子琴的实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
电子琴的实验报告 WTD standardization office【WTD 5AB- WTDK 08- WTD 2C】
单片机课程设计
设计题目电子琴
指导老师:苏
参与实验者: moxiaoxiao
专业:统本电信0801
地点:3#楼北楼605
电子琴
一.设计目的:
(1).培养综合运用知识的能力
(2).朋友查阅资料,使用工程设计标准及编写设计文档的能力.
(3).掌握单片机应用系统的设计方法.
(4).提高计算机绘图能力
二.设计任务:
利用DP51PROC实验系统上的定时器/计数器,按键和蜂鸣器单元。
用单片机I/O口线控制蜂鸣器发出不同的音调,程序检测按键状态,7个按键中某一键按下时,蜂鸣器对应标称音阶.
三.设计与调试环境
KEIL uVision2 是众多单片机应用开发软件中优秀的软件之一,它支持众多不同公司的 MCS51 架构的芯片,它集编辑,编译,仿真等于一体,同时还支持,PLM ,
汇编和 C 语言的程序设计,它的界面和常用的微软VC++的界面相似,界面友好,易学易用,在调试程序,软件仿真方面也有很强大的功能。
1:按下面的步骤建立一个项目:
图 1-4 选取芯片
图 1-5 新建程序文件
(1)点击图1-5 中的 3 保存新建的程序,也可以用菜单 File-Save 或快捷键 Ctrl+S 进行保存。
因是新文件所以保存时会弹出类似图1-3 的文件操作窗口,我们把第一个程序命名为,保存在项目所在的目录中,这时程序单词有了不同的颜色,说明 KEIL 的 C 语法检查生效了。
如图1-6 鼠标在屏幕左边的 Source Group1 文件夹图标上右击弹出菜单,在这里可以做项目中增加减少文件等操作。
我们选“Add File to Group
‘SourceGroup 1’”弹出文件窗口,选择刚刚保存的文件,按 ADD 按钮,关闭文件窗,程序文件已加到项目中了。
这时在 Source Group1 文件夹图标左边出现了一个小+号说明,文件组中有了文件,点击它可以展开查看。
图 1-6 把文件加入到项目文件组中
编译程序
(2)进入调试模式,软件窗口样式大致如图1-8 所示。
图中 1 为运行,当程序处于停止状态时才有效,2 为停止,程序处于运行状态时才有效。
3 是复位,模拟芯片的复位,程序回到最开头处执行。
按 4 我们可以打开 5 中的串行调试窗口,这个窗口我们可以看到从 51 芯片的串行口输入输出的字符,这项目也正是在这里看运行结果。
2.输入输出引脚
(1) P0 端口[ P0 是一个 8 位漏极开路型双向 I/O 端口,端口置 1(对端口写1)时作高阻抗输入端。
作为输出口时能驱动 8 个 TTL。
对内部 Flash 程序存储器编程时,接收
指令字节;校验程序时输出指令字节,要求外接上拉电阻。
在访问外部程序和外部数据存储器时,P0 口是分时转换的地址(低 8 位)/数据总线,访问期间内部的上拉电阻起作用。
(2) P1 端口[-] P1 是一个带有内部上拉电阻的 8 位双向 I/0 端口。
输出时可驱动 4 个TTL。
端口置 1 时,内部上拉电阻将端口拉到高电平,作输入用。
对内部 Flash 程序存储器编程时,接收低 8 位地址信息。
(3) P2 端口[-] P2 是一个带有内部上拉电阻的 8 位双向 I/0 端口。
输出时可驱动 4 个TTL。
端口置 1 时,内部上拉电阻将端口拉到高电平,作输入用。
对内部 Flash 程序存储器编程时,接收高 8 位地址和控制信息。
在访问外部程序和 16 位外部数据存储器时,P2 口送出高 8 位地址。
而在访问 8 位地址的外部数据存储器时其引脚上的内容在此期间不会改变。
(4) P3 端口[-] P2 是一个带有内部上拉电阻的 8 位双向 I/0 端口。
输出时可驱动 4 个TTL。
端口置 1 时,内部上拉电阻将端口拉到高电平,作输入用。
对内部 Flash 程序存储器编程时,接控制信息。
除此之外 P3 端口还用于一些专门功能,具体请看表 2-2.。
*P1-3 端口在做输入使用时,因内部有上接电阻,被外部拉低的引脚会输出一定的电流。
生成 HEX 文件和最小化系统
3:如何用 KEIL uVision2 来编译生成用于烧写芯片的 HEX文件。
HEX 文件格式是 Intel 公司提出的按地址排列的数据信息,数据宽度为字节,所有数据使用16 进制数字表示, 常用来保存单片机或其他处理器的目标程序代码。
它保存物理程序存储区中的目标代码映象。
一般的编程器都支持这种格式。
打开第一课做的项目,打开它的所在目录,找到的文件就可以打开先前的项目了。
然后右击图3-1中的 1 项目文件夹,弹出项目功能菜单,选Options for Target’Target1’,弹出项目选项设置窗口,同样先选中项目文件夹图标,这时在 Project 菜单中也有一样的菜单可选。
打开项目选项窗口,转到Output 选项页图3-2所示,图中 1 是选择编译输出的路径,2 是设置编译输出生成的文件名,3 则是决定是否要创建 HEX文件,选中它就可以输出 HEX 文件到指定的路径中。
将它重新编译一次,很快在编译信息窗口中就显示 HEX 文件创建到指定的路径中了,如图3-3。
这样就可用编程器所附带的软件去读取并烧到芯片了。
(技巧:一、在图3-1中的 1 里的项目文件树形目录中,先选中对象,再单击它就可对它进行重命名操作,双击文件图标便可打开文件。
二、在 Project 下拉菜单的最下方有最近编辑过的项目路径保存,可以快速打开最近在编辑的项目。
)
图3-1项目功能菜单
图3-2 项目选项窗口
四.工作原理:
要求设计的电子琴共有七个按键对应着七个音阶,也就是按下不同的按键时,蜂鸣器会发出不同平率的声音。
而这些声音的频谱范围约在几十到几千赫兹,若能利用程序来控制某个口线不断的输出“高”“低”电平,则在该口线上就能产生一定频率的方波,将该方波接上喇叭就能发出一定频率的声音,若再利用程序控制“高”“低”电平
的持续时间,就能改变输出波形的频率,从而改变音调。
我们用MC51单片机实现这一功能。
不同音阶所对应的频率如下图所示:
乐曲中,每一音符对应着确定的频率,表1给出C调时各音符频率。
如果单片机某个口线输出“高”“低”电平的频率和某个音符的频率一样,那么将此口线接上喇叭就可以发出此音符的声音。
本系统就是根据此原理设计,对于单片机来说要产生一定频率的方波大致是先将某口线输出高电平然后延时一段时间再输出低电平,如此循环的输出就会产生一定频率的方波,通过改变延时的时间就可以改变输出方波的频率
本系统的具体电路如右图所示。
图中P1.1-P1.7分别接7个按键对应着乐曲中的1、2、3、4、5、6、7七个音符。
P3.6口通过功率放大与喇叭相连。
当P1.1~中有一个按键按下时单片机便执行相应的子程序对定时器赋一个计数初值同时使
P3.6口输出高电平。
当定时器定时结束时将P3.6口的值取反并重新赋计数初值继续计数,再次计完时再将P3.6口的值取反再赋初值计数,如此循环便在P3.6口产生一定频率的方波, LM386将此方波经过功率放大后通过喇叭输出便产生对应音符的声音。
按不同的按键单片机便执行不同的子程序给定时器赋不同的初值得到不同频率的方波从而输出不同的声音,因此按一个按键输出一种音符。
在单片机的特殊功能寄存器中有6个寄存器(TH1、TH0、TL1、TL0、TMOD、
TCON)是用来控制单片机的定时器的,通过编程对这些特殊功能寄存器的读写就可以控制单片机的两个定时器T0、T1。
当单片机复位时这6个寄存器默认值都是00H。
五.设计思想
(1)系统的总框图
(2)系统电路图
(3)软件设计思路
由于每个音阶对应着不同的频率,当然对单片机来说产生不同的频率非常方便,我们可以利用单片机的定时、计数器T0来产生这样的方波频率信号,因此我们只要把1-7的七个音阶对应的频率关系弄正确即可。
本次设计中单片机晶振为12MHz,那么定时器的计数周期为1MHz,假如选择工作方式为1,那T值便为T=216-5*105/相应的频率,那么根据不同的频率计算出应该赋给定时器的计数值,列出不同音符与单片机计数T0相关的计数值如下表所示:采用查表程序查表时,可以为这个音符建立一个表格,有助于单片机通过查表的方式来获得相应的数据。
工作方式1
工作方式1是16位的定时/计数方式,将M1M0设为01。
对于定时器的工作模式可以根据定时器的寄存器TMOD来设置:
①M1M0:定时/计数器共有四种工作方式,就是用M1M0来控制的,2位正好是四种组合。
②C/T:定时/计数器即可作定时用也可用计数用,如果C/T为O就是用作定时器(开关往上打),如果C/T为1就是用作计数器(开关往下打)。
一个定时/计数器同一时刻要么作定时用,要么作计数用,不能同时用的。
③GATE:当我们选择了定时或计数工作方式后,定时/计数脉冲却不一定能到达计数器端,中间还有一个开关,显然这个开关不合上,计数脉冲就没法过去,那么开关什么时候过去呢? 有两种情况
GATE=0,分析一下逻辑,GATE非后是1,进入或门,或门总是输出1,和或门的另一个输入端INT1无关,在这种情况下,开关的打开、合上只取决于TR1,只要TR1是1,开关就合上,计数脉冲得以畅通无阻,而如果TR1等于0则开关打开,计数脉冲无法通过,因此定时/计数是否工作,只取决于TR1。
GATE=1,在此种情况下,计数脉冲通路上的开关不仅要由TR1来控制,而且还要受到INT1引脚的控制,只有TRl为1,且INT1引脚也是高电平,开关才合上,计数脉冲才得以通过。
这个特性可以用来测量一个信号的高电平的宽度。
Ⅰ程序流程图
第一步是对定时器T0进行初始化,设定它的工作状态(对于本系统将T0设定为工作方式O);然后判断是否有键按下,如果没有按键按下,继续判断,如果有按键按下,则判断是哪个键按下;再根据按键的功能将计数初值装入定时器T0中中并启动T0,当T0定时完毕后,重新装入计数初值继续定时并将P3. 6取反,再次定时完毕后再一次的装入计数初值继续定时并将P3.6取反,一直循环此操作直到按键释放为止,按键释放后停止T0工作并再次判断是否又有按键按下,并继续执行以前的过程。
Ⅱ程序
BUZZ EQU ; 定义端口
ORG 1000H
LJMP MAIN
ORG 000BH
LJMP INT_T0
ORG 1100H
MAIN:
MOV SP,#60H ; 初始化堆栈指针
MOV P1,#0FFH ; 设置P1 口为输入模式
MOV TMOD,#01H ; 设置定时器0 为工作模式1 SETB ET0 ; 开定时器0 中断
SETB EA ; 开总中断
CLR TR0 ; 关闭定时器0
START:
MOV R0,P1
CJNE R0,#0FFH,KEY1; 键盘扫描
CLR TR0
SJMP START
KEY1:
CJNE R0,#0FEH,KEY2 ; K1 键按下
MOV 30H,#0FBH ; 设置音阶1
MOV 31H,#0E9H
LJMP SET_TIMER
KEY2:
CJNE R0,#0FDH,KEY3; K2 键按下
MOV 30H,#0FCH ; 设置音阶2
MOV 31H,#5CH
LJMP SET_TIMER
KEY3:
CJNE R0,#0FBH,KEY4; K3 键按下
MOV 30H,#0FCH ; 设置音阶3 MOV 31H,#0C1H
LJMP SET_TIMER
KEY4:
CJNE R0,#0F7H,KEY5 ; K4 键按下MOV 30H,#0FCH ; 设置音阶4 MOV 31H,#0EFH
LJMP SET_TIMER
KEY5:
CJNE R0,#0EFH,KEY6 ; K5 键按下MOV 30H,#0FDH ; 设置音阶5 MOV 31H,#045H
LJMP SET_TIMER
KEY6:
CJNE R0,#0DFH,KEY7; K6 键按下MOV 30H,#0FDH ; 设置音阶6 MOV 31H,#92H
LJMP SET_TIMER
KEY7:
CJNE R0,#0BFH,NOKEY; K7 键按下MOV 30H,#0FDH ; 设置音阶7 MOV 31H,#0D6H
SET_TIMER:
SETB TR0 ; 发声
SJMP START
NOKEY:
CLR TR0 ; 无键按下
SJMP START
INT_T0: ; T0 中断服务程序
MOV TH0,30H ; 定时器赋初值
MOV TL0,31H
CPL BUZZ ; 输出方波
RETI;
END
六. 总结
通过两周的紧张工作,终于完成了简易电子琴的设计,这个课程设计是我受益匪浅,在老师的指导下,我们逐渐了解了硬件设计的整个流程,并且加深了我对单片机这门课程内容的理解,通过这个课程设计,不仅使我了解了组成原理的脊髓,而且使我对单片机从陌生到处不理解,扩充了我的知识面和理解应用能力。