这个程序是为了测试51用寄存器传递数据。流程是给r0-----r7 两个页面赋值,然后串口发送页面1 r0---r7的值。总是跑不起来,有的时候跑飞,有的时候死循环。以上程序 在子程序 SYSTEMSET: 的ret位置不返回。
单片机汇编语言源程序如下:
- AUXR EQU 08EH //辅助寄存器
- T2H DATA 0D6H //定时器2高8位
- T2L DATA 0D7H //定时器2低8位
- P_SW1 EQU 0A2H //外设功能切换寄存器1
- S1_S0 EQU 40H //P_SW1.6
- S1_S1 EQU 80H //P_SW1.7
- BUSY BIT 20H.0 //忙标志位
- ORG 0000H
- LJMP MAIN
- ORG 0030H
- //主程序 **************************************
- MAIN:
- LCALL SYSTEMSET
- LCALL UART_2
- D1:
- LCALL DDATA
- LJMP D1
- RET
- //主程序 **************************************
- UART_2:
- PUSH ACC
- // PUSH PSW
- CLR BUSY ;
- // CLR EA ;
- MOV SP,#3FH ;
- ANL P_SW1,#03FH ;S1_S0=0 S1_S1=0
- MOV SCON,#50H ;8位可变波特率
- ORL AUXR,#04H ;定时器2时钟为Fosc,即1T
- ORL AUXR,#01H ;串口1选择定时器2为波特率发生器 9600
- MOV T2L,#0E0H ;设定定时初值 9600
- MOV T2H,#0FEH ;设定定时初值
- ORL AUXR,#10H ;启动定时器2
- // SETB ES; //使能串口中断
- // SETB EA;
- // POP PSW
- POP ACC
- RET
- SYSTEMSET:
- PUSH ACC
- MOV 00H,#0X01
- MOV 01H,#0X02
- MOV 02H,#0X03
- MOV 03H,#0X04
- MOV 04H,#0X05 ;寄存器 R0--R7 0页面
- MOV 05H,#0X06
- MOV 06H,#0X07
- MOV 07H,#0X08
- MOV 08H,#0X09
- MOV 09H,#0X0A
- MOV 0AH,#0X0B
- MOV 0BH,#0X0C ;寄存器 R0--R7 1页面
- MOV 0CH,#0X0D
- MOV 0DH,#0X0E
- MOV 0EH,#0X0F
- MOV 0FH,#0X11
- POP ACC
- RET
- DDATA:
- PUSH ACC
- PUSH PSW
- SETB PSW.3 ;将r0---r7 1页面 8个值发送串口
- SETB BUSY;
- MOV A,R0
- MOV SBUF,A; //写数据到UART数据寄存器
- JNB TI,$;
- CLR TI;
- SETB BUSY;
- MOV A,R1
- MOV SBUF,A; //写数据到UART数据寄存器
- JNB TI,$;
- CLR TI;
- SETB BUSY;
- MOV A,R2
- MOV SBUF,A; //写数据到UART数据寄存器
- JNB TI,$;
- CLR TI;
- SETB BUSY;
- MOV A,R3
- MOV SBUF,A; //写数据到UART数据寄存器
- JNB TI,$;
- CLR TI;
- SETB BUSY;
- MOV A,R4
- MOV SBUF,A; //写数据到UART数据寄存器
- JNB TI,$;
- CLR TI;
- SETB BUSY;
- MOV A,R5
- MOV SBUF,A; //写数据到UART数据寄存器
- JNB TI,$;
- CLR TI;
- SETB BUSY;
- MOV A,R6
- MOV SBUF,A; //写数据到UART数据寄存器
- JNB TI,$;
- CLR TI;
- SETB BUSY;
- MOV A,R7
- MOV SBUF,A; //写数据到UART数据寄存器
- JNB TI,$;
- CLR TI;
- POP PSW
- POP ACC
- RET;
- end
复制代码 |