前些日子,做而論道寫了一篇關于單片機發音的文章,后來,就不斷有網友來電詢問單片機電子琴的設計方法。
以前制作過一個24鍵(獨立按鍵)的,程序是用匯編語言寫的,估計多數人看不了。
下面,把新設計的16按鍵的電子琴,公布給網友。
電路圖如下:
制作說明:
單片機采用51系列的都行,AT89C2051也可;
圖中沒有畫出復位和晶振電路,實際制作時,不可省略,晶振可以使用11.0592或12MHz;
揚聲器應該按照圖中給出的附圖加上驅動電路;
顯示器及七段譯碼器不接,單片機電子琴也可以正常工作。
74LS47 和數碼管之間,應該接上“限流電阻”,約 470 歐姆即可。
C語言程序如下:
/*************************************************************
* 程序功能 : 對4×4矩陣鍵盤進行掃描,顯示鍵值和輸出音響
**************************************************************/
#include
#include
#define uint unsigned int
#define uchar unsigned char
sbit SPK = P3^7; //P3.7外接揚聲器
uint FreqTemp;
unsigned int code Freqtab[] = { //定時半周期的初始值
64021,64103,64260,64400, //低音3 4 5 6
64524,64580,64684,64777, //低音7,中音1 2 3
64820,64898,64968,65030, //中音4 5 6 7
65058,65110,65157,65178}; //高音1 2 3 4
/*************************************************************
* 函數功能 : 用掃描法讀 P1 外接 4×4 鍵盤
* 函數返回 : 按下鍵:返回0~15、如無鍵按下:返回16
**************************************************************/
uchar Keyscan(void)
{
uchar i, j, temp, Buffer[4] = {0xfe, 0xfd, 0xfb, 0xf7};
for(j = 0; j < 4; j++) { //循環四次,掃描四行
P1 = Buffer[j]; //在低四位分別輸出一個低電平
_nop_();
temp = 0x80; //計劃先讀出P1.7位
for(i = 0; i < 4; i++) { //循環四次,檢查四列
if(!(P1 & temp)) { //從高四位,截取1位
return (i + j * 4); //返回取得的按鍵值
}
temp >>= 1; //換右邊一位
} }
return 16; //沒有鍵按下就返回16
}
/**************************************************************
* 函數功能 : 將參數分成十位、個位,分別顯示到P2
* 輸入 : k (鍵盤數值)
***************************************************************/
void Display(uchar k)
{
P2 = ((k / 10) << 4) + (k % 10);
}
/**************************************************************
* 主函數
***************************************************************/
void Main(void)
{
uchar Key_Value = 16, Key_Temp1, Key_Temp2;//讀出的鍵值
TMOD = 0x01; //T0定時方式1
ET0 = 1; //允許T0中斷
EX0 = 1; //允許X0中斷
EA = 1;
while(1) {
TR0 = 0; //暫不發音
Key_Temp1 = Keyscan(); //讀入按鍵
if(Key_Temp1 != 16) { //有鍵按下
Display(Key_Value); //顯示鍵值、延時消抖
Key_Temp2 = Keyscan(); //再讀一次
if (Key_Temp1 == Key_Temp2) {//兩次相等
Key_Value = Key_Temp1; //就確認下來
FreqTemp = Freqtab[Key_Value]; //根據鍵值,取出定時半周期的初始值
Display(Key_Value); //顯示
TR0 = 1; //啟動定時器,發音
while (Keyscan() < 16); //等待釋放
SPK = 1; //停止發音
} } } }
//===============================================
void T0_INT(void) interrupt 1
{
TL0 = FreqTemp; //載入定時半周期的初始值
TH0 = FreqTemp >> 8;
SPK = ~SPK; //發音
}
//===============================================
上一篇: 4×4 矩陣式鍵盤電路的改進
下一篇:利用定時方式0,測量外部脈沖寬度(5到250ms),74HC595輸出顯示
推薦閱讀
史海拾趣
希望可以有參考價值。 1.西門子: TC35 MC35 2.WAVECOM: Q2403 Q2501 3.索尼愛立信: GR47 4.華為: GTM900 5.中興: MZ28 等等。。。。… 查看全部問答∨ |
建立一個新的應用程序,它采用標準庫函數來顯示一條hello world消息: 1、在相應安裝文件的myprojects文件夾中建立新的文件夾hello; 2、在tutorial/hello中的所有文件拷貝到上述新文件夾(就是這一步,我找不到這個目錄 ...… 查看全部問答∨ |
上位機的一個截圖。這是我空間里貼的圖http://hi.baidu.com/bd%5Fshb/blog/item/ac0cb2c2804a4c180ef47794.html… 查看全部問答∨ |
本人現在在用8051單片機做一個5×6的鍵盤的程序,鍵盤掃描已調試成功,在示波器上也能觀察到按下其中任一按鍵時,時鐘線與數據線有正常的波形出來,但是接上PC后確不能使用,后在網上查找,發現在上電時要有一個上電自檢的過程,但找到的東西沒有 ...… 查看全部問答∨ |
本帖最后由 jameswangsynnex 于 2015-3-3 19:59 編輯 派睿電子公司(隸屬于Premier Farnell集團)日前宣布采用其支付寶服務的用戶群數量在華實現翻倍增長,并且該趨勢正在持續加強。自其推出支付平臺至今的一年中,不斷贏得廣大電子設計工程師的一 ...… 查看全部問答∨ |
各位大俠,緊急求助,我買了一個MSP430仿真器PCB空板,焊好后通過USB插上電腦后,電腦設別后就自動裝上了驅動 然后我就更新了固件,連接板子下載程序,可是下不進去,顯示了如下圖 &nbs ...… 查看全部問答∨ |
FPGA配置電路可以看成用戶設計和硬件電路之間的連接紐帶,最終目的是在一定外部條件下,準確快速地實現FPGA系統配置。 在FPGA的配置系統中,軟件編程由FPGA提供商提供,設計人員要掌握其操作方法, 將配置數據從PC加載到XilinxFPGA芯片的整個配 ...… 查看全部問答∨ |
Altium Designer 6.9畫原理圖 問題 大家幫忙看看。 我用 Altium Designer 6.9畫了一個關于51單片機 最后規則檢查時出現Signal PinSignalJ8_2[0] has no driver 錯誤 而且出現的很多錯誤都是這種類型的! 不知道怎么修改,請大家幫忙看看。… 查看全部問答∨ |