历史上的今天
返回首页

历史上的今天

今天是:2025年01月12日(星期日)

2018年01月12日 | 89c51六首歌曲的音乐门铃程序

2018-01-12 来源:eefocus

buzzer        equ        p2.4 
KEY        EQU        P3.7

            org         00h                  ;主程序起始地址 
            jmp          start                ;跳动主程序 
            org          0bh                  ;timer0中断起始地址 
            jmp          tim0                 ;跳至timer0在mode1 
start:       MOV           tmod,#00000001b      ;设timer0在mode1 
             MOV           ie,#10000010b        ;中断使能 
            jb           KEY,$               ;第一次按to? 
            call         delay1               ;消除抖动 
            jnb          KEY,$               ;to放开? 
             MOV           31h,#00              ;按to次数计数指针初值为00h 
start0:              
             MOV           30h,#low song        ;取简谱码指针(第1首) 
next:        MOV           a,30h 
             MOV           dptr,#table 
             MOV c         a,@a+dptr            ;至相关页码,高4位为音符的高低 
             MOV           r2,a                 ;低4位为音符的节拍 
            jz           end0                 ;检查简谱码是否已结束(有无00?) 
            anl          a,#0fh               ;取节拍(低4位)  
             MOV           r5,a                 ;存入r5,节拍的时间 
             MOV           a,r2 
            swap         a  
            anl          a,#0fh               ;取音频值(高4位) 
            jnz          sing                 ;是否为0,是0则不发音 
            clr          tr0 
            jmp          d1 
sing:       dec          a                    ;因0不列入 
             MOV           22h,a                ;存入(22h) 
            rl           a                    ;乘2 
             MOV           dptr,#table 
             MOV c         a,@a+dptr            ;至table取码,取t的值 
             MOV           th0,a                ;取到的高位字节存入th0 
             MOV           21h,a                ;取到的高位字节存入(21h) 
             MOV           a,22h                ;再载入取到的音符码 
            rl           a                    ;乘2 
            inc          a                    ;加1 
             MOV c         a,@a+dptr            ;至table取相对的低位字节计数值 
             MOV           tl0,a                ;取到的低位字节存入tl0 
             MOV           20h,a                ;取到的低位字节存入(20h) 
            setb         tr0                  ;启动timer0 
d1:         call         delay 
            inc          30h                  ;取简谱码指针加1 
            jmp          next 
end0:       clr          tr0                  ;停止计数器 
             MOV           a,31h                ;载入计次指针 
            xrl          a,#00h               ;是否按第1次? 
            jnz          end1                 ;不是则跳至end1 
            jb           KEY,$               ;按第2次? 
            call         delay1               ;消除抖动 
            jnb          KEY,$               ;放开否? 
            inc          31h                  ;计次地址(31h)加1 
             MOV           30h,#low song1       ;第2首歌指针 
            jmp          next 
end1:        
             MOV           a,31h                ;载入计次指针 
            xrl          a,#01h               ;是否按第2次? 
            jnz          end2                 ;不是则跳至end2 
            jb           KEY,$               ;按第3次? 
            call         delay1               ;消除抖动 
            jnb          KEY,$               ;放开否? 
            inc          31h                  ;计次地址(31h)加1 
             MOV           30h,#low song2       ;第3首歌指针 
            jmp          next 
end2:        
             MOV           a,31h                ;载入计次指针 
            xrl          a,#02h               ;是否按第3次? 
            jnz          end3                ;不是则跳至end3 
            jb           KEY,$               ;按第4次? 
            call         delay1               ;消除抖动 
            jnb          KEY,$               ;放开否? 
            inc          31h                  ;计次地址(31h)加1 
             MOV           30h,#low song3       ;第4首歌指针 
            jmp          next 
end3:        
             MOV           a,31h                ;载入计次指针 
            xrl          a,#03h               ;是否按第4次? 
            jnz          end4                 ;不是则跳至end4 
            jb           KEY,$               ;按第5次? 
            call         delay1               ;消除抖动 
            jnb          KEY,$               ;放开否? 
            inc          31h                  ;计次地址(31h)加1 
             MOV           30h,#low song4      ;第5首歌指针 
            jmp          next 
end4:        
             MOV           a,31h                ;载入计次指针 
            xrl          a,#01h               ;是否按第5次? 
            jnz          end5                 ;不是则跳至end2 
            jb           KEY,$               ;按第6次? 
            call         delay1               ;消除抖动 
            jnb          KEY,$               ;放开否? 
            inc          31h                  ;计次地址(31h)加1 
             MOV           30h,#low song5       ;第6首歌指针 
            jmp          next 
end5: 
            jmp          start                ;回到第1次位置 
tim0:       push         aCC                  ;将a的值暂存于堆栈 
            push         psw                  ;将psw的值暂存于堆栈 
            setb         rs0                  ;设工作寄存器库1,rs0=1,rs1=0 
            clr          rs1                   
             MOV           tl0,20h              ;重设计数值 
             MOV           th0,21h               
            cpl          buzzer               ;将p10位反相 
        clr        rs0 
            pop          psw                  ;至堆栈取回psw的值 
            pop          acc                  ;至堆栈取回a的值 
            reti                              ;返回主程序 
delay:       MOV           r7,#02               ;125秒 
d2:          MOV           r4,#125 
d3:          MOV           r3,#248 
            djnz         r3,$ 
            djnz         r4,d3 
            djnz         r7,d2 
            djnz         r5,delay             ;决定节拍 
            ret  
delay1:      MOV           r4,#20 
d4:          MOV           r3,#248 
            djnz         r3,$ 
            djnz         r4,d4 
            ret 

            org          300h                    
table:        
            dw           64260,64400,64524,64580  
            dw           64684,64777,64820,64898  
            dw           64968,65030,65058,65110  
            dw           65157,65178,65217 
song:       ;第一首歌  哈 巴 狗 
            ;1 
            db           42h,42h,42h,52h,62h,04h 
            db           62h,62h,62h,72h,84h,04h 
            db           92h,92h,82h,72h,64h,04h 
            db           82h,82h,52h,62h,44h,04h 
            ;2 
            db           42h,42h,42h,52h,62h,04h 
            db           62h,62h,62h,72h,84h,04h 
            db           92h,92h,82h,72h,64h,04h 
            db           82h,82h,52h,62h,44h,04h 
            db           00h 
song1:      ;第2首歌    生 日 快 乐 
            ;1 
            db           82h,01h,81h,94h,84h 
            db           0b4h,0a4h,04h 
            db           82h,01h,81h,94h,84h 
            db           0c4h,0b4h,04h 
            ;2 
            db           82h,01h,81h,0f4h,0d4h 
            db           0b4h,0a4h,94h 
            db           0e2h,01h,0e1h,0d4h,0b4h 
            db           0c4h,0b4h,04h 
            db           00h 
song2:      ;第3首歌     不 倒 翁 
            ;1 
            db           84h,94h,88h 
            db           64h,54h,68h 
            db           84h,64h,54h,44h 
            db           52h,42h,52h,62h,48h 
      
            ;2 
            db           84h,94h,88h 
            db           64h,54h,68h 
            db           84h,64h,54h,44h 
            db           52h,42h,52h,62h,48h 
            db           00h 
song3:      ;第4首歌       妹妹背着洋娃娃 
            ;1 
            db           84h,02h,82h,64h,54h 
            db           64h,54h,48h 
            db           64h,02h,52h,44h,24h 
            db           14h,24h,18h 
            ;2 
            db           24h,02h,22h,42h,24h 
            db           44h,54h,68h 
            db           54h,02h,52h,84h,84h 
            db           54h,64h,48h 
            db           00h 
song4:      ;第5首歌   两只老虎 
            ;1 
            db           44h,54h,64h,44h 
            db           44h,54h,64h,44h 
            db           64h,74h,88h 
            db           64h,74h,88h 
            ;2 
            db           82h,92h,82h,72h,64h,44h 
            db           82h,92h,82h,72h,64h,44h 
            db           44h,84h,48h 
            db           44h,14h,48h,00H 
song5:      ;第6首歌   三只小猫 
            ;1 
            db           62h,82h,82h,62h,98h 
            db           92h,0b2h,0b2h,82h,98h 
            db           62h,82h,82h,52h,68h 
            db           92h,0b2h,0b2h,82h,98h 
            ;2 
            db           62h,82h,82h,62h,92h,92h,94h 
            db           92h,0b2h,0b2h,92h,84h,94h 
            db           0b8h,0b4h,04h 
            db           00h 
            end            


89c51六首歌曲的音乐门铃程序


推荐阅读

史海拾趣

硕颉(BITEK)公司的发展小趣事

硕颉科技股份有限公司成立于1999年11月,总部设在台北市。自成立以来,公司一直专注于积体电路的设计、研发与销售,致力于为客户提供高质量的电子产品解决方案。在创立初期,硕颉便以其创新的技术和严谨的研发态度,迅速在电子行业崭露头角。公司资本额为新台币三亿三仟万元,为公司的稳健发展提供了坚实的资金基础。

Bergquist Company公司的发展小趣事

随着导热材料技术的不断进步,其应用领域也在不断扩展。Bergquist Company紧跟市场需求,将导热产品应用于汽车、家用电器、电脑、散热器、电源供应器及电马达控制等多个领域。这些产品的广泛应用不仅提升了人们的生活品质,还为公司的持续发展注入了强大动力。

Everett Charles Technologies (ECT)公司的发展小趣事

1996年,ECT为了进一步壮大在产业中的主导地位,加入了Dover集团。Dover集团是一家在纽约股票交易所上市的全美500强大企业之一,其业务涵盖工业、工程系统、流体、电子技术等多个领域。加入Dover集团后,ECT得到了更多的资源和支持,实现了跨越式发展。Dover集团的全球布局和丰富资源,为ECT在全球范围内的业务拓展提供了有力保障。

EMC [ELAN Microelectronics Corp]公司的发展小趣事

义隆电子一直注重人才培养和团队建设。公司积极引进国内外各知名学府的优秀人才,并提供完善的在职培训和优厚的福利待遇。同时,公司还建立了高效的团队协作机制,鼓励员工之间的交流和合作。这种注重人才培养和团队建设的策略使得义隆电子能够保持持续的创新能力和市场竞争力。

Ferroperm公司的发展小趣事

在发展的过程中,Ferroperm公司不断进行技术创新和产品研发,推动产品的多样化发展。他们成功开发了一系列具有高性能和独特功能的电磁材料,如高性能铁氧体、NdFeB永磁体等。这些产品不仅满足了客户对电磁材料性能的高要求,还推动了相关行业的发展。同时,Ferroperm还不断拓展产品线,推出了变压器、电感器、滤波器等一系列电子产品,进一步巩固了其在电磁材料领域的领先地位。

Belkin公司的发展小趣事

在发展过程中,贝尔金也通过收购其他公司来增强自身实力。例如,2013年贝尔金正式完成对Linksys的收购,这一举措进一步丰富了其产品线,并加强了在网络设备领域的竞争力。此外,贝尔金还通过不断整合内部资源,优化生产流程,提高产品质量和效率。

问答坊 | AI 解惑

整理中的传感器部分清单

传感器接近开关10-36VDC/200mA/4mmLJ18A3-4-Z/BX 乐清市新欧传感器有限公司1传感器接近开关10-36VDC/200mA/8mmLJ18A3-8-Z/BX 乐清市新欧传感器有限公司1传感器接近开关黄色/塑料/大   1传感器光电二极管发射管EL-1KL3  2传感器光电三极管接 ...…

查看全部问答>

人心不齐是团队发展的最大障碍

每个人哪怕略微有点责任心,对工作稍微注意点!…

查看全部问答>

WinCE6.0中Catalog Item没有CISCO Aironet 340/350 PCMCIA WLAN Card网卡驱动选项

我要加一个CISCO Aironet 350 PCMCIA 无线网卡,查看Windows Embedded CE6.0帮助文件,有CISCO Aironet 340/350 PCMCIA WLAN Card驱动可以用,位于Device Drivers\\Networking\\下。可是我的Wince6.0却找不到这个驱动,不知道怎么回事?…

查看全部问答>

暑期学习

a)        暑期嵌入式特色强化培训课程 i.        嵌入式Linux驱动与内核强化培训班 1.        课程目标 ◆ 掌握Linux操作系统及内核; ◆ 掌握ARM体系结构; ◆ 掌握嵌入式技术 ...…

查看全部问答>

WINCE 下ADSL拨号上网问题

wince5.0 我的板子不用ADSL线,用公司网络上网正常,说明网卡及驱动没有问题! 我用ADSL线直接接我的PC,通过输入用户名及密码,正常登录,并正常浏览网页,说明ADSL线及账户没有问题! 我的问题是: ADSL线接上我的板子,创建PPPOE后,只要一 ...…

查看全部问答>

【LaunchPad手记】MSP430 LaunchPad演示应用:内部温度测量

不会编辑帖子,直奔主题,利用刚刚到手的MSP430 LaunchPad演示应用,内部温度测量,注意到手后的430先不要下载新程序哦,里面是带程序的准备工作1:下载IAR for MSP430,因为我用的IAR就暂时不提CCS了哦准备工作2:检查电脑是否安装java程序,如果 ...…

查看全部问答>

时钟偏斜大于数据延迟在Quartus II 9.1 如何修改

问题就是这样的,怎么改时序约束啊,具体步骤,我对Quartus II 9.1 不是很熟啊…

查看全部问答>

【晒心得】+购买的EZ430-CHRONOS-433收到了,第一次海外购物总结

经过漫长的等待,终于在周五收到了手表。不容易啊。 总结下这次的海外购物经验: 这是我第一次从海外购买东西,共经历了7天时间。上周五下的订单,周一就过海关了,很神速。可惜联邦快递在国内不给力,货物到了济南,连续三天,一天是例外情况,F ...…

查看全部问答>

【Circuit Scribe:能通电的手绘电路】电路也能手绘出来?

在Kickstarter 上,一款神奇的圆珠笔Circuit Scribe(意为电路书写器)横空出世,它经过特殊处理,内部填充了可以导电的银制墨水,只需用它信手涂鸦,便可以轻松创造出电路,不需要面包板也不用接线。 $(\'flv_jl5\').innerHTML=(AC_FL_Ru ...…

查看全部问答>