📄 duartm.asm
字号:
;******************************************************************************
; DP-51S单片机仿真实验板上多机通讯程序
; 本程序是主机部分,主要负责与指定的从机进行通讯,读取从机上的按键,并发送
;显示数据到从机。
;
;File: DUARTM.ASM
;Date: 2003.03.29
;******************************************************************************
LED_ADDR EQU 2000H ;定义LED数码管的数据段地址
;当前与主机通讯的从机地址
NOW_SLA DATA 30H
SLA_NO DATA 31H ;从机地址序号(0-7)
;定义串行通讯发送数据缓冲区35H--3FH
SENDD_BUF EQU 35H
;定义串行通讯数据接收缓冲区40H---4FH
RCVD_BUF EQU 40H
;接收新的数据帧标志,为1是表示接收到新回应帧
RCV_NEW BIT 10H
RCV_ERR BIT 13H ;接收出错标志,在显示输出时使用
;显示缓冲区50H---54H
DISP_BUF EQU 50H
;显示控制位定义
DISPB0 BIT P1.6 ;显示位控制
DISPB1 BIT P1.0
DISPB2 BIT P1.1
DISPB3 BIT P1.2
DISPB4 BIT P1.3
DISPB5 BIT P1.4
DISPB6 BIT P1.5
KDKEY BIT P1.7
TIME_COUNT EQU 32H ;闪动显示的软件定时器
DISP_CPL BIT 11H ;闪动显示的取反标志,为1时将屏幕显示取反
DISP_STA BIT 12H ;当前显示状态,为1时表示是显示数据,为0时显示灭
;定时器0的初值,设置为20mS定时,DP-51上的晶振为11.0592M。
TH0_DAT EQU 0B8H
TL0_DAT EQU 61H
;=========================================================================
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP T0_INT ;定时器0中断入口
ORG 0023H
AJMP SERIAL_INT ;串口中断入口
ORG 0100H
MAIN:
MOV SP,#60H
MOV R0,#SLA_NO
MOV @R0,#0H
MOV SLA_NO,#0H
MOV R7,#10
MAIN_L1:
MOV R6,#0
DJNZ R6,$
DJNZ R7,MAIN_L1 ;延时,等待从机上电复位完成
SERIAL_INI:
MOV TMOD,#21H ;设置定时器1工作模式,波特率发生器;设置定时器0为工作模式1
MOV TH1,#0FDH ;设置波特率为9600b
SETB TR1
MOV PCON,#00H
MOV SCON,#0D0H ;设置串口位方式3,允许串口接收。SM2=0,接收所有数据
SETB ES ;打开串口中断允许
SETB PS ;设置串口中断为高优先级
DISP_INI:
MOV TH0,#TH0_DAT ;设置定时器0,用于显示闪动定时
MOV TL0,#TL0_DAT
SETB ET0
SETB TR0
SETB EA
ACALL SYS_INI ;进行系统的初化
MAIN_L2: ;系统主循环
ACALL DISP ;扫描显示
ACALL DISP
MOV R4,#10
MAIN_L3:
ACALL SCAN_KEY ;扫描键盘
CJNE A,#0FFH,MAIN_KEY
DJNZ R4,MAIN_L3 ;多次扫描,以提高按键的灵敏度
MAIN_SEND: ;若没有按键,则正常通讯及显示
JNB DISP_CPL,MAIN_L2
CLR DISP_CPL
JBC DISP_STA,MAIN_SDL1
SETB DISP_STA
MOV DISP_BUF,#0FFH ;4位数码管显示为灭
MOV DISP_BUF+1,#0FFH ;4位数码管显示为灭
MOV DISP_BUF+2,#0FFH
MOV DISP_BUF+3,#0FFH
MOV DISP_BUF+4,#0FFH
MOV DISP_BUF+5,#0FFH ;4位数码管显示为灭
MOV DISP_BUF+6,#0FFH ;4位数码管显示为灭
SJMP MAIN_SDL3
MAIN_SDL1:
JNB RCV_ERR,MAIN_SDL2
MOV DPTR,#FIND_BIT
MOV A,SLA_NO
MOVC A,@A+DPTR
MOV DISP_BUF,A
MOV DISP_BUF+1,#86H ;4位数码管显示"ErrX"
MOV DISP_BUF+2,#0AFH
MOV DISP_BUF+3,#0AFH
MOV A,SLA_NO
INC A
MOV DPTR,#DISP_TAB
MOVC A,@A+DPTR
MOV DISP_BUF+4,A
SJMP MAIN_SDL3
MAIN_SDL2:
MOV DPTR,#FIND_BIT
MOV A,SLA_NO
MOVC A,@A+DPTR
MOV DISP_BUF,A
MOV DISP_BUF+1,#92H
MOV DISP_BUF+2,#0C7H
MOV DISP_BUF+3,#88H
MOV A,SLA_NO
INC A
MOV DPTR,#DISP_TAB
MOVC A,@A+DPTR
MOV DISP_BUF+4,A
MAIN_SDL3:
ACALL SEND_DISP
SJMP MAIN_L2
MAIN_KEY: ;若有按键,则进行从机的切换
CJNE A,SLA_NO,MAIN_KEYL1 ;判断是否要切换从机
AJMP MAIN_L2
MAIN_KEYL1:
MOV SLA_NO,A ;设置通讯从机
MOV SENDD_BUF,#12H
MOV SENDD_BUF+1,#30H
MOV SENDD_BUF+2,#06H
MOV SENDD_BUF+3,#00H ;不需要从机回应
MOV SENDD_BUF+4,#0BFH ;设置显示"----"
MOV SENDD_BUF+5,#0BFH
MOV SENDD_BUF+6,#0BFH
MOV SENDD_BUF+7,#0BFH
MOV SENDD_BUF+8,#24H
MOV R7,#9
ACALL SEND_SLADAT ;发送数据
AJMP MAIN_L2
; 0-F的显示字模 (共阳数码管),0FFH为显示' '
DISP_TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH
;*************************************************************
;名称:SYS_INI
;功能:系统初始化,包括设置从机号SLA_NO为0,并向所有从机发送初
; 化显示数据,设置主机显示内容。
;入口参数:无
;出口参数:无
;使用资源:SEND_SLADAT子程序所用的资源
;*************************************************************
SYS_INI:
MOV SLA_NO,#0
MOV TIME_COUNT,#00H
CLR RCV_NEW
CLR RCV_ERR
;向从机1-4发送初化显示数据,广播地址为0C0H
MOV SENDD_BUF,#12H
MOV SENDD_BUF+1,#30H
MOV SENDD_BUF+2,#06H
MOV SENDD_BUF+3,#00H ;不需要从机回应
MOV SENDD_BUF+4,#0BFH ;设置显示"----"
MOV SENDD_BUF+5,#0BFH
MOV SENDD_BUF+6,#0BFH
MOV SENDD_BUF+7,#0BFH
MOV SENDD_BUF+8,#24H
MOV NOW_SLA,#0C0H
MOV R7,#9
ACALL SEND_SLADAT ;发送数据
;向从机5-8发送初化显示数据,广播地址为0D0H
MOV NOW_SLA,#0D0H
MOV R7,#9
ACALL SEND_SLADAT
RET
;*************************************************************
;名称:SEND_DISP
;功能:向从机发送显示命令,数据为本机显示缓冲区的数据。
;入口参数:DISP_BUF 发送的数据的缓冲区
; SLA_NO 从机号
;出口参数:NOW_SLA 从机地址
;占用资源
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -