单片机_汇编编程_报警产生器
时间:2017/9/28
# 一、任务描述
通过汇编编程,从而控制P1.0口输出1kHz和500Hz的音频信号驱动扬声器,作为报警信号。要求1kHz的信号响100ms,500Hz的信号响200ms,交替进行。P1.7接开关进行控制。当开关合上的时候,报警信号开始响。当开关断开的时候报警信号停止。
# 二、任务实现
## 2.1 硬件连接
目前的硬件线路如下:
主控芯片: STC 89C52
输入引脚: P1.7 - 开关
输出引脚: P1.0 - 功放
工作频率: 12MHz
其中的功放为,利用LM386来进行搭接的。
[图 7_报警产生器IO]
## 2.2 分析命题
这次主要的功能如下:
1. 信号的频率不同 <-- 涉及到了调用延时的功能
2. 发出的频率有两种 <-- 需要进行两次判断
3. 不同频率的信号是高低电平进行跳变的 <-- 需要利用标志位进行取反
## 2.3 确定算法
影响LED显示的因素有两种,其中最高优先级的是,按键信号。然后次一级的优先级是,标志位。前者影响要不要进行输出动作,而后者则是影响到底是要进行的输出的频率是多少。
而控制频率的算法就是,采用调用延时的次数,来控制总的频率。
## 2.4 流程图
[图 7_报警产生器_流程图]
## 2.5 程序
```
FLAG BIT 00H ; 设置标志位
ORG 00H
START:
JB P1.7, START ; 如果按下,则进行复位,不发信号
JNB FLAG, NEXT ; 判断需要输出高频还是低频
MOV R2, #200 ; 设置计数次数
DV: ; 500Hz
CPL P1.0 ; 对P1.0口输出进行取反
LCALL DELY500 ; 长调用DELY500函数
LCALL DELY500 ; 长调用DELY500
DJNZ R2, DV ; R2寄存器减一,如果R2不等于0,则跳转到DV
CPL FLAG ; FLAG取反
NEXT:
MOV R2, #200 ; 给R2赋计数次数
DV1: ; 1000Hz
CPL P1.0 ; P1.0口取反
LCALL DELY500 ; 长调用DELY500函数
DJNZ R2, DV1 ; R2寄存器减一,如果R2不等于0,则跳转到DV1
CPL FLAG ; FLAG取反
SJMP START ; 跳回起始处
DELY500: ; 延时0.5mS
MOV R7, #250 ; 设置计数次数
LOOP:
NOP
DJNZ R7, LOOP
RET
END
```
# 三、总结
这次主要是设计到了两个判断,以及针对于两个不同的判断情况,从而采用不同延时方式。
# 参考资料
[1] 《单片机的编程与汇编程序案例》, https://wenku.baidu.com/view/9018d6795acfa1c7aa00cc58.html