课程设计报告王方徐.docx
《课程设计报告王方徐.docx》由会员分享,可在线阅读,更多相关《课程设计报告王方徐.docx(25页珍藏版)》请在冰豆网上搜索。
课程设计报告王方徐
HefeiUniversity
微机原理课程设计报告
课题名称:
基于8086钢琴的程序设计
班级:
09自动化
(1)班
报告人:
王杰0905072038
徐宏波0905072005
方来红0905072025
指导教师:
刘伟王敬生
2011年12月30日
目录
摘要:
3
关键字:
3
正文:
3
一、总体框图3
二、方案的论证3
三、电路设计4
3.1扬声器接口电路4
3.2键盘模块4
3.3总电路系统5
四、软件设计流程图6
4.1主流程图6
4.2键盘扫描子程序图7
五、c51单片机系统仿真实现9
六、总结与体会9
参考文献:
9
附件一、自动化专业微机原理课程设计任务书10
附件二:
汇编程序清单11
附件三:
C语言程序清单15
基于8086钢琴的程序设计
摘要:
本设计以8086为主体,结合使用8255,8253及相关电路设计利用键盘输入发出不同频率的的音调。
利用8255检测键盘,根据输入信号驱动数码管显示,控制8253,完成输入与检测;利用8253的分频输出不同的信号,经放大驱动扬声器发出声音。
关键字:
8086、8255、8253、键盘
正文:
一、总体框图
本系统主要有两个功能模块组成:
键盘扫描,蜂鸣器发声。
围绕这二个功能需要用到三个主要芯片:
8086,8255,8253。
首先8086主芯片负责数据交换与处理,芯片初始化等。
系统开始时对键盘进行扫描,有输入信号时,8255采集信号并输入8086进行处理,8086接到8255输入的信号时,调用与之相关的初始值n,输入到8253,对clock进行分频输出不同的频率信号,驱动扬声器发出不同的音调,同时8255对8253进行控制并对信号进行采集送到8086,决定发声时间的长短。
二、方案的论证
扬声器接口由8255、8253、驱动器和低通滤波器等构成,8255做控制器,8253做音频信号源。
根据音阶频率表,利用8253可以产生相应频率的脉冲信号,不同频率的脉冲信号经驱动电路放大后,就会发生不同的音调。
对于每个按键的音调发音时间由软件延时控制,如键一直按下,就会连续发音各音阶标称频率值:
键盘接口采用8255A,使用A、B端口,对键盘的扫描,对8255初始化编程,写入控制字10001011B,方式0,A口作输出,B口和C口为输入。
三、电路设计
3.1扬声器接口电路
扬声器接口如图所示,该电路主要作用是将8253A的OUT2端口输出的不同频率的波形经放大器LM386放大并驱动扬声器发出不同音调的声音.
3.2键盘模块
如图所示是16个按键的键盘,左边8个高音键,右边8个是低音键,8255的PA口对应于键盘的行,PB口键盘的列。
利用程序检测键盘,先在PA口全部输出低电平,由二极管的单向导通,在键盘的每个按键的两边都是处于高电平的状态,当有按键按下时,该按键对应的行和列都变为低电平,再由PB口检测键盘两边的信号,低四位检测列,高四位检测行即可确定键值。
3.3总电路系统
系统cpu8086工作在最小模式下,通过数据总线给8255写入控制字,使其工作在方式0,A口作输出,B口作输入。
系统通过8255检测键盘,检测到键盘的键值后再通过8086给8253写入相应的计数初值,产生需要的波形信号。
其中,8255和8253的片选信号是由一片74LS138译码器提供。
四、软件设计流程图
4.1主流程图
4.2键盘扫描子程序图
键盘扫描程序流程图如上图所示,上面的键盘扫描包含以下几步:
1、检测是否所有键都松开了,若没有则反复检测。
2、当所有键都松开了,在检测是否有键压下,若无键压下则反复检测。
3、若有键压下,要消除键抖动,再确定是否有键压下。
4、对压下的键进行编码,将该键的行列信息转换成16进制码,由此确定哪个键被压下了,如果出现了多键重按的情况,则只有在其他键均释放后,仅剩一个键闭合时,才把此键当做本次压下的键。
5、该键释放后,再回到2。
程序调试正常,截图如下:
五、c51单片机系统仿真实现
硬件仿真图
六、总结与体会
由于之前没有接触过protues仿真软件,所以前几天进展较慢,主要在熟习软件的使用方法,后来在老师的指导下,能够较熟练的应用该软件。
通过本次课程设计让我们不仅加深了对808682538255芯片的认识,而且汇编语言实际运用能力也得到了提高。
本次课程设计让我们从课本的理论知识联系了实际运用。
也使我们知道了理论知识的重要性,懂得了实际运用能力是对理论知识的升华。
这对我们以后的学习将会有深厚的影响。
总之,本次此次项目的实施,不仅有利于提高我们的实际动手操作能力,也是一个将书本理论知识与现实中应用相结合的良好机遇,同时也进一步考验我们的团队协作能力、团队沟通意识等。
以后我们会倍加珍惜课程设计让我们更好的学习的机会
参考文献:
《微型计算机原理及接口技术》中国科技大学出版社吴秀清周荷琴编著
《汇编语言程序设计》南京大学出版社姚君遗编著
《微型计算机原理及接口技术》实验指导书
《DJ—8086系列微机实验指导书》
附件一、自动化专业微机原理课程设计任务书
论文
题目
基于8086钢琴的程序设计
设计类型
导师姓名
主要内容及目标
1.掌握利用pc机扬声器发出不同频率声音的方法.
2.学习利用系统功能调用从键盘上读取字符的方法.
3.编写程序,程序运行时使pc机成为一架可弹奏的”钢琴”。
当按下数字1-8时,依次发出1,2,3,4,5,6,7,i八个音调.按下CTRL-C则退出”钢琴”状态.
具有的设计条件
1.PC机一台,EL教学实验箱一台及汇编程序;
计划学生数及任务
3人
(1):
明确课题对程序功能,运算精度等方面的要求。
(2):
把复杂问题分解为若干模块,确定各模块处理方法,画出流程图。
(3):
存储器资源分配
(4):
编制程序,根据流程图精心选择合适的指令和寻址方式来编制源程序
(5):
对程序进行汇编,调试和修改,直到程序运行结果正确为止。
计划设计进程
(按课程设计周计算)
第一周设计任务:
(1):
把复杂问题分解为若干模块,确定各模块处理方法,画出流程图。
(2):
存储器资源分配
第二周设计任务:
(3):
编制程序,根据流程图精心选择合适的指令和寻址方式来编制源程序
(4):
对程序进行汇编,调试和修改,直到程序运行结果正确为止。
参考文献
《微型计算机原理及接口技术》中国科技大学出版社吴秀清周荷琴编著
《16-32位微型计算机技术及应用》清华大学出版社戴梅萼史嘉权编著
<<汇编语言程序设计》南京大学出版社姚君遗编著
《汇编语言程序设计教程》清华大学出版社杨记文编著
《微型计算机原理及接口技术》实验指导书
附件二:
汇编程序清单
datasegment
io8255aequ0F0h
io8255bequ0F2h
io8255cequ0F4h
io8255ctrequ0F6h
io8253aequ84h
io8253bequ86h
io8253cequ88h
io8253ctrequ8Ah
msgdb'Pleaseinputonenumber(1~7):
',0dh,0ah,'$'
;1234567
tabledb0ebh,0dbh,0bbh,0edh,0ddh,0bdh,0eeh;
dataends
stacksegmentstack
dw50dup(0)
;top_staclabelword
stackends
codesegment
assumecs:
code,ds:
data,ss:
stack
start:
movax,stack
movss,ax
;leasp,top_stack
movax,data
movds,ax
movdx,offsetmsg
movah,9
int21h
movdx,io8255ctr
moval,10001011b
outdx,al
movdx,io8255a
moval,00h
outdx,al
movdx,io8255c
wait_open:
inal,dx
andal,0fh
cmpal,0fh
jewait_open
;moval,0feh
;movcl,al
wait_pres:
inal,dx
andal,0fh
cmpal,0fh
jewait_pres
movcx,002ah
delay:
loopdelay
inal,dx
andal,0fh
cmpal,0fh
jewait_pres
moval,0feh
movcl,al
next_row:
movdx,io8255a
outdx,al
movdx,io8255c
inal,dx
andal,0f0h
cmpal,0f0h
jnecamp
rolcl,1
moval,cl
jmpnext_row
camp:
movdx,io8255c
inal,dx
cmpal,0ebh
jeduo
cmpal,0dbh
jeruai
cmpal,0bbh
jemi
cmpal,0edh
jefa
cmpal,0ddh
jesuo
cmpal,0bdh
jela
cmpal,0eeh
jexi
jmpstart
duo:
movbx,262
callmido
jmpstart
ruai:
movbx,294
callmido
jmpstart
mi:
movbx,330
callmido
jmpstart
fa:
movbx,349
callmido
jmpstart
suo:
movbx,392
callmido
jmpstart
la:
movbx,440
callmido
jmpstart
xi:
movbx,494
callmido
jmpstart
midoPROCnear
movdx,io8253ctr
moval,10110110B
outdx,al
movdx,0012H
movax,34deH
DIVBX
movdx,io8253a
OUTdx,AL
MOVAL,AH
OUTdx,AL
calldelay1
ret
midoendp
delay1PROCnear
MOVDX,01FFH
DEL1:
MOVCX,0FFFFH
DEL2:
LOOPDEL2
DECDX
JNZDEL1
ret
delay1endp
CODEENDS
ENDSTART
附件三:
C语言程序清单
#include
unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
unsignedchartemp;
unsignedcharkey;
unsignedchari,j;
unsignedcharSTH0;
unsignedcharSTL0;
unsignedintcodetab[]={64021,64103,64260,64400,
64524,64580,64684,64777,
64820,64898,64968,65030,
65058,65110,65157,65178};
voidmain(void)
{
TMOD=0x01;
ET0=1;
EA=1;
while
(1)
{
P3=0xff;
P3_4=0;
temp=P3;
temp=temp&0x0f;
if(temp!
=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp&0x0f;
if(temp!
=0x0f)
{
temp=P3;
temp=temp&0x0f;
switch(temp)
{
case0x0e:
key=3;
break;
case0x0d:
key=2;
break;
case0x0b:
key=1;
break;
case0x07:
key=0;
break;
}
temp=P3;
//多P1_0=~P1_0;
P0=table[key];
STH0=tab[key]/256;
STL0=tab[key]%256;
TR0=1;
temp=temp&0x0f;
while(temp!
=0x0f)
{
temp=P3;
temp=temp&0x0f;
}
TR0=0;
}
}
P3=0xff;
P3_5=0;
temp=P3;
temp=temp&0x0f;
if(temp!
=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp&0x0f;
if(temp!
=0x0f)
{
temp=P3;
temp=temp&0x0f;
switch(temp)
{
case0x0e:
key=7;
break;
case0x0d:
key=6;
break;
case0x0b:
key=5;
break;
case0x07:
key=4;
break;
}
temp=P3;
//多P1_0=~P1_0;
P0=table[key];
STH0=tab[key]/256;
STL0=tab[key]%256;
TR0=1;
temp=temp&0x0f;
while(temp!
=0x0f)
{
temp=P3;
temp=temp&0x0f;
}
TR0=0;
}
}
P3=0xff;
P3_6=0;
temp=P3;
temp=temp&0x0f;
if(temp!
=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp&0x0f;
if(temp!
=0x0f)
{
temp=P3;
temp=temp&0x0f;
switch(temp)
{
case0x0e:
key=11;
break;
case0x0d:
key=10;
break;
case0x0b:
key=9;
break;
case0x07:
key=8;
break;
}
temp=P3;
//多P1_0=~P1_0;
P0=table[key];
STH0=tab[key]/256;
STL0=tab[key]%256;
TR0=1;
temp=temp&0x0f;
while(temp!
=0x0f)
{
temp=P3;
temp=temp&0x0f;
}
TR0=0;
}
}
P3=0xff;
P3_7=0;
temp=P3;
temp=temp&0x0f;
if(temp!
=0x0f)
{
for(i=50;i>0;i--)
for(j=200;j>0;j--);
temp=P3;
temp=temp&0x0f;
if(temp!
=0x0f)
{
temp=P3;
temp=temp&0x0f;
switch(temp)
{
case0x0e:
key=15;
break;
case0x0d:
key=14;
break;
case0x0b:
key=13;
break;
case0x07:
key=12;
break;
}
temp=P3;
//多P1_0=~P1_0;
P0=table[key];
STH0=tab[key]/256;
STL0=tab[key]%256;
TR0=1;
temp=temp&0x0f;
while(temp!
=0x0f)
{
temp=P3;
temp=temp&0x0f;
}
TR0=0;
}
}
}
}
voidt0(void)interrupt1using0
{
TH0=STH0;
TL0=STL0;
P1_0=~P1_0;
}