学习51单片机不久后,自己设计制作了这个简易电子琴,这是我单片机DIY的第一个作品,从构思设计-购买元件-布局焊接-程序编写,系统地体验了整个开发流程,也是一边学一边做,还好有网络。 在2015年3月底焊接的,那段时间也参考网上的程序写了个程序,实现的功能跟现在这个是一样的,只不过程序结构不好,还有延时有点问题,所以在2016年1月1日重写了一下,功能不变,没加没减。
没什么技术含量,但是是我的第一个DIY成品,很有纪念价值啊,现在分享一下。
有演示视频,有图片,有程序,不过没有元件清单,没有电路图,也没有必要吧,大家看看就都明白。
视频:
源代码:
- #include <reg52.h>
- sbit BUZZ=P1^6;//蜂鸣器连续的IO口
- unsigned char T1TH=0,T1TL=0;
- unsigned char code song1[]={ //两只老虎
- 0x14,0x14,0x24,0x34,0x14,0x14,0x24,0x34,0x14,
- 0x34,0x44,0x58,0x34,0x44,0x58,
- 0x53,0x61,0x53,0x41,0x34,0x14,
- 0x53,0x61,0x53,0x41,0x34,0x14,
- 0x14,0x54,0x18,
- 0x14,0x54,0x18,
- 0xFF //歌曲结束标志
- };
- unsigned char code song2[]={ //送别
- 0x54,0x54,0x32,0x52,0x88,0x64,0x84,0x58,
- 0x54,0x12,0x22,0x34,0x22,0x12,0x28,0x04,0x04,
- 0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,
- 0x54,0x22,0x32,0x46,0xB2,0x18,0x04,0x04,
- 0x64,0x84,0x88,0x74,0x62,0x72,0x88,
- 0x62,0x72,0x82,0x62,0x62,0x52,0x32,0x12,0x28,0x04,0x04,
- 0x54,0x32,0x52,0x86,0x72,0x64,0x84,0x58,
- 0x54,0x22,0x32,0x46,0xB2,0x18,0x04,0x04,
- 0xFF
- };
- unsigned char code cuzhi[]={
- 0xFF,0xFF, // low mid high
- 0xFC,0x44, //1 ## 5 6 7 1 2 3 4 5 6 7 1 2 3
- 0xFC,0xAC, //2 ## D C B 1 2 3 4 5 6 7 8 9 A
- 0xFD,0x09, //3
- 0xFD,0x34, //4
- 0xFD,0x82, //5
- 0xFD,0xC8, //6
- 0xFE,0x06, //7
- 0xFE,0x2A, //8 --high 1 N = 470;
- 0xFE,0x48, //9 --hign 2 N = 440;
- 0xFE,0x66, //A --hign 3 N = 410;
- 0xFC,0x0C //B---low 7 N = 1012
- };
- void delay1ms(unsigned char z); //延时1MS
- void delay125ms(unsigned char z); //延时165MS,即十六分音符
- void sing();
- main()
- {
- EA=1;//开总中断
- TMOD=0x10;//定时器1工作在方式1
- TH1=0;
- TL1=0;
- ET1=1;
- while(1)
- {
- sing();
- delay1ms(1000);
- }
- }
- void sing()
- {
- unsigned char temp;
- unsigned char jianpu;
- unsigned int i = 0;
- static unsigned char thesong = 0;
- while(1)
- {
- switch(thesong)
- {
- case 0:temp = song1[i];break;
- case 1:temp = song2[i];break;
- default:break;
- }
- if(temp == 0xFF)
- break;
- jianpu = (temp>>4); //取数的高4位
- if(jianpu != 0) //不是休止符
- {
- T1TH = cuzhi[jianpu*2];
- T1TL = cuzhi[jianpu*2+1];
- } //查表找初值
- else //jp = 0,休止符
- { TR1 = 0;BUZZ = 1; } //关蜂鸣器
- delay125ms( temp & 0x0F ); //取数的低4位
- TR1 = 0; //唱完一个音停10MS
- BUZZ = 1;
- delay1ms(10);
- TR1 = 1;
- i++;
- }
- TR1 = 0;
- BUZZ = 1;
- thesong++;
- if(thesong >=2)
- thesong = 0;
- }
- void delay125ms(unsigned char z) //延时165MS,即十六分音符
- {
- unsigned int x,y;
- for(x=z;x>0;x--)
- for(y=15000;y>0;y--);
- }
- void delay1ms(unsigned char z) //延时1MS
- {
- unsigned int x,y;
- for(x=z;x>0;x--)
- for(y=112;y>0;y--);
- }
- void timer1() interrupt 3 //用于产生各种音调
- {
- TH1=T1TH;
- TL1=T1TL;
- BUZZ = ~BUZZ;
- }
复制代码
制作资料下载:
【BrightBell】基于51单片机的简易电子琴.rar
(9.67 MB, 下载次数: 331)
|