不想用芯片實現回放功能,我想用數組來存放按過的鍵號,實現回放,寫了個程序沒有錯誤和警告,但是仿真的時候沒有按鍵音,也不能回放,不知道是不是哪里沒有出來
請大佬看看,指點迷津
#include<reg51.h>
sbit P14=P1^4;
sbit P15=P1^5;
sbit P16=P1^6;
sbit P17=P1^7;
unsigned char keyval;
sbit sound=P3^0;
sbit P31=P0^0;
sbit P34=P3^4;
sbit P35=P3^5;
unsigned int C;
unsigned int f;
unsigned int s;
//低音的音頻
#define l_dao 262
#define l_re 286
#define l_mi 311
#define l_fa 349
#define l_sao 392
#define l_la 440
#define l_xi 494
//中音的音頻
#define dao 523
#define re 587
#define mi 659
#define fa 698
#define sao 784
#define la 880
#define xi 987
//高音的音頻
#define h_dao 1046
#define h_re 1174
#define h_mi 1318
#define h_fa 1396
#define h_sao 1567
#define h_la 1760
#define h_xi 1975
/**延時子程序函數*/
void delay20ms(void)
{
unsigned char i,j;
for(i=0;i<100;i++)
for(j=0;j<60;j++)
;
}
//延時200ms
void delay()
{
unsigned char i,j;
for(i=0;i<100;i++)
for(j=0;j<60;j++)
;
}
//輸出音階
void Output_Sound(void)
{
C=(50000/f)*10;
TH0=(8192-C)/32;
TL0=(8192-C)%32;
TR0=1;
for(s=0;s<2;s++)
delay();
TR0=0;
sound=1;
keyval=0xff;
}
//主程序
void main()
{
unsigned char n,m,k,x,z;
unsigned char pu[41];
while(1)
{
m=0;
n=0;
k=0;
x=0;
EA=1;
ET0=1;
ET1=1;
TMOD=0x10;
TH1=(65536-500)/256;
TL0=(65536-500)%256;
while(n!=1&&m<40)
{ TR1=1;
P34=0;
P35=1;
switch(keyval)
{
case 1:f=dao;
Output_Sound();
pu[m]=dao;
m++;
break;
case 2:f=l_xi;
Output_Sound();
pu[m]=l_xi;
m++;
break;
case 3:f=l_la;
Output_Sound();
pu[m]=l_la;
m++;
break;
case 4:f=l_sao;
Output_Sound();
pu[m]=l_sao;
m++;
break;
case 5:f=sao;
Output_Sound();
pu[m]=sao;
m++;
break;
case 6:f=fa;
Output_Sound();
pu[m]=fa;
m++;
break;
case 7:f=mi;
Output_Sound();
pu[m]=mi;
m++;
break;
case 8:f=re;
Output_Sound();
pu[m]=re;
m++;
break;
case 9:f=h_dao;
Output_Sound();
pu[m]=h_dao;
m++;
break;
case 10:f=h_dao;
Output_Sound();
pu[m]=h_dao;
m++;
break;
case 11:f=xi;
Output_Sound();
pu[m]=xi;
m++;
break;
case 12:f=la;
Output_Sound();
pu[m]=la;
m++;
break;
case 13:f=h_la;
Output_Sound();
pu[m]=h_la;
m++;
break;
case 14:f=h_sao;
Output_Sound();
pu[m]=h_sao;
m++;
break;
case 15:f=h_fa;
Output_Sound();
pu[m]=h_fa;
m++;
break;
case 16:f=h_mi;
Output_Sound();
pu[m]=h_mi;
m++;
break;
case 17:n=1;
break;
}
}
while(pu[k]!=0)
{
P34=1;
P35=0;
f=pu[k];
Output_Sound();
k++;
}
for(z=0;z<41;z++)
{
pu[z]=0;
}
}
}
void Time0_serve(void) interrupt 1 using 1
{
TH0=(8192-C)/32;
TL0=(8192-C)%32;
sound=!sound;
}
//定時器t1中斷,進行掃描 判斷健位
void time1_serve(void) interrupt 3 using 2
{
TR1=0;
P1=0xf0;
P2=0xff;
if((P1&0xf0)!=0xf0)
{
delay20ms();
if((P1&0xf0)!=0xf0)
{
P1=0xfe;//第一行置位低電平
if(P14==0)
keyval=1;
if(P15==0)
keyval=2;
if(P16==0)
keyval=3;
if(P17==0)
keyval=4;
P1=0xfd;//第二行置位低電平
if(P14==0)
keyval=5;
if(P15==0)
keyval=6;
if(P16==0)
keyval=7;
if(P17==0)
keyval=8;
P1=0xfb;//disanhang
if(P14==0)
keyval=9;
if(P15==0)
keyval=10;
if(P16==0)
keyval=11;
if(P17==0)
keyval=12;
P1=0xf7;//dishihang
if(P14==0)
keyval=13;
if(P15==0)
keyval=14;
if(P16==0)
keyval=15;
if(P17==0)
keyval=16;
}
}
if(P31==0)
{
delay20ms();
if(P31==0)
keyval=17;
}
TR1=1;
TH1=(65536-500)/256;
TL1=(65536-500)%256;
}
|