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

📄 xhuankoutongxin.asm

📁 利用单片机进行两台电脑之间的通信,可以传递数据和汉字.
💻 ASM
字号:
           ORG 0000H
           AJMP MASSAGE
           ORG 0023H
           AJMP RMASSAGE
           ORG 0030H
 MASSAGE:  MOV DPTR,#8003H         ;8255初始化
           MOV A,#80H
           MOVX @DPTR,A
           MOV R3,#0
           MOV R4,#0
           MOV R5,#0
           MOV R6,#0
           MOV 0CH,#07DH            ;开机后,静态显示为“9.6”
           MOV 0BH,#0EFH
           ACALL WATCH             ;在静态数码管上显示“9.6 ”
           MOV 20H,#02H            ;将01H单元置1
           MOV SP,#50H             ;中断初始化
           MOV TMOD,#20H           ;计数器1工作在方式2
           MOV TH1,#0FDH           ;波特率为9.6k比特每秒
           MOV TL1,#0FDH
           SETB TR1                ;开计数器
           MOV SCON,#50H          ;串口在方式1,SM2=0,允许接收
           MOV PCON,#00H           ;SMOD=0
           MOV R0,#40H             ;将R0指向40H单元
           MOV R1,#03             ;将传送的数据块首地址送R1
           MOV 09H,#4             ;将数据块的长度送09H中
           MOV 30H,#0             ;校验数据和
           MOV IE,#90H            ;开串口中断

    AGAIN: ACALL SCAN             ;扫描键盘
           CJNE A,#0FFH,NEXT0     ;判断是否有键按下
           MOV 08H,#0FFH          ;使08H中的内容为FFH
           CLR 00H                ;将00H清空,来控制连续的键盘输入
           ACALL ACTIVITY         ;动态显示
           SJMP AGAIN
    NEXT0: CJNE A,08H,NEXT1       ;判断有没有松开按键
           JB 00H,NEXT1           ;若没有,则延时500毫秒后连续键入数值
           SETB 00H               ;如00H中不是1则置1,
           ACALL DELAY600MS       ;延时600毫秒
    NEXT1: MOV 08H,A              ;将按键数值放入08H中
           ACALL DELAY250MS       ;若有键按下则延时200毫秒键入数据
           CJNE A,#0AH,CONT       ;判断是什么键
    CONT:  JC NUM                 ;如是数据键则转移去处理数据
           CJNE A,#0AH,SETMASS    ;判断是什么功能
           JB 01H,SPEED1          ;若上次是波特率1,则转移到波特率2
           JB 02H,SPEED2          ;若上次是波特率2,则转移到波特率3
           JB 03H,SPEED3          ;若上次是波特率3,则转移到波特率4
           JB 04H,SPEED4          ;若上次是波特率4,则转移到波特率1
  SPEED1:  CLR 01H
           SETB 02H
           MOV TH1,#0F9H          ;4800比特每秒的波特率
           MOV TL1,#0F9H
           MOV 0CH,#7FH
           MOV 0BH,#0E6H
           ACALL WATCH            ;在静态数码管上显示4.8
           AJMP AGAIN
  SPEED2:  CLR 02H
           SETB 03H
           MOV TH1,#0F2H          ;2400比特每秒的波特率
           MOV TL1,#0F2H
           MOV 0CH,#66H
           MOV 0BH,#0DBH
           ACALL WATCH            ;在静态数码管上显示2.4
           AJMP AGAIN
  SPEED3:  CLR 03H
           SETB 04H
           MOV TH1,#0E5H           ;1200比特每秒的波特率
           MOV TL1,#0E5H
           MOV 0CH,#5BH
           MOV 0BH,#86H
           ACALL WATCH            ;在静态数码管上显示1.2
           AJMP AGAIN
  SPEED4:  CLR 04H
           SETB 01H
           MOV TH1,#0FDH          ;9600比特每秒的波特率
           MOV TL1,#0FDH
           MOV 0CH,#7DH
           MOV 0BH,#0EFH
           ACALL WATCH            ;在静态数码管上显示9.6
           AJMP AGAIN             ;处理功能后继续扫描键盘

   NUM:    MOV R2,A               ;数据处理将数据按先后顺序
           MOV A,R5               ;依次存入R3,R4,R5,R6
           MOV R6,A
           MOV A,R4
           MOV R5,A
           MOV A,R3
           MOV R4,A
           MOV A,R2
           MOV R3,A
           AJMP AGAIN

 SETMASS:  CLR EA                 ;关本机中断
           CLR TI
  THEN:    MOV SBUF,@R1           ;数据起始位开始发送
           JNB TI,$               ;未发送完则等待
           CLR TI
           MOV A,@R1
           ADD A,30H              ;求数据和
           MOV 30H,A
           INC R1                 ;指向下一位数据
           DJNZ 09H,THEN          ;若没有发完则继续发
           JNB RI,$               ;等待接收数据和
           CLR RI
           MOV A,SBUF             ;收数据
           XRL A,30H              ;校验数据和是否相等
           JNZ SETMASS            ;若发生错误则从新传送
           MOV R1,#03             ;将传送的数据块首地址送R1
           MOV 09H,#4             ;将数据块的长度送09H中
           MOV 30H,#0             ;校验数据和
           SETB EA                ;开本机中断
           AJMP AGAIN             ;若发完则继续键盘扫描



 RMASSAGE: PUSH A                  ;中断服务程序,接收数据
           PUSH PSW                ;保护现场
 R_AGAIN:  JNB RI,$                ;等待接受
           CLR RI                  ;接收到则清接收中断标志
           MOV A,SBUF
           MOV @R1,A               ;数据存储
           INC R1                  ;指向下一个存储单元
           ADD A,30H               ;计算接收数据的累加和
           MOV 30H,A
           DJNZ 09H,R_AGAIN        ;如没发完则继续发送
           MOV A,30H
           CLR TI                 ;清发送标志位
           MOV SBUF,A             ;回送累加和
           JNB TI,$               ;等待发送结束
           CLR TI
           MOV R1,#03             ;将传送的数据块首地址送R1
           MOV 09H,#4             ;将数据块的长度送09H中
           MOV 30H,#0             ;校验数据和
           POP PSW                ;恢复现场
           POP A
           RETI


SCAN:     PUSH 00H
          CLR P1.0              ;键盘扫描子程序**********************************************
          CLR P1.1              ;                 占用资源RO,A
          CLR P1.2              ;                 数字出口为A. 堆栈2字节
          CLR P1.3              ;              **********************************************
          MOV A,P1
          ANL A,#0F0H
          CJNE A,#0F0H,KEYSCAN   ;如有键按下则转移
          SJMP EXIT
  KEYSCAN:ACALL DLY20MS          ;延时
          MOV R0,#00H            ;列数用R0来记录
          CLR P1.0
          SETB P1.1
          SETB P1.2
          SETB P1.3
          MOV A,P1
          ANL A,#0F0H
          CJNE A,#0F0H,TTTT1     ;若在本行则转移
          MOV A,R0               ;扫描下一行
          ADD A,#4H
          MOV R0,A
          SETB P1.0
          CLR P1.1
          SETB P1.2
          SETB P1.3
          MOV A,P1
          ANL A,#0F0H
          CJNE A,#0F0H,TTTT1     ;若在本行则转移
          MOV A,R0               ;扫描下一行
          ADD A,#4H
          MOV R0,A
          SETB P1.0
          SETB P1.1
          CLR P1.2
          SETB P1.3
          MOV A,P1
          ANL A,#0F0H
          CJNE A,#0F0H,TTTT1     ;若在本行则转移
  EXIT:   MOV A,#0FFH            ;如无键按下则推退出
          SJMP DONE
  TTTT1:  JB P1.4,TTTT2          ;如按键不在本行则转移
          MOV A,#00H             ;在则将0放入A 中
          AJMP TTTT5
  TTTT2:  JB P1.5,TTTT3          ;如按键不在本行则转移
          MOV A,#01H             ;在则将1放入A 中
          AJMP TTTT5
  TTTT3:  JB P1.6,TTTT4          ;如按键不在本行则转移
          MOV A,#02H             ;在则将2放入A 中
          AJMP TTTT5
  TTTT4:  JB P1.7,TTTT5          ;如按键不在本行则转移
          MOV A,#03H             ;在则将3放入A 中
          AJMP TTTT5
  TTTT5:  ADD A,R0
   DONE:  POP 00H
          RET






ACTIVITY: PUSH A                 ;保护现场
          MOV @R0,#0E0H          ;数据显示输入时由右向左显示
          MOV A,R3
          XCHD A,@R0
          MOV DPTR,#6000H
          MOV A,@R0
          MOVX @DPTR,A
          MOV @R0,#0D0H
          MOV A,R4
          XCHD A,@R0
          MOV DPTR,#6000H
          MOV A,@R0
          MOVX @DPTR,A
          MOV @R0, #0B0H
          MOV A,R5
          XCHD A,@R0
          MOV DPTR,#6000H
          MOV A,@R0
          MOVX @DPTR,A
          MOV @R0,#70H
          MOV A,R6
          XCHD A,@R0
          MOV DPTR,#6000H
          MOV A,@R0
          MOVX @DPTR,A
          MOV A,#0F0H
          MOV DPTR,#6000H
          MOVX @DPTR,A
          POP A
          RET




WATCH:  MOV A,#00H             ;8255送数据显示程序
        MOV DPTR,#8002H
        MOVX @DPTR,A
        MOV A,0BH
        MOV DPTR,#8001H
        MOVX @DPTR,A
        MOV A,0CH
        MOV DPTR,#8000H
        MOVX @DPTR,A
        RET




 DLY20MS: MOV 22H,#70H        ; 延时20毫秒子程序       *******占用资源22h,23h****************
     DY1: MOV 23H,#69H
     DY2: DJNZ 23H,DY2
          ACALL ACTIVITY         ;动态显示
          DJNZ 22H,DY1
          RET

 DELAY250MS: MOV 22H,#25          ;延时0.25秒子程序         *****占用资源22h,23h,24h************
     DL333:  MOV 23H,#100
     DL222:  MOV 24H,#49
     DL111:  DJNZ 24H,DL111
             ACALL ACTIVITY         ;动态显示
             DJNZ 23H,DL222
             ACALL ACTIVITY         ;动态显示
             DJNZ 22H,DL333
             RET



DELAY600MS:MOV 22H,#50          ;延时0.6秒子程序         *****占用资源22h,23h,24h************
     DL33: MOV 23H,#100
     DL22: MOV 24H,#49
     DL11: DJNZ 24H,DL11
           ACALL ACTIVITY         ;动态显示
           DJNZ 23H,DL22
           ACALL ACTIVITY         ;动态显示
           DJNZ 22H,DL33
           RET


ORG 0000H
   AJMP BEGIN
   ORG 000
   ORG 0100H
BEGIN:MOV DPTR,#8003H;8255初始化,设置初始化条件
      MOV A,#80H
      MOVX @DPTR,A
LOOP:CLR P1.0;  设置行编码"1110"
     SETB P1.1
     SETB P1.2
     SETB P1.3
     JB P1.7,NEXT1;判断"定时0.5MS"键是否按下
     ACALL D20MS;延时去抖
  K0:JB P1.7,K00;等待"定时0.5MS "键释放
     AJMP K0
  K00:定时0.5MS
NEXT1:JB P1.6,NEXT2;判断"定时10MS"键是否按下
       ACALL D20MS; 延时去抖
    K1:JB P1.6,K11;等待"定时10MS"键释放
     AJMP K1
   K11:定时10MS
NEXT2:JB P1.5,NEXT3;判断"定时20MS"键是否按下
     ACALL D20MS; 延时去抖
  K2:JB P1.5,K22; 等待"定时20MS "键释放
     AJMP K2
  K22:定时20MS
 NEXT3:JB P1.4,NEXT4;判断"定时50MS"键是否按下
     ACALL D20MS; 延时去抖
K3:JB P1.4,K33; 等待"定时50MS"键释放
     AJMP K3
  K33:定时50MS
NEXT4:SETB P1.0;  设置行编码"1101"
      CLR P1.1
      SETB P1.2
      SETB P1.3
     JB P1.7,NEXT5;判断"定时100MS"键是否按下
     ACALL D20MS; 延时去抖
   K4:JB P1.7,K44; 等待"定时100MS "键释放
     AJMP K4
  K44:定时100MS
NEXT5:JB P1.6,NEXT6;判断"定时500MS"键是否按下
     ACALL D20MS; 延时去抖
  K5:JB P1.6,K55; 等待"定时500MS "键释放
     AJMP K5
  K55:定时500MS
NEXT6:JB P1.5,NEXT7;判断"定时1000MS"键是否按下
     ACALL D20MS; 延时去抖
  K6:JB P1.5,K66; 等待"定时1000MS "键释放
     AJMP K6
  K66:定时1000MS
 NEXT7:AJMP LOOP



  

⌨️ 快捷键说明

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