历史上的今天
返回首页

历史上的今天

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

2018年01月11日 | 单片机六首歌曲的音乐门铃程序

2018-01-11 来源: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             


推荐阅读

史海拾趣

Advanced Fibreoptic Engineering Ltd公司的发展小趣事

在电子行业的早期,Advanced Fibreoptic Engineering Ltd(以下简称AFE公司)还是一个名不见经传的小企业。然而,随着技术的不断进步,AFE公司凭借其在光纤技术领域的深厚积累,成功研发出了一种具有划时代意义的新型光纤材料。这种材料不仅传输速度快,而且损耗极低,极大地提高了数据传输的效率和质量。这一技术突破迅速为AFE公司赢得了市场认可,公司的订单量激增,业绩逐年攀升。

随着技术的推广和应用,AFE公司的光纤产品逐渐在通信、医疗、工业等多个领域得到广泛应用。公司不仅在国内市场占据了一席之地,还积极拓展海外市场,与国际知名企业建立了稳定的合作关系。凭借卓越的产品性能和良好的市场口碑,AFE公司逐渐在电子行业中崭露头角,成为了光纤技术领域的佼佼者。

以上是第一个故事的示例,若您想要探索更多关于AFE公司的发展故事,请输入继续。

(注:由于我无法实时获取具体公司的实际发展故事,以上故事为虚构内容,仅用于展示故事编写风格和结构。如果您需要真实、具体的故事,请提供更多关于AFE公司的信息,以便我能为您编写更贴近实际的内容。)

Emulation Technology Inc公司的发展小趣事

作为一家在电子行业具有影响力的企业,Emulation始终关注社会责任和可持续发展。公司积极参与各种公益活动,为当地社区的发展做出了贡献。同时,Emulation还注重环保和节能,致力于推动绿色电子产品的设计和生产。这些举措不仅提升了公司的社会形象,还为公司的长期发展奠定了坚实的基础。

Axiohm公司的发展小趣事

随着国内市场的饱和,Axiohm公司开始寻求国际化发展。公司制定了详细的国际化战略,先后在亚洲、欧洲和北美设立了分支机构和研发中心。通过与当地企业的合作,Axiohm成功打入多个国际市场,并根据不同地区的需求进行产品定制。这一战略不仅拓宽了公司的销售渠道,还提升了品牌知名度。

Herga公司的发展小趣事

在竞争激烈的电子行业中,Herga公司始终将客户服务和技术创新放在同等重要的位置。公司建立了完善的客户服务体系,提供从售前咨询、方案设计到售后服务的全方位支持。同时,Herga公司不断加大研发投入,与国内外知名高校和研究机构建立合作关系,共同探索电子行业的前沿技术。这种客户服务与技术创新并重的战略使得Herga公司能够持续满足市场需求,保持竞争优势。

请注意,以上故事均为基于电子行业一般发展趋势和可能的公司发展路径构建的假设性案例,并非直接来源于Herga公司的官方记录。

COMPEX公司的发展小趣事

COMPEX公司自成立以来,一直致力于电子技术的研发与创新。在光通讯领域,公司凭借先进的光通讯模块电路板小器件技术,逐渐在市场中占据了一席之地。COMPEX团队不断突破技术壁垒,推出了多款高性能、高可靠性的产品,赢得了客户的广泛认可。同时,公司还积极与国内外知名企业和研究机构合作,共同推动电子行业的技术进步。

Giga公司的发展小趣事
通过定时控制LED灯的亮灭,实现视觉效果。

问答坊 | AI 解惑

按Ctrl+Alt+delete没有反应

前天我用木马克星杀了一次毒,等杀完以后,再点击按Ctrl+Alt+delete的键时,系统没有任何反应,不弹出任务管理器,请问这是什么问题 请各位高手给以解答 在此万分感谢!!!…

查看全部问答>

【资料下载】STM32固件库1.0版使用说明的中文翻译

运行于EK-STM32F学习板上的STM32固件库中的例子 相关链接:http://www.stmicroelectronics.com.cn/stonline/mcu/images/STM32F10xxx_Library_Manual_ChineseV2.pdf…

查看全部问答>

请教关于USB初始化的问题

根据 ST 虚拟串口 的例子,改写了一个用USB与上位机通信的程序。现在的问题是,原程序 把 USB_Init();语句放在了 main 函数里面,这样如果插着USB线给 ARM 上电的话,就会导致 usb的初始化 ...…

查看全部问答>

请教香主,STM32有内置的硬件CRC计算单元吗?

请问香主,我在www.stmfans.com里面看到了一个帖子说STM32有内置的硬件CRC计算单元,我在库文件、datasheet上都没有找到。请问真是的是有吗?如果有,在那个模块?stmfans的链接如下:http://www.stmfans.com/bbs/viewthread.php?tid=325&high ...…

查看全部问答>

求教2812 ad问题

各位好:我在ad程序里添加了两个变量:float  in_voltage[NP]; float  step_h[NP];后出现这个错误error: can\\\'t allocate .ebss (sz: 00002898 page: 1) in DRAMH0 (avail:            ...…

查看全部问答>

发布DIY进展,未完成

最近一个月多月,工作上的事情繁多,没能够及时的完成前期参与的论坛活动,深感抱歉!先开个帖子,我慢慢的补吧 本来打算做成这样的。 总体设计框图 实现的功能 1.         完成A/D转换,FFT变换 ...…

查看全部问答>

请问各位前辈帮指点一下晚辈 甚是感谢

请问各位前辈 我想知道怎么调节两相占空比相同 相位相差一定角度 比如60 度 90度 在430中应该怎么设定啊…

查看全部问答>

PADS9.3经典3合一教程

“读万卷书,不如行万里路,行万里路,不如阅人无数,阅人无数,不如名师点悟。”技术交流群78321575 78321575 78321575 谢谢!…

查看全部问答>

为什么定时器T0.c没有调用

define.h #include #define uchar unsigned char #define uint unsigned int sbit led1=P1^0; uchar num; main.c #include void main(void) { TMOD=0x01; TH0=(65536-45872)/256; TH0=(65536-45872)%256; EA=1; ET0=1; TR0=1; ...…

查看全部问答>