单片机实验
微机实验:报警监测仪
实验目的
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采样改为中断法,程序将作哪些改动?
全部0条评论
快来发表一下你的评论吧 !