《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