
这样的例子,用汇编也不是很难。因为程序不会很长的。只写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语言程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)