《匠人手记》推荐网上购书渠道:
互动出版网(china-pub)购书入口   >>>
当当网(dangdang)购书入口   >>>
卓越亚马逊网 购书入口   >>>
淘宝网(taobao)购书入口   >>>
更多购书渠道……   >>> 

设为首页加入收藏联系匠人管理入口21IC首页21IC博客21IC社区侃单片机回复的贴参与的贴

天气预报
百宝日历
载入中...

百宝专栏

载入中...
最新货色

载入中...

粉丝评论

载入中...

载入中...



百宝信息

载入中...

百宝流量

(2006-07-01开始)


匠人手记

 匠人观点: 好记性不如烂笔头  
 黑色幽默:三鹿门——后世畅想

简易电子琴的设计(ASM程序)
程序匠人 发表于 2005-10-19 19:42:00  阅读全文 | 回复(0) | 引用通告 | 编辑

简易电子琴的设计 


作者:luwenxi 

一、设计题目:
设计一简易电子琴,要求能够发出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
 

看《匠人手记》,与匠人同行!北航出版,正在热卖!

发表评论:
载入中...

芯片专题

器件专题

软件专题

硬件专题

综合专题

项目专题

原创专题

器件检测
LCD LED
按键 触摸键
E2PROM
电池 电机
电阻 电容 电感

指令系统
软件算法
编程规范
滤波算法
串行通讯

PCB设计
I2C PWM
红外遥控
充电技术
中断 ADC 

匠人手记
匠人夜话
网络心路
一周热点串烧
从零开始玩PIC
DIY旋转时钟

广告5号位 [投放]


学习板、开发板、编程器、下载器、仿真器(查看详情……)

广告3号位 [投放]

站内搜索


站外搜索


百度  google
mp3  歌词 
图片  FLASH 
知道  文档
新闻  词典 
地图  mp3 
软件  天网 
雅虎  爱问 
搜狗  讯雷 
网讯  华军 
天空 

21IC器件搜索
百宝箱分站
  • 《匠人的百宝箱》21IC站
  • 《匠人的百宝箱》21IC笔记团队
  • 《匠人手记》21IC书友会
  • 《匠人的百宝箱》MCUBLOG站
  • 《匠人的百宝箱》MCUBLOG笔记团队
  • 《匠人的百宝箱》EDN站
  • 《匠人手记》EDN书友会
  • 《匠人的百宝箱》与非网站
  • 《匠人的百宝箱》新浪站
  • 《匠人的百宝箱》百度站
  • 《匠人的百宝箱》网易126站
  • 《匠人的百宝箱》网易163站
  • 《匠人的百宝箱》互动出版网站
  • 广告4号位 [投放]

     
     

    匠人原创

    往日酷贴

     
     
     

    大千八卦

    友情连接

    新浪新闻:
    新浪财经:
    AK58新闻:
    新浪股票:
    新浪股票:
    证券之星:

     [更多酷站连接]

     

     

    [欢迎交换连接]

    [百宝箱之与非门分舵]

    [电脑圈圈的家当]

    [IC921的博客]

    [柔月阁]

    [八楼的呼吸]

    [hotpower 的水潭]

    [xwj的文君阁]

    [所长的BLOG]

    [阿摆手记]

    [电子伙伴]

    [unaided的笔记]

    [小飞的笔记]

    [单片机开发联盟]

    [网址之家]

    [好东西网址大全]

    [美萍中文精选]

    [数字电视之家]

    [SMARTCODE电子书斋]

    [软件开发之窗]

    [Armoric]

    [我爱研发网]

    [infernal的笔记]

    [雄鹰的空中加油站]

    [SunK]

    [逍遥电子]

    [ningpanda的博客]

    [C-Design]

    [一网见天下]

    [海边淘沙]

    [嵌入式365]

    [水牛的仓库]

    [股剩是怎样炼成的]

    [PIC论坛]

    [ICC AVR开发网]

    [中国高校自动化网]

     

     

     

    MCU博客-中国电子工程师博客网 

    大学生电子网 

     

     

     

     

     

    !!! 《匠人的百宝箱》 !!!