微機實驗:報警監測儀
實驗目的
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采樣改為中斷法,程序將作哪些改動?
評論
查看更多