《微机原理及应用》课程设计.docx
《《微机原理及应用》课程设计.docx》由会员分享,可在线阅读,更多相关《《微机原理及应用》课程设计.docx(17页珍藏版)》请在冰点文库上搜索。
《微机原理及应用》课程设计
河北科技师范学院
《微机原理及应用》
课程设计说明书
题目:
电子琴
学院(系):
机电科学与工程
年级专业:
电气工程及其自动化1006
学号:
9310100724
学生姓名:
王雷涛
同组学生:
董允
指导教师:
刘士光
一、设计题目:
电子琴
二、设计目的:
(1)熟悉单片机的内部结构;
(2)掌握C51编程方法;
(3)掌握定时器与发声的关系;
(4)掌握交流蜂鸣器的发声原理和程序控制方法;
(5)掌握串行控制键盘键的识别方法;
(6)掌握声音频率的计算方法。
三、主要内容
本系统设计制作一个可演奏的电子琴。
综合应用了两项设计
(1)能产生纯音,了解音调高低的控制方法。
(2)用键盘代替电子琴的键盘,控制演奏音乐。
(a)掌握串行控制键盘键的识别方法;
(b)根据键值控制发声。
(3)至少演奏一支乐曲。
四、音符频率与计数初值对照表:
音符
频率
计数处之
音符
频率
计数初值
音符
频率
计数初值
低音
1
220
Oxefa
9
中音1
440
0xf7d
8
高音1
880
0xfbef
低音
2
247
0xf17
3
中音2
494
0xf8bd
高音2
988
0xfc6
2
低音
3
277
0xf30
7
中音3
554
0xf98
7
高音3
1109
0xfcc
7
低音
4
294
0xf3c
8
中音4
587
0xf9e
4
高音4
1175
0xfcf
6
低音
5
330
0xf51
e
中音5
659
0xfa9
0
高音5
1318
0xfd4b
低音7
370
0xf64
c
中音6
740
0xfb2
9
高音6
1480
0xfd9
8
低音7
415
0xf75
a
中音7
831
0xfbb
1
高音7
1661
0xfdd
c
图1音符频率与计数初值对照表
五、定时/计数器原理
MCS-51单片机内部有2个16位的可编程定时/计数器,定时/计数器0由计数器THO和TLO组成,定时/计数器1由计数器TH1和TL1组成,THX和TLX(X=0,1)分别为两个8位计数器,连接起来可组成16位计数器。
定时/计数器的工作方式由方式控制字TMOD选择,定时/计数器的启停由控制寄存器TCON空制,这两个寄存器均属于特殊功能寄存器。
定时/计数器的工作原理图如下:
其核心是一个加1计数器,
加1计数器的脉冲有两个来源:
一个是外部脉冲源,另一个是系统的时钟振荡器。
当脉冲源为时钟振荡器(等间隔脉冲序列)时,由于计数器脉冲周期相同,所以脉冲数乘以脉冲周期就是定时时间,此时为定时功能。
当脉冲源为外部脉冲时,就是外部事件的计数器,此时为计数功能。
启动信号
定时忙十数黠的結构框1)
图2定时/计数器结构框图
5.1方式寄存器TMOD
D7D6D5D4D3D2D1DO
GATE
C/T
M1
M0
GATE
C/T
M1
M0
定时/计数器1方式字
定时/计数器0方式字
图35.1方式寄存器
GATE=0时,外部中断信号不参预控制,此时,只要控制位,TR0(TR1)为1时,定时/计数器就开始计数,而不管外部中断信号的电平为高还是为低。
C/T:
计数方式还是定时方式选择位,当为0时为定时方式,当为1时为计数方式。
M1和M0操作方式选择位。
对应4种操作方式,当系统发生复位时,TMO各位为0。
操作方式选择如下图:
M1M0
操作方式
功能
00
方式0
13位计数器
01
方式1
16位计数器
10
方式2
可自动再装载的8位计数器
11
方式3
定时/计数器0分为两个独立计数器,
定时/计数器1为串行口波特率发生器
图4操作方式功能表
女口:
若单片机晶振为12MHz设定时/计数器1作定时器,以方式
1工作,定时时间为5ms定时/计数器0作计数器,以方式2工作,
外界发生一次事件(一个负脉冲)即产生溢出。
解:
定时/计数器0的初值为:
X=28-1=255=FFH即卩:
FFH装入TH0,FFH装入TL0。
定时/计数器1的初值为:
X=216-5ms/1卩s=EC78I■即:
ECH装入TH1,78H装入TL1。
方式寄存器TMOD=00010110B=16H
5.2启/停控制寄存器TCON
定时/计数器的控制寄存器也是一个8位的特殊功能寄存器,字节
地址为88H,可以位寻址。
其格式如下:
TF1
TR1
TF0
TR0
IE1
IT1
IE0
IT0
TF1(TF0):
定时/计数器1(0)溢出标志。
当定时/计数器1(0)产生溢出时,由硬件置1,可向CPU发中断请求。
CPU响应中断后被硬件自动清0,也可以由程序查询后清0.
TR1(TR0):
定时/计数器1(0)启/停控制位,由软件置1或置0来启动或关闭定时/计数器1工作。
六、中断控制
6.1TCON用于中断请求
TF1
TF0
IE1
IT1
IE0
IT0
IT0:
外部中断请求触发方式。
当IT0=0时,低电平触发;当IT0=1时,
下降沿触发。
IT1外部中断请求触发方式。
作用同IT0。
IEO:
外部中断请求标志位。
当发中断请求时,置1,否则置0。
IE1:
外部中断请求标志位。
作用同IE0。
TF0:
片内定时/计数器0的溢出请求标志位,定时/计数器0溢出时,置1,否则置0.
TF1:
片内定时/计数器1的溢出中断请求标志位,作用同TF0.
6.2中断允许寄存器IE
EA
ES
ET1
EX1
ET0
EX0
EA:
开中断标志位。
当EA=1时,CPU开中断;EA=0时,CPU关中断。
ES:
串行口的中断允许位。
当ES=1时,串行口允许中断;ES=0时,则不允许中断。
ET0(ET1):
定时/计数器0
(1)的中断允许位。
当ET0=1,定时/计数器0
(1)溢出,允许中断,否则不允许。
EX0(EX1):
INTO的中断允许位,当EX0=1时,允许中断,否则,不允许。
七、系统分析:
7.1系统组成
本系统由矩阵键盘、扬声器、LED显示管模块一起组合而成。
如下:
图7.1系统组成
7.2系统工作原理
本系统扫描键盘矩阵、显示按键、扬声器发出对应音符。
4X2行列式键盘识别及显示原理如下:
编码键盘:
键盘本身带有实现接口主要功能所需的硬件电路。
不仅能自动检测被按下的键,并完成去抖动、防串键等功能,而且能提供与被按键功能对应的键码送往CPU所以,编码键盘接口简单、使用方便。
但由于硬件电路较复杂,因而价格较贵。
键盘接口必须具有去抖动、防串键、按键识别和键码4个基本功能。
(1)去抖动:
所谓抖动是指在识别被按键是必须避开抖动状
态,只有处在稳定接通或稳定断开状态才能保证识别正确无误。
去
抖问题可通过软件延时或硬件电路解决。
(2)防串键:
防串键是为了解决多个键同时按下或者前一按键没有释放又有新的按键按下时产生的问题。
常用的方法有双键锁定和N键轮回两种方法。
(3)被
按键识别:
如何识别被按键是接口解决的主要问题,一般可通过软
硬结合的方法完成。
常用的方法有行扫描法和线反转法两种。
(4)键码产生:
为了从键的行列坐标编码得到反映键功能的键
码,一般在内存区中建立一个键盘编码表,通过查表获得被按键的键
码。
用AT89C52的并行口P1接4X2矩阵键盘,以P1.0—P1.3作输入
线,在数码管上显示每个按键的“1—8”序号。
八、系统硬件设计
8.1系统硬件总体设计
本系统由键盘矩阵、LED显示管、扬声器这几个部分组成,LED显示管显示当前按键,扬声器发出对应音符,最终还要完整的演唱一首歌曲。
一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频
率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器TO来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系正确即可。
利用AT89C52的内部定时器使其工作计数器模式(MODE)下,改
变计数值TH0及TLO以产生不同频率的方法产生不同音阶。
8.2LED显示模块
LED显示模块如图2-2所示,利用AT89S52单片机的P0端口的P0.0
—P0.7连接到一个七段数码管的a—h的笔段上,数码管的公共端接
电源。
矩阵扫描显示当前按键模块如下:
■raz
FES*™
mag
FD科9
FO片心
RP1
・・・・aaBtoc-
图8.2矩阵扫描显示当前按键模块
8.3扬声器模块
矩阵扫描扬声器发出对应音符模块如下:
图8.3矩阵扫描扬声器发出对应音符模块
8.4子系统(模块)电路图
8.4.1共阳极电路图
图8.4.1共阳极电路图
842上位开关
L
lK1
IL
H
]
P1.0
SDA
jK2
P1.1
CLK
_j_K3
丰唏
…J_KS
MCS-51
P1.2
图8.4.2上位开关
9.系统软件设计
9.1系统软件总体设计
本系统的软件流程图如下:
模诀则始化汽
詆发口岛IM}K
扌I描诫借期
:
:
詛平按键
I「".打
:
根扌A+;L彎NoKt:
咅
嫌
图9.1系统的软件流程图
9.2本系统总体代码如下:
#include
#includevintrins.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitBEEP=PM7;
sbitSDA=P1A0;
sbitCLK=PM1;
sbitP12=P1A2;
sbitP13=P1A3;
uintflag,tO,n;
ucharm,q;
codeucharTable[8]={0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80};〃数码管显示
数据
Code
[music]={0xfbef,0xfbef,0xfd4b,0xfd4b,0xfd98,0xfd98,0xfd4b,0,0,0,0xfcf6,0xfcf6,0xfcc7,0xfcc7,0xfc62,0xfc62,0xfbef,0,0,0,0xfd4b,0xfd4b,0xfcf6,0xfcf6,0xfcc7,0xfcc7,0xfc62,0,0,0,0xfd4b,0,0};〃乐谱
Codeuint
freq[21]={0xefa9,0xf173,0xf307,0xf3c8,0xf51e,0xf64c,0xf75a,0xf7d8,0xf8bd,0xf987,0xf9e4,0xfa90,0xfb29,0xfbb1,0xfbef,0xfc62,0xfcc7,0xfcf6,0xfd4b,0xfd98,0xfddc};
〃低中高音的频率
voiddelay()//延时函数
{
uinti;
for(i=0;i<5000;i++);
}
timer0()interrupt1//发声函数
{
TH0=t0/256;
TL0=t0%256;
BEEP=~BEEP;
}timer1()interrupt3
n++;
//定时50010*50=500
〃65536-10ms/1us=55536--->0xd8fo
TH1=0xd8;TL1=OxfO;if(n==50){n=0;
q++;
TR0=0;TR1=0;
}
}
voidsend(uchara)//串并转换函数
{
ucharj;
for(j=0;j<8;j++)
{
if(_crol_(a,j)&0x80)SDA=1;
elseSDA=0;
CLK=0;
CLK=1;
}
}voidmain(void)//主函数{
ucharkey8_count,com,i,a,j;
key8_count=0;
n=0;
TMOD=0x11;
EA=1;
ET0=1;
ET1=1;
TH仁0xd8;TL1=0xf0;TR0=0;
TR1=0;
//定时/计数器0和定时/计数器1工作与方式1
//cpu开中断
〃定时/计数器0开中断
〃定时/计数器1开中断
//65536-10000=55536->0xd8f0
//th1=0xd8
//thl=0xf0
BEEP=1;q=0;m=0;while
(1){
//歌曲自动循环播放if(q>=33){
q=1;m=0;
}
〃自动播放音乐
if(key8_count==3&&q>m){t0=music[m++];
if(t0==0){
delay();q++;
}else{TH0=t0/256;TL0=t0%256;TH1=0xd8;TL1=0xf0;TR0=1;TR1=1;
}
}else
{
delay();
flag=0;
//快速扫描
a=0x00;
P13=1;
send(a);
if(P12==0)
{
m=q=0;com=0xfe;for(i=0;i<8;i++){
P13=1;
send(com);if(P12==0){flag=1;P13=1;send(Table[i]);delay();P13=0;break;
}else
com=_crol_(com,1);
if(flag==1)
{
for(j=0;j<5;j++){delay();
}
TR1=0;
TR0=0;
if(i==7)
{key8_count++;key8_count=key8_count%4;
//由频率判断按键音或者播放歌曲if(key8_count==3)
{
q++;
}
}
else
{
switch(key8_count)
{_
case0:
t0=freq[i];
TH0=t0/256;
TL0=t0%256;
TH1=0xd8;
TL1=0xf0;
TR1=1;
TR0=1;break;case1:
t0=freq[i+7];
TH0=t0/256;
TL0=t0%256;
TH1=0xd8;
TL1=0xf0;
TR1=1;
TR0=1;break;case2:
t0=freq[i+14];
TH0=t0/256;
TL0=t0%256;
TH1=0xd8;
TL1=0xf0;
TR1=1;
TR0=1;break;case3:
q++;break;
}
}
}
十、课程设计成果:
课程设计结果和要求一样,能实现
(1)能产生纯音;
(2)用键盘代替电子琴的键盘,控制演奏音乐,并根据键值控制发声;(3)演奏一支乐曲。
十一、个人总结:
通过两周的课程设计,我学到了很多,这些不仅仅局限于巩固复习了课本上知识点,还锻炼了自己分析问题以及动手实际操作的能力,将以前学过的零散的知识串到一起冰学以致用。
小组两个人长时间的讨论以及调试,本系统基本上实现了按下键盘矩阵中的按键会使数码管显示当前按键,扬声器播放对应的音符,同时单个程序也能播放歌曲,不足之处在于不能将按键和播放音乐的程序不能完美融合,只能在一定范围内满足按键或播放歌曲一种需要。
。
本次综合设计主要涉及硬件和软件两方面的内容,通过这次课程,
我的硬件和软件开发能力都获得了提高。
首先硬件方面,更加熟悉了51单片机的结构以及它的实用,基本了解了电子产品的开发流程和所要做的工作。
基本掌握了C51并设计了一个单片机最小系统。
通过C语言编程的过程,使我对C语言的编程能力和C51单片机的功能有了更深层次的理解,熟悉了一些单片机常用的外围电路引脚和连接方法,如LED数码管,键盘等,并且我学会了遇到问题要分析问题及解决问题的能力,加深了对所学理论知识的理解和运用。
我的动手能力得到了很大的提高,尤其是团队合作和沟通交流能力得到明显锻炼。
每次实际的经历都会给自己带来很多技能的提升,虽然现在的自己还仅仅是一名学生,可也就是学生的不断学习和创新,一个又一个创新和进步带来了生活的丰富,把握实践,成就将来,感谢老师的辛勤给我带来的收获,以后更加努力。
参考文献:
[1]彭伟.单片机C语言程序设计实训100例.电子工业出版社.2009年
[2]李建忠.单片机原理及应用.西安:
西安电子科技大学,2002年
[3]周润景等.Proteus在MCS-51&ARM系统中的应用百例[M].电子工业出版社,2006
[4]马忠梅等.单片机的C语言应用程序设计[M].北京航空航天大学出版社,2006