单片机每计十个脉冲蜂鸣器响一用汇编语言 例如输入十个外部脉冲让蜂鸣器响一次

单片机每计十个脉冲蜂鸣器响一用汇编语言 例如输入十个外部脉冲让蜂鸣器响一次,第1张

这样的例子,用汇编也不是很难。因为程序不会很长的。只写2 位的,多位你自己可以加上,另外帮你顺便写上显示程序。

;16M晶振,共阴数码管显示

SP1 EQU P36

SP2 EQU P37

ORG 00H

AJMP MAIN

ORG 0BH

AJMP T0INT

ORG 1BH

AJMP T1INT

ORG 30H

MAIN: MOV SP,#60H

MOV DPTR,#TAB

MOV TMOD,#11H ;T0、T1定时方式1

SETB EA

SETB ET0

SETB ET1

MOV TH0,#3CH ;50ms定时常数

MOV TL0,#0B0H

MOV TH1,#0FEH ;05ms定时常数

MOV TL1,#0CH

K1:   ACALL   DISP

JB SP1,K2

ACALL DISP

JNB SP1,$-2

AJMP    CNT1

K2: ACALL DISP

JB SP2,K1

ACALL DISP

JNB SP2,$-2

AJMP CLR1

CNT1: INC  30H

INC  31H

MOV A,31H

CJNE A,#10,CNT2

MOV 31H,#0

SETB  TR0

SETB TR1

CNT2: MOV A,30H

CJNE A,#100,K1

MOV 30H,#0

AJMP K1

CLR1:  MOV 30H,#0

DISP: MOV A,30H

MOV B,#10

DIV AB

MOVC A,@A+DPTR

MOV P0,A

CLR P30

ACALL DLY

SETB P30

MOV A,B

MOVC A,@A+DPTR

MOV P0,A

CLR P31

ACALL DLY

SETB P31

RET

T0INT:  MOV TH0,#3CH ;定时器0作蜂鸣时间,定时常数50ms

MOV TL0,#0B0H

INC R0

CJNE R0,#40,RTI ;设蜂鸣器响2s,如果10次计数时间低于2s,R0要改小。

MOV R0,#0

CLR TR0

CLR TR1

RTI: RETI

T1INT:  MOV TH1,#0FEH ;P10  05ms高低电平变换一次,即输出频率1KHz的方波

MOV TL1,#0CH

CPL P10

RETI

DLY: MOV R6,#2

D1: MOV R7,#248

DJNZ R7,$

DJNZ R6,$-4

RET

TAB: DB        03FH;0

DB        006H;1

DB        05BH;2

DB        04FH;3

DB        066H;4

DB        06DH;5

DB        07DH;6

DB        007H;7

DB        07FH;8

DB        06FH;9

END

 两个子程序均实现延时1秒的功能,实现方式略有不同,但机制是一样的。

 

 

        CODE  SEGMENT

              ASSUME    CS:CODE

              ORG       100H

      START:  PUSH      CS

              POP       DS

              PUSH      CS

              POP       ES

              MOV       CX,10

              MOV       DL,7        ; 蜂鸣

        @00:

              MOV       AH,2

              INT       21H

              CALL      DELAY_PROC

              LOOP      @00

              

              MOV       AH,4CH

              INT       21H

     DELAY1S  PROC      NEAR

              PUSH      AX

              PUSH      CX

              PUSH      DX

              PUSH      SI

              PUSH      DI

              PUSHF

              MOV       AH,0

              INT       1AH

              MOV       SI,CX

              MOV       DI,DX

     @DELAY:

              MOV       AH,0

              INT       1AH

              SUB       DX,DI

              SBB       CX,SI

              CMP       DX,18       ; 延时1秒

              JB        @DELAY

              POPF

              POP       DI

              POP       SI

              POP       DX

              POP       CX

              POP       AX

              RET

     DELAY1S  ENDP

  ;================================================================

  DELAY_PROC  PROC      NEAR

              PUSH      ES

              PUSH      DX

              MOV       DX,40H

              MOV       ES,DX

              MOV       DX,ES:[006CH]

              ADD       DX,18       ; 延时1秒

    DELAY10:

              CMP       ES:[006CH],DX

              JBE       DELAY10

              POP       DX

              POP       ES

              RET

  DELAY_PROC  ENDP

       

      

        CODE  ENDS

              END       START

#include\r\n#include\r\n//本例采用89C52,晶振为110592MHZ\r\n//关于如何编制音乐代码,其实十分简单,各位可以看以下代码\r\n//频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍;\r\n//所以拿出谱子,试探编吧!\r\nsbitBeep=P1^5;\r\n\r\nunsignedcharn=0;//n为节拍常数变量\r\nunsignedcharcodemusic_tab[]={\r\n0x18,0x30,0x1C,0x10,//格式为:频率常数,节拍常数,频率常数,节拍常数,\r\n0x20,0x40,0x1C,0x10,\r\n0x18,0x10,0x20,0x10,\r\n0x1C,0x10,0x18,0x40,\r\n0x1C,0x20,0x20,0x20,\r\n0x1C,0x20,0x18,0x20,\r\n0x20,0x80,0xFF,0x20,\r\n0x30,0x1C,0x10,0x18,\r\n0x20,0x15,0x20,0x1C,\r\n0x20,0x20,0x20,0x26,\r\n0x40,0x20,0x20,0x2B,\r\n0x20,0x26,0x20,0x20,\r\n0x20,0x30,0x80,0xFF,\r\n0x20,0x20,0x1C,0x10,\r\n0x18,0x10,0x20,0x20,\r\n0x26,0x20,0x2B,0x20,\r\n0x30,0x20,0x2B,0x40,\r\n0x20,0x20,0x1C,0x10,\r\n0x18,0x10,0x20,0x20,\r\n0x26,0x20,0x2B,0x20,\r\n0x30,0x20,0x2B,0x40,\r\n0x20,0x30,0x1C,0x10,\r\n0x18,0x20,0x15,0x20,\r\n0x1C,0x20,0x20,0x20,\r\n0x26,0x40,0x20,0x20,\r\n0x2B,0x20,0x26,0x20,\r\n0x20,0x20,0x30,0x80,\r\n0x20,0x30,0x1C,0x10,\r\n0x20,0x10,0x1C,0x10,\r\n0x20,0x20,0x26,0x20,\r\n0x2B,0x20,0x30,0x20,\r\n0x2B,0x40,0x20,0x15,\r\n0x1F,0x05,0x20,0x10,\r\n0x1C,0x10,0x20,0x20,\r\n0x26,0x20,0x2B,0x20,\r\n0x30,0x20,0x2B,0x40,\r\n0x20,0x30,0x1C,0x10,\r\n0x18,0x20,0x15,0x20,\r\n0x1C,0x20,0x20,0x20,\r\n0x26,0x40,0x20,0x20,\r\n0x2B,0x20,0x26,0x20,\r\n0x20,0x20,0x30,0x30,\r\n0x20,0x30,0x1C,0x10,\r\n0x18,0x40,0x1C,0x20,\r\n0x20,0x20,0x26,0x40,\r\n0x13,0x60,0x18,0x20,\r\n0x15,0x40,0x13,0x40,\r\n0x18,0x80,0x00\r\n};\r\n\r\nvoidint0()interrupt1//采用中断0控制节拍\r\n{TH0=0xd8;\r\nTL0=0xef;\r\nn--;\r\n}\r\n\r\nvoiddelay(unsignedcharm)//控制频率延时\r\n{\r\nunsignedi=3m;\r\nwhile(--i);\r\n}\r\n\r\nvoiddelayms(unsignedchara)//豪秒延时子程序\r\n{\r\nwhile(--a);//采用while(--a)不要采用while(a--);各位可编译一下看看汇编结果就知道了!\r\n}\r\n\r\nvoidmain()\r\n{unsignedcharp,m;//m为频率常数变量\r\nunsignedchari=0;\r\nTMOD&=0x0f;\r\nTMOD|=0x01;\r\nTH0=0xd8;TL0=0xef;\r\nIE=0x82;\r\nplay:\r\nwhile(1)\r\n{\r\na:p=music_tab[i];\r\nif(p==0x00){i=0,delayms(1000);gotoplay;}//如果碰到结束符,延时1秒,回到开始再来一遍\r\nelseif(p==0xff){i=i+1;delayms(100),TR0=0;gotoa;}//若碰到休止符,延时100ms,继续取下一音符\r\nelse{m=music_tab[i++],n=music_tab[i++];}//取频率常数和节拍常数\r\nTR0=1;//开定时器1\r\nwhile(n!=0)Beep=~Beep,delay(m);//等待节拍完成,通过P1口输出音频(可多声道哦!)\r\nTR0=0;//关定时器1\r\n}\r\n}\r\n\r\n你参考这个吧

上面的未免有些复杂了,程序就不给了,提供你个思路如何?设置一个寄存器,里面就装#00H即可,每次按键按下自加一,利用二进制代码末尾的0,1特性,每次自加一之后把寄存器里的数值和#01H做乘法,直接判断处理数值是否为零即可,是则KEY为开,不是则KEY为关。自行设计一段程序脉冲,频率自行考虑。(由于蜂鸣器功率不大,建议1K即可)主程序就做个开关检测,利用子程序调用,开则调用子程序,然后自检测开关按键,相信就那几个机器周期是不碍事的。楼主可以自行试试。

以上就是关于单片机每计十个脉冲蜂鸣器响一用汇编语言 例如输入十个外部脉冲让蜂鸣器响一次全部的内容,包括:单片机每计十个脉冲蜂鸣器响一用汇编语言 例如输入十个外部脉冲让蜂鸣器响一次、求一个汇编语言程序的定时器,目的是让蜂鸣器一秒响一次。最好能有解释,没有也无所谓、怎样用stc89c52单片机控制蜂鸣器发出音乐的c语言程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10166764.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存