?? b03.asm
字號:
; ;“模仿式”實驗三 雙機通訊實驗
; 文件名:B03.ASM
;一、實驗要求
; 利用8031單片機串行口,實現兩個實驗臺之間的串行通
; 訊。其中一個實驗臺作為發送方,另一側為接收方。發
; 送方讀入按鍵值,并發送給接收方,接收方收到數據
; 后在LED上顯示。
;
;二、實驗目的
; 1、掌握單片機串行口工作方式的程序設計,及簡易三線式通訊的方法。
; 2、了解實現串行通訊的硬環境、數據格式的協議、數據交換的協議。
; 3、學習串口通訊的中斷方式的程序編寫方法。
;
;三、實驗電路
; 顯示電路和鍵盤電路見硬件實驗十六和硬件實驗十七。
;四、實驗說明
; 1、通訊雙方的RXD、TXD信號本應經過電平轉換后再行交叉連接
; ,本實驗中為減少連線可將電平轉換電路略去,而將雙方的RXD、TXD
; 直接交叉連接。也可以將本機的TXD接到RXD上,這樣按下的鍵,就會
; 在本機LED上顯示出來。
OUTBIT equ 0e101h ; 位控制口
CLK164 equ 0e102h ; 段控制口(接164時鐘位)
DAT164 equ 0e102h ; 段控制口(接164數據位)
IN equ 0e103h ; 鍵盤讀入口
HasRcv equ 20h.0 ; 接收標志位
LEDBuf equ 40h ; 顯示緩沖
RCVBuf equ 50H ; 接收緩沖
ORG 0000H
LJMP START
; 串行口中斷程序
ORG 0023H
JNB TI,S0_R
CLR TI
NOP
SJMP S0_RET
S0_R: ; 接收數據
CLR RI
MOV RCVBUF,SBUF ; 保存數據
SETB HasRcv ; 提示收到數據
NOP
S0_RET:
RETI
LEDMAP: ; 八段管顯示碼
db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h
db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h
Delay: ; 延時子程序
mov r7, #0
DelayLoop:
djnz r7, DelayLoop
djnz r6, DelayLoop
ret
DisplayLED:
mov r0, #LEDBuf
mov r1, #6 ; 共6個八段管
mov r2, #00100000b ; 從左邊開始顯示
Loop:
mov dptr, #OUTBIT
mov a, #0
movx @dptr, a ; 關所有八段管
mov a, @r0
mov B, #8 ; 送164
DLP:
rlc a
mov r3, a
mov acc.0, c
mov dptr, #DAT164
anl a,#0fdh
movx @dptr, a
mov dptr, #CLK164
orl a,#02h
movx @dptr, a
anl a,#0fdh
movx @dptr, a
mov a, r3
djnz B, DLP
mov dptr, #OUTBIT
mov a, r2
movx @dptr, a ; 顯示一位八段管
mov r6, #1
call Delay
mov a, r2 ; 顯示下一位
rr a
mov r2, a
inc r0
djnz r1, Loop
ret
TestKey:
mov dptr, #OUTBIT
mov a, #0
movx @dptr, a ; 輸出線置為0
mov dptr, #IN
movx a, @dptr ; 讀入鍵狀態
cpl a
anl a, #0fh ; 高四位不用
ret
KeyTable: ; 鍵碼定義
db 00h, 01h, 04h, 07h
db 0fh, 02h, 05h, 08h
db 0eh, 03h, 06h, 09h
db 0dh, 0ch, 0bh, 0ah
db 10H,10H,10H,10H,10H,
db 10H,10H,10H,10H,10H
GetKey:
mov dptr, #OUTBIT
mov P2, dph
mov r0, #Low(IN)
mov r1, #00100000b
mov r2, #6
KLoop:
mov a, r1 ; 找出鍵所在列
cpl a
movx @dptr, a
cpl a
rr a
mov r1, a ; 下一列
movx a, @r0
cpl a
anl a, #0fh
jnz Goon1 ; 該列有鍵入
djnz r2, KLoop
mov r2, #0ffh ; 沒有鍵按下, 返回 0ffh
sjmp Exit
Goon1:
mov r1, a ; 鍵值 = 列 X 4 + 行
mov a, r2
dec a
rl a
rl a
mov r2, a ; r2 = (r2-1)*4
mov a, r1 ; r1中為讀入的行值
mov r1, #4
LoopC:
rrc a ; 移位找出所在行
jc Exit
inc r2 ; r2 = r2+ 行值
djnz r1, LoopC
Exit:
mov a, r2 ; 取出鍵碼
mov dptr, #KeyTable
movc a, @a+dptr
mov r2, a
WaitRelease:
mov dptr, #OUTBIT ; 等鍵釋放
clr a
movx @dptr, a
mov r6, #10
call Delay
call TestKey
jnz WaitRelease
mov a, r2
ret
START:
MOV SP, #60H
mov dptr,#0e100h
mov a,#03h
movx @dptr,a
MOV IE, #0 ; DISABLE ALL INTERRUPT
MOV TMOD,#020H ; 定時器1工作于方式2 (8位重裝)
MOV TH1, #0F3H ; 波特率
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -