- UID
- 373967
- 帖子
- 9008
- 主題
- 2609
- 精華
- 0
- 積分
- 1003
- 楓幣
- 0
- 威望
- 980
- 存款
- 35891
- 贊助金額
- 0
- 推廣
- 0
- GP
- 1205
- 閱讀權限
- 70
- 在線時間
- 460 小時
- 註冊時間
- 2023-1-12
- 最後登入
- 2024-12-22
|
製作32鍵電子琴需要以下材料和工具:
材料:
PIC18F6620 微控制器
32 個按鈕或觸發器
32 個發聲器或喇叭
一個電源供應器 (通常是 9V 電池或外部電源)
適當的導線
電容器和電阻器
工具:
電線剝皮工具
焊接工具
電路板
連接線
麵包板
電池座
連接線插頭
以下是 PIC18F6620 的連接腳位:
┌───┐
VSS --| 1 |-- VDD
RA0 --| 2 |-- RA7
RB0 --| 3 |-- RB7
RC0 --| 4 |-- RC7
RD0 --| 5 |-- RD7
RE0 --| 6 |-- RE7
RF0 --| 7 |-- RF7
RG0 --| 8 |-- RG7
MCLR --| 9 |-- PGD
VPP --|10|-- PGC
OSC1 --|11|-- T1OSI
OSC2 --|12|-- T1OSO
CCP2 --|13|-- T1CKI
VSS --|14|-- AN5
VDD --|15|-- AN4
AN3 --|16|-- AN2
AN1 --|17|-- AN0
SS --|18|-- SCL
SDI --|19|-- SDA
SDO --|20|-- RX
TX --|21|-- CCP1
CCP2 --|22|-- RC6
AN6 --|23|-- RC5
RD4 --|24|-- RC4
RD3 --|25|-- RC3
RD2 --|26|-- RC2
RD1 --|27|-- RC1
RD0 --|28|-- RC0
VSS --|29|-- VDD
└───┘
基本的 PIC18F6620 32鍵電子琴的程式碼範例:
#include <xc.h>
#include <stdint.h>
#pragma config FOSC = HS
#pragma config WDTE = OFF
#pragma config PWRTE = OFF
#pragma config BOREN = OFF
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config WRT = OFF
#pragma config CP = OFF
#define _XTAL_FREQ 20000000
uint8_t notes[] = {52, 54, 55, 57, 59, 60, 62, 64, 66, 67, 69, 71, 72, 74, 76, 78, 79, 81,83, 84, 86, 88, 90, 91, 93, 95, 97, 98, 100, 102, 103, 105, 107, 109};
void main(void) {
TRISB = 0b11111111; // Set all RB pins as input
TRISC = 0b00000000; // Set all RC pins as output
while (1) {
for (uint8_t i = 0; i < 32; i++) {
if (PORTB & (1 << i)) { // Check if button is pressed
uint16_t period = 65536 - (int)((float)20000000 / (float)(4 * notes[i])) - 1; // Calculate period based on note
CCPR1L = period >> 8; // Load period into CCP1 registers
CCPR1H = period & 0xFF;
RC0 = 1; // Turn on speaker
}
}
RC0 = 0; // Turn off speaker
}
}
這個程式碼使用 PIC18F6620 的 CCP1 模組來生成PWM信號來控制音頻信號的發生。
每次迴圈,程式會掃描所有的按鈕輸入,如果按鈕被按下,則計算出相應音符的週期,並將週期載入CCP1寄存器中,以便生成該音符的聲音。
然後打開音箱,以便播放聲音。
最後,迴圈結束時,關閉音箱以停止聲音播放。 |
|