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

📄 uart.asm

📁 89c52串口通信
💻 ASM
字号:
;串口通信测试
;晶振6.0MHz,通信波特率7500,采用T2作为串行口波特率发生器
;文件名:UART.ASM
;于2006年9月22日至2006年9月24日编程   作者:唐元广
;
;主程序段
	ORG	0000H
	LJMP	MAIN            ;转主程序段
        ORG     0023H
        LJMP    COMINT          ;转串行口中断服务程序
	ORG	0040H
MAIN:	MOV	SP,#80H         ;堆栈空间128个字节
        MOV     A,#0FFH
        MOV     P0,A
        MOV     P3,A
        MOV     P2,A
        MOV     TMOD,#11H       ;T0,T1为方式1(16位)
        CLR     A
        MOV     PSW,A           ;通用寄存器R0-R7选择0区
;面板指示灯及磁场量程的初使化程序段
MAINLB1:MOV     IP,#10H         ;设定,PS为高优先级(鄢定明书P107)
	MOV     PCON,#00H
	MOV     SCON,#070H      ;选择串行口方式1
        MOV     T2CON,#34H      ;发送和接收波特率
	MOV     TH2,#0FFH       ;设定时初值(波特率为:7500)
	MOV     TL2,#0E7H
        MOV     RCAP2H,#0FFH
        MOV     RCAP2L,#0E7H
        CLR     TR0             ;禁止定时器0工作
        CLR     ET0             ;禁止定时器0中断
        MOV     30H,#80H        ;串行口接收数据缓冲区首单元置空
	CLR     ET1             ;禁止定时器1中断
 	SETB    EA              ;允许CPU中断
;主循环程序段
MAINLOP:SETB    ES              ;允许串行口中断
        MOV     A,30H           ;接收的控制数据送A
	CLR     C
	PUSH    A
	SUBB    A,#0BH
	POP     A
	JNC     MAINLOP         ;为空转回
	CLR     ES              ;禁止串行口中断
	MOV     B,#03H          ;通讯功能程序入口地址表间隔
	MUL     AB
	MOV     30H,#80H        ;接收数据缓冲区置空
	MOV     DPTR,#KPRG1     ;指向通讯功能程序入口地址表首址
	JMP     @A+DPTR         ;键功能程序散转
;通讯功能程序入口地址表
KPRG1:  LJMP	MAGNCHG		;转微机改变磁场量程转换程序段
MAGNCHG:MOV     A,#01H
        LCALL   TXDSUB
        MOV     A,#80H
        LCALL   TXDSUB
        MOV     A,#20H
        LCALL   TXDSUB
        MOV     A,#30H
        LCALL   TXDSUB
        MOV     A,#0DH          ;给微机发送回车符
        LCALL   TXDSUB
        LJMP    MAINLOP
;串行口中断服务程序段
;接收数据说明:一接收到0DH则中断返回
;出口参数:接收的数据在缓冲区30H~37H中
COMINT: CLR     ES              ;关串行口中断
	JNB     RI,COMINT0      ;不是接收数据中断标志转
	CLR     RI
	PUSH    00H             ;R0入栈
	PUSH    A
        PUSH    B
        PUSH    PSW
	MOV     A,SBUF
	MOV     30H,A           ;接收的控制数据送30H单元
	MOV     R0,#31H         ;指向接收数据缓冲区首址
COMINT1:LCALL   RXDSUB          ;调用接收一字节子程序
        MOV     @R0,A
	INC     R0
	CLR     C
	SUBB    A,#0DH
	JNZ     COMINT1         ;没有接收到0DH则继续接收
        POP     PSW
        POP     B
	POP     A
	POP     00H
COMINT0:CLR     TI
	SETB    ES              ;允许串行口中断
	RETI
;接收一字节子程序
;出口参数:接收到的ASCII码在A中
RXDSUB: PUSH    DPL
        PUSH    DPH
        PUSH    B
        MOV     B,#0AH
RXDLOP4:MOV     DPH,#0FFH
RXDLOP3:MOV     DPL,#0FFH
RXDLOP2:JNB     RI,RXDLOP0      ;等待接收标志置位
        SJMP    RXDLOP1
RXDLOP0:DJNZ    DPL,RXDLOP2
        DJNZ    DPH,RXDLOP3
        DJNZ    B,RXDLOP4       ;等待2.6S后未接收到则退出
        MOV     A,#0DH
        SJMP    RXDLOP5
RXDLOP1:CLR     RI
	MOV     A,SBUF
RXDLOP5:POP     B
        POP     DPH
        POP     DPL
        RET
;发送一字节子程序段
;入口参数:要发送的数据送A中
TXDSUB: MOV     SBUF,A
TDWAIT0:JNB     TI,TDWAIT0
        CLR     TI
        RET

⌨️ 快捷键说明

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