學習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)
|