本节书摘来自异步社区《51单片机应用开发从入门到精通》一书中的第2章,第2.10节,作者 张华杰,更多章节内容可以访问云栖社区“异步社区”公众号查看。
2.10 变频报警实例
本实例是用软件延时方法实现变频振荡报警,即用P3.4端口输出1kHz和2kHz的变频信号以示报警,每隔1s交替变换1次。本节硬件设计与上节相同。
2.10.1 程序设计
本程序利用软件延时方法,使P3.4端口输出1kHz和2kHz的变频信号,每隔1s交替变换1次。
1.流程图
程序设计流程如图2-16所示。
2.程序
汇编语言编写的变频报警源程序FS02.ASM代码如下:
01: MAIN: MOV R1,#8 ;1kHz持续时间
02: LOOP1: MOV R2,#250
03: LOOP2: CPL P3.4 ;输出1kHz方波
04: ACALL DELAY2 ;调用延时500s子程序
05: DJNZ R2,LOOP2 ;持续1s
06: DJNZ R1,LOOP1
07: MOV R3,#16 ;2kHz持续时间
08: LOOP3: MOV R4,#250
09: LOOP4: CPL P3.4 ;输出2kHz方波
10: ACALL DELAY1 ;调用延时250s子程序
11: DJNZ R4,LOOP4 ;持续1s
12: DJNZ R3,LOOP3
13: JMP MAIN
14: DELAY1: MOV R5,#125 ;延时250s子程序
15: DJNZ R5,$
16: RET ;子程序返回
17: DELAY2: MOV R6,#250 ;延时500s子程序
18: DJNZ R6,$
19: RET ;子程序返回
20: END ;程序结束
2.10.2 代码详解
1.标号说明
START:程序开始的进入点。
LOOP1和LOOP2:输出1kHz方波,持续1s时间是采用双重循环来实现的。LOOP2是内循环的进入点,LOOP1是外循环的进入点。
LOOP3和LOOP4:输出2kHz方波,持续1s时间也是采用双重循环来实现的。LOOP4是内循环的进入点,LOOP3是外循环的进入点。
DELAY1:延时250s子程序的进入点。
DELAY2:延时500s子程序的进入点。
2.寄存器使用分配情况
在程序中,P3与R1~R6都是寄存器。P3是特殊寄存器,对外是输出端口;R1~R6是普通寄存器,用作计数器。
P3.4对内是寄存器P3的一个位,对外是P3端口的第5个引脚。
R1和R2:输出1kHz方波时,采用双重循环来实现持续1s所使用的两个计数器。
R3和R4:输出2kHz方波时,采用双重循环来实现持续1s所使用的两个计数器。
R5:延时250s子程序中所用的计数器。
R6:延时500s子程序中所用的计数器。
3.程序分析解释
本程序使P3.4端口输出1kHz和2kHz的变频信号,每隔1s交替变换1次。
01~06:完成1kHz的输出,并持续1s。
07~12:完成2kHz的输出,并持续1s。
14~16:输出1kHz时的延时子程序;17~19行语句为输出2kHz时的延时子程序。
第01~06行语句中,03行语句使P3.4端口作反相输出,每次反相输出后,都要调用延时子程序延时500s,该延时的时间决定着P3.4端口输出的频率为1kHz。
02和05行语句组成内循环,01和06行语句组成外循环。双重循环使输出1kHz方波时间持续为1s,如图2-17所示。
第07~12行语句的结构与第01~06行语句完全相同,只是调用的延时子程序的延时时间缩短了,输出2kHz方波,并持续1s。
第14~16行语句与第17~19行语句组成两个延时子程序,延时的时间不一样,但是程序结构一样,都属于单重循环结构的延时程序。
2.10.3 模拟仿真
该程序语句行数不多,但循环较多。因此,在模拟仿真时,主要是观察程序的运行路线,弄清每次循环的意图,以便更好地理解程序。
为了节省时间,在模拟仿真之前,可以先将寄存器R2、R4、R5和R6的数值减小。
2.10.4 实例测试
将写入变频报警程序的单片机插入实验板插座内,并检查实验板上的峰鸣器是否接在P3.4端口上,当检查无误后接通电源,会听到变频报警声。
实例测试时注意听声音的频率变化及频率变化的时间。该程序开始时先发出1kHz的声音,持续1s,接着发出2kHz的声音,也持续1s。不断循环,便产生变频报警声。
可以改变程序中延时子程序DELAY1或DELAY2的延时时间,观察声音的变化;再改变一下程序中的R1或R3的数值,观察发声长度的变化,从而加深对变频报警声产生原理的理解。
2.10.5 经验总结
本节程序利用两个频率声音交替变化,产生报警声,其中延时子程序中的延时时间决定输出声音的频率,双重循环延时的时间决定声音的长短。