包含Proteus仿真,原理圖,PCB及源程序
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png (22.93 KB, 下載次數(shù): 175)
下載附件
2017-8-15 23:41 上傳
8音鍵電子琴介紹:
該設(shè)計(jì)采用AT89C52(AT89C52數(shù)據(jù)手冊(cè))單片機(jī)作為主控制芯片,外接燈光閃爍功能和8音調(diào)鍵。共有8個(gè)音節(jié)和4個(gè)功能按鍵?刹シ艃(nèi)置樂(lè)曲,可彈奏錄音,采用24C02(24C02數(shù)據(jù)手冊(cè))芯片作為EEPROM存儲(chǔ),掉電不掉內(nèi)容,LM386(LM386數(shù)據(jù)手冊(cè))功放模塊外接揚(yáng)聲器。
具體功能介紹:
8個(gè)彈奏鍵,具有很強(qiáng)的娛樂(lè)性。
獨(dú)創(chuàng)--彈奏錄音功能 能錄音,能回放,聽(tīng)起來(lái)更愜意。
內(nèi)置多首音樂(lè)。
4個(gè)功能按鍵設(shè)計(jì),PLAY(播放)NEXT(下一首),PRE(上一首),STOP(停止)按鍵。
5V電源轉(zhuǎn)接PIN,供電穩(wěn)定,方便實(shí)用。
采用LM386功放和專用音樂(lè)喇叭,聲音更柔和動(dòng)聽(tīng),不再是蜂鳴器的刺耳嘯叫。
Altium Designer畫(huà)的原理圖和PCB圖如下:(51hei附件中可下載工程文件):
0.png (54.98 KB, 下載次數(shù): 141)
下載附件
2017-8-15 23:42 上傳
0.png (52.59 KB, 下載次數(shù): 135)
下載附件
2017-8-15 23:42 上傳
0.png (53.23 KB, 下載次數(shù): 134)
下載附件
2017-8-15 23:42 上傳
元件清單:
主機(jī)元件清單
名稱 參數(shù) 數(shù)量
電阻 470,1K、10K、10歐 若干
電位器 10K 1
發(fā)光二極管 9
電源接口 1
電解電容 10uf 1
電解電容 250uf 1
獨(dú)石電容 104 1
瓷片電容 30pf 2
按鍵 13
晶振 12.00M 1
排針 若干
AT89S52單片機(jī) 1
AT24C08 1
揚(yáng)聲器 0.5W 8歐 1
LM386 1
單片機(jī)源程序如下:
- /**************************************************************
- 程序名稱:模擬電子琴
- **************************************************************/
- #include<reg52.h> //定義頭文件
- #define uchar unsigned char //宏定義
- #define led P0 //定義LED等位P0口
- #define sw_port P1 //中間變量。。。使按鍵和led對(duì)應(yīng)
- sbit buzzer=P2^7; //揚(yáng)聲器管腳
- sbit key1=P3^2; //播放音樂(lè)與彈奏歌曲轉(zhuǎn)換
- sbit key3=P3^4; //掉電存儲(chǔ)按鍵
- sbit key4=P3^5; //播放掉電存儲(chǔ)的歌曲
- sbit keybofang=P3^3; //播放剛才彈奏的歌曲
- sbit key7=P3^0; //音調(diào)鍵。。。 和 歌曲鍵
- sbit key8=P3^1; //音調(diào)鍵。。。 和 歌曲鍵
- sbit key6=P1^7;
- sbit key5=P1^6;
- sbit sda=P1^1; //24c02數(shù)據(jù)線
- sbit scl=P1^0; //24c02時(shí)鐘線
- uchar keyd,i,keys,b; //定義變量
- uchar tone_H; //定義變量
- uchar tone_L; //定義變量
- void beat_125(unsigned char); //聲明函數(shù)
- uchar code beat1[]={16,8,8,8,8,4,4,16,8,4,4,8,4,4,4, //歌曲1節(jié)拍
- 4,4,4,16,16,8,8,4,4,12,8,16,16,8,4,4,4,4,16};
- uchar code song1[]={6,5,3,5,7,6,5,6,3,5,6,5,3, //歌曲1簡(jiǎn)譜
- 2,1,6,5,3,2,2,3,5,5,6,3,2,1,5,3,2,1,6,1,1,15};
- uchar code beat2[]={7,7,7, 7,8,9, 1,2,3, 6,2,4, 4,4,4, 12, //歌曲二節(jié)拍
- 8,2,2, 4,4,4, 8,2,2, 4,4,4, 2,2,4,4, 12,};
- uchar code song2[]={1,2,8, 8,5,1, 3,3,3, 5,4,3, //歌曲二簡(jiǎn)譜
- 5,4,3, 2, 2,1,0, 1,2,3, 4,3,2, 3,4,5, 5,4,3, 2,1,15};
- uchar code beat4[]={4,4,4, 6,2,4, 4,4,4, 6,2,4, 4,4,4, 12,
- 8,2,2, 4,4,4, 8,2,2, 4,4,4, 2,2,4,4, 12,};
- uchar code song4[]={1,1,1, 3,2,1, 3,3,3, 5,4,3,
- 5,4,3, 2, 2,1,0, 1,2,3, 4,3,2, 3,4,5, 5,4,3, 2,1, 15};
- uchar code tone[]={115,102,91,86,77,68,61,57}; //歌曲音調(diào)
- unsigned int code tone1[]={1012,956,852,759,716,638,568,506,478,426,379,531,10}; //歌曲音調(diào)
- uchar song3[43]; //定義空數(shù)組
- void play(uchar*,uchar*); //演奏歌曲函數(shù)
- void delay8um(uchar); //第一8um延時(shí)函數(shù)
- void sound(uchar); //彈奏發(fā)聲函數(shù)
- /*******************************************
- 函數(shù)功能:節(jié)拍的延時(shí)的基本單位,用于24c08簡(jiǎn)單延時(shí)
- ******************************************/
- void delay() //簡(jiǎn)單延時(shí)函數(shù)
- {;;}
- /*******************************************
- 函數(shù)功能:節(jié)拍的延時(shí)的基本單位,延時(shí)1ms
- ******************************************/
- void delay1ms(uchar x) //1um延時(shí)函數(shù)
- {
- uchar j;
- while(x--)
- for(j=120;j>0;j--);
- }
- /**************************************************************
- 函數(shù)功能:24c02驅(qū)動(dòng)程序 用IIC總線進(jìn)行傳輸
- **************************************************************/
- void init_c02() //24c02初始化
- {
- sda=1;
- delay();
- scl=1;
- delay();
- }
- void start_c02() //24c02的啟動(dòng)信號(hào)
- {
- scl=1;
- delay();
- sda=1;
- delay();
- sda=0;
- delay();
- }
- void stop_c02() //24c02停止信號(hào)
- {
- sda=0;
- delay();
- scl=1;
- delay();
- sda=1;
- delay();
- }
- void response_c02() //24c02的應(yīng)答信號(hào)
- {
- uchar i;
- scl=1;
- delay();
- while((sda==1)&&(i<250))i++;
- scl=0;
- delay();
- }
- void write_c02byte(uchar date) //對(duì)24c02寫(xiě)一個(gè)字節(jié)
- {
- uchar i,temp;
- temp=date;
- for(i=0;i<8;i++)
- {
- temp=temp<<1;
- scl=0;
- delay();
- sda=CY;
- delay();
- scl=1;
- delay();
- }
- scl=0;
- delay();
- sda=1;
- delay();
- }
- uchar read_c02byte() //對(duì)24c02讀一個(gè)字節(jié)
- {
- uchar i,k;
- scl=0;
- delay();
- sda=1;
- delay();
- for(i=0;i<8;i++)
- {
- scl=1;
- delay();
- k=(k<<1)|sda;
- scl=0;
- delay();
- }
- return k;
- }
- void write_addc02(uchar address,uchar date) //對(duì)24c02寫(xiě)一個(gè)數(shù)據(jù)
- {
- start_c02();
- write_c02byte(0xa0);
- response_c02();
- write_c02byte(address);
- response_c02();
- write_c02byte(date);
- response_c02();
- stop_c02();
- }
- uchar read_addc02(uchar address) //從24c02讀一個(gè)數(shù)據(jù)
- {
- uchar date;
- start_c02();
- write_c02byte(0xa0);
- response_c02();
- write_c02byte(address);
- response_c02();
- start_c02();
- write_c02byte(0xa1);
- response_c02();
- date=read_c02byte();
- // response_c02;
- stop_c02();
- return date;
- }
- /**************************************************************
- 函數(shù)功能:主函數(shù)。。。。。。。。。。。。
- **************************************************************/
- void main() //主函數(shù)
- {
- uchar yd,temp,jj,tt; //定義變量
- uchar t1,i; //定義變量
- t1=0; //初始化 t1
- yd=0; //初始化t2
- buzzer=1; //初始化蜂鳴器
- EA=1; //打開(kāi)定時(shí)總中斷
- TMOD=0x01; //設(shè)置定時(shí)器模式 定時(shí)器0工作在方式1
- ET0=1; //打開(kāi)定時(shí)器0中斷
- while(1) //主循環(huán)
- {
- led=0x3c;
- sw_port=0xff;
- keys=~sw_port; //將led與按鍵結(jié)合起來(lái)
- switch(keys) //進(jìn)入鍵盤選擇
- {
- case 0x04:sound(0);temp=1;yd=0;break; //如果鍵盤1被按下發(fā)音do,同時(shí)設(shè)置標(biāo)志temp,將數(shù)字計(jì)入yd
- case 0x08:sound(1);temp=1;yd=1;break; //如果鍵盤2被按下發(fā)音ruai,同時(shí)設(shè)置標(biāo)志temp,將數(shù)字計(jì)入yd
- case 0x10:sound(2);temp=1;yd=2;break; //如果鍵盤3被按下發(fā)音mi,同時(shí)設(shè)置標(biāo)志temp,將數(shù)字計(jì)入yd
- case 0x20:sound(3);temp=1;yd=3;break; //如果鍵盤4被按下發(fā)音fa,同時(shí)設(shè)置標(biāo)志temp,將數(shù)字計(jì)入yd
- }
- if(key5==0) //如果鍵盤5被按下發(fā)音la,同時(shí)設(shè)置標(biāo)志temp,將數(shù)字計(jì)入yd
- {
- while(!key5) // 松手檢測(cè)
- sound(4);
- temp=1;yd=4;
- }
- if(key6==0) //如果鍵盤6被按下發(fā)音xi,同時(shí)設(shè)置標(biāo)志temp,將數(shù)字計(jì)入yd
- {
- while(!key6) // 松手檢測(cè)
- sound(5);
- temp=1;yd=5;
- }
- if(key7==0) //如果鍵盤7被按下發(fā)音xi,同時(shí)設(shè)置標(biāo)志temp,將數(shù)字計(jì)入yd
- {
- while(!key7) // 松手檢測(cè)
- sound(6);
- temp=1;yd=6;
- }
- if(key8==0) //如果鍵盤8被按下發(fā)音高音do,同時(shí)設(shè)置標(biāo)志temp,將數(shù)字計(jì)入yd
- {
- while(!key8) //松手檢測(cè)
- sound(7); //播放高音do。。
- temp=1;yd=7;
- }
- if(temp==1) //標(biāo)志位,如果標(biāo)志位為1,則說(shuō)明有按鍵被按下
- {
-
- temp=0; //將標(biāo)識(shí)位歸零
- song3[t1++]=yd; //將數(shù)據(jù)存入song3[]數(shù)組
- }
- if(key3==0) //將數(shù)據(jù)存入24c02 ,掉電存儲(chǔ)按鍵
- {
- delay1ms(10);
- if(key3==0) //檢測(cè)是否key3被按下
- {
- P0=0; //如果被按下,將led打開(kāi)
- while(!key3); //松手檢測(cè)
- song3[t1++]=30;
- init_c02(); //初始化24c02
- for(i=0;i<40;) //進(jìn)入循環(huán)
- {
- write_addc02(i,song3[i++]); //將數(shù)據(jù)依次寫(xiě)入24c02
- delay1ms(10); //延時(shí)
- }
- P0=1; //led關(guān)閉
- }
- }
- if(key4==0) //讀取24c02中的數(shù)據(jù),掉電播放
- {
- delay1ms(10);
- if(key4==0)
- { //檢測(cè)是否有鍵被按下
-
- while(!key4); //松手檢測(cè)
- init_c02(); //初始化
- P0=0; //將led打開(kāi)
- tt=1; //將tt初值設(shè)為0
- while(read_addc02(tt)!=30) //進(jìn)入while循環(huán)
- {
- jj=read_addc02(tt++);
- tone_H=(65536-tone1[jj])/256; //設(shè)定初值
- tone_L=(65536-tone1[jj])%256; //設(shè)定初值
- TH0=tone_H; //賦值TH0高八位
- TL0=tone_L; //賦值TL0低八位
- TR0=1; //打開(kāi)定時(shí)器
- beat_125(3); //延時(shí)
- TR0=0;
- beat_125(4); //關(guān)閉定時(shí)器
- }
- P0=1; //關(guān)閉led
- }
- }
- if(keybofang==0)
- {
- while(!keybofang); //檢測(cè)回放鍵是否被按下
- song3[t1++]=30;
- // t1=0;
- while(song3[i]!=30) //進(jìn)入while循環(huán)。
- {
- tone_H=(65536-tone1[song3[i]])/256;
- tone_L=(65536-tone1[song3[i]])%256;
- TH0=tone_H;
- TL0=tone_L;
- TR0=1; //開(kāi)啟定時(shí)器
- beat_125(3);
- TR0=0; //關(guān)閉定時(shí)器
- i++;
- beat_125(4); //將i值加一
- }
- }
- if(key1==0)
- {
- delay1ms(10);
- if(key1==0) //檢測(cè)key1是否被按下
- {
- while(!key1);
- P0=0; //關(guān)閉led
- while(key1) //進(jìn)入循環(huán)
- {
- if(key7==0) //檢測(cè)key7是否被按下
- {
- delay1ms(10);
- if(key7==0)
- {
- P0=0xaa; //設(shè)置led燈亮個(gè)數(shù)
- while(!key7); //等待釋放
- play(song1,beat1); //演奏歌曲1
- P0=0xff; //關(guān)閉led
- }
- }
- if(key8==0) //檢測(cè)是否key8鍵被按下
- {
- delay1ms(10);
- if(key8==0)
- {
- P0=0xaa; //設(shè)置led燈亮
- while(!key8); //松手檢測(cè)
- play(song2,beat2); //播放歌曲2
- P0=0xff; //關(guān)閉led
- }
- }
- if(key6==0) //檢測(cè)是否key6鍵被按下
- {
- delay1ms(10);
- if(key6==0)
- {
- P0=0xaa; //設(shè)置led燈亮
- while(!key6); //松手檢測(cè)
- play(song4,beat4); //播放歌曲4
- P0=0xff; //關(guān)閉led
- }
- }
- }
- while(!key1); //檢測(cè)key1是否被按下
- P0=1; //如果被按下。退出該函數(shù)。。并關(guān)閉led
-
- }
- }
-
- }
- }
- /**************************************************************
- 函數(shù)功能:從數(shù)組中播放歌曲
- **************************************************************/
- void play(uchar*song,uchar*beat) //播放歌曲函數(shù)
- {
- i=0; //設(shè)置初始值
- while(song[i]!=15) // 進(jìn)入循環(huán)函數(shù)
- {
- tone_H=(65536-tone1[song[i]])/256; //定義初值
- tone_L=(65536-tone1[song[i]])%256; //定義初值
- TH0=tone_H; //賦值
- TL0=tone_L; //賦值
- TR0=1; //打開(kāi)定時(shí)器0
- beat_125(beat[i]); //讀取節(jié)拍函數(shù)
- i++; //自加
- TR0=0; //關(guān)閉led
- }
- }
- /**************************************************************
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼 附件內(nèi)容包括:
整個(gè)電路設(shè)計(jì)原理圖和PCB源文件,用AD軟件打開(kāi);
源程序;
仿真電路,用proteus軟件打開(kāi);
BOM表;
我這個(gè)目前目前問(wèn)題還很多,研究了幾天,也沒(méi)有解決,仿真也沒(méi)有效果,求大神幫幫忙看看我這電路和程序哪里錯(cuò)了?
錯(cuò)誤文件:
基于51單片機(jī)8音鍵電子琴DIY制作(完整設(shè)計(jì)項(xiàng)目開(kāi)源).zip
(114.57 KB, 下載次數(shù): 479)
2017-8-15 19:52 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
下面這位大神制作的是可以運(yùn)行的,大家能參考這個(gè)幫我修改一下嗎?
成功版:http://www.zg4o1577.cn/bbs/dpj-148020-1.html
|