仿真版本:Proteus8.6及以上版本
程序編譯:Keil5 C51
編程語言:C語言
設計編號:【V01】
1.? 簡介
? 本文提出了一種基于51單片機的8鍵電子琴設計。以AT89C51單片機作為主控核心,與鍵盤、揚聲器等模塊組成核心主控制模塊,在主控模塊上設有8個按鍵和一個復位按鍵,利用單片機的定時/計數(shù)器T0來產(chǎn)生這樣的方波頻率信號,只要把一首歌曲的音階對應頻率關系編寫正確就可以達到想要的曲目。
2.? 主要功能
a.利用蜂鳴器作為發(fā)聲部件,數(shù)碼管作為顯示部件,設置8個按鍵,實現(xiàn)高音、中音、低音的0、1、2、3、4、5、6、7的發(fā)音。
b.存儲三首歌曲的內(nèi)容,可以通過獨立按鍵實現(xiàn)自動播放。
3.? 源程序(Keil5)
本設計采用keil5 C51軟件(內(nèi)附安裝包)實現(xiàn)程序設計。如需用keil4打開程序,可自行通過.c和.h文件新建工程即可。
void delay(uchar p)
{
uchar i,j;
for(;p>0;p--)
for(i=181;i>0;i--)
for(j=181;j>0;j--);
}
void pause()
{
uchar i,j;
for(i=150;i>0;i--)
for(j=150;j>0;j--);
}
/***********************1ms延時函數(shù)*****************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<120;j++);
}
/******************按鍵程序*************************/
void key() //按鍵程序
{
if(K1==0)
{
delay_1ms(10); //按鍵去抖動
if(K1==0)
{
P0=smg_du[0];//使數(shù)碼管顯示該音調(diào)的字符
while(!K1)
{
m = 8;
TR0 = 1; //打開定時器
}//使蜂鳴器發(fā)出相應頻率的聲音;
TR0 = 0; //關閉定時器
}
}
if(K2==0)
{
delay_1ms(10); //按鍵去抖動
if(K2==0)
{
P0=smg_du[1];//使數(shù)碼管顯示該音調(diào)的字符
while(!K2)
{
m = 9;
TR0 = 1; //打開定時器
}//使蜂鳴器發(fā)出相應頻率的聲音;
TR0 = 0; //關閉定時器
}
}
if(K3==0)
{
delay_1ms(10); //按鍵去抖動
if(K3==0)
{
P0=smg_du[2];//使數(shù)碼管顯示該音調(diào)的字符
while(!K3)
{
m = 10;
TR0 = 1; //打開定時器
}//使蜂鳴器發(fā)出相應頻率的聲音;
TR0 = 0; //關閉定時器
}
}
if(K4==0)
{
delay_1ms(10); //按鍵去抖動
if(K4==0)
{
P0=smg_du[3];//使數(shù)碼管顯示該音調(diào)的字符
while(!K4)
{
m = 11;
TR0 = 1; //打開定時器
}//使蜂鳴器發(fā)出相應頻率的聲音;
TR0 = 0; //關閉定時器
}
}
if(K5==0)
{
delay_1ms(10); //按鍵去抖動
if(K5==0)
{
P0=smg_du[4];//使數(shù)碼管顯示該音調(diào)的字符
while(!K5)
{
m = 12;
TR0 = 1; //打開定時器
}//使蜂鳴器發(fā)出相應頻率的聲音;
TR0 = 0; //關閉定時器
}
}
if(K6==0)
{
delay_1ms(10); //按鍵去抖動
if(K6==0)
{
P0=smg_du[5];//使數(shù)碼管顯示該音調(diào)的字符
while(!K6)
{
m = 13;
TR0 = 1; //打開定時器
}//使蜂鳴器發(fā)出相應頻率的聲音;
TR0 = 0; //關閉定時器
}
}
if(K7==0)
{
delay_1ms(10); //按鍵去抖動
if(K7==0)
{
P0=smg_du[6];//使數(shù)碼管顯示該音調(diào)的字符
while(!K7)
{
m = 14;
TR0 = 1; //打開定時器
}//使蜂鳴器發(fā)出相應頻率的聲音;
TR0 = 0; //關閉定時器
}
}
if(K8==0)
{
delay_1ms(10); //按鍵去抖動
if(K8==0)
{
P0=smg_du[7];//使數(shù)碼管顯示該音調(diào)的字符
while(!K8)
{
m = 15;
TR0 = 1; //打開定時器
}//使蜂鳴器發(fā)出相應頻率的聲音;
TR0 = 0; //關閉定時器
}
}
P0 = 0x80;
K9 = 1;
if(K9==0)
{
delay_1ms(10); //按鍵去抖動
if(K9==0)
{
flag_en ++;
flag_i = 0;
if(flag_en > 3)
{
flag_en = 0;
TR0 = 0;
}
while(!K9)
{
}//使蜂鳴器發(fā)出相應頻率的聲音;
}
}
}
/******************主程序**********************/
void main()
{
P0 = 0x00;
P1 = P2 = P3 = 0xff;
TMOD=0x01; EA=1; ET0=1; //定時器0初始化
while(1)
{
key(); //按鍵程序
if(flag_en == 1) //青花瓷
{
m=music1[flag_i][0];n=music1[flag_i][1]; //放歌
P0 = smg_du[m % 8]; //顯示
if(m==0x00)
{
TR0=0;
beep = 1;
delay(n);
flag_i++;
}
else if(m==0xFF) //放歌結束
{
TR0=0;beep = 1;delay(30);flag_i=0;flag_en = 0;}
else if(m==music1[flag_i+1][0])
{TR0=1;delay(n);TR0=0;beep = 1;pause();flag_i++; }
else
{TR0=1;delay(n);flag_i++;}
}
else
beep = 1 ;
if(flag_en == 2) //生日歌
{
m=music2[flag_i][0];n=music2[flag_i][1]; //放歌
P0 = smg_du[m % 8]; //顯示
if(m==0x00)
{
TR0=0;
beep = 1;
delay(n);
flag_i++;
}
else if(m==0xFF) //放歌結束
{
TR0=0;beep = 1;delay(30);flag_i=0;flag_en = 0;}
else if(m==music2[flag_i+1][0])
{TR0=1;delay(n);TR0=0;beep = 1;pause();flag_i++; }
else
{TR0=1;delay(n);flag_i++;}
}
else
beep = 1 ;
if(flag_en == 3) //愛情買賣
{
m=music3[flag_i][0];n=music3[flag_i][1]; //放歌
P0 = smg_du[m % 8]; //顯示
if(m==0x00)
{
TR0=0;
beep = 1;
delay(n);
flag_i++;
}
else if(m==0xFF) //放歌結束
{
TR0=0;beep = 1;delay(30);flag_i=0;flag_en = 0;}
else if(m==music3[flag_i+1][0])
{TR0=1;delay(n);TR0=0;beep = 1;pause();flag_i++; }
else
{TR0=1;delay(n);flag_i++;}
}
else
beep = 1 ;
}
}
4.? 仿真proteus8.6
? 本設計采用proteus8.6軟件(內(nèi)附安裝包)實現(xiàn)仿真設計,如下圖所示。proteus軟件一般存在高低版本兼容問題,該仿真是通過proteus8.6導出的,所以請盡量使用proteus8.6打開文件,低于proteus8.6的版本不能夠正常使用,高于proteus8.6的版本除了proteus8.8/8.9理論上可以正常使用。
初始界面:
5.? 設計報告
設計報告主要包括硬件電路、軟件設計、仿真調(diào)試等等,僅供參考。
6.? 資料清單
設計資料主要包括C程序+仿真+設計報告+使用說明+元件清單+操作視頻等。
7.? 資料獲取鏈接
百度網(wǎng)盤下載鏈接:【V01】百度網(wǎng)盤下載鏈接
更多單片機仿真設計合集:單片機仿真設計合集