本设计仅供参考
基于51单片机的7键电子琴音乐播放器proteus(仿真+源码+原理图)
原理图:Altium Designer
仿真图proteus 7.8
程序编译器:keil 4/keil 5
编程语言:C语言
编号C0036
有需要学习可以点击下方链接下载
资料下载链接
本次设计首先对单片机设计简易电子琴仔细分析,接着制作硬件电路和编写软件的程序,最后进行软硬件的调试运行。并且从原理图,主要芯片,各模块的原理和各个模块的程序调试来阐述。利用单片机产生不同频率来获得我们要求的音阶,实现高、中、低共21个音符的发音和显示和音乐播放时的控制显示,并且能自动播放程序中编排的音乐。系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比高等,具有一定的使用和参考价值。
设计思路:
用独立式键盘的7个按键分别对应相应的音符,当按下某一个按键时,产生一个相应音符,操作者按一定的节奏、规律进行输入时,信号经过单片机处理,然后经音频放大后经扬声器输出音频信号,产生乐曲。本次设计有一个创新,就是预先存放一段音乐程序在芯片内,整个设计既可以作电子琴用又可以作音乐盒用,且带显示功能。
#include设计报告:#include typedef unsigned int uint; typedef unsigned char uchar; sbit SDA1=P0^2;//串行数据输入,对应595的14脚SER sbit SCL1=P0^1;//移位寄存器时钟输入,对应595的11脚SCK sbit SCL2=P0^0;//存储寄存器时钟输入,对应595的12脚RCK sbit W1=P0^3; sbit W2=P0^4; 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 D1=P2^6;//播放音乐模式 sbit D2=P2^7;//弹奏模式 sbit k8=P3^2;//功能切换键 sbit k9=P3^3;//低音 sbit k10=P3^4;//中音 sbit k11=P3^5;//高音 sbit beep=P2^2;//蜂鸣器接口 uchar code table1[]={ 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x37,//中音 0x38,//低音 0x76,//高音 0x79 };//共阴极数码管 uchar code table2[]={ 0xFC,0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,//中音 0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,//低音的高8位 0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF, };//音阶频率表 低八位 uchar code table3[]={ 0x8E,0xED,0x44,0x6B,0xB4,0xF4,0x2D,//中音 0x21,0xDB,0x87,0xD7,0x68,0xE8,0x5B,//低音的低8位 0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16, }; uchar code table4[]={ 1,2,3,1, 1,2,3,1, 3,4,5, 3,4,5, 5,6,5,4,3,1, 5,6,5,4,3,1, 1,12,1, 1,12,1 }; uchar code table5[]={ 4,4,4,4, 4,4,4,4, 4,4,8, 4,4,8, 2,1,2,1,4,4, 2,1,2,1,4,4, 4,4,6, 4,4,6 }; uchar i; uchar key,aa=0; uchar bb,cc; bit flag=0; //延时子函数 void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=340;y>0;y--); } void in(uchar Data) { uchar i; for(i=0;i<8;i++) //循环8次,刚好移完8位 { Data<<=1; SCL1=CY; SDA1=1; //先将移位寄存器控制引脚置为低 _nop_(); _nop_(); SDA1=0; } } void out() { SCL2=0; //先将存储寄存器引脚置为低 _nop_(); SCL2=1; //再置为高,产生移位时钟上升沿,上升沿时移位寄存器的数据进入数据存储寄存器,更新显示数据。 _nop_(); SCL2=0; } //初始化子函数 void init() { beep=0; D1=1; D2=0; EA=1;//开总中断 TCON=0x01;//外部中断0设置为边沿触发 EX0=1;//开外部中断0 ET0=1; ET1=1; TMOD=0x11;//定时器0,1工作在定时状态,均为方式1 } //数码管显示子函数 void display1() { in(table1[aa]); //再传段码 out(); W1=0;; delay(1); //延迟时间2ms以内 W1=1; in(table1[cc+1]); //再传段码 out(); W2=0; delay(1); //延迟时间2ms以内 W2=1; } //高低音选择子函数 void yinjie() { if(k10==0) { delay(5); if(k10==0) { aa=10; bb=0;//返回10为seg[10]显示C } } if(k9==0) { delay(5); if(k9==0) { aa=11; bb=1;//返回11为seg[11]显示L } } if(k11==0) { delay(5); if(k11==0) { aa=12; bb=2;//返回12为seg[12]显示H } } if(aa==0) { aa=13; } } //播放音乐子函数 void display_music() { TH0=table2[table4[i]-1]; TL0=table3[table4[i]-1]; while(flag==0) { if(i<32) { TR0=1; delay(57*table5[i]); i++; } if(i==32) { i=0; } } } //演奏模式子函数 void display_play() { TR0=0; TR1=0; yinjie(); in(table1[aa]); //再传段码 out(); W1=0;; delay(1); //延迟时间2ms以内 W1=1; if(aa!=13&&flag==1) { if(k1==0) { TH1=table2[7*bb+cc]; TL1=table3[7*bb+cc]; TR1=1; while(k1==0) { cc=0; display1(); } } if(k2==0) { TH1=table2[7*bb+cc]; TL1=table3[7*bb+cc]; TR1=1; while(k2==0) { cc=1; display1(); } } if(k3==0) { TH1=table2[7*bb+cc]; TL1=table3[7*bb+cc]; TR1=1; while(k3==0) { cc=2; display1(); } } if(k4==0) { TH1=table2[7*bb+cc]; TL1=table3[7*bb+cc]; TR1=1; while(k4==0) { cc=3; display1(); } } if(k5==0) { TH1=table2[7*bb+cc]; TL1=table3[7*bb+cc]; TR1=1; while(k5==0) { cc=4; display1(); } } if(k6==0) { TH1=table2[7*bb+cc]; TL1=table3[7*bb+cc]; TR1=1; while(k6==0) { cc=5; display1(); } } if(k7==0) { TH1=table2[7*bb+cc]; TL1=table3[7*bb+cc]; TR1=1; while(k7==0) { cc=6; display1(); } } } } //主函数 void main() { init(); while(1) { if(flag==0) display_music(); else display_play(); } } //外部0中断子函数 void wb0() interrupt 0 { if(k8==0) { delay(5); while(k8==0); flag=~flag; D1=~D1; D2=~D2; } }



