课程设计报告王方徐.docx

上传人:b****4 文档编号:27254345 上传时间:2023-06-28 格式:DOCX 页数:25 大小:498.07KB
下载 相关 举报
课程设计报告王方徐.docx_第1页
第1页 / 共25页
课程设计报告王方徐.docx_第2页
第2页 / 共25页
课程设计报告王方徐.docx_第3页
第3页 / 共25页
课程设计报告王方徐.docx_第4页
第4页 / 共25页
课程设计报告王方徐.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

课程设计报告王方徐.docx

《课程设计报告王方徐.docx》由会员分享,可在线阅读,更多相关《课程设计报告王方徐.docx(25页珍藏版)》请在冰豆网上搜索。

课程设计报告王方徐.docx

课程设计报告王方徐

 

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;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1