多语言展示
当前在线:901今日阅读:60今日分享:41

51单片机 电子琴 36键 protues仿真

原理图如下:程序如下:#include #define uchar unsigned char#define uint unsigned intsbit speak=P0^4; //sbit key1=P0^0;sbit key2=P0^1;sbit key3=P0^2;sbit key4=P0^3;sbit key7=P0^7;//模式切换键uchar num;uchar flag; //0为电子琴模式 1为试音模式//uchar code tone[]=原先错误的uint code tone[]={1908,1805,1701,1608,1515,1433,1351,1276,1205,1136,1078,1012, //0-11低音部分1-71908对应的频率是262hz956,903,852,804,759,716,676,638,602,568,536,506, //12-23中音部分1-7478,451,426,402,379,358,338,319,301,284,268,253, //24-35高音部分1-7};////电子琴的数组////////////////////uchar code song[]={0,1,2,3,4,5,6,7,8,9,10,11, //0-11低音部分1-712,13,14,15,16,17,18,19,20,21,22,23, //12-23中音部分1-724,25,26,27,28,29,30,31,32,33,34,35,88}; //24-35高音部分1-7uchar tone_H,tone_L;//音阶定时器变量uchar beat_H=(65536-62500)/256;uchar beat_L=(65536-62500)%256;uchar i;void init();void delay_ms(uint z);void key();void sound();void main(){ init(); while(1){key();TR0=0;}}void sound(){ TR0=1; //启动定时器T0 delay_ms(100); //每个音符延时0.1s}void init(){ TMOD=0X11;//T0 T1 EA=1; ET0=1; ET1=1; tone_H=(65536-tone[song[i]])/256; tone_L=(65536-tone[song[i]])%256; TH0=tone_H; TL0=tone_L;}void tone_timer() interrupt 1 //音阶中断{ tone_H=(65536-tone[song[i]])/256; tone_L=(65536-tone[song[i]])%256; TH0=tone_H;//重装初值 TL0=tone_L;//重装初值speak=~speak;}void key(void){ uchar temp; P3=0XFE;//第1行为低电平 temp=P3; //把P3赋值给TEMP temp=temp&0xf0;//temp与0XF0后的值赋值给TEMP if(temp!=0xf0) //判断temp是否有键按下{ delay_ms(10); //延时消抖temp=P3; temp=temp&0xf0;if(temp!=0xf0)//确认有键按下{temp=P3; //把新的P3赋值给TEMPswitch(temp) //temp与case后的常量比较,而得出SHU的值{ case 0xee: i=0;sound();break; case 0xde: i=1;sound();break; case 0xbe: i=2;sound();break; case 0x7e: i=3;sound();break; } while(temp!=0xf0)//等待按键释放{temp=P3;//读取P3的值 temp=temp&0xf0;////temp与0XF0后的值赋值给TEMP,如果按键松开,temp=temp&0XF0的值为0XF0, temp!=0XF0为假,跳出while语句} }}P3=0XFd;//第2行为低电平 temp=P3; temp=temp&0xf0; if(temp!=0xf0){ delay_ms(10);temp=P3; temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){ case 0xed: i=4;sound();break; case 0xdd: i=5;sound();break; case 0xbd: i=6;sound();break; case 0x7d: i=7;sound();break; } while(temp!=0xf0)//等待按键释放{temp=P3; temp=temp&0xf0;} }}P3=0XFb;//第3行为低电平 temp=P3; temp=temp&0xf0; if(temp!=0xf0){ delay_ms(10);temp=P3; temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){ case 0xeb: i=8;sound();break; case 0xdb: i=9;sound();break; case 0xbb: i=10;sound();break; case 0x7b: i=11;sound();break; } while(temp!=0xf0)//等待按键释放{temp=P3; temp=temp&0xf0;} }}P3=0XF7;//第4行为低电平 temp=P3; temp=temp&0xf0; if(temp!=0xf0){ delay_ms(10);temp=P3; temp=temp&0xf0;if(temp!=0xf0){temp=P3;switch(temp){ case 0xe7: i=12;sound();break; case 0xd7: i=13;sound();break; case 0xb7: i=14;sound();break; case 0x77: i=15;sound();break; } while(temp!=0xf0)//等待按键释放{temp=P3; temp=temp&0xf0;} }}///////////////////////////////////////////////// P2=0XFE;//第1行为低电平 temp=P2; //把P3赋值给TEMP temp=temp&0xf0;//temp与0XF0后的值赋值给TEMP if(temp!=0xf0) //判断temp是否有键按下{ delay_ms(10); //延时消抖temp=P2; temp=temp&0xf0;if(temp!=0xf0)//确认有键按下{temp=P2; //把新的P3赋值给TEMPswitch(temp) //temp与case后的常量比较,而得出SHU的值{ case 0xee: i=16;sound();break; case 0xde: i=17;sound();break; case 0xbe: i=18;sound();break; case 0x7e: i=19;sound();break; } while(temp!=0xf0)//等待按键释放{temp=P2;//读取P3的值 temp=temp&0xf0;////temp与0XF0后的值赋值给TEMP,如果按键松开,temp=temp&0XF0的值为0XF0, temp!=0XF0为假,跳出while语句} }}P2=0XFd;//第2行为低电平 temp=P2; temp=temp&0xf0; if(temp!=0xf0){ delay_ms(10);temp=P2; temp=temp&0xf0;if(temp!=0xf0){temp=P2;switch(temp){ case 0xed: i=20;sound();break; case 0xdd: i=21;sound();break; case 0xbd: i=22;sound();break; case 0x7d: i=23;sound();break; } while(temp!=0xf0)//等待按键释放{temp=P2; temp=temp&0xf0;} }}P2=0XFb;//第3行为低电平 temp=P2; temp=temp&0xf0; if(temp!=0xf0){ delay_ms(10);temp=P2; temp=temp&0xf0;if(temp!=0xf0){temp=P2;switch(temp){ case 0xeb: i=24;sound();break; case 0xdb: i=25;sound();break; case 0xbb: i=26;sound();break; case 0x7b: i=27;sound();break; } while(temp!=0xf0)//等待按键释放{temp=P2; temp=temp&0xf0;} }}P2=0XF7;//第4行为低电平 temp=P2; temp=temp&0xf0; if(temp!=0xf0){ delay_ms(10);temp=P2; temp=temp&0xf0;if(temp!=0xf0){temp=P2;switch(temp){ case 0xe7: i=28;sound();break; case 0xd7: i=29;sound();break; case 0xb7: i=30;sound();break; case 0x77: i=31;sound();break; } while(temp!=0xf0)//等待按键释放{temp=P2; temp=temp&0xf0;} }}///////////////////////////////////////////////////////// if(key1==0){delay_ms(10);if(key1==0){i=32; sound();}while(!key1);}if(key2==0){delay_ms(10);if(key2==0){i=33;sound();}while(!key2);}if(key3==0){delay_ms(10);if(key3==0){i=34;sound();}while(!key3);}if(key4==0){delay_ms(10);if(key4==0){i=35;sound();}while(!key4);}//////////////////////////////////////////////////////// if(key7==0){delay_ms(10);if(key7==0){num++;num=num%3;switch(num){case 0:flag=0;break;case 1:flag=1;break;case 2:flag=2;break;default : break;}}while(!key7);}}void delay_ms(uint z) //延时子程序{ uchar x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}
推荐信息