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

📄 code.txt

📁 无线通信系统 1、系统由一个主站
💻 TXT
字号:
;从机程序                          
                            ORG    0000H
                            LJMP   START


DELAY:                     MOV     R7,#0
DELAYLOOP:                 DJNZ    R7,DELAYLOOP
                           DJNZ    R6,DELAYLOOP
                           RET





LEDMAP:                                             ;共阴极八段管0~9的显示码
                         DB   3FH,06H,5BH,4FH,66H
                         DB   6DH,7DH,07H,7FH,6FH
                         



START:                  MOV     SP,#70H            ;设置堆栈指针            
                        MOV     PCON,#00H          ;设置SMOD=0
                        MOV     TMOD,#20H          ;定时器T1设置为方式2
                        MOV     TH1,#0FDH          ;设置波特率为9600bps
                        MOV     TL1,#0FDH
                        SETB    TR1                ;启动T1
                        MOV     SCON,#0F0H         ;串口工作于方式3,允许接收,TB8=0
AA:                     CLR     RI                 ;清接收中断标志
                        JNB     RI,$               ;等待主机呼叫
                        MOV     A,SBUF             ;主机呼叫的从机地址送A
                        CJNE    A,#01H,AA          ;是本机地址?否,跳到AA,继续等待主机呼叫
                        MOV     SBUF,#01H          ;是,返回本机地址,回应主机

                        MOV     P1,#06H            ;显示“1”,告知从机用户发送数据
                        CLR     P2.0
                        MOV     R6,#0               ;调用延时程序
                        LCALL   DELAY
                        LCALL   SENTER             ;调用发送子程序
                        MOV    R4,#30              ;设置刷新的次数

DISAGAIN:              LCALL   DISPLAYLED   ;调用显示子程序
                       DJNZ   R4,DISAGAIN 
                       SETB   SM2           ;准备下一次接收主机呼叫
                       SETB   REN           ;从机允许再次接收数据
                       SJMP   AA            ;跳到AA,再次等待主机呼叫 
                       
SENTER:                MOV     R0,#30H          ;设置数据块存放始地址
                       MOV     70H,#0           ;校验和初始化为零
                       MOV     R2,#0            ;将存放数据个数的寄存器R2清零

KEY:                   SETB    P2.7              ;设置OK键 
                       CLR     P2.6
                      
                       MOV     R0,#0F8H            ;屏蔽码及P1口控制字
                       MOV     P1,R0               ;个行接地,P1.3~P1.5为输入
                       MOV     A,P1                ;读入列信息
                       CJNE    A,#0F8H,WAIT       ;根据扫描结果判断有无键按下?有,跳到WAIT
                       SJMP    KEY                ;无,跳回KEY,开始新一轮扫描

WAIT:                  MOV     R6,#1
                       LCALL    DELAY              ;按键延时消抖 
                       MOV     R0,#0F8H            ;屏蔽码及P1口控制字
                       MOV     P1,R0               ;个行接地,P1.3~P1.5为输入
                       MOV     A,P1                ;读入列信息
                       CJNE    A,#0F8H,SCAN        ;再根据扫描结果判断有无键按下?有,跳到SCAN 
                       SJMP    KEY                 ;无,跳回KEY,开始新一轮的扫描

SCAN:                  MOV     R1,#03H             ;列数为3
                       MOV     20H,#0FEH            ;初始化扫描字
                       MOV     10H,#01H             ;初始化键号

BEGIN:                 MOV     A,20H
                       MOV     P1,A                ;扫描第一行
                       MOV     A,P1                ;输入列信息
                       CJNE    A,20H,FL            ;第一行有键按下?有,找到列值
                       MOV     A,20H               ;无,调整扫描字
                       RL      A
                       MOV     20H,A
                       MOV    A,R1                
                       ADD    A,20H                ;键号加列数
                       MOV    20H,A
                       SJMP   BEGIN                ;继续扫描
                      
FL:                    MOV    A,P1                  ;读取列信息
                       JNB    ACC.3,DO              ;第一列为零?是,跳到DO
                      INC    10H                    ;否,键号加1
                      JNB    ACC.4,DO              ;第二列为零?是,跳到DO
                      INC    10H                    ;否,键号加1 
                      JNB   ACC.5,DO
DO:                   INC   R2                     ;记录数据个数
                      MOV  A,10H
                     MOV   DPTR,#LEDMAP 
                     MOVC  A,@A+DPTR                ;数值转换为显示码
                     MOV   @R0,A                    ;显示码存入数据缓冲区
                     INC   R0
                     
                     MOV   A,R2                     ;设置传送数据的最大个数即最多传送10个数据
                     CLR   C
                     SUBB  A,#0AH                    
                     JZ    TT                        ;达到最大值?是,跳到TT
 
                    JB   P2.7,KEY                  ;否,OK键按下?否,跳到KEY,继续输入数据
                    
TT:                  MOV  A,R2
                     MOV  SBUF,A                    ;发送数据个数
                     CLR   TI
                     JNB   TI,$                      ;等待一个字节发送完
                    
                    
                     MOV     R0,#30H       ;设置数据块存放始地址
                     MOV     70H,#0        ;校验和初始化为零

SENTERAGAIN:         MOV     A,@R0
                     MOV    SBUF,A         ;发送当前的数据
                     ADD     A,70H         ;计算校验和
                     MOV    70H,A           ;存放校验和
                     INC     R0             ;准备下个要发送的数据的存放地址
                     ADD     A,70H          ;计算接收数据的校验和
                     MOV     70H,A           ;暂存校验和
                     CLR    TI
                     JNB    TI,$             ;等待一个字节的数据发送完
                     DJNZ    R2,SENTERAGAIN   ;所有数据接收完?否,跳到SENTERAGAIN

                    MOV     A,70H             ;发送校验和
                    CLR     RI
                    JNB     RI,$              ;等待主机接收的结果标志位
                    CJNE    A,#00H,SENTERAGAIN  ;主机接收正确?否,返回到SENTERAGAIN再次发送数据
                    RET
                 


DISPLAYLED:       MOV    R0,#30H
              
DISPLAY:         MOV    R1,#4         ;共四个八段管 
                 MOV    R3,#11111110B ;从左边开始显示

LOOP:            MOV    P2,#0FH       ;关所有八段管
                 MOV    P1,R0         ;显示一位八段管
                 MOV    P2,R3
                 MOV    R6,#1
                 LCALL  DELAY           ;调用延迟子程序
                 MOV    A,R3           ;显示下一位
                 RL     A
                 MOV    R3,A
                 INC    R0
                 DEC    R2              ;数据块长度减1
                 DJNZ   R1,LOOP        ;四位显示完?否,跳到LOOP
                 MOV    A,R2           ;将R2中的值给A
                 JNZ    DISPLAY     ;数据块都显示完?否,跳到DISPLAY
                 RET                    ;是,返回
 
               END
                    
                    
                    
                                       






                     
 





                       
   


             



⌨️ 快捷键说明

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