微机实验:报警监测仪

单片机实验

27人已加入

描述

微机实验:报警监测仪

实验目的

1、了解基于8031的微机化仪表的总体设计。

2、理解键盘管理程序的设计原理。

3、掌握各模块的程序设计和调试。

实验内容:

利用本实验板设计一台报警监测仪,它能够显示测量值,设置报警值,如测量值大于报警值则亮灯报警。

测量信号0~5V由0809通道1输入。键盘布置如图7-1所示。键号为B的键作为测量键。当按下该键时,仪表进入测量状态,测量值显示格式:P灭灭×××,测量显示范围0~255。键号为0~9的10个数字键用于报警值设定。按下任一个数字键,仪表进入设定状态,设定值显示格式:A灭灭×××,设定允许范围0~255。如果设定过大,超出255,则显示警告格式:A……。

8031的P1.0口作为报警接口,连接发光二极管LED做报警指示。

0

1

2

3

4

5

6

7

8

9

测量

          图7-1  按键分配图

主程序

图7-2表示了仪表的总体框图。相应主程序如下

ORG  0000H

LJMP  MAIN

ORG  0150H

 MAIN:

MOV  SP,  #60H

;设置堆栈

MOV  DPTR, #B000H

;设置8155

MOV  A, #03H

;A、B口输出

MOVX  @DPTR, A

;C口输入

CLR  A

;初始显示全“0”

MOV  R0, #2AH

MP0:

MOV  @R0, A

INC  R0

CJNE  R0, #30H, MP0

CLR  00H

;bit00,状态标志

MOV  21H, #00H

;21H,设定值的位标志

  DIS:

LCALL  DISP

;调显示

LCALL  KS1

;有键按下吗?

JZ  MP2

;无,转MP2

  MP1:

LJMP  SCAN

;转键管理

  MP2:

LJMP  RUN

;转监测

监测运行程序

    监测运行程序框图见图7-3。包括:仪表状态判别、A/D采样、测量值显示、比较报警等部分。

ORG  0180H

0180

  RUN:

JNB  00H, RU1

;bit00=0,仪表为测量状态

0183

LJMP  DIS

  RU1:

LCALL  AD1

;调用A/D采样

MOV  R3, A

;以下是显示测量值

LCALL  IBTD

;二进制转BCD(见实验二)

MOV  2DH, R4

;测量值百位送显示缓冲2DH

MOV  A, R5

ANL  A, #F0H

SWAP  A

MOV  2EH, A

;测量十位送显示缓冲2EH

MOV  A, R5

ANL  A, #0FH

MOV  2FH, A

;测量值个位送显示缓冲2FH

MOV  2AH, #10H

;第一位显示“P”

MOV  2BH, #14H

;第二位显示不亮

MOV  2CH, #14H

;第三位显示不亮

CLR  C

;以下是比较报警

MOV  A, 50H

;测量值存50H,设定值存51H

   

SUBB  A,51H

;测量一设定

JC  RU2

;测量<设定,转

SETB  P1.0

;测量≥设定,报警灯亮

LJMP  DIS

  RU2:

CLR  P1.0

;关报警灯

01B1

LJMP  DIS

键管理程序

键管理程序框图如图7-4示。首先判别是否测量键,若是则进入测量状态。再判是否数字键0~9,若是则进入设定状态。利用位00H作为状态标志,以区别测量或设定。随着按数字键的先后次序,键号分别送入显示缓冲2DH、2EH、2FH,从而显示设定值的百位、十位和个位。为了区别设定值的哪一位,用RAM 21H做位指针。数码显示的设定值是十进制数,需转换为二进数并存入51H,以便和A/D转换结果(存50H)进行比较,设定值若超出255,表示过大,显示A……,以示警告。相应程序如下:

ORG  01D0H

SCAN:

LCALL  KEYA

;查键号,存A

CJNE  A, #0B, SC2

;不是测量键,转

CLR  00H

;是测量键,置测量状态

MOV  21H, #00H

;设定位指针复0

    SC1:

LJMP  SC9

    SC2:

CJNE  A, #0AH, SC3

;判是否数字键?

    SC3:

JNC  SC1

;不是,则退出

SETB  00H

;是数字键,置设定状态

MOV  2AH, #1EH

;最高位显示A

MOV  2BH, #14H

;第2、3位显示不亮

MOV  2CH, #14H

INC  21H

;修改设定位指针

MOV  A, 21H

    SC4:

CJNE  A, #01H, SC5

;不是设置百位数,转

MOV  2DH, A

;是百位数设置,键号送2DH

SJMP  SC8

    SC5:

CJNE  A, #02H, SC6

;是十位数设置吗?

MOV  2EH, A

;是,键号送2EH

SJMP  SC8

    SC6:

CJNE  A, #03H, SC7

;是个位数设置?

MOV  2FH, A

;是,键号送2FH

SJMP  SC8

    SC7:

MOV  21H, #01H

SJMP  SC4

    SC8:

LCALL  DTB

;BCD转二进制,且与255比较

020F

    SC9:

LJMP  DIS

ORG  0220H

求(2D)×100+(2E)×10+(2F)→51H

   DTB:

MOV  B, #64H

MOV  A, 2DH

MUL AB

;(2D)×100

MOV  R6, A

;乘积低8位暂存R6

MOV  A, B

JZ  DTB1

SJMP  DTB2

;乘积高8位≠0,表示设定值>FFH

DTB1:

MOV  B, #0AH

MOV  A, 2EH

MUL  AB

;(2E)×10

ADD  A, R6

;(2D)×100+(2E)×10→A

JC   DTB2

;C=1表示设定值>FFH,转

ADD  A, 2FH

;(2D)×100+(2E)×10+(2F)→A

JC  DTB2

C=1,表示设定>FFH,转

MOV  51H, A

;二进制结果存51H

  

RET

 DTB2:

MOV  2AH, #1EH

;设定值过大,显示报警提示A……

MOV  2BH, #11H

MOV  2CH, #11H

MOV  2DH, #11H

MOV  2EH, #11H

MOV  2FH, #11H

RET

实验要求:

首先调试子程序(例如DTB),然后分段调试键管理程序,监测运行程序和主程序。在此基础上,连续运行整个程序,检查仪表工作是否符合设计要求。

思考题:

1、监测运行程序和键管理程序两个模块的结束处(01B1H句和020FH句)都是转向显示程序。为什么?

2、监测运行模块中,如果省略0180H、0183H句,对仪表的工作有什么影响?

3、键管理程序中,如何判别按下的数字键是百位数?是十位数?还是个位数?

4、如果把A/D采样改为中断法,程序将作哪些改动?

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分