高分求用8051单片机设计8按键电子琴 用单片机实现8个按键的简单电子琴

作者&投稿:郁孔 (若有异议请与网页底部的电邮联系)
  一、设计题目:
  设计一简易电子琴,要求能够发出1、2、3、4、5、6、7等七个音符。
  使用元件:AT89C51、LM324,喇叭,按键等

  二、 设计目的
  (1)能够对电子电路、电子元器件、印制电路板等方面的知识有进一步的认识,独立对其进行测试与检查。
  (2)熟悉8051单片机的内部结构和功能,合理使用其内部寄存器,能够完成相关软件编程设计工作。
  (3)为实现预期功能,能够对系统进行快速的调试,并能够对出现的功能故障进行分析,及时修改相关软硬件。
  (4)对软件编程、排错调试、焊接技术、相关仪器设备的使用技能等方面得到较全面的锻炼和提高。

  三、系统硬件图

  原理:
  (一) 音乐产生原理及硬件设计
  由于一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时/计数器T0来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系弄正确即可。
  本次设计中单片机晶振为12MHZ,那么定时器的计数周期为1MHZ,假如选择工作方式1,那T值便为T= 216--5﹡105/相应的频率 ,那么根据不同的频率计算出应该赋给定时器的计数值,列出不同音符与单片机计数T0相关的计数值如下表所示:
  音符 频率(HZ) 简谱码(T值)
  中 1 DO 523 64580
  中 2 RE 587 64684
  中 3 M 659 64777
  中 4 FA 698 64820
  中 5 SO 784 64898
  中 6 LA 880 64968
  中 7 SI 988 65030

  采用查表程序进行查表时,可以为这个音符建立一个表格,有助于单片机通过查表的方式来获得相应的数据:
  TABLE DW 64580,64684,64777,64820,64898,64968,65030

  源程序:
  方案一:产生按键音符
  ORG 0000H
  LJMP MAIN
  ORG 000BH
  LJMP BREAK
  MAIN: MOV TMOD,#01H ;设置定时器0的工作方式
  SETB EA
  SETB ET0 ; 设置定时器0中断
  SETB TR0 ; 启动定时器0
  WAIT1: LCALL KEY ; 调用KEY子程序,判断有键按下否?第几个键?
  CLR EA ;屏蔽中断
  CJNE R3,#00H,WAIT1 ;如果R3=0,表示有键按下
  MOV A,22H ;将22H里存放的按键号送给A
  RL A ; 因为查表里都是字,所以得乘2查得数据
  MOV DPTR,#TABLE ;指向表头
  MOVC A,@A+DPTR ; 查表
  MOV TH0,A ;将数据高位送TH0
  MOV 21H,A ; 将高位备份
  MOV A,22H ;将22H里存放的按键号送给A
  RL A ;因为查表里都是字,所以得乘2查得数据
  INC A ;取低位数据
  MOVC A,@A+DPTR
  MOV TL0,A
  MOV 20H,A
  WAIT2: LCALL KEY
  SETB EA
  CJNE R3,#00H,WAIT1
  JMP WAIT2
  KEY: MOV R3,#00H ; KEY子程序,判断有键按下否?第几个键?
  MOV R1,#0FFH
  MOV R0,#00H
  MOV A,R1
  MOV P2,A
  MOV A,P2
  CLR C
  CPL C ;利用标志位CY来判断是哪个键按下
  MOV R2,#08H
  WAIT3: RLC A ;移位判断
  JNC STORE
  INC R0
  DJNZ R2,WAIT3
  STORE: MOV 22H,R0 ; 将按键号存22H,R3=0有键按下
  MOV R3,#00H
  RET
  BREAK: PUSH ACC ; 中断产生方波,从P1.0口输出
  PUSH PSW
  MOV TL0,20H
  MOV TH0,21H
  CPL P1.0
  POP PSW
  POP ACC
  RETI
  TABLE: DW 65030,64968,64898,64820,64777,64684,64580 ; 7,6,5,4,3,2,1
  END
  方案二:产生按键音符
  ORG 0000H
  SJMP START
  ORG 000BH
  AJMP INT_0
  ORG 0030H
  START: MOV P1,#00H
  SETB EA
  SETB ET0 ;计数器0
  MOV TMOD,#02H
  MOV TH1,#09CH
  MOV TL1,#09CH ;定时器初植
  CLR TR0 ;定时器不允许
  SCAN: ;键盘扫描
  MOV A,P2 ;判断键盘按下,跳到SCAN_1,若未按,继续扫描
  CJNE A,#0FFH,SCAN_1
  NOP
  SJMP SCAN
  SCAN_1:ACALL DELAY ;是不是真的要按下?如果是,则跳转SU_KEY查询是哪个按下?
  MOV A,P2
  CJNE A,#0FFH,SU_KEY
  NOP
  SJMP SCAN
  SU_KEY:JNB P2.1,MU_1 ;判断是哪个键按下?
  JNB P2.2,MU_2
  JNB P2.3,MU_3
  JNB P2.4,MU_4
  JNB P2.5,MU_5
  JNB P2.6,MU_6
  JNB P2.7,MU_7
  SJMP SCAN
  ;R1信号周期
  MU_1: MOV R1,#19 ;如果第一个按键按下,则R1=19,同时程序转NEXT
  SJMP NEXT
  MU_2: MOV R1,#17
  SJMP NEXT
  MU_3: MOV R1,#15
  SJMP NEXT
  MU_4: MOV R1,#14
  SJMP NEXT
  MU_5: MOV R1,#13
  SJMP NEXT
  MU_6: MOV R1,#11
  SJMP NEXT
  MU_7: MOV R1,#10
  SJMP NEXT
  NEXT: MOV A,R1
  MOV R0,A
  SETB TR0 ;启动定时器0
  NEXT_1:MOV A,P2 ; 没键按下继续执行,有键按下,返回读引脚
  CJNE A,#0FFH,NEXT_1
  ACALL DELAY
  MOV A,P2 ;真的没键按下?
  CJNE A,#0FFH,NEXT_1
  CLR TR0 ;不响
  AJMP SCAN ;扫描键盘去
  INT_0: ;中断程序
  DJNZ R0,RE ;R0不等于0时,返回
  CPL P1.0
  MOV A,R1
  MOV R0,A
  RE: RETI
  DELAY:MOV R7,#100 ;延长时间等待,键盘消抖
  D1: MOV R6,#10
  D2: DJNZ R6,D2
  DJNZ R7,D1
  RET
  END

  生日快乐歌:(扩展功能部分程序)

  ORG 0000H
  JMP MAIN
  ORG 000BH
  JMP TT0
  MAIN: MOV TMOD,#01H ;设置定时器0工作方式
  MOV IE,#82H ;设置中断
  MAIN0:MOV 30H,#00H
  NEXT: MOV A,30H
  MOV DPTR,#TABLE ;查表
  MOVC A,@A+DPTR
  MOV R2,A
  JZ STOP
  ANL A,0FH
  MOV R5,A
  MOV A,R2
  SWAP A
  ANL A,#0FH
  JNZ SING
  CLR TR0
  JMP W1
  SING: DEC A
  MOV 22H,A
  RL A
  MOV DPTR,#TABLE1 ;查表
  MOVC A,@A+DPTR
  MOV TH0,A
  MOV 21H,A
  MOV A,22H
  RL A
  INC A
  MOVC A,@A+DPTR
  MOV TL0,A
  MOV 20H,A
  SETB TR0
  W1: CALL DELAY
  INC 30H
  JMP NEXT
  STOP: CLR TR0
  JMP MAIN0
  TT0: PUSH ACC ;中断服务程序
  PUSH PSW
  MOV TL0,20H
  MOV TH0,21H
  CPL P1.0
  POP PSW
  POP ACC
  RETI
  DELAY:MOV R7,#2 ;延时187ms
  W2: MOV R4,#187
  W3: MOV R3,#248
  DJNZ R3,$
  DJNZ R4,W3
  DJNZ R7,W2
  DJNZ R5,DELAY
  RET
  TABLE1:DW 64260,64400,64524,64580 ;音符计数植
  DW 64684,64777,64820,64898
  DW 64968,65030,65058,65110
  DW 65157,65178,65217

  TABLE:DB 82H,01H,81H,94H,84H ;节拍表
  DB 0B4H,0A4H,04H
  DB 82H,01H,81H,94H,84H
  DB 0C4H,0B4H,04H

  DB 82H,01H,81H,0F4H,0D4H
  DB 0B4H,0A4H,94H
  DB 0E2H,01H,0E1H,0D4H,0B4H
  DB 0C4H,0B4H,04H

  DB 82H,01H,81H,94H,84H
  DB 0B4H,0A4H,04H
  DB 82H,01H,81H,94H,84H
  DB 0C4H,0B4H,04H

  DB 82H,01H,81H,0F4H,0D4H
  DB 0B4H,0A4H,94H
  DB 0E2H,01H,0E1H,0D4H,0B4H
  DB 0C4H,0B4H,04H
  DB 00H
  END 谢谢希望采纳

这是4*4矩阵式按键的,16个键,但只有c程序,汇编不会,算是给你点资料,参考参考吧,我的c程序放进去可以发出12个音,因为老师最后把这改成4*3,,12个键的,用的是Proteus,你要的话可以给你,我还有份实训报告了。。。

注:没有汇编



这个可以吗



求用单片机AT89C52制作的8个按键的简易电子琴的元件清单,~

如果你要用ISP线下载的话at89c52是不行的,s52以上的才可用ISP下载线下载。楼上的清单里可以不用语音芯片,“晶体”应该改为晶振(一般用12M的),起振电容用30PF左右,做电源还需要一个三端稳压芯片7805,由于单片机驱动能力有限,扬声器发出的声音会很小,这时如果你需要一个大一点的声音就要做一个功放电路,最简单便宜的就是LM386了,百度一下就有好多电路图了。如果你嫌麻烦可以在你设置的单片机音频输出端接一个3.5mm的音频接口,直接就可以插那些市场上卖的电脑小功放了。具体的电路和程序固件也可以发给你

简单的电子琴仿真实例,可以参考一下。

设8051单片机的P1的8位接8个发光二极管,正常情况下,二极管常亮;当外部...
答:org 0000h ajmp main org 0030h ajmp inter org 0030h main:mov ie,#10000001b mov r0,#1h flag:mov p1,#0ffh ajmp flag inter:mov a,r0 mov p1,a rl a lcall delay reti delay:mov r7 ,#20 d1: mov r6,#220 d2: mov r5,#200 djnz r5,djnz r6,d3 djnz r7,d1 ret end ...

用8051单片机设计步进电机控制器的原理和实现方法
答:关键字:四相步进电机 单片机 功率放大 红外遥控 目 录 前言 3 1.系统设计 3 1.1 功能介绍 3 1.2总体设计方案 3 1.2.1总体设计思路 3 1.2.2方案论证与比较 3 1.3电机的参数 7 1.4系统组成 7 2.单元电路设计 8 2.1功率放大驱动电路方案设计 8 2.2显示电路方案设计 9 2.3单片机...

简述8051单片机的定时/计数器的四种工作方式的特点。
答:C/T:C/T为0就是用作定时器(开关往上打),如果C/T为1就是用作计数器(开关往下打)。GATE:GATE后非门后是一或门,GATE=0时只要TR1=0则开关闭合。2、是16位的定时/计数方式,将M1、M0设为01即可,其它特性与工作方式0相同。3、自动装入预置数的工作方式。当溢出后,T(0/1)高、低八位...

如何实现51单片机的按键k1按下,LED流水灯向右移动,按键k2被按下,LED...
答:for(i=0;i<8;i++)。{。P1=temp1>>i。}。}。}。对控制LED口的寄存器进行位操作,按k1左移,按K2就是右移了。51单片机是对兼容英特尔8051指令系统的单片机的统称。51单片机广泛应用于家用电器、汽车、工业测控、通信设备中。因为51单片机的指令系统、内部结构相对简单,所以国内许多高校用其进行...

基于8051单片机的高精度时钟设计 要求 LCD显示当前的年、月、日,时...
答://display(8,0);while(1){ sec(num0);display(6,20);delayms(2);min(num1);display(3,20);delayms(2);hour(num2);} } void display(uchar w,uchar value){ WR=1;P0=table1[value];HC138A=1;HC138B=1;HC138C=1;WR=0;WR=1;P0=table2[w];HC138A=0;HC138B=1;HC138C=1...

单片机8051电子时钟设计
答:/ include <reg51.h> include <stdio.h> define uchar unsigned char void timer0();void init_T0();void delay(uchar);void display();void convert();void pressKey();sbit K0=P3^0;sbit K1=P3^1;sbit K2=P3^2;sbit K3=P3^3;//共阴:0,1,2,3,4,5,6,7,8,9,- code ...

8051单片机功能简介
答:从这里我们可以看到,当系统没有进行扩展时ALE会以1/6振荡周期的固定频率输出,因此可以做为外部时钟,或者外部定时脉冲使用。PORG为编程脉冲的输入端 在第五课 单片机的内部结构及其组成中,我们已知道,在8051单片机内部有一个4KB或8KB的程序存储器(ROM),ROM的作用就是用来存放用户需要执行的程序的...

求基于8051单片机用C语言编写的双矩阵键盘扫描程序(5个IO口控制25个按 ...
答:我这里有一个程序,include<reg51.h> define rowkey() (~P2)&0x0f//键盘输入端 define OUT P0 //数码管显示输出端 unsigned char code TAB[]= { 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0x89,0xC7,0xC8,0xC1,0x8C,0xA3,...

如何利用8051的单片机定时/计数器产生定时时钟,由P1口控制8个发光二极 ...
答:你是学单片机的吧,我也是,这是单片机最简单的运用了、我电脑里有汇编程序呢。QQ810758582,我发给你

如何设计8051单片机应用系统的复位电路
答:第十六课:51单片机的复位 51单片机高电平复位。以当前使用较多的AT89系列单片机来说,,在复位脚加高电平2个机器周期(即24个振荡周期)可使单片机复位。复位后,主要特征是各IO口呈现高电平,程序计数器从零开始执行程序。复位方式有两种。1. 手动复位:按钮按下,复位脚得到VCC的高电平,单片机复位,...