1、电路原理:
2、功能要求:利用独立八个按键,按下某个按键时,数码管显示对应音符,喇叭发出对应音调;
无按键按下时,数码管不显示 ,无声音输出。八个按键对应do,re,mi,fa, so,la,xi,do。
3、设计方案:
最近学习51单片机,利用定时中断做一个简单电子琴,注重简单,所以采用了独立按键的形式,
单片机选择经典的STC89C52RC,程序使用汇编指令。
4、程序代码
//51单片机8按键电子琴
//p2.4--脉冲输出
//p3.0---P3.7八按键,do,re,mi,fa,so,la,xi,do
//p2.0---数码管位选端
//p0---段码 用于显示按下时每一个音符
/***T0中断用来产生脉冲*****/
ORG 0000H
AJMP MAIN
ORG 000BH
CPL P2.4 //输出频率
MOV TH0,R3 //重装初值
MOV TL0,R4
RETI
/*****用来检测两次按键的状态*******/
//第一次检测按键值送42H单元,第二次检测按键值送41H
//单元,比较两次的值是否相等,如果不等说明一定有按键按下
//此时关定时器0,更改计数频率后启动T0;如果相等且等于0,说明
//没有按键按下,此时关定时器T0;如果相等且不等于0,
//说明按键还没有松手,不需要更改频率。
/*R2用来统计中断次数,第一次检测按键值送42H单元,
/*第二次检测按键值送41H单元
/****T1每10ms中断一次,用于判断有无按键按下*************/
ORG 001BH
MOV TH1,#00H //定时10ms
MOV TL1,#0DCH
INC R0 //R2用来统计中断次数
CJNE R0,#01H,YICI
MOV 42H,40H //第一次保存按键值到42H中
AJMP TT
YICI:MOV 41H,40H //第二次保存按键值到41H中
CJNE R0,#02,TT
MOV R0,#00H //恢复中断寄存器
TT:MOV A,41H
CJNE A,42H,GG1 //两次不相等转GG1
JZ GG3 //两次相等且是0转到GG3
SJMP GG2 //有按键按下,按键没有松手
GG1:CLR TR0
MOV R3,30H //更新数据
MOV R4,31H
SETB TR0
SJMP GG2
GG3:CLR TR0 //两次都为0,表示没有按键按下,关T0
SETB P2.4 //这两个语句如果关闭,则数码管一直显示
MOV P0,#0FFH //否则按下才显示对应音符
GG2:RETI
/********主程序********/
MAIN:
MOV TMOD,#11H
MOV TH1,#00H
MOV TL1,#0DCH
MOV R0,#00H //统计中断次数
SETB ET0
SETB ET1
SETB EA
SETB TR1
CLR P2.0 //数码管位选打开
MOV 40H,#00H //暂存键值
LOOP:ACALL KEYSAN
/****这段程序也可以不要,在T1中断中也有判断*/
MOV A,40H //根据键值判断是否按下
CJNE A,#00H,PLAY //40H的值不等于0,有按键按下
MOV P0,#0FFH
CLR TR0
AJMP LOOP //无按键按下转LOOP等待按键按下
PLAY:
/****这段程序也可以不要,在T1中断中也有判断*/
ACALL TM0I //查表求对应频率
ACALL DISP //显示音符
AJMP LOOP
/******键值查表求对应频率,确定音阶*******/
/*40H保存的键值,送A中,将a的值加倍,因为
表格中每一个音符的定时初值对应两个地址单元*/
TM0I:MOV A,40H //键值对应频率的位置
RL A //位置加倍
MOV B,A //暂存
MOV DPTR,#FREQ
MOVC A,@A+DPTR
MOV 30H,A //30H保存定时初值高八位
MOV A,B
INC A //位置加一,取下一个字节
MOVC A,@A+DPTR
MOV 31H,A //31H保存定时初值低八位
RET
//显示子程序
DISP:
MOV A,40H //键值用于显示
JZ DISPND //为0不显示
ADD A,#(TAB-TB) //修正查表位置
MOVC A,@A+PC
TB: MOV P0,A
DISPND:
RET
//按键检查测子程序
KEYSAN:
MOV 40H,#00H //用于暂存键值,不断刷新
MOV P3,#0FFH //p3口设置为输入口,检测按键
// MOV R7,P3 ;读引脚
// CJNE R7,#0FFH,KEYDWON ;判断是否有按键按下
// AJMP KEYEND ;无按键按下结束检测
//
//KEYDWON:
JNB P3.0,K0
JNB P3.1,K1
JNB P3.2,K2
JNB P3.3,K3
JNB P3.4,K4
JNB P3.5,K5
JNB P3.6,K6
JNB P3.7,K7
AJMP KEYEND
K0: MOV 40H,#01
SJMP KEYEND
K1: MOV 40H,#02
SJMP KEYEND
K2: MOV 40H,#03
SJMP KEYEND
K3: MOV 40H,#04
SJMP KEYEND
K4: MOV 40H,#05
SJMP KEYEND
K5: MOV 40H,#06
SJMP KEYEND
K6: MOV 40H,#07
SJMP KEYEND
K7: MOV 40H,#08
KEYEND: RET
FREQ: DW 0,64580, 64684, 64777, 64820, 64898, 64968, 65030, 65058
TAB: DB 0C0H,0F9H,0A4H,0B0H, 99H, 92H, 82H,0F8H, 80H, 90H
END