這個程序是為了測試51用寄存器傳遞數據。流程是給r0-----r7 兩個頁面賦值,然后串口發送頁面1 r0---r7的值。總是跑不起來,有的時候跑飛,有的時候死循環。以上程序 在子程序 SYSTEMSET: 的ret位置不返回。
無標題.png (87.8 KB, 下載次數: 34)
下載附件
2024-3-8 21:04 上傳
單片機匯編語言源程序如下:
- 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
復制代碼 |