其实单片机的功能是很强大的,而这里,我倒很愿意同各位朋友一起分享一个单片机来作门铃的试验程序。一般的单片机学习板上都有嗡鸣器(也就是我们常说的喇叭),所以利用它来模拟门铃的功能其实挺简单的。
废话少说,下面就进入主题:声音是由振动所产生的,而要发出“抑扬顿挫”的声音,就需要改变驱动信号的频率。现在假设喇叭的驱动信号线接口是P1.1,那么当你以100次每秒的速度来改变P1.1的电平高低和你以1000次每秒的速度改变P1.1的电平状态所产生的效果显然是不一样的。(当然前者是“男低音”,后者是“女高音”)
我用的是AT89S52芯片,22.1184MHz的晶振,用延迟子程序来控制高音,低音,静音的延迟时间,利用中断来驱动喇叭发音。具体设计为:高音为1KHz,低音为600Hz,且高音的持续时间为0.6S,低音的持续时间为1S,静音的持续时间为1.2S。嗡鸣器接口为P3.7,具体参考程序如下:
ORG 0000H ;从地址0000开始执行
JMP START ;跳转到START处
ORG 0BH ;TIMER0 的中断矢量
JMP TIMER_0 ;跳转到TIMER—0
START :
MOV IE , #10000010B ;打开TIMER0 的开关
MOV TMOD , #00000001 ;设置TIMER0的计时方式MODEL1
MOV SP ,#70 ;移开堆栈
<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />LOOP:
MOV R1 , #252 ;设置定时值
MOV R0,#91 ;
CALL LOAD ;调用装载TIMER0的子程序
MOV R5,#6 ;设定延迟时间
CALL DELAY ;调用延迟子程序
CLR TR0 ;关闭TIMER0
MOV R1,#249 ;设定TIMER0的值
MOV R0,#242 ;
CALL LOAD ;调用装载子程序
SETB TR0 ;打开TIMER0
MOV R5,#10 ;设定延迟时间
CALL DELAY ;调用延迟子程序
CLR TR0 ;关闭TIMER0
MOV R5,#12 ;设定延迟时间
CALL DELAY ;调用延迟子程序
JMP LOOP ;跳转到LOOP处形成循环
//******************以下为延迟子程序(基准为0.1S)***************//
DELAY:
MOV R4,#2 ;
D2: MOV R7 ,#200 ;
D1: MOV R6,#250 ;
DJNZ R6,$ ;
DJNZ R7,D1 ;
DJNZ R4,D2 ;
DJNZ R5,DELAY ;
RET ;
//***************以下为TIMER0的装载子程序********************//
LOAD:
MOV A,R1 ;
MOV TH0,A ;
MOV A,R0 ;
MOV TL0,A ;
SETB TR0 ;
RET ;
//**************以下为TIMER0的中断服务子程序**************//
TIMER_0:
CLR TR0 ;
CALL LOAD ;
CPL P3.7 ;
SETB TR0 ;
RETI ;
END ;
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
用户152713 2008-5-8 16:53
用户66632 2007-3-17 13:57
用户587325 2007-3-14 17:29