《MCS—51单片机原理、系统设计与应用》课程实验3 下载本文

内容发布更新时间 : 2024/7/7 6:55:13星期一 下面是文章的全部内容请认真阅读。

《MCS—51单片机原理、系统设计与应用》课程实验

实验报告三

键盘扫描及音乐控制实验

指导教师:龚光珍

学生姓名:

学号:201203

实验地点:211楼607室

实验时间:2015,5,30

1 / 5

一、 实验原理和内容

1、 SPEAKER 控制原理

SPEAKER 的控制电路如图 1 所示,当 SPEAKER 接收到一定强度,一定频率的信号时,振动发声,产生该频率的声音。不同的频率对应不同的音调。SPEAKER 的控制信号连接到 J42 插针的第 7 引脚。

2、

键盘扫描原理

行列式矩阵键盘通过插针 J24 进行控制,本文档使用 P1.7~P1.4 控制矩阵的行线, P1.3~P1.0 控制矩阵的列线;将 J25 连接到单片机外部中断 0 输入口,由此,所有列线信号以逻辑与的关系输入到中断 0 口,如图 2 所示。扫描过程为:

(1)设置 P1.7~P1.4 为输出,P1.3~P1.0 为输入当 P1.7~P1.4 输出 0000 时,如果没有按键按下,列线 P1.3~P1.0 输入为 1111,此次键盘扫描结束。若有键按下,相应列线为 0。所有列线信号 P1.3~P1.0 可用通过 J25 插针连接到中断输入线,以中断方式进行判别。

(2)为去除误判,需要延时消抖,延时时间约为 10~15ms

(3)当消抖后再次识别到有键按下时,如 S5 键按下, P1.3~P1.0 输入为 1110,表示第 0 列有按键按下;将 P1.7~P1.4 设置为输入,P1.3~P1.0 设置为输出(即输入/输出反转法),输出“1110”,读取 P1.7~P1.4,为 0 的行线对应按键的行位置,如“1101”表示按键的行位置为第 1 行。故第 1 行第 0 列有按键按下,对应 S5 按键。

3、 实验内容

设计要求和提高 1、补足程序中缺失的部分 1)变量定义、位定义/声明 2)初始化函数Init() 2、完成整个源程序的设计,能键控音乐,演奏一段乐曲。 3、当按键仅仅按下一次,音阶乐音会持续不断,直到按下另一个按键,不符合音乐弹奏的实际情况。改进程序控制单音的持续时间。

二、 实验过程

1、 阅读并分析程序

2、 用实验指导书上的程序练习KEIL 51软件的使用,并用烧录软件将可执行程序烧录到开发板中,观

看实验效果,结合程序分析实验效果是否符合程序编译原理 3、 建立乐音音阶与频率对应的数据表

4、 编写键盘扫描程序并软件消抖,编写乐音播放程序

5、 和同组的同学分析各自程序的正确性,比较各自程序的优缺点,最后选出最好的实验程序进行下

一步操作。

2 / 5

6、 在KEIL 51 软件平台上编译、调试程序,将可执行程序烧录到单片机中,观察实验结果并作出分析 7、 请老师点评,演示实验结果给指导老师看,并回答老师所提出的问题

8、 在实验检查完后,将开发板整理好,把实验提供的杜邦线、USB链接线放在实验板箱中的合理位

9、 将实验板放回原处,请老师查收 10、 离开实验室

三、 程序流程

1、 程序代码

#include

unsigned char code Freq_H[4][7]={

{0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8},

{0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC}, {0xFC,0xFC,0xFD,0xFD,0xFD,0xFD,0xFE}, {0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF}};

unsigned char code Freq_L[4][7]={ {0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6},

{0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B}, {0x8F,0xEE,0x44,0x6B,0xB4,0xF4,0x2D}, {0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16}};

//sbit f=P3^2;

sbitVoice_high=P2^1; sbitVoice_low=P2^2; sbit SPK=P2^0;

bit Key_valid,Tout_15ms;

voidInit(void); voidKey_scan(void); void delay(void); {

void main()

Init(); while(1) {

P1=0X0F;

{

//P1.7~P1.4=0000,start keyscan

if (Key_valid)

//has new key pressed

int count=0;

unsigned char Col,Row,Key_value,Timer0_H,Timer0_L=Freq_L,Sound_type;

Key_valid=0; TR0=0;

Timer0_H=Freq_H[Sound_type][Key_value-1]; Timer0_L=Freq_L[Sound_type][Key_value-1]; TR0=1;

3 / 5