一直下学习单片机A51汇编语音,流水灯,数码管,独立按键基本上都可以写出来,而学习蜂鸣器,死活驱动不了无源蜂鸣器,今天在论坛看了admin的C语音,用他的C语言下载进去蜂鸣器响了,自己照他的程序写汇编,很多方式不太会用,汇编与C应用不是很懂(开始学习过一点C),不会写的去掉了,只留下自己会写的,下载程序,有点响了,改变定时器的时间,蜂鸣器响了,感觉很高兴,附上版主的程序和我的汇编程序,请各位指点一二
单片机源码:
这个为版主的C,下面为我写的汇编,已下载HEX文件到开发板可以正常发声了(驱动无源蜂鸣器,蜂鸣器为P1.0)
- BUZZ BIT P1.0
- ORG 0000H
- LJMP START
- ORG 000BH ;定时器0入口
- LJMP ZHONGDUAN;跳转到定时中断
- START:
- MOV TMOD ,#01H ; 使用定时器T0
- SETB EA ;开启总中断
-
- MAIN:
- LCALL OPENBUZZ ;调用开启无源蜂鸣器
- LCALL YS1 ;延时下
- LCALL STOPBUZZ ;关闭蜂鸣器
- LCALL YS1 ;延时下
- LCALL OPENBUZZ ;再开启蜂鸣器
- LCALL YS1 ;延时下
- LCALL STOPBUZZ ;关闭蜂鸣器
- LCALL YS1 ;再延时
- LJMP MAIN ;如此循环
- OPENBUZZ:
- MOV TH0,#0FFH ;定时时间在65536-65350=186US
- MOV TL0,#046H ;根据你蜂鸣器的频率不同,调节定时时间
- SETB ET0 ;开启定时器中断
- SETB TR0 ;开启定时器
- RET
- STOPBUZZ: CLR ET0 ;关闭定时器中断和关闭定时器,蜂鸣器将不会鸣叫
- CLR TR0
- RET
- ZHONGDUAN: MOV TH0,#0FFH ;给T0的重现赋初值
- MOV TL0,#046H
- CPL BUZZ ;对蜂鸣器进行取反
- RETI
-
- YS1: MOV R7,#20 ;延时子程序,时间长可以更改R6或R5的值。
- D1: MOV R6,#200
- D2: MOV R5,#100
- D3: DJNZ R5,D3
- DJNZ R6,D2
- DJNZ R7,D1
- RET
- END
复制代码
|