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

📄 myproj.asm

📁 暑假为学生培训写的51相关接口的所有源码及项目代码
💻 ASM
字号:
;命令协议为:
;LENG为除起止位外其它数据长度 CRC为除起止、LENG及地址外所有数据的检验和
;| STR | LENG | ADDR | CMD | DAT0 | DAT1 | CRC | END |
;R0为参数0 R1为参数1 R2为参数2 R3为模式 R4为当前数值 R5为接收字节数 R6为按键功能 R7为秒倍数
	org 0000H
	LJMP Main
	org 0003H
	LJMP Int0Add
	org 000bH
	LJMP TimeSec
	org 0013H
	LJMP Int1Ent
	org 0023H
	LJMP RecvDat
	org 0100H
R8      DATA    08H   ;微秒延时
R9      DATA    09H   ;毫秒延时
R10     DATA    0AH   ;秒延时
R11     DATA    0BH
R12     DATA    0CH
R13     DATA    0DH
ADDR    DATA    0EH
INITDAT DATA    0FH   ;倒计时初值
RecvBUF DATA    10H   ;接收缓冲区最大16个
Main:		      ;初始化
	mov SP,#60h
	mov ADDR,#01h
	mov R0,#01h
	mov R1,#10h
	mov R2,#00h
	mov R3,#00h
	mov R4,#00h
	mov R5,#00h
	mov R6,#00H
	mov R7,#20H
	mov P2,#0FFh
	mov P0,#0FFH
	mov DPTR,#0400H
	mov INITDAT,#3cH
	mov TMOD,#21h
	mov TH1,#0FAh
	mov TL1,#0FAh
	mov TH0,#00h
	mov TL0,#00h
	mov SCON,#50h
	mov PCON,#80h
	mov IE,#0d7h
        setb it1
        setb it0
        setb TR1
	setb TR0
	clr  F0
	mov R2,#10H
	mov R0,#10H
	call ClearM
Again:			;循环调用显示
	Call DispLed
	Call DispNum
	Call ExcuBuf
	JMP	Again
;LED显示
DispLed:
	mov P2,#80h
	jb F0,ShowOtr
	mov P0,R6
	JMP Show
ShowOtr:
	CJNE R6,#04h,ShowStart
	mov P0,R3
	JMP Show
ShowStart:
	mov P0,INITDAT
Show:
	mov R9,#05h
	Call DelayMs
	ret
;数码显示  注意修改位控位及位控电平
DispNum:
	mov A,R4
	mov B,#0Ah
	div AB
	movc A,@A+DPTR
	mov p2,#40h
	mov p0,A
	mov R9,#05h
	Call DelayMs
	mov A,B
	movc A,@A+DPTR
	mov p2,#20H
	mov P0,A
	mov R9,#05h
	Call DelayMs
	ret
;命令处理线程
ExcuBuf:
        mov R0,#10h
        CJNE R5,#08h,NEqu08H
Nequ08H:
        JC ExitExcu      ;小于8个
        CJNE @R0,#02H,ERR
        mov A,11H
        add A,#11H
        mov R0,A
        CJNE @R0,#03H,ERR ;结尾不为0x03
        mov R0,#12H
        CJNE @R0,#01H,ERR ;地址不为0x01
        mov R0,#13H
        mov R1,11H
        dec R1
        dec R1
        dec R1
        mov A,#00h
CRCADD: Add A,@R0
        inc R0
        DJNZ R1,CRCADD  ;校验和不正确
        mov  R8,16h
        CJNE A,R8,ERR
        mov R0,13H
        mov R1,14H
        mov R2,15H
        Call DoCMD
        clr ES
        mov R2,11H
        inc R2
        inc R2
        mov A,R5
        SUBB A,R2
        mov R5,A
        mov R0,#10H
        Call ClearM
        mov A,R5
        mov R2,A
        mov R1,#10H
        mov A,#12H
        Add A,11H
        mov R0,A
        call MoveM
        setb ES
        jmp ExitExcu
ERR:                     ;错误
        clr ES
        dec R5
        mov A,R5
        mov R2,A
        mov R0,#11H
        mov R1,#10H
        Call MoveM
        add A,#10H
        mov R0,A
        mov @R0,#00H
        setb ES
ExitExcu:
        ret
;外部中断0
Int0Add:
	clr ex0
	JNB F0,AddR1
	CJNE R6,#04H,AddR3
	inc R3
	CJNE R3,#02h,Exit0
	mov R3,#00H
	JMP Exit0
AddR3:
	inc INITDAT
	mov A,#63H
	CJNE A,INITDAT,Exit0
	mov INITDAT,#00H
	JMP Exit0
AddR1:
	inc R6
	CJNE R6,#06h,Exit0
	mov R6,#00H
Exit0:
	setb ex0
	reti
;外部中断1
Int1Ent:
	clr ex1
	CJNE R6,#00H,Next01
	setb TR0
	JMP Exit1
Next01:
	CJNE R6,#01H,Next02
	clr TR0
	JMP Exit1
Next02:
	CJNE R6,#02H,Next03
	mov R4,#00H
	JMP Exit1
Next03:
	CJNE R6,#03H,NextOther
	CJNE R3,#00H,MODE1
	mov R4,#00h
	mov R7,#20h
	setb TR0
	JMP Exit1
MODE1:
	mov A,INITDAT
	mov R4,A
	JMP Exit1
NextOther:
	CPL F0
Exit1:
	setb ex1
	reti
;串行中断  实现简单的置数及计数启停
RecvDat:
        CLR ES
        mov 30H,R0
	jnb TI,RiCom
	CLR TI
RiCom:
	jnb RI,ExitCom
	CLR RI
	CJNE R5,#10H,RiNext
	jmp ExitCom
RiNext:
	mov A,R5
	add A,#10H
	mov R0,A
	mov A,SBUF
	mov @R0,A
	inc R5
ExitCom:
        mov R0,30H
        Setb ES
	reti
;定时器中断0
TimeSec:
	mov TL0,#00h
	mov TH0,#00h
	DJNZ R7,ExitSec
	mov R7,#20H
	CJNE R3,#00H,DecR0
	inc R4
	CJNE R4,#3Ch,ExitSec
	mov R4,#00h
	JMP ExitSec
DecR0:
	dec R4
	CJNE R4,#00h,ExitSec
	mov R4,INITDAT
ExitSec:
	reti
;清指定位置内存 R2字节数 R0起始位置	
ClearM:
        CJNE R2,#00,Clear
        jmp ExitClear
Clear:
        mov @R0,#00H
        inc R0
        DJNZ R2,ClearM
ExitClear:
        ret
;移指定位置内存 R2字节数 R0源地址 R1目的地址
MoveM:  
        CJNE R2,#00H,NextM
        jmp ExitMove 
NextM:
        mov R11,R2
        mov R12,R0
Move:
        mov A,@R0
        mov @R1,A
        inc R0
        inc R1
        DJNZ R2,Move
        mov A,R12
        subb A,#10H
        mov R2,A
        mov A,R5
        ADD A,#10H
        mov R0,A
        Call ClearM
ExitMove:
        ret
;执行命令 R0命令 R1扩展命令字节1 R2扩展命令字节2
DoCMD:
        CJNE R0,#00H,Do01H ;启动
        setb TR0
        jmp  ExitDo
Do01H:
        CJNE R0,#01H,Do02H ;暂停
        clr  TR0
        jmp  ExitDo
Do02H:
        CJNE R0,#02H,Do03H ;清零
        mov  R4,#00h
        jmp  ExitDo
Do03H:
        CJNE R0,#03H,Do04H ;复位
        CJNE R3,#00H,MODE01
        mov  R4,#00h
        setb TR0
        jmp  ExitDo
MODE01:
        mov  R4,INITDAT
        setb TR0
        jmp  ExitDo
Do04H:
        CJNE R0,#04H,Do05H ;模式
        mov  A,R1
        mov  R3,A
        jmp  ExitDo
Do05H:
        CJNE R0,#05H,ExitDo ;初值
        mov  INITDAT,R1
        jmp  ExitDo
ExitDo:
        ret
;秒级延时子程序以130050us为单位,最大为130050us		
DelaySs:		
	mov 	r9,#0ffh
ss:	
	mov 	r8,#0ffh
	djnz 	r8,$
	djnz 	r9,ss
	djnz	r10,DelaySs
	ret
;毫秒延时子程序以510us为单位,最大为130050us		
DelayMs:		
	mov 	r8,#0ffh
	djnz 	r8,$
	djnz 	r9,DelayMs
	ret
;微秒延时以2us为单位,最大为510us
DelayUs:
	djnz r8,$           
        ret
	
	org 0400h
;共阳极数码管数模0~9、A~F
DB  0C0h,0F9H,0A4H,0B0H,099H,092H,082H,0F8H
DB	080H,090H,088H,083H,0C6H,0A1H,086H,08EH
	
end

⌨️ 快捷键说明

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