#include<reg52.h>
#include<intrins.h>
#include<math.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
extern serial_initial();
sbit CS=P1^0;
sbit CLK=P1^1;
sbit DIO=P1^2;
sbit KEY=P1^3;
sbit P3_4=P3^4;
sbit P3_5=P3^5;
uint code fre1[]={63628,63835,64021,64103,64260,64400,64524,64580,64684,64777,64820,
64898,64968,65030,65058,65110,65157,65178,65217,65252,65283};
uint code fre3[]={262,294,330,349,392,440,494,523,587,659,698,784,880,988,1046,1175,1318,1397,1568,1760,1976}; //低中高音频率
unsigned char code paipai[]={5,5,8,8,8,8,8,8,7,8,9,99,99,99,5,5,9,9,9,9,9,9,8,9
,10,99,99,99,5,5,10,10,10,10,10,10,9,10,11,11,10,9,8,99,7,8,9,9,9,8,7,5,6,7,8}; //如果感到快乐你就拍拍手?
unsigned char code rabbit[]={6,6,5,6,8,9,10,9,8,9,10,99,8,13,13,
12,9,9,8,9,10,99,99,99,8,6,8,9,5,5,10,12,10,9,8,99,8,6,8,9,10,12,10,10,12,13}; //最炫民族风
unsigned char code huanle[]={10,10,11,12,12,11,10,9,8,8,9,10,10,9,9,99,10,10,11,12,12,11,10,9,8,8,9,10,9,8,8}; //欢乐颂
uchar rebuf,sebuf,a,b,c;
int k;
int s;
bdata uchar com_data;
sbit mos_bit=com_data^7;
sbit low_bit=com_data^0;
void delay_50us() //延时50us
{
uchar i;
for(i=0;i<6;i++) {;}
}
void delay_8us() //延时8us
{
uchar i;
for(i=0;i<=1;i++) {;}
}
void delay_1s()
{
unsigned int j;
for(j=0;j<32250;j++){;}
}
void delay_10s()
{
unsigned int j;
for(j=0;j<25550;j++){;}
}
void send(uchar sebuf) //发送数据
{
uchar i;
CS=0;
delay_50us();
for(i=0;i<8;i++)
{
com_data=sebuf;
sebuf=com_data<<1;
DIO=mos_bit;
CLK=1;
delay_8us();
CLK=0;
delay_8us();
}
DIO=0;
}
void receive() //接收数据
{
uchar i;
DIO=1;
delay_50us();
for(i=0;i<8;i++)
{
CLK=1;
delay_8us();
low_bit=DIO;
com_data=com_data<<1;
rebuf=com_data;
CLK=0;
delay_8us();
}
DIO=0;
CS=1;
}
void time_0() interrupt 1 //定时器0中断
{
TH0=fre1[k-1+s]/256;
TL0=fre1[k-1+s]%256;
P3_4=~P3_4;
}
void display(int kk);
void play(int kk);
void autoplay();
void welcome();
void main() //主函数
{
serial_initial();
TMOD=0x01;
sebuf=0xbf;
send(sebuf);
delay_50us();
CS=1;
send(0xa4);
delay_50us();
CS=1;
welcome(); //欢迎界面
while(1)
{
EA=1;
ET0=1;
TR0=0;
TR1=0;
while(KEY);
{
send(0x15);
delay_50us();
receive();
delay_50us();
CS=1;
rebuf=rebuf>>1;
k=rebuf;
switch(k) //键值转换
{
case 63:k=1; break;
case 55:k=2; break;
case 47:k=3; break;
case 39:k=4; break;
case 31:k=5; break;
case 23:k=6; break;
case 15:k=7; break;
case 7: k=8; break;
case 62:k=9; break;
case 46:k=10; break;
case 38:k=11; break;
case 30:k=12; break;
case 22:k=13; break;
case 14:k=14; break;
case 6: k=15; break;
case 54:k=16; break;
case 61:k=17; break;
case 45:k=18; break;
case 37:k=19; break;
case 29:k=20; break;
case 21:k=21; break;
case 13:k=22; break;
case 5: k=23; break;
case 53:k=24; break;
default: k=0;
}
display(k);
if(k>=22&&k<=24) //判断是否自动播放
{
autoplay();
TR0=0;TR1=0;
goto key; //此句实现自动播放歌曲结束后声音停止
}
else play(k);
while(!KEY); //按键防抖
while(KEY);
while(!KEY);
key:KEY=1;
TR0=0;
TR1=0;
}
}
}
void display(int kk) //显示子程序
{
if(kk<=21&&kk>=1) //对应于低中高音按键的显示
{
int d,qian,bai,shi,ge;
d=fre3[kk-1];
qian=d/1000;
bai=(d-qian*1000)/100;
shi=(d-qian*1000-bai*100)/10;
ge=d-qian*1000-bai*100-shi*10;
send(0xa4);delay_50us();
CS=1;
send(0x87);delay_50us();
send(qian);delay_50us();
CS=1;
send(0x86);delay_50us();
send(bai);delay_50us();
CS=1;
send(0x85);delay_50us();
send(shi);delay_50us();
CS=1;
send(0x84);delay_50us();
send(ge);delay_50us();
CS=1;
send(0x83);delay_50us();
send(0x0c);delay_50us();
CS=1;
send(0x82);delay_50us();
send(0x02);delay_50us();
CS=1;
}
else if(kk==22) //显示01;
{
send(0xa4);delay_50us();
CS=1;
send(0x81); delay_50us();
send(0x00); delay_50us();
CS=1;
send(0x80); delay_50us();
send(0x01); delay_50us();
CS=1;
}
else if(kk==23) //显示02;
{
send(0xa4);delay_50us();
CS=1;
send(0x81); delay_50us();
send(0x00); delay_50us();
CS=1;
send(0x80); delay_50us();
send(0x02); delay_50us();
CS=1;
}
else if(kk==24) //显示03;
{
send(0xa4);delay_50us();
CS=1;
send(0x81); delay_50us();
send(0x00); delay_50us();
CS=1;
send(0x80); delay_50us();
send(0x03); delay_50us();
CS=1;
}
else if(kk==99) //按键失误时显示00
{
_nop_();
}
else
{
send(0xa4);delay_50us();
CS=1;
send(0x81); delay_50us();
send(0x00); delay_50us();
CS=1;
send(0x80); delay_50us();
send(0x00); delay_50us();
CS=1;
}
}
void play(int kk) //给定时器送初值并启动定时器工作
{
if(kk!=99&&kk!=22&&kk!=23&&kk!=24)
{
TH0=fre1[kk-1]/256;
TL0=fre1[kk-1]%256;
TR0=1;
}
else if(kk==99)
{
delay_50us();
}
}
void autoplay() //自动播放子程序
{
int i=0;
if(k==22) //第一首歌
{
while(i<55)
{
k=paipai[i];
play(k);
display(k);
delay_1s();
TR0=0;
i++;
}
}
else if(k==23) //第二首歌
{
while(i<46)
{
k=rabbit[i];
play(k);
display(k);
delay_1s();
TR0=0;
i++;
}
}
else if(k==24) //第三首歌
{
while(i<31)
{
k=huanle[i];
play(k);
display(k);
delay_1s();
TR0=0;
i++;
}
}
TR0=0;
}
void welcome() //开机显示HELLO界面子程序
{
int i;
send(0xa4);delay_50us();CS=1;
send(0x84); delay_50us();
send(0x0c); delay_50us(); CS=1;
send(0x83); delay_50us();
send(0x0b); delay_50us(); CS=1;
send(0x82); delay_50us();
send(0x0d); delay_50us(); CS=1;
send(0x81); delay_50us();
send(0x0d); delay_50us(); CS=1;
send(0x80); delay_50us();
send(0x00); delay_50us(); CS=1;
for(i=0;i<6;i++)
{
delay_10s();
}
send(0xa1); delay_50us(); CS=1;
delay_10s();
send(0xa1); delay_50us(); CS=1;
delay_10s();
send(0xa1); delay_50us(); CS=1;
delay_10s();
send(0xa1); delay_50us(); CS=1;
delay_10s();
send(0xa1); delay_50us(); CS=1;
delay_10s();
send(0xa1); delay_50us(); CS=1;
delay_10s();
send(0xa1); delay_50us(); CS=1;
delay_10s();
send(0xa1); delay_50us(); CS=1;
delay_10s();
send(0xa4);delay_50us();CS=1;
}
dianziqin.rar_电子琴_电子琴 21_电子琴 51_电子琴程序keil
版权申诉
5星 · 超过95%的资源 177 浏览量
2022-09-24
18:37:04
上传
评论 1
收藏 58KB RAR 举报
alvarocfc
- 粉丝: 109
- 资源: 1万+
最新资源
- 基于QT的地图可视化桌面系统后台数据库为MySQL5.7源码.zip
- 基于simulink的PLL锁相环系统仿真【包括模型,文档,参考文献,操作步骤】
- 基于EM-GMM模型的目标跟踪和异常行为检测matlab仿真【包括程序,注释,参考文献,操作步骤,说明文档】
- 2109010044_胡晨燕_选课管理数据库设计与实现.prj
- 帕鲁介绍的PPT备份没什么好下的
- demo1-202405
- 两种方式修改Intel网卡MAC地址
- 服务器搭建所需资源:static文件夹
- Vue02的源码学习资料
- Python 程序语言设计模式思路-行为型模式:访问者模式:在不改变被访问对象结构的情况下,定义对其元素的新操作
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈