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

📄 master.asm

📁 关于51单片机学习的基本样例程序
💻 ASM
字号:
;----------------------------------
;                   单片机与单片机通信实例(主机)
;功能:通过串口与从机与主机的通信,对从机1发出问询帧,然后接收从机1 
;       的脉冲数,通过简单计算得出电压控制值,通过串口发给从机2
;-----------------------------------
ORG 0000H
JMP START                 ; 程序开始
ORG 000BH                 
JMP Timer0_ISR           ; 定时器T0中断向量

START:
    MOV SP,#60H         ; 将堆栈位置设为60H
    CALL Init             ; 进行串口及相关寄存器的初始化
    MOV 30H,#7FH        ; 将30h设为7fh
MOV R3,#0H          ; 将触发标志位清零

Init:
;---------------------------------
;     程序初始化,包括串口、定时器T1、中断的初始化
;---------------------------------
      MOV SCON,#11010000B    ; 串口控制寄存器初始化
      ORL PCON,#10000000B    ; 把SMOD位置1
      SETB EA                ; 中断允许总控制位使能
      SETB ET0                ; 定时器T0中断使能
      SETB PT0                ; 把定时器T0中断设为高优先级
      CALL Timer0_Init       ; 进行定时器T0的初始化
      CALL Timer1_Init       ; 进行定时器T1的初始化
      RET
Timer0_Init:
;-------------------------
;    T0作为定时器,T0溢出一次为一个控制周期
;-------------------------
      ORL TMOD,#00000001B   ; 定时器T0工作在方式1
      ORL TCON,#00010000B   ; 定时器T0使能
      RET

Timer1_Init:
;-------------------------
;     定时器T1作为串口的波特率发生器
;     (2^SMOD)*fosc/32*12*(256-th1)=57600
;-------------------------
      ORL TMOD,#00100000B   ; 定时器T1工作在方式2
      ORL TCON,#01000000B   ; 定时器T1使能
      MOV TH1,#0FFH         ; 设定定时器T1的初始值
      RET
MainLoop:
      CJNE R3,#0,MainLoop   ; 等待中断触发
      MOV R1,#01H           ; R1中存放地址字节
      MOV R2,#0FEH          ; R2中存放命令字节
      CALL Serial_TX        ; 放送给从机1命令帧
      NOP
      CALL Serial_RX        ; 等待接收从机1返回的脉冲数
      
      MOV A,R1              
      SUBB A,#01H           ; 脉冲数减256
      JC UP_POWER           ; 比256小则电压加大,反之则减小
DOWN_POWER:
      MOV R0,#30H           ; 30h中存储电压控制值
      MOV A,@R0            ; 将电压控制值增加2
      INC A
      INC A
      MOV @R0,A            ; 将电压控制值写回缓存
      JMP Send_Con
UP_POWER:
      MOV R0,#30H
      MOV A,@R0            ; 将电压控制值减小2
      DEC A
      DEC A
      MOV @R0,A            ; 将电压控制值写回缓存
Send_Con:
      MOV R1,#02H            ; R1地址字节
      MOV R0,#30H            ; 读取电压控制值
      MOV A,@R0
      MOV R2,A               ; R2中存放电压控制值
      CALL Serial_TX          ; 放送从机2的命令帧
      MOV R3,#0              ; 清除触发标志位
      JMP MainLoop

Serial_TX:
;-----------------------
;   串口发送,采用查询的方式
;-----------------------
Serial_TX_LOOP1:
       MOV A,R1
       MOV SBUF,a            ; 将一个字节写入串口缓存中
       SETB C
       MOV TB8,C             ; 将发送的第9位置为1,此字节为地址
Serial_TX_WAIT1:
       JNB TI,Serial_TX_WAIT1 ; 等待该字节数据发送完成
       NOP
       CLR TI                ; 软件清除串口发送中断标志位
Serial_TX_LOOP2:
       MOV A,R2
       MOV SBUF,a            ; 将一个字节写入串口缓存中
       CLR C
       MOV TB8,C             ; 将发送的第9位置为0
Serial_TX_WAIT2:
       JNB TI,Serial_TX_WAIT2 ; 等待该字节数据发送完成
       NOP
       CLR TI                ; 软件清除串口发送中断标志位
       RET

Serial_RX:
;-------------------
;    串口接收,采用查询RI位的方式
;-------------------  
Serial_RX_WAIT1:                    ; 等待下一个字节数据的接收     
       JNB RI,Serial_RX_WAIT1
       MOV A,SBUF                ; 将接收到的数据写入A
       MOV R1,A                   ; 将接收的数据写入接收数据缓存区 
       CLR RI                      ; 软件清除串口接收中断标志位
Serial_RX_WAIT2:                    ; 等待下一个字节数据的接收     
       JNB RI,Serial_RX_WAIT2
       MOV A,SBUF                ; 将接收到的数据写入A
       MOV R2,A                   ; 将接收的数据写入接收数据缓存区 
       CLR RI              
       RET

Timer0_ISR:
      PUSH PSW
      INC R3                    ; 设置标志位,表示定时器T0触发
      POP PSW
      RETI
END

⌨️ 快捷键说明

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