高分求用8051单片机设计8按键电子琴

作者&投稿:从马 (若有异议请与网页底部的电邮联系)
求用单片机AT89C52制作的8个按键的简易电子琴的元件清单,~

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

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

  一、设计题目:
  设计一简易电子琴,要求能够发出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,你要的话可以给你,我还有份实训报告了。。。

注:没有汇编



这个可以吗




8051单片机中断源问题,求解
外部中断0 中断入口地址为 0003H 定时器0中断,入口地址为 000BH 外部中断1 中断入口地址为0013H 定时器1中断,入口地址为 001BH 串口中断,入口地址为 0023H

8051单片机时钟电路
8051单片机时钟电路如下所示:电容C2、C3对频率有微调的作用,电容容量的选择范围在30pF±10pF。震荡频率的选择范围为1.2-12MHz。时钟周期=石英振荡器频率的倒数。单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I\/O口和...

8051单片机的地址怎么分配啊?
如果你的地址空间有余富的话 可以使用p2.7,p2.6,p2.5作为地址线,分别将两个执行件映射到单片机的地址空间,这样可以按照访问存储器的方法使用movx指令进行控制。如果地址空间没有余富或者说地址线不够用,可以使用p1口的某三条线作为执行件的选通信号,具体使用那一位可以根据你的系统,只要没...

8051单片机中断源通常有哪几类?
8051单片机中断源通常分为三类,分别是:外部中断、定时中断和串行口中断。其中,外部中断和定时器中断可以自动清除,串行口中断不能自动清除。1、对于外部中断,CPU响应中断后,中断请求是自动撤除的,无需采取其他措施;2、对于定时器,CPU响应中断后,中断请求也是自动撤除的,无需采取其他措施;3、对于...

8051单片机:1、 用定时器T1方式1计数,要求每计满10次产生溢出标志,则TH1...
T1方式1计数 2的16次方-10=65526=fff6 H(换成16进制)

MIPS结构及指令能在8051单片机中应用吗,谁能提供一写相关资料,多谢._百...
东芝单片机门类齐全,4位机在家电领域有很大市场,8位机主要有870系列,90系列,该类单片机允许使用慢模式,采用32K时钟时功耗降至10UA数量级.东芝的32位单片机采用MIPS 3000A RISC的CPU结构,面向VCD,数字相机,图像处理等市场.8051单片机:8051单片机最早由Intel公司推出,其后,多家公司购买了8051的内核,使得以...

8051单片机的串行口具有几物理缓冲寄存器,分别对应几个逻辑地址_百度知 ...
串行口控制寄存器 MCS-51单片机串行口寄存器结构如图3所示。SBUF为串行口的收发缓冲器,它是一个可寻址的专用寄存器,其中包含了接收器和发送器寄存器,可以实现全双工通信。但这两个寄存器具有同一地址(99H)。MCS-51的串行数据传输很简单,只要向发送缓冲器写入数据即可发送数据。而从接收缓冲器读出数据...

关于一个8051单片机的编程~求大神指导!!跪求!
TEMPDATA30H ;定义一个临时数据 ORG 0000H LJMPMAIN ORG0100H MAIN: MOVDPTR,#NUMB ;将数据存放在表中 MOVR3,#6 MOVR4,#0 LOOP: MOVA,R4 MOVCA,@A+DPTR;从表中取数 MOVTEMP,A;将数据放入temp,此时 ;第一个数的低位在temp的低三位 INC R4 MOVA,R4 MOVCA,@A+DPTR;从表中取...

51单片机最小系统详解
单片机:一片AT89S51\/52或其他51系列兼容单片机 特别注意:对于31脚(EA\/Vpp),当接高电平时,单片机在复位后从内部ROM的0000H开始执行;当接低电平时,复位后直接从外部ROM的0000H开始执行.这一点是初学者容易忽略的.1、复位电路 复位电路的用途 单片机复位电路就好比电脑的重启部分,当电脑在使用...

两个8051单片机之间用方式2串行通信
串行口是单片机与外界进行信息交换的工具,8051单片机的通信方式有两种:并行通信:数据的各位同时发送或接收。串行通信:数据一位一位次序发送或接收。串行通信的方式 异步通信 用一个起始位0表示字符的开始,用停止位1表示字符的结束,中间夹着8个数据位,字符能一个接一个传送 CPU与外设之间必须有字符...

息烽县15971028907: 8051单片机c语言编一个程序 8个按键按下显示相应1到8 -
释凤香连: 8 个独立按键? #include<reg51.h>#define uchar unsigned char#define uint unsigned int uchar i; uchar code tab[]={ 0xC0,/*0*/ 0xF9,/*1*/ 0xA4,/*2*/ 0xB0,/*3*/ 0x99,/*4*/ 0x92,/*5*/ 0x82,/*6*/ 0xF8,/*7*/ 0x80,/*8*/ 0x90,/*9*/ }; sbit key1=P1^0; sbit key2...

息烽县15971028907: 设计一个包含8个按键和一个7段LED显示器的按键显示电路, 要求每按下一个按键, 在7段LED上显示该按键的编号 -
释凤香连: 电路不用经过特殊处理,8个按键接8个IO口上,7端LED显示器的按键显示电路按共阳极接,该下拉的下拉,显示该键的编号可以用软件来实现,比用硬件简单的多.

息烽县15971028907: 急求程序:8051单片机P0口接8个按钮控制P1口8个LED,按钮按下要求对应的LED亮2秒然后自动熄灭 谢谢
释凤香连: 你好 我也是初学者 我写了个可以实现你的功能 但是就是程序繁琐 供参考 附带电路图 因为P0口本身没有上啦电阻 所以用高电平触发 MAIN:MOV P1,#0FFH;初此化P1 LOOP:JB P0.0,L0;P0.0为1转到L0 JB P0.1,L1 JB P0.2,L2 JB P0.3,L3 JB P0....

息烽县15971028907: 需要基于8051单片机的8键电子琴的C代码! -
释凤香连: 首先你得编出8个键相应的音高和音调,分别对应信号的幅度和频率.需要键盘中断模块,用到51的外部中断来确定按键的序号,进入相应的中断处理程序,并驱动蜂鸣器发出对应频率的声音.大概步骤是这样的,具体的频率实现就是定时器那些,得反复调试才能出来合适的声音,c代码网上应该很多,大同小异!

息烽县15971028907: 单片机 8个按键分别控制对应的8个led的亮灭 程序设计 -
释凤香连: 八个灯接在单片机的P1口(P0,P2,P3,P4都一样) while(1) { delay(你想要延时的时间); P1=0xff; delay(你想要延时的时间); P1=0; } 注意led最好加驱动,不然单片机会坏的.

息烽县15971028907: 急求单片机课程设计.要求:八个按键控制八个LED,按下一个按键相应的LED亮一秒 -
释凤香连: 8个按键接P1口,8个LED接P0口. ORG 00H AJCX: JNB P1.0, AJCL-1 ;键按下,转移到消抖延时程序 JNB P1.1, AJCL-2 ;键按下,转移到消抖延时程序 JNB P1.2, AJCL-3 ;键按下,转移到消抖延时程序 JNB P1.3, AJCL-4 ;键按下,转移...

息烽县15971028907: 单片机C语言实现八个按键控制直流电机转与停,正转与反转,转速快慢 -
释凤香连: 驱动芯片一般都有2路PWM输入,一路负责正转,一路负责反转,比如正转的时候就反转那一路输出低电平,而调节占空比可以调节速度,2路都给百分之五十的PWM就实现停车.单片机不能直接驱动电机,因为单片机接口的电流不够,一般都外接电机驱动芯片

息烽县15971028907: 简单的51单片机设计,用8个按键独立控制8个灯的程序!(高分!)要求如下: -
释凤香连: 没有要求,就随便编一个吧.#include sfr key=P1; sfr LED=P0; main() { while(1) { LED=key; } }

息烽县15971028907: 跪求单片机8个按键的独立式键盘实验C程序源码!!!AT89C51的芯片、共阴极的数码管 -
释凤香连: #include#define nop() _nop_()#define keyport P1#define ledport P2unsigned char code seg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴数码管段码 void delayms(unsigned int ms) //12M { ...

息烽县15971028907: 单片机!求助高手“8个按键控制8灯不同亮法” -
释凤香连: 用汇编写可用查表方法: ORG 0H AJMP MAIN ORG 30H MAIN: MOV A,P1; P1接8个按键,表示8个值,每个键对应一种亮法 MOV DPTR,#TABLE JMP @A+DPTR TABLE:AJMP LAMP1;跳到相应的灯亮程序AJMP LAMP2......AJMP LAMP8;一共8个LAMP1:下面分别写8个亮灯的子程序,什么亮法自已写了 RET .... LAMP8: .... END

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网