单片机课程设计---简易电子琴设计 下载本文

相关代码:

P0 = 0xff;

Line = 1; Mask = 0x01; for(i=0;i<4;i++) { Col = 0; P0 = ~Mask;

ScanCode = P0 & 0xf0;

if(ScanCode!=0xf0) delay(); ScanCode = P0 & 0xf0; switch(ScanCode) {

case 0xe0:Col = 1;break; case 0xd0:Col = 2;break; case 0xb0:Col = 3;break; case 0x70:Col = 4;break; default:Col = 0;break; } if(Col>0) { num = (Line-1)*4+Col; if(SAVE==0) //保存 ,灯亮 {

save[a]=num; a++; } if(num==0) {

TR0=0;

SPK=1; //在未按键时,防止长期高电平损坏喇叭 } else {

P1 = CharCode[num-1]; High=tab[num-1][0]; Low =tab[num-1][1]; TR0=1; while(1) {

ScanCode = P0 & 0xf0; if(ScanCode == 0xf0) {

}

} } }

Mask <<=1; Line ++;

TR0 = 0; SPK=1; break; }

5.2键盘接口必须具有的4个基本功能

(1)去抖动:每个按键在按下或松开时,都会产生短时间的抖动。抖动的持续时间与键的质量相关,一般为5—20mm。所谓抖动是指在识别被按键是必须避开抖动状态,只有处在稳定接通或稳定断开状态才能保证识别正确无误。

(2)被按键识别:如何识别被按键是接口解决的主要问题,一般可通过软硬结合的方法完成。

(3)键码产生:为了从键的行列坐标编码得到反映键功能的键码,一般在内存区中建立一个键盘编码表,通过查表获得被按键的键码。

如下为键盘编码表:

unsigned char code tab[][2]= {

0x00,0x00, 0xf8,0x8c, 0xf9,0x5b, 0xfa,0x15, 0xfa,0x67, 0xfb,0x04, 0xfb,0x90, 0xfc,0x0c, 0xfc,0x44, 0xfc,0xac, 0xfd,0x09, 0xfd,0x34, 0xfd,0x82, 0xfd,0xc8, 0xfe,0x06, 0xfe,0x22, 0xfe,0x56, 0xfe,0x85,

0xfe,0x9a, 0xfe,0xc1, 0xfe,0xe4, 0xff,0x03 };

这是个二维数组,第一列是高位(THx),第二列是地位(TLx),一共有16行,第一行对应休止符。

用AT89C51的并行口P0接4×4矩阵键盘,以P0.0-P0.3作输入线,以P0.4-P0.7作输出线;

(4)在数码管上显示每个按键的“0-F”序号。 5.3数码管的相关代码

unsigned char code CharCode[]= {

0xc0, 0xf9, 0xa4,0xb0,0x99, 0x92,0x82,0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6,0xa1,0x86,0x8e };

5.4 C调各音符频率的相关代码

将数值转换为16进制的数,分成高八位和低八位,我们要为这个音符建立一个表格,单片机通过查表的方式来获得相应的数据。

unsigned char code tab[][2]= {

0x00,0x00, 0xf8,0x8c, 0xf9,0x5b, 0xfa,0x15, 0xfa,0x67, 0xfb,0x04, 0xfb,0x90, 0xfc,0x0c, 0xfc,0x44, 0xfc,0xac, 0xfd,0x09, 0xfd,0x34, 0xfd,0x82, 0xfd,0xc8, 0xfe,0x06, 0xfe,0x22,

0xfe,0x56, 0xfe,0x85, 0xfe,0x9a, 0xfe,0xc1, 0xfe,0xe4, 0xff,0x03 };

5.5 放歌子程序

放歌子程序设计类似于音乐播放,将每个音调循环播放出来。 if(MODE==1) //播放模式 ,灯不亮 {

if(SAVE==1) //保存灯不亮,播放内置音乐 {

SPK = 1;

//P1 = CharCode[Song[Tone_Index]]; dis = Song[Tone_Index];

High = tab[Song[Tone_Index]][0]; Low = tab[Song[Tone_Index]][1]; TR1 = 1;

delay1((6000*Pai[Tone_Index]));//取音节 TR1 = 0; SPK=1;

//if(((Tone_Index+1)%7)==0) delay1(1000); //else delay1(400); Tone_Index++;

if(Tone_Index==sizeof(Song)) Tone_Index =0; }

if(SAVE==0) //保存灯亮,播放录制的音乐 {

Tone_Index =0; SPK = 1; for(j=0;j

//P1 = CharCode[save[j]-1]; dis = save[j]-1;

High = tab[save[j]-1][0]; Low = tab[save[j]-1][1]; TR1 = 1;

delay1(6000);//取音节 TR1 = 0;

SPK=1;

delay1(1000);

if(MODE!=1&&a==0)break; } } }

5.6 内置歌曲子程序

unsigned char code Song[]= {

8,8,12,12,13,13,12, 11,11,10,10,9,9,8, 12,12,11,11,10,10,9, 12,12,11,11,10,10,9, 8,8,12,12,13,13,12, 11,11,10,10,9,9,8, //小星星 10,10,11,12,12,11,10,9,8,8,9,10,3,2,2, 10,10,11,12,12,11,10,9,8,8,9,10,9,8,8, 9,9,10,8,9,10,11,10,8,9,10,11,10,8,8,9,12,

10,10,11,12,12,11,10,9,8,8,9,10,9,8,8 //欢乐颂 };

六、 系统调试

6.1硬件调试

硬件调试主要是针对单片机部分进行调试。 在上电前,先确保电路中不在断路或短路情况,这一工作是整个调试工作的第一步,也是非常重要的一个步骤。在这部分调试中主要使用的工具是万用表,用来完成检测电路中是否存在断路或者短路情况等。注意焊点之间,确保焊点没有短接在一起,同时注意焊点的美观,确保没有开路以及短路的现象出现。

在确保硬件电路正常,无异常情况(断路或短路)方可上电调试,上电调试的目的是检验电路是否接错,同时还要检验原理是否正确,在本次设计中,上电调试主要键盘单片机控制部分、数码管点亮部分和音频转换电路硬件调试。 1、数码管LED电路调试:接通电源,随机按下按钮可以看到数码管显示数字。 2、键盘单片机控制部分调试:上电后,随机按动键盘可以发现各个按键对应的音正确。 6.2软件调试

调试主要方法和技巧:

通常一个调试程序应该具备至少四种性能:跟踪、断点、查看变量、更改数