文档库 最新最全的文档下载
当前位置:文档库 › 计算机接口课设报告

计算机接口课设报告

简易电子琴

一、设计目标

运用本学期学过的接口芯片,设计一个8086微机应用系统,要求系统中除CPU以外包含三个以上芯片。具体题目为简易电子琴,用小键盘演奏简单乐曲。即点击对应按键,可发出不同的音阶,从而演奏音乐。

二、设计所用仪器和器件

1.外设:

按键

扬声器

示波器

2.芯片:

8086芯片×1

8253芯片×1

8255芯片×1

74HC373芯片×2

74HC138芯片×1

三、设计内容

简易电子琴,用小键盘演奏简单乐曲。

四、设计过程

1.设计说明

芯片对应的功能为:

8255A:作为键盘接口、扬声器接口、8253芯片接口。利用8255控制扬声器的开关状态,通过按键模拟电子琴的按键,接受按键的输入,设置不同的计数值,输出到8253中,给8253芯片设置不同的计数值。

8253:使用其分频功能,产生乐音。接受不同的计数值,产生不同频率的波

形,从而使得扬声器产生不同的频率。此处用到其方式2。

2个74HC373芯片,1个74HC138芯片,分别作为锁存器、译码器。它们是IO端口译码电路的重要组成成分。

2.设计方案

(1)逻辑框图

4×4按键

8255芯片8253芯片

扬声器示波器

(2)程序流程图

N

Y

3.设计系统的硬件电路图

硬件图设计与连接如下图

延时关扬声器

开始

芯片初始化

读取按键

有无按键按下?

取出音阶值设置8255口输出

开扬声器

4.代码设计

#define TCONTRO 0A006H

#define TCON0 0A000H

#define TCON1 0A002H

#define TCON2 0A004H

#define IOCON 8006H

#define IOA 8000H

#define IOB 8002H

#define IOC 8004H

//#define feq 1000000

//以下是C调低音的音频宏定义

#define l_dao 382 //将“l_dao”宏定义为低音“1”的频率262Hz #define l_re 350 //将“l_re”宏定义为低音“2”的频率286Hz

#define l_mi 322 //将“l_mi”宏定义为低音“3”的频率311Hz

#define l_fa 287 //将“l_fa”宏定义为低音“4”的频率349Hz

#define l_sao 254 //将“l_sao”宏定义为低音“5”的频率392Hz #define l_la 227 //将“l_a”宏定义为低音“6”的频率440Hz

#define l_xi 202 //将“l_xi”宏定义为低音“7”的频率494Hz

//以下是C调中音的音频宏定义

#define dao 191 //将“dao”宏定义为中音“1”的频率523Hz

#define re 170 //将“re”宏定义为中音“2”的频率587Hz

#define mi 152 //将“mi”宏定义为中音“3”的频率659Hz

#define fa 143 //将“fa”宏定义为中音“4”的频率698Hz

#define sao 128 //将“sao”宏定义为中音“5”的频率784Hz

#define la 114 //将“la”宏定义为中音“6”的频率880Hz

#define xi 101 //将“xi”宏定义为中音“7”的频率523H //以下是C调高音的音频宏定义

#define h_dao 96 //将“h_dao”宏定义为高音“1”的频率1046Hz #define h_re 85 //将“h_re”宏定义为高音“2”的频率1174Hz #define h_mi 76 //将“h_mi”宏定义为高音“3”的频率1318Hz #define h_fa 72 //将“h_fa”宏定义为高音“4”的频率1396Hz #define h_sao 64 //将“h_sao”宏定义为高音“5”的频率1567Hz #define h_la 57 //将“h_la”宏定义为高音“6”的频率1760Hz #define h_xi 51 //将“h_xi”宏定义为高音“7”的频率1975Hz

void outp(unsigned int addr, char data) {

// Write a byte to the specified I/O port

__asm

{

mov dx, addr

mov al, data

out dx, al

}

}

char inp(unsigned int addr) {

// Read a byte from the specified I/O port

char result;

__asm

{

mov dx, addr

in al, dx

mov result, al

}

return result;

}

void delay()

{

unsigned char i,j;

for(i=0;i<250;i++)

for(j=0;j<50;j++)

;

}

unsigned char

table[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa 1,0x86,0x8e};//按键对应的频率

unsigned int

cf[]={l_dao,l_re,l_mi,l_fa,l_sao,l_la,l_xi,duo,re,mi,fa,sao,la,xi,h_dao,h_re,h_ mi,h_fa,h_sao,h_la,h_xi};

void display(int i){

outp(IOA,table[i]);

int a = cf[i];

outp(TCONTRO,0x36);

int ch=cf[i]/256;

int cl=cf[i]%256;

outp(TCON0,cl);

outp(TCON0,ch);

int j;

for(j=0;j<4;j++)//控制节拍数

delay();//延时1个节拍单位

}

void main(void){

unsigned char i,j,k,tmp;

unsigned int count; //储存定时器的定时常数

unsigned int ch, cl; //储存定时器的定时常数

// Write your code here

outp(TCONTRO,0x36);//计数器0,只写计算值低8位,方式3,二进制计数

outp(IOCON,0x88);

outp(IOA,0xFF);

while (1){

j=0x0e;

tmp = 0;

for(k=0;k<4;k++){

j-=k;

if(j==0x08)

j=0x07;

outp(IOC,j);

i=inp(IOC);i=inp(IOC);i=inp(IOC);//重复几次

i|=0x0f;

switch(i){//键盘演奏

case 0xef:display(4*k);break;

case 0xdf:display(4*k+1);break;

case 0xbf:display(4*k+2);break;

case 0x7f:display(4*k+3);break;

}

}

}

}

5.使用说明

打开文件后运行仿真。用鼠标点击4×4的键盘上的按键,听到不同的音阶。有规律地点击这些按键就可以进行演奏。

6.实验结果

五、分析与讨论

相关文档
相关文档 最新文档