标题:
单片机电子琴加强版代码
[打印本页]
作者:
jw2595
时间:
2020-12-28 13:21
标题:
单片机电子琴加强版代码
#include <stc15.h>
#define uchar unsigned char
#define uint unsigned int
sbit KEY1=P3^2;
sbit KEY2=P3^3;
sbit KEY3=P3^6;
sbit KEY4=P3^7;
sbit KEY5=P1^3;
sbit KEY6=P1^2;
sbit KEY7=P1^0;
sbit KEY8=P1^1;
sbit beep=P1^5;
uint z;
uint code tone[8]={0xFCAC,0xFD09,0xFD34,0xFD82,0xFDC8,0xFE06,0xFE22,0xFC44};//对应每个单调的计数初值
uchar k,i;
void song1();
uchar timer0h,timer0l,time;
//世上只有妈妈好 数据表
code uchar sszymmh[]={6,2,3,5,2,1,3,2,2,5,2,2,1,3,2,6,2,1,5,2,1,
6,2,4,3,2,2,5,2,1,6,2,1,5,2,2,3,2,2,1,2,1,
6,1,1,5,2,1,3,2,1,2,2,4,2,2,3,3,2,1,5,2,2,
5,2,1,6,2,1,3,2,2,2,2,2,1,2,4,5,2,3,3,2,1,
2,2,1,1,2,1,6,1,1,1,2,1,5,1,6,0,0,0
};
// 音阶频率表 高八位
code uchar FREQH[]={0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i
0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,} ;
// 音阶频率表 低八位
code uchar FREQL[]={0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i
0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,
0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,};
void delay(uint t);
void anjian()
{
KEY1=1;KEY2=1;KEY3=1;KEY4=1;KEY5=1;KEY6=1;KEY7=1;KEY8=1;
if(KEY1==0)
{
timer0h=FREQH[14];
timer0l=FREQL[14];
}
if(KEY2==0)
{
timer0h=FREQH[15];
timer0l=FREQL[15];
}
if(KEY3==0)
{
timer0h=FREQH[16];
timer0l=FREQL[16];
}
if(KEY4==0)
{
timer0h=FREQH[17];
timer0l=FREQL[17];
}
if(KEY5==0)
{
timer0h=FREQH[18];
timer0l=FREQL[18];
}
if(KEY6==0)
{
timer0h=FREQH[19];
timer0l=FREQL[19];
}
if(KEY7==0)
{
timer0h=FREQH[20];
timer0l=FREQL[20];
}
if(KEY8==0)
{
timer0h=FREQH[21];
timer0l=FREQL[21];
}
if(KEY1==0&&KEY8==0)
{
i=0;
song1();
}
}
void zdkg()
{
if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1&&KEY5==1&&KEY6==1&&KEY7==1&&KEY8==1)
{
TR0=0;//如果没有按键按下,就关闭定时器中断
beep=1;//同时也关闭蜂鸣器
}
else
{
TR0=1;
}
}
void song() // 音乐处理函数
{
TH0=timer0h;
TL0=timer0l;
TR0=1;
delay(time);
}
void song1()
{
while(i<100) //音乐数组长度 ,唱完从头再来
{
k=sszymmh[i]+7*sszymmh[i+1]-1;
timer0h=FREQH[k];
timer0l=FREQL[k];
time=sszymmh[i+2];
i=i+3;
song();
}
}
void main()
{
P1M0=0;P1M1=0;
P3M0=0;P3M1=0;
KEY1=1;KEY2=1;KEY3=1;KEY4=1;KEY5=1;KEY6=1;KEY7=1;KEY8=1;
EA=1;//开总中断
ET0=1;//定时器T0中断允许
TMOD=0x01;//使用定时器T0的模式1
TH0=(65536-500)/256;//定时器T0的高8位重新赋初值
TL0=(65536-500)%256;//定时器T0的低8位重新赋初值
while(1)
{
anjian();
zdkg();
}
}
void t0int() interrupt 1 //定时器中断函数
{
TR0=0;
beep=!beep;
TH0=timer0h;
TL0=timer0l;
TR0=1;
}
void delay(uchar t) // 延时函数
{
uchar t1;
unsigned long t2;
for(t1=0;t1<t;t1++)
{
for(t2=0;t2<8000;t2++);
}
TR0=0;
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1