注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
chenht7的个人空间 https://home.eeworld.com.cn/space-uid-490705.html [收藏] [复制] [分享] [RSS]
日志

单片机_汇编编程_报警产生器

已有 1525 次阅读2017-9-28 09:43 |个人分类:汇编| 汇编学习, 单片机

 单片机_汇编编程_报警产生器
时间: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
评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章