八音盒程序和與原理圖見附件
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (13.73 KB, 下載次數(shù): 70)
下載附件
2018-11-29 02:15 上傳
單片機源程序如下:
- #include <reg52.h>
- #include<intrins.h>
- #define uhar unsigned char
- #define uint unsigned int
- sbit key1=P3^2;//定義按key1可切換花樣
- sbit key2=P3^3;//定義按key2可切換歌曲
- sbit fm=P3^5;//蜂鳴器連續(xù)的IO口,接蜂鳴器的管腳
- sbit rs=P2^0;
- sbit rw=P2^1;
- sbit ep=P2^2;
- uchar i;
- uchar Tong_index=0;//音樂片段索引音符索引
- uchar song_index=0;
- uchar *discode;//暫存LCD需要顯示的歌名
- uchar *song_Tone,*song_Time;
- uchar code dis1[]={"song1"};//第一首歌名,dis1~dis4位LCD第一行要顯示的歌名;
- uchar code dis2[]={"song2"};
- uchar code dis3[]={"song3"};
- uchar code dis4[]={"song4"};
- uchar code dis[]={"K1:Down K2:Up"}; //第二行顯示的內(nèi)容
- uint code Tong_tab[]={62018,62401,62491,62895,63184,63441,63506,63773,
- 63965,64137,64215,64360,64488,64603,64654,64751,64836,64876,64948,65012,65067,65535};
- //---------------------------簡譜---------------------------------------
- //編程規(guī)則:字節(jié)高位是簡譜,低位是持續(xù)時間,代表多少個十六分音符。
- //1-7代表中央C調(diào),8-E代表高八度,0代表停頓
- //最后的0是結(jié)束標(biāo)志
- //uchar code song1_Tone[]={ // 歌曲1的演奏音符
- //11,9,11,14,12,14,12,11,11,7,8,9,8,7,8,
- //11,9,11,14,13,12,14,11,11,7,8,9,6,7,
- //12,14,14,13,12,13,14,12,13,14,12,12,11,10,7,8,
- //11,9,11,14,13,12,14,11,11,8,9,10,6,7,0xff};//結(jié)束標(biāo)志
- //uchar code song1_Time[]={ // 歌曲1的節(jié)拍頻率
- //4,2,2,8,4,2,2,8,4,2,2,4,2,2,12,
- //4,2,2,4,2,4,4,8,4,2,2,4,2,12,
- //4,4,8,4,2,2,8,2,2,2,2,2,2,2,2,16,
- //4,2,2,4,2,4,4,8,4,2,2,4,2,12,0xff};
- //uchar code song2_Tone[]={ // 歌曲2的演奏音符
- //7,8,9,7,7,8,9,7,9,10,11,9,10,11,
- //11,12,11,10,9,7,11,12,11,10,9,7,7,4,7,7,4,7,0xff};//結(jié)束標(biāo)志
- //uchar code song2_Time[]={ // 歌曲2的節(jié)拍頻率
- //4,4,4,4,4,4,4,4,4,4,8,4,4,8,
- //2,2,2,2,4,4,2,2,2,2,4,4,4,4,8,4,4,8,0xff};
- //uchar code song3_Tone[]={ // 歌曲3的演奏音符
- //7,7,7,8,9,9,9,9,10,11,12,12,11,10,9,11,11,8,9,7,
- //7,7,7,8,11,9,9,9,10,11,12,12,11,10,9,11,11,8,9,7,0xff};//結(jié)束標(biāo)志
- //uchar code song3_Time[]={ // 歌曲3的節(jié)拍頻率
- //2,2,2,2,4,2,2,2,2,4,2,2,2,2,4,2,2,2,2,4,
- //2,2,2,2,4,2,2,2,2,4,2,2,2,2,4,2,2,2,2,5,0xff};
- //uchar code song4_Tone[]={ // 歌曲4的演奏音符
- //5,9,9,9,9,8,7,8,7,6,5,12,12,12,12,12,11,
- //2,11,11,10,9,9,12,12,11,9,8,7,8,7,6,5,9,
- //2,7,7,6,5,9,8,7,6,4,12,0xff};//結(jié)束標(biāo)志
- //uchar code song4_Time[]={ // 歌曲4的節(jié)拍頻率
- //2,2,2,2,2,2,2,2,2,2,8,2,2,2,2,4,2,
- //2,2,2,2,8,2,2,2,2,4,2,2,2,2,2,4,2,
- //2,2,2,2,4,2,2,2,2,2,8,0xff};
- void delayms(uint ms)
- {
- uchar a;
- while(ms--)
- {
- for(a=230;a>0;a--);
- }
-
- }
- uchar Busy_Check(void)//測試LED忙碌狀態(tài)
- {
- uchar LCD_Status;
- rs=0;
- rw=1;
- ep=1
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- LCD_Status=P0&0x80;
- ep=0;
- return LCD_Status;
- }
- void led_wemd(uchar cmd)//寫入指令數(shù)據(jù)到LCD
- {
- while(Busy_Check());
- rs=0;
- rw=0;
- ep=0;
- _nop_()
- _nop_()
- P0=cmd;
- _nop_()
- _nop_()
- _nop_()
- _nop_()
- ep=1;
- _nop_()
- _nop_()
- _nop_()
- _nop_()
- ep=0;
- }
- void lcd_pos(uchar pos)
- {
- lcd_wcmd(pos|0x80);
- }
- void lcd_wdat(uchar dat)
- {
- while(Busy_Check());
- rs=0;
- rw=0;
- ep=0;
- _nop_()
- _nop_()
- P0=cmd;
- _nop_()
- _nop_()
- _nop_()
- _nop_()
- ep=1;
- _nop_()
- _nop_()
- _nop_()
- _nop_()
- ep=0;
- }
- void lcd_init(void) //lcd初始化設(shè)定
- {
- lcd_wcmd(0x38); //設(shè)置顯示格式為16*2行顯示,5*8點陣,8位
-
- delay(1);
- lcd_wcmd(0x0C); //0x0c-顯示開關(guān)設(shè)置
- delay(1);
- lcd_wcmd(0x06); //0x06讀寫后指針+1
- delay(1);
- lcd_wcmd(0x01);//清除lcd顯示內(nèi)容
- }
- //----------------------------簡譜音調(diào)對應(yīng)的定時器初值---------------------------
- //適合11.0592M的晶振,對定時器置入的初值
- uchar code cuzhi[]={
- 0xff,0xff,//占位用的,沒有實際的意義
- 0xFC,0x8E,//中央C調(diào)1-7
- 0xFC,0xED,
- 0xFD,0x43,
- 0xFD,0x6A,
- 0xFD,0xB3,
- 0xFD,0xF3,
- 0xFE,0x2D,
- 0xFE,0x47, //高八度1-7
- 0xFE,0x76,
- 0xFE,0xA1,
- 0xFE,0xC7,
- 0xFE,0xD9,
- 0xFE,0xF9,
- 0xFF,0x16
- };
- uchar yinyue[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x0,0x0};
- //將音調(diào)轉(zhuǎn)化為對應(yīng)的LED樣式
- void delay1(uint z); //延時1MS
- void delay(uint z); //延時165MS,即十六分音符
- void song();
- void beep();//蜂鳴器叫一聲
- void int0() interrupt 0
- {
- delayms(100);
- if(INT0==0)
- {
- TR0=0;
- if(song_index>5)
- {
- song_index=5;
- }
- else{song_index++;}
- if(song_index==1)
- {temp=songl[i];discode=dis2;}
- if(song_index==2)
- {temp=song2[i];discode=dis3;}
- if(song_index==3)
- {temp=song3[i];discode=dis4;}
- if(song_index==4)
- {temp=song4[i];discode=dis1;song_index=0;}
- TR0=1;
- i=0;
- }
- }
- void int1() interrupt 2 //外部中斷1
- {
- delayms(100);
- if(INT1==0)
- {
- TR1=0;
- if(song_index<1)
- {
- song_index=0;
- }
- else{song_index--;}
- if(song_index==1)
- {temp=song[i];discode=dis2;}
- if(song_index==2)
- {temp=song2[i];discode=dis3;}
- if(song_index==3)
- {temp=song3[i];discode=dis4;}
- if(song_index==4)
- {temp=song4[i];discode=dis1;song_index=0;}
- TR0=1;
- i=0;
- }
- }
- //---------------.按照51單片機的中斷向量順序編的號,也是缺省狀態(tài)下的優(yōu)先級------------
- //外部中斷0 interrupt 0
- //定時器0 interrupt 1
- //外部中斷1 interrupt 2
- //定時器1 interrupt 3
- //串口中斷 interrupt 4
- //定時器2 interrupt 5
- void timer0() interrupt 1 //用于產(chǎn)生各種音調(diào) 定時器0
- {
- TH0=Tone_tab[Tone_index]/256;//重置T0定時初值
- TL0=Tone_tab[Tone_index]%256;
- fm=~fm;
- }
- void LCD_disp(void)
- {
- uchar i;
- lcd_pos(0);
- i=0;
- while(discode!='\0')
- {
- lcd_wdat(discode[i]);
- i++;
- }
- lcd_pos(0x40);
- i=0;
- while(dis[i]!='\0')
- {
- lcd_wdat(dis[i]);
- i++;
- }
- }
- void int_init(void)
- {
- TMOD=0x01;
- ET0=1;//允許Timer0中斷
- EX0=1;//允許INT0中斷
- IT0=1; //INT0為邊沿觸發(fā)
- EX1=1;
- IT1=1;
- EA=1;
- TR0=0; //Timer0停止
- }
- void main(void)
- {
- int_init();
- song_Tone=song1_Tone;
- song_Time=song1_Time;
- discode=dis1;
- lcd_init();
- while(1)
- {
- LCD_disp();
- Tone_index=song_Tone[i];
- if(Tone_index==0xFF)
- {
- i=0;
- TR0=0;
- }
- TR0=1;
- delayms(song_Time[Tone_index]*60);
- TR0=0
- i++
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
《流水燈音樂盒》.rar
(806.82 KB, 下載次數(shù): 84)
2018-11-29 00:48 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|