#include <reg52.H>
unsigned char temp;
unsigned char key;
unsigned char i,j;
unsigned char STH0;
unsigned char STL0;
unsigned int code tab[]= {64820,64898,64968,65030,65058,65110,65157,65178}; //音符表 do re mi fa sol la xi duo
unsigned int aa;
sbit K1=P1^0; //音符按键
sbit K2=P1^1;
sbit K3=P1^2;
sbit K4=P1^3;
sbit K5=P1^4;
sbit K6=P1^5;
sbit K7=P1^6;
sbit K8=P1^7;
sbit Speak=P2^0; //喇叭
/***********************1ms*****************************/
void delay_1ms(unsigned int q)
{
unsigned int i,j;
for(i=0;i<q;i++)
for(j=0;j<120;j++);
}
void main(void) //主程序
{
TMOD=0x01;
ET0=1;
EA=1;
Speak=0;
while(1)
{
if(!K1)
{
delay_1ms(20);//延时去抖
if(!K1)
{
aa=0;
key=0;//将音乐的值赋值给定时器以便发出对应的声音
P0=0xC0;//显示0
STH0=tab[key]/256; //计算音符对应的定时器计数值
STL0=tab[key]%256;
TR0=1;
while(!K1)
;
}
}
if(!K2)
{
delay_1ms(20);//延时去抖
if(!K2)
{
aa=0;
key=1;
P0=0xF9;//显示1
STH0=tab[key]/256; //计算音符对应的定时器计数值
STL0=tab[key]%256;
TR0=1;
while(!K2)
;
}
}
if(!K3)
{
delay_1ms(20);//延时去抖
if(!K3)
{
aa=0;
key=2;
P0=0xA4;//显示2
STH0=tab[key]/256; //计算音符对应的定时器计数值
STL0=tab[key]%256;
TR0=1;
while(!K3)
;
}
}
if(!K4)
{
delay_1ms(20);//延时去抖
if(!K4)
{
aa=0;
key=3;
P0=0xB0;//显示3
STH0=tab[key]/256; //计算音符对应的定时器计数值
STL0=tab[key]%256;
TR0=1;
while(!K4)
;
}
}
if(!K5)
{
delay_1ms(20);//延时去抖
if(!K5)
{
aa=0;
key=4;
P0=0x99;//显示4
STH0=tab[key]/256; //计算音符对应的定时器计数值
STL0=tab[key]%256;
TR0=1;
while(!K5)
;
}
}
if(!K6)
{
delay_1ms(20);//延时去抖
if(!K6)
{
aa=0;
key=5;
P0=0x92;//显示5
STH0=tab[key]/256; //计算音符对应的定时器计数值
STL0=tab[key]%256;
TR0=1;
while(!K6)
;
}
}
if(!K7)
{
delay_1ms(20);//延时去抖
if(!K7)
{
aa=0;
key=6;
P0=0x82;//显示6
STH0=tab[key]/256; //计算音符对应的定时器计数值
STL0=tab[key]%256;
TR0=1;
while(!K7)
;
}
}
if(!K8)
{
delay_1ms(20);//延时去抖
if(!K8)
{
aa=0;
key=7;
P0=0xF8;//显示7
STH0=tab[key]/256; //计算音符对应的定时器计数值
STL0=tab[key]%256;
TR0=1;
while(!K8)
;
}
}
if(aa<50000)aa++;
delay_1ms(20);
if(aa>=150) //延时时间数字越大越久
{
TR0=0;
Speak=0;//当按键弹起的时候,蜂鸣器停止发音
}
}
}
void t0(void) interrupt 1 using 0 { //定时器T0中断服务函数
TH0=STH0;
TL0=STL0;
Speak=~Speak; //产生方波
}
|