51单片机汇编语言 8键电子琴(带注释)

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  
  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值