按鍵控制蜂鳴器演奏音樂
下載:
單片機(jī)演奏音樂.rar
(44.26 KB, 下載次數(shù): 94)
2016-11-20 21:02 上傳
點(diǎn)擊文件名下載附件
音樂
- #include<reg52.h>
- sbit spek=P3^7; //聲音輸出端
- sbit set=P3^2; //設(shè)定及退出鍵,按奇數(shù)次為設(shè)定功能;偶數(shù)次為退出功能
- sbit up=P3^1; //上一曲
- sbit down=P3^0; //下一曲
- bit flag1,flag2; //按鍵掃描標(biāo)志位,新鍵值標(biāo)志位
- unsigned char f_t,n,i,key,k_max; //音符頻率對(duì)應(yīng)的二分之一周期值,節(jié)拍常數(shù)值,查表用計(jì)數(shù)器,鍵值,最大鍵值
- unsigned char *p_music; //指向音樂數(shù)據(jù)數(shù)組的指針
- void timer_ms(unsigned char tim); //毫秒級(jí)延時(shí)函數(shù)聲明
- void timer_us(unsigned char t); //微秒級(jí)延時(shí)函數(shù)
- void key_scan(void); //按鍵掃描函數(shù)
- void key_manage(); //鍵值處理函數(shù)
- //格式為:頻率常數(shù),節(jié)拍常數(shù),頻率常數(shù),節(jié)拍常數(shù)
- unsigned char code music_table1[]={
- 0x18,0x30,0x1c,0x10,0x20,0x40,0x1c,0x10,0x18,
- 0x10,0x20,0x10,0x1c,0x10,0x18,0x40,0x1c,0x20,
- 0x20,0x20,0x1c,0x20,0x18,0x20,0x20,0x80,0xff,
- 0x20,0x30,0x1c,0x10,0x18,0x20,0x15,0x20,0x1c,
- 0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2b,0x20,
- 0x26,0x20,0x20,0x20,0x30,0x80,0xff,0x20,0x20,
- 0x1c,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2b,
- 0x20,0x30,0x20,0x2b,0x40,0x20,0x20,0x1c,0x10,
- 0x18,0x10,0x20,0x20,0x26,0x20,0x2b,0x20,0x30,
- 0x20,0x2b,0x40,0x20,0x30,0x1c,0x10,0x18,0x20,
- 0x15,0x20,0x1c,0x20,0x20,0x20,0x26,0x40,0x20,
- 0x20,0x2b,0x20,0x26,0x20,0x20,0x20,0x30,0x80,
- 0x20,0x30,0x1c,0x10,0x20,0x10,0x1c,0x10,0x20,
- 0x20,0x26,0x20,0x2b,0x20,0x30,0x20,0x2b,0x40,
- 0x20,0x15,0x1f,0x05,0x20,0x10,0x1c,0x10,0x20,
- 0x20,0x26,0x20,0x2b,0x20,0x30,0x20,0x2b,0x40,
- 0x20,0x30,0x1c,0x10,0x18,0x20,0x15,0x20,0x1c,
- 0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2b,0x20,
- 0x26,0x20,0x20,0x20,0x30,0x30,0x20,0x30,0x1c,
- 0x10,0x18,0x40,0x1c,0x20,0x20,0x20,0x26,0x40,
- 0x13,0x60,0x18,0x20,0x15,0x40,0x13,0x40,0x18,
- 0x80,0x00}; //八月桂花香
- unsigned char code music_table2[]={
- 0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,
- 0x10,0x20,0x80,0x26,0x20,0x30,0x20,0x30,0x20,
- 0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,
- 0x20,0x20,0x20,0x1c,0x20,0x20,0x80,0x2b,0x20,
- 0x26,0x20,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,
- 0x80,0x26,0x20,0x30,0x20,0x30,0x20,0x39,0x10,
- 0x26,0x10,0x26,0x60,0x40,0x10,0x39,0x10,0x26,
- 0x20,0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,
- 0x26,0x80,0x26,0x20,0x2b,0x10,0x2b,0x10,0x2b,
- 0x20,0x30,0x10,0x39,0x10,0x26,0x10,0x2b,0x10,
- 0x2b,0x20,0x2b,0x40,0x40,0x20,0x20,0x10,0x20,
- 0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x18,0x20,
- 0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x40,0x26,
- 0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,
- 0x20,0x20,0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,
- 0x20,0x30,0x20,0x30,0x60,0x39,0x10,0x30,0x10,
- 0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,0x26,
- 0x10,0x26,0x10,0x2b,0x10,0x2b,0x80,0x18,0x20,
- 0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x60,0x26,
- 0x10,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,
- 0x20,0x20,0x20,0x80,0x26,0x20,0x30,0x10,0x30,
- 0x10,0x30,0x20,0x39,0x20,0x26,0x10,0x2b,0x10,
- 0x2b,0x20,0x2b,0x40,0x40,0x10,0x40,0x10,0x20,
- 0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,
- 0x00}; //祝你平安
- unsigned char code music_table3[]={
- 0x20,40,0x26,20,0x20,20,0x17,80,0x1c,40,0x17,40,
- 0x20,80,0x20, 40,0x2f,20,0x2a,20,0x26,40,0x2a,20,
- 0x2f,20,0x2a,80,0xff,0x20,40,0x26,20,0x20,20,0x17,60,
- 0x19,20, 0x1c,40,0x17,40,0x20,80,0x20,40,0x2a,20,
- 0x26,20,0x24,60,0x32,20,0x2f,80,0xff,0x1c,40,0x17,40,
- 0x17, 80,0x19,40,0x1c,20,0x19,20,0x17,80,0x1c,20,
- 0x19,20,0x17,20,0x1c,20,0x1c,20,0x20,20,0x26,20,0x2f,20,
- 0x2a,80,0xff,0x20,40,0x26,20,0x20,20,0x17,60,0x19,20,
- 0x1c,40,0x17,40,0x20,80,0x20,40,0x2a,20,0x26, 20,
- 0x24,60,0x32,20,0x2f,80,0xff,0x20,40,0x26,20,0x20,20,
- 0x17,80,0x1c,40,0x17,40,0x20,80,0x20,40, 0x2f,20,0x2a,20,
- 0x26,40,0x2a,20,0x2f,20,0x2a,80,0xff,0x20,40,0x26,20,
- 0x20,20,0x17,60,0x19,20,0x1c, 40,0x17,40,0x20,80,0x20,40,
- 0x2a,20,0x26,20,0x24,60,0x32,20,0x2f,80,0}; //送別
- main()
- {
- spek=0;
- P3=0x7f;
- TMOD=0x01; //T0工作于方式1,即16位定時(shí)器模式
- IE=0x82; //開總中斷,T0中斷
- flag2=0; //
- flag1=0;
- key=1;
- k_max=3; //最大鍵值(取值范圍1~254)
- n=0;
- i=0;
- p_music=music_table1; //指針賦初值
- while (1)
- {
- switch (p_music[i])
- {
- case 0x00: i=0; //歌曲完,則停止0.5S后重新開始
- timer_ms(250); //延時(shí)0.25ms
- timer_ms(250);
- break;
- case 0xff: i++; //遇到休止符則停止100us
- timer_ms(250);
- timer_ms(250);
- break;
- default: f_t=p_music[i++];
- n=p_music[i++];
- spek=1;
- TR0=1;
- while (n!=0)
- {
- spek=~spek;
- timer_us(4*f_t); //改變f_t前面的系數(shù)可以調(diào)整音符頻率的高低
- }
- TR0=0;
- spek=0;
- if(set==0)
- {
- key_scan();
- key_manage();
- }
- }
- }
- }
- /**************************************************************
- 函數(shù)名稱: 定時(shí)器0的中斷處理程序 函數(shù)功能: 完成10毫秒定時(shí) 入口參數(shù):
- 出口參數(shù): 其 它: **************************************************************/
- void timer0() interrupt 1 using 2
- {
- TH0=(65536-10000)/256; //定時(shí)10毫秒
- TL0=(65536-10000)%256;
- n--; }
- /**************************************************************
- 函數(shù)名稱: 延時(shí)程序 函數(shù)功能: 完成微秒級(jí)的延時(shí) 入口參數(shù):
- t為需延時(shí)的時(shí)間(取值范圍1~255;延時(shí)時(shí)間5~1275us) 出口參數(shù):
- 其 它: **************************************************************/
- void timer_us(unsigned char t)
- {
- while (--t); //本語(yǔ)句執(zhí)行一次需5us的時(shí)間
- }
- /**************************************************************
- 函數(shù)名稱: 按鍵掃描函數(shù) 函數(shù)功能: 完成按鍵掃描處理 入口參數(shù):
- 應(yīng)為在中斷函數(shù)中被調(diào)用,所以不能有參數(shù)傳遞 出口參數(shù): 其 它:
- **************************************************************/
- void key_scan(void)
- {
- timer_ms(10); //延時(shí)10ms等待按鍵狀態(tài)穩(wěn)定
- if (set==0) //再次確認(rèn)
- {
- while (set==0); //等待按鍵松開
- flag1=1; //該位為1,表示進(jìn)入按鍵掃描處理;為0,表示本次按鍵掃描處理完成
- while (flag1)
- {
- if (up==0) //加一鍵
- {
- timer_ms(10);
- if (up==0)
- {
- while (!up);
- key++;
- if (key>k_max) key=1;
- }
- }
- if (down==0) //減一鍵
- {
- timer_ms(10);
- if (down==0)
- {
- while (!down);
- key--;
- if (key<1) key=k_max;
- }
- }
- if (set==0) //退出鍵
- {
- timer_ms(10);
- if (set==0)
- {
- while (set==0);
- flag1=0; //表示本次按鍵掃描處理完成
- flag2=1; //該位置1,表示有新鍵值要處理
- }
- }//以上鍵值處理的范圍為1到254個(gè)鍵值
- }
- }
- }
- /**************************************************************
- 函數(shù)名稱: 鍵值處理函數(shù) 函數(shù)功能: 完成按鍵鍵值的處理
- 入口參數(shù): 應(yīng)為在中斷函數(shù)中被調(diào)用,所以不能有參數(shù)傳遞
- 出口參數(shù): 其 它:
- **************************************************************/
- void key_manage()
- {
- flag2=0;
- switch (key)
- {
- case 1: p_music=music_table1; //鍵值為1 播放第一首樂曲
- goto kh1;
- case 2: p_music=&music_table2[0]; //鍵值為2 播放第2首樂曲
- goto kh1;
- case 3: p_music=&music_table3[0]; //鍵值為3 播放第3首樂曲
- goto kh1;
- default: key=1;
- p_music=music_table1;
- kh1: TH0=(65536-10000)/256;
- TL0=(65536-10000)%256;
- break;
- }
- n=0;
- i=0;
- }
- /*----------------------------------------------------------------------------------------------------
- 函數(shù)名稱: timer_ms 函數(shù)說明: 1ms延時(shí)子程序 入口參數(shù): tim為接收主調(diào)傳來需延時(shí)的毫秒數(shù),取值范圍1~256,定時(shí)時(shí)間1~256ms
- 出口參數(shù): 其 它: ----------------------------------------------------------------------------------------------------*/
- void timer_ms(unsigned char tim)
- {
- unsigned char j;
- while(tim--)
- {
- for(j=0;j<200;j++); //延時(shí)1ms
- }
- }
復(fù)制代碼
|