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

📄 communication.asm

📁 通信程序实例。。 。。 。。 。。
💻 ASM
字号:
;---------------------------------------------------------
D8255    EQU     8503H  ;8255 状态/命令口地址
D8255A   EQU     8500H  ;8255 PA 口地址
D8255B   EQU     8501H  ;8255 PB 口地址
D8255C   EQU     8502H  ;8255 PC 口地址
;---------------------------------------------------------
Z8279	EQU 0FF82H  		;8279 状态/命令口地址
D8279	EQU 0FF80H  		;8279 数据口地址
LEDMOD	EQU 10H     		;右端输入,八位字符显示;
LEDFEQ	EQU 100H     		;扫描速率分频系数为18H=24
LEDCLS	EQU 0D1H    		;清除
LEDWRO	EQU 90H     		;设定的将要写入的"显示RAM地址"
                            ;地址从0000开始,且自动增量AI=1
A_DPORT EQU     8600H 		;0809通道0地址
SECOND	EQU		40H
MINUTE	EQU		41H
HOUR	EQU		42H
N1		EQU		43H
N2		EQU		44H
N3		EQU		45H
N4		EQU		46H
N5		EQU		47H
N6		EQU		48H
N7		EQU		49H
N8		EQU		50H

		Org 0000h
    	ljmp 0100h
    	ORG 000BH
    	LJMP T0INT
        ORG     0013H
        LJMP    INT_1
        org 0100h
            
start1:	LCALL   DELAY           ;延时
        MOV     DPTR,#D8255
        MOV     A,#82H          ;置8255状态
                MOVX    @DPTR,A    ;方式0,PA,PC口输出,PB口输入
                 
        	mov tmod,#21h   ;选定T1为模式2(自动重装)
             mov tl1,#0E8h   ;设定初值,波特率为1200HZ
             mov th1,#0E8h   ;同上
             mov pcon,#00h   ;PCON的SMOD=0
             setb tr1        ;启动T1定时器
             clr ri          ;清接收标志
             MOV		SECOND,#00H
	MOV		MINUTE,#59H
	MOV		HOUR,#00H

		
	MOV		TH0,#4BH
	MOV		TL0,0FCH
	MOV		IE,#82H
	SETB	TR0
             mov scon,#50h   ;设定串行口为方式1(允许接收)
          	MOV	R1,#0
     		MOV	R2,#0
     		
     	     
RXD1:       JNB RI,NEXT
			CLR	RI
     		 mov A,sbuf      ;数据送累加器A
     		 clr c
     		 subb A,#0
     		 jz loop2        ;若代码为0,则由开关显示a
     		 
     		 MOV R5,#03H
X:			Jb ri,AbC    ;判断是否接收到数据?
     		LCALL DELAY
     		DJNZ R5,X
     		LJMP RXD1 

AbC:    	clr  ri          ;接收到一个数据后必须清接收标志,否则不能在接受数据
   		  	    		 
     		 mov B,sbuf      ;数据送B
     		 MOV 30H,B
      		 lcall 	btod	;否则由数码管显示
        MOV      A,33H
        MOV 	DPTR,#LEDSEG		;显示用字符表首址送DPTR 准备查表
		MOVC 	A,@A+DPTR			;查表
		ORL		A,#80H
		MOV 	25H,A				;查出的字符送内部RAM的20H单元
		MOV 	A,32H				;BCD码送A
		MOVC 	A,@A+DPTR			;查表
		MOV 	26H,A
		MOV		A,31H
		MOVC	A,@A+DPTR
		MOV		27H,A				;送内部RAM的22H单元
		LCALL 	INIT8279			;调子程序将数据送8279显示
		SJMP RXD1
Loop2:      jnb ri,LOOP2    ;判断是否接收到数据?
     		 clr ri          ;接收到一个数据后必须清接收标志,否则不能在接受数据
     		 mov A,sbuf      ;数据送B
     		MOV DPTR,#D8255C
             MOVX	@DPTR,A
            SJMP RXD1     ;返回继续
nexT:	                                  ;没收到数据转next	
			mov p1,#0ffh	;读P口之前要把它置高
			MOV	A,P1
			CLR	C
			SUBB A,r1
			JZ	A_D  ;若开关输入没变看ad
			MOV	R1,P1
    	   mov p1,#0ffh
    	   MOV	A,#0     ;发代码
    	   MOV	SBUF,A   
    	   loop6:  jnb ti,loop6   ;判断数据是否发送完毕?
             clr ti          ;发送完一帧后清标志 
             LCALL DELAY
             mov a,R1        ;发P1口输入数据
             mov sbuf,a      ;数据送SBUF发送
     loop4:  jnb ti,loop4   ;判断数据是否发送完毕?
             clr ti          ;发送完一帧后清标志
            SJMP RXD1   ;返回最开始
		
A_D:       
        ;MOV     SP,#60H
        MOV     R7,#0FFH      	  ;初始化,读数标志
        SETB    IT1				  ;INT1为边沿触发
        SETB    EA				  ;开中断
        SETB    EX1               ;INT1允许中断
        MOV     DPTR,#A_DPORT
        MOVX    @DPTR,A           ;启动 A_D
        CJNE    R7,#00H,$         ;等待 A_D 转换结束
        MOV		B,A
        CLR	C
			SUBB A,r2
			JZ	LOOP9   ;若ad输入没变返回最开始
			MOV	R2,B
    	   mov p1,#0ffh
    	   MOV	A,#1     ;发代码
    	   MOV	SBUF,A   
    	   loop5:  jnb ti,loop5   ;判断数据是否发送完毕?
             clr ti          ;发送完一帧后清标志
             LCALL DELAY 
             mov a,R2        ;发P1口输入数据
             mov sbuf,a      ;数据送SBUF发送
     loop7:  jnb ti,loop7   ;判断数据是否发送完毕?
             clr ti          ;发送完一帧后清标志
     LOOP9:    LJMP RXD1    ;返回最开始
        
        	
INT_1:
        MOVX    A,@DPTR           ;读 A_D 数据
        MOV     R7,#00H           ;置读数标志
        RETI
        
LEDSEG: DB     3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;'0,1,2,3,4,5,6,7'
        DB     7FH,6FH,77H,7CH,39H,5EH,79H,71H ;'8,9,A,B,C,D,E,F'
        


INIT8279:                       ;8279子程序,显示RAM20H~27H中的数据
        PUSH   DPH              ;保存现场
        PUSH   DPL
        PUSH   ACC
        PUSH   02H
        PUSH   01H
        LCALL  DELAY            ;延时
        MOV    R1,#20H
        MOV    R2,#08H
        MOV    DPTR ,#Z8279
        MOV    A,#LEDMOD        ;置8279工作方式00010000B,8位右入
        MOVX   @DPTR,A			;编码扫描键盘,双键锁定
        MOV    A,#LEDFEQ        ;置键盘扫描速率,分频系数N=24
        MOVX   @DPTR,A
        ;MOV    A,#LEDCLS       ;清除显示RAM ,11010001B
        ;MOVX   @DPTR,A			;将8279的显示RAM全部清零
        LCALL  DELAY            ;延时,8279的清除需要160μS
        MOV    DPTR,#Z8279		
        MOV    A,#LEDWRO		; 设定显示RAM的起始地址
		MOVX	@DPTR,A			; 向8279 发"写显示RAM"命令
		MOV    DPTR,#D8279		; 指向8279的数据口
LOOP33: MOV	A,@R1				; R1指向单片机内部RAM的20H单元
		MOVX   @DPTR,A
        INC R1
        DJNZ R2,LOOP33
        POP    01H
        POP    02H
        POP    ACC                ;恢复现场
        POP    DPL
        POP    DPH
        RET
btod:	push psw
        push acc
        MOV A,30H
        mov b,#100
        div ab
        anl a,#0fh
              		mov 31h,a		;百位存31h单元
              		mov a,b
            			mov b,#10
                		div ab
              		anl a,#0fh
              		mov 32h,a		;十位存32h单元
              		mov a,b
              		anl a,#0fh
              		mov 33h,a		;个位存33h单元
              		pop acc
              		pop psw
                		ret
   
   

DELAY:                            ;延时子程序
        PUSH    00H               ;保存现场
        PUSH    01H
        MOV     R0,#00H
DELAY1: MOV     R1,#00H
        DJNZ    R1,$
        DJNZ    R0,DELAY1
        POP     01H               ;恢复现场
        POP     00H
        RET
T0INT:
	PUSH  DPL
	PUSH	DPH
	PUSH  ACC
	MOV		TH0,#4BH
	MOV		TL0,0FCH
	DJNZ	N5,LOOP49
	MOV		A,SECOND
	ADD		A,#01H
	DA		A
	MOV		N1,A
	CJNE	A,#60H,GO1
	MOV		N1,#00H
	MOV		A,MINUTE
	ADD		A,#01H
	DA		A
	MOV		N2,A
	CJNE	A,#60H,GO2
	MOV		N2,#00H
	MOV		A,HOUR
	ADD		A,#01H
	MOV		HOUR,A
GO2:
	MOV		MINUTE,N2
GO1:
	MOV		SECOND,N1
	MOV		N5,#01H;;;;;;;;;;;;;;;;;;;;;;;;
	MOV		A,SECOND
	LCALL	CAIFEN
	LCALL	OUT1
	MOV		A,MINUTE
	LCALL	CAIFEN
	LCALL	OUT2
	MOV		A,HOUR
	MOV		N7,A
	MOV		A,#0FH
	ANL		A,N7
	MOV		DPTR,#LEDSEG
	MOVC	A,@A+DPTR
	ORL		A,#80H
	MOV		24H,A
	LCALL	INIT8279
LOOP49:
	POP ACC
	POP DPH
	POP DPL
	RETI
CAIFEN:
	PUSH	AC
	MOV		N7,A
	MOV		N8,A
	MOV		A,#0FH
	ANL		A,N7
	MOV		N7,A
	MOV		A,#0F0H
	ANL		A,N8
	SWAP	A
	MOV		N8,A
	POP		ACC
	RET
OUT1:
	MOV		A,N7
	MOV		DPTR,#LEDSEG
	MOVC	A,@A+DPTR
	MOV		20H,A
	MOV		A,N8
	MOVC	A,@A+DPTR
	MOV		21H,A
	RET
OUT2:
	MOV		A,N7
	MOV		DPTR,#LEDSEG
	MOVC	A,@A+DPTR
	ORL		A,#80H
	MOV		22H,A
	MOV		A,N8
	MOVC	A,@A+DPTR
	MOV		23H,A
	RET
       
        	       
	end

⌨️ 快捷键说明

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