原创 用单片机来做门铃?

2007-3-2 19:42 3820 8 11 分类: MCU/ 嵌入式

其实单片机的功能是很强大的,而这里,我倒很愿意同各位朋友一起分享一个单片机来作门铃的试验程序。一般的单片机学习板上都有嗡鸣器(也就是我们常说的喇叭),所以利用它来模拟门铃的功能其实挺简单的。


废话少说,下面就进入主题:声音是由振动所产生的,而要发出“抑扬顿挫”的声音,就需要改变驱动信号的频率。现在假设喇叭的驱动信号线接口是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                  ;跳转到TIMER0


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" />

 


 

文章评论3条评论)

登录后参与讨论

用户152713 2008-5-8 16:53

我想知道音乐程序是怎么翻译出来的?简谱是怎么翻译成代码的?我想让您解释的仔细一点。谢谢

用户66632 2007-3-17 13:57

这是我随便选的,如果你想,也可以用11.0592MHz,12MHz,24Mhz等,不过,如果你的晶振频率不是22.1184,那么需要在我的程序里修改一些参数,否则发出的声音不会那么悦耳……

用户587325 2007-3-14 17:29

请问:这里晶振的数值有特定的吗?为什么要用22.1184M?
相关推荐阅读
用户66632 2007-04-13 20:14
最近有点迷失目标了
又很久没有来BLOG了,说实在的,最近确实有点乱.在别人眼里看来我挺忙的,整天见不到人.的确,我和我的班级已经脱节了,甚至有很多人很久都没有见到了.       下午的时候忽然间想反省一下自己,总觉的...
用户66632 2007-02-21 00:13
生活随想
        很久没有写东西了,以前都是些日记的,不过,如今大伙都流行写博客。为了不让自己落伍,我也得改改“陋习”了,呵呵     最近一直很郁闷,说不上为什么?总感觉很烦,做事情没有激情。主要是自...
用户66632 2007-02-15 17:04
单片机实现交通灯的一些感想
       上午别人拿给我一个程序,关于单片机模拟实现城市交通灯的,也可以称的上是MCU中一个很经典的程序吧。朋友写了很久终于搞定的,而且用KEIL生成了.HEX文件,但当烧到片子里的时候出向了问题...
用户66632 2007-02-06 13:37
单片机的一点感想
  昨天有个朋友问我一个关于单片机ADC和DAC的问题,解释了半天,他才明白为什么要有OC门,什么是缓冲器,它的作用是什么.呵呵,其实这些都是一些很基础的知识了,如果这些东西都搞懂了,你就可以称得上是...
用户66632 2007-02-03 20:24
有点郁闷
 忽然之间发现自己最近挺没目标的,已经差不多十来天没有认真做事情了。上午的时候一直在忙着装软件,CAD, 3D MAX, ADAMS,PRO/E ,唉,说实在的,到现在为止也就一个CAD装好了,其余的...
我要评论
3
8
关闭 站长推荐上一条 /2 下一条