⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zhujiasm.asm

📁 51单片机的串口多机通讯设计
💻 ASM
字号:
      T_RSTATE EQU P1.7
      ORG 0000H
      LJMP START
	  ORG 0100H
;**********************************************************
;
;系统初始化
;
;********************************************************** 
START:MOV TMOD,#20H
      MOV TH1,#0FDH
	  MOV TL1,#0FDH
	  SETB TR1
	  MOV SCON,#0D0H
	  MOV PCON,#80H
	  ACALL INIT_LCD
	  ACALL SCAN_SENSOR
	  ACALL STRING_DISPLAY 
;**********************************************************
;
;发送请求信号
;
;********************************************************** 
MAIN_LOOP:
STEP1:SETB T_RSTATE 
      CJNE R0,#00H,MODE_1;是否选择模式0(循环显示模式)
	  INC R1;循环模式的从机号
	  MOV A,R1
	  CJNE A,38H,MODE_0
	  MOV R1,#00H
MODE_0:
;	  MOV A,R1;从机号加一
;	  ANL A,#03H;预设有4个从机
;	  MOV R1,A
	  SETB TB8;表明传送的是地址数据
	  MOV SBUF,R1
	  JNB TI,$;等待发送完成
	  CLR TI
	  CLR T_RSTATE
	  JNB RI,$;等待从机应答
	  CLR RI
	  SETB T_RSTATE
	  MOV A,SBUF
	  MOV 39H,R1
	  CJNE A,39H,RESET1
	  CLR TB8
	  MOV SBUF,#00H
	  JNB TI,$
	  CLR TI
	  CLR T_RSTATE
	  JNB RI,$
	  CLR RI
	  MOV R3,SBUF
	  AJMP STEP2
RESET1:
      MOV SBUF,#0FFH
	  JNB TI,$
	  CLR TI
	  MOV 3AH,#01H;40H为显示错误状态的标志	   
	  AJMP STEP2
MODE_1:
      CLR C;清借位
      MOV A,38H
	  DEC A
      SUBB A,R2;比较从机数和选择的机号的大小
	  JC INPUT_ERROR;若从机数小于选择的机号,就跳转
      SETB TB8;表明传送的是地址数据
	  MOV SBUF,R2;将自选模式的从机号发出
	  JNB TI,$;等待发送完成
	  CLR TI
	  CLR T_RSTATE
	  JNB RI,$
	  CLR RI
	  SETB T_RSTATE
	  MOV A,R2
	  CJNE A,SBUF,RESET2;若接收到的地址不符合发送地址,则发送复位
	  CLR TB8
	  MOV SBUF,#00H
	  JNB TI,$
	  CLR TI
	  CLR T_RSTATE
	  JNB RI,$
	  CLR RI
	  MOV R3,SBUF
	  AJMP STEP2
RESET2:
      MOV SBUF,#0FFH
	  JNB TI,$
	  CLR TI
	  MOV 3AH,#01H
	  AJMP STEP2
INPUT_ERROR:
	  MOV 3AH,#01H      	  
;**********************************************************
;
;接收数据并显示
;
;**********************************************************
STEP2:
	  ACALL DISPLAY_NO;显示接收的数据
	  MOV R7,#02H
	  ACALL DELAY_S;延迟2秒
 	  AJMP MAIN_LOOP	  
;**********************************************************
;
;延时子程序
;
;**********************************************************
DELAY_MS:
DEL_MS2:
      MOV 37H,#0F9H
DEL_MS1:
      NOP
      NOP
	  DJNZ 37H,DEL_MS1
	  DJNZ R5,DEL_MS2
	  RET

DELAY_S:
DEL_S2:
      MOV 36H,#0AH
DEL_S1:
      MOV R5,#64H
      ACALL DELAY_MS
	  ACALL SCAN_KEYBOARD
	  DJNZ 36H,DEL_S1
	  DJNZ R7,DEL_S2
	  RET
;**********************************************************
;
;液晶初始化子程序
;
;**********************************************************
INIT_LCD:
     MOV R5,#0FAH
     ACALL DELAY_MS;延时,等待液晶进入工作状态
	 MOV 31H,#01H
	 ACALL WRITE_COMM;显示清零
	 MOV 31H,#02H
	 ACALL WRITE_COMM;光标复位
	 MOV 31H,#38H
	 ACALL WRITE_COMM;设置显示状态
	 MOV 31H,#0CH
	 ACALL WRITE_COMM;开显示,无光标
	 MOV 31H,#18H
	 ACALL WRITE_COMM;移动显示的文字
	 MOV 31H,#01H
	 ACALL WRITE_COMM;显示清零
	 RET
;**********************************************************
;
;从机存在扫描子程序
;
;**********************************************************
SCAN_SENSOR:
     MOV 31H,#86H
	 ACALL WRITE_COMM
	 MOV 32H,#06H;字符串长度为6个字节
	 MOV 33H,#00H;设置字符串中指针
DISPLAY_LOOP1:
     MOV A,33H
	 MOV DPTR,#STRING_SYSTEM
	 MOVC A,@A+DPTR
	 MOV 31H,A
	 ACALL WRITE_DATA
	 INC 33H
	 DJNZ 32H,DISPLAY_LOOP1
	 MOV 31H,#0C2H
	 ACALL WRITE_COMM
	 MOV 32H,#0CH;字符串长度为12个字节
	 MOV 33H,#00H;设置字符串中指针
DISPLAY_LOOP2:
     MOV A,33H
	 MOV DPTR,#STRING_INITIALIZE
	 MOVC A,@A+DPTR
	 MOV 31H,A
	 ACALL WRITE_DATA
	 INC 33H
	 DJNZ 32H,DISPLAY_LOOP2
	 SETB TB8
	 MOV 33H,#01H
SCAN:
	 MOV SBUF,32H;32H作为扫描发出的从机号
	 JNB TI,$
	 CLR TI
	 MOV R5,#01H
	 ACALL DELAY_MS
	 JNB RI,OUT_SCAN
	 INC 32H
     CLR RI
	 MOV A,33H
	 SJMP JUDGE_SCAN
OUT_SCAN:
     MOV 38H,32H;将从机数保存在38H中
	 MOV 33H,#00H;33H作为结束扫描的标志
	 MOV A,33H
JUDGE_SCAN:
	 CJNE A,#00H,SCAN
	 MOV R7,#02H
	 ACALL DELAY_S
	 RET
STRING_SYSTEM:DB 'S','Y','S','T','E','M'
STRING_INITIALIZE:DB 'I','N','I','T','I','A','L','I','Z','I','N','G' 	  
;**********************************************************
;
;显示字符串子程序
;
;**********************************************************
STRING_DISPLAY:
	 MOV 31H,#01H
	 ACALL WRITE_COMM;显示清零
	 MOV 31H,#80H
	 ACALL WRITE_COMM;设置输入字符串的首地址
	 MOV 32H,#10H;字符串长度为16个字节
	 MOV 33H,#00H;设置字符串中指针
DISPLAY_LOOP3:
     MOV A,33H
	 MOV DPTR,#STRING
	 MOVC A,@A+DPTR
	 MOV 31H,A
	 ACALL WRITE_DATA
	 INC 33H
	 DJNZ 32H,DISPLAY_LOOP3
	 MOV 31H,#87H
	 ACALL WRITE_COMM
	 MOV A,38H
	 ADD A,#30H;将从机数转化为相应的ASCII码
	 MOV 31H,A
	 ACALL WRITE_DATA 
	 RET
STRING:DB 'N','O',' ',' ','o','f',' ',' ',' ','s','e','n','s','o','r','s'
;**********************************************************
;
;液晶显示调用子程序库
;
;**********************************************************
WRITE_COMM:
     MOV P0,31H
	 CLR P1.4
	 CLR P1.3
	 CLR P1.2
     ACALL READ_BUSY
	 SETB P1.2
	 RET
WRITE_DATA:
     MOV P0,31H
	 SETB P1.4
	 CLR P1.3
	 CLR P1.2
	 ACALL READ_BUSY
	 SETB P1.2
	 RET
READ_BUSY:
     PUSH DPH
	 PUSH DPL
WAIT:MOV P0,#0FFH
	 CLR P1.4
	 SETB P1.3
	 CLR P1.2
	 MOV R5,#02H
	 ACALL DELAY_MS
	 SETB P1.2
	 MOV DPTR,#0FFFFH
	 MOVX A,@DPTR
	 JB ACC.7,WAIT     
	 POP DPL
	 POP DPH
	 RET
;**********************************************************
;
;接收的数据显示程序
;
;**********************************************************
DISPLAY_NO:
     MOV A,3AH
     CJNE A,#01H,DISPLAY_CORRECT
	 MOV 31H,#82H
     ACALL WRITE_COMM
	 MOV 31H,' '
	 ACALL WRITE_DATA
	 MOV 31H,#0C4H
	 ACALL WRITE_COMM
	 MOV 32H,#08H;字符串长度为8个字节
	 MOV 33H,#00H;设置字符串中指针
DISPLAY_LOOP4:
     MOV A,33H
	 MOV DPTR,#STRING_ERROR
	 MOVC A,@A+DPTR
	 MOV 31H,A
	 ACALL WRITE_DATA
	 INC 33H
	 DJNZ 32H,DISPLAY_LOOP4
	 MOV 3AH,#00H
	 AJMP DISPLAY_END

DISPLAY_CORRECT:
     MOV 31H,#82H
     ACALL WRITE_COMM;设置液晶写入的地址
	 CJNE R0,#00H,DISPLAY_MODE1;判断是否为循环显示模式
	 MOV A,R1
	 ADD A,#30H
	 MOV 31H,A
	 ACALL WRITE_DATA;将从机号显示出来
	 AJMP DISPLAY_DATA;跳转到采集的数据显示
DISPLAY_MODE1:
     MOV A,R2
	 ADD A,#30H
	 MOV 31H,A
	 ACALL WRITE_DATA
DISPLAY_DATA:
     MOV 31H,#0C4H
	 ACALL WRITE_COMM;第二行显示数据时的地址
	 MOV 34H,#08H;数据向左循环的次数
	 MOV 35H,R3;接收到的数据给35H
DISPLAY_LOOP5:
     MOV A,35H
	 RL A
	 MOV 35H,A
	 ANL A,#01H
	 ADD A,#30H
	 MOV 31H,A
	 ACALL WRITE_DATA
	 DJNZ 34H,DISPLAY_LOOP5
DISPLAY_END:
	 RET

STRING_ERROR:DB ' ','E','R','R','O','R','!',' '
;**********************************************************
;
;键盘扫描子程序
;返回值R2(按键编号)或R0(显示模式)
;
;**********************************************************
SCAN_KEYBOARD:
     MOV R6,#0EFH
	 MOV P2,#0FH
	 MOV A,P2
	 ANL A,#0FH
	 CPL A
	 ANL A,#0FH
	 JZ EXIT_SCAN
	 MOV R5,#05H
	 ACALL DELAY_MS
	 MOV A,P2
	 ANL A,#0FH
	 CPL A
	 ANL A,#0FH
	 JZ EXIT_SCAN
SCAN_LOOP:
     MOV A,R6;行扫描输出
	 CPL A
	 ANL A,#0FEH
     JZ EXIT_LOOP
	 MOV P2,R6
	 MOV A,P2
	 ANL A,#0FH
	 CPL A
	 ANL A,#0FH;查看是否是这一行有键按下
	 JZ NEXT
	 MOV A,P2
	 MOV R4,A;将键盘码缓存在R4中
	 AJMP EXIT_LOOP
NEXT:MOV A,R6
     RL A
	 MOV R6,A;扫描输出值变换
	 AJMP SCAN_LOOP 
EXIT_LOOP:
     ACALL COMMAND_TRANSLATION
EXIT_SCAN:
	 RET

COMMAND_TRANSLATION:
KEY1:CJNE R4,#0E7H,KEY2
	 MOV R2,#01H
	 AJMP EXIT_TRANSLATION
KEY2:CJNE R4,#0EBH,KEY3
     MOV R2,#02H
	 AJMP EXIT_TRANSLATION
KEY3:CJNE R4,#0EDH,KEY4
     MOV R2,#03H
	 AJMP EXIT_TRANSLATION
KEY4:CJNE R4,#0D7H,KEY5
     MOV R2,#04H
	 AJMP EXIT_TRANSLATION
KEY5:CJNE R4,#0DBH,KEY6
     MOV R2,#05H
	 AJMP EXIT_TRANSLATION
KEY6:CJNE R4,#0DDH,KEY7
     MOV R2,#06H
	 AJMP EXIT_TRANSLATION
KEY7:CJNE R4,#0B7H,KEY8
     MOV R2,#07H
	 AJMP EXIT_TRANSLATION
KEY8:CJNE R4,#0BBH,KEY9
     MOV R2,#08H
	 AJMP EXIT_TRANSLATION
KEY9:CJNE R4,#0BDH,KEY0
     MOV R2,#09H
	 AJMP EXIT_TRANSLATION
KEY0:CJNE R4,#7BH,KEY_MODE_0
     MOV R2,#00H
	 AJMP EXIT_TRANSLATION
KEY_MODE_0:
     CJNE R4,#77H,KEY_MODE_1
	 MOV R0,#00H
	 AJMP EXIT_TRANSLATION
KEY_MODE_1:
     CJNE R4,#7DH,EXIT_TRANSLATION
	 MOV  R0,#01H
EXIT_TRANSLATION:
     RET
	 END    	  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -