📄 401.asm
字号:
;;;;;;;;;;;;;;;;;;;;;定义变量;;;;;;;;;;;;;;;;;;;;;;
PRE1 EQU 20H ;数据前缀1
PRE2 EQU 21H ;数据前缀2
ADH EQU 22H ; 用于存放AD转换结果的高4位
ADL EQU 23H ; 用于存放AD转换结果的低8位
VBIT EQU 24H ; 用于存放位变量
CRCH EQU 25H ; 存放CRC校验码高字节
CRCL EQU 26H ; 存放CRC校验码低字节
;;;;;;;;;;(定义各个引脚)
SCLK BIT P1.3 ; MAX187 串行时钟引脚
CS BIT P1.1 ; MAX187 的AD转换启动控制引脚
DOUT BIT P1.2 ; MAX187 串行数据引脚
;;;;;;;;;;;;;;;
TXEN BIT P1.5 ; nRF401 的收发控制引脚
OK BIT P1.4 ; 指示灯控制位
;;;;;;;;程序开始;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0000H
LJMP MAIN ;
;;;;;;;;以下为余式表;;;;;;;;;;
ORG 0100H
TAB1:
DB 00H,010H,020H,030H,040H,050H,060H,070H,081H,091H,0A1H,0B1H,0C1H,0D1H,0E1H,0F1H
DB 12H,002H,032H,022H,052H,042H,072H,062H,093H,083H,0B3H,0A3H,0D3H,0C3H,0F3H,0E3H
DB 24H,034H,004H,014H,064H,074H,044H,054H,0A5H,0B5H,085H,095H,0E5H,0F5H,0C5H,0D5H
DB 36H,026H,016H,006H,076H,066H,056H,046H,0B7H,0A7H,097H,087H,0F7H,0E7H,0D7H,0C7H
DB 48H,058H,068H,078H,008H,018H,028H,038H,0C9H,0D9H,0E9H,0F9H,089H,099H,0A9H,0B9H
DB 5AH,04AH,07AH,06AH,01AH,00AH,03AH,02AH,0DBH,0CBH,0FBH,0EBH,09BH,08BH,0BBH,0ABH
DB 6CH,07CH,04CH,05CH,02CH,03CH,00CH,01CH,0EDH,0FDH,0CDH,0DDH,0ADH,0BDH,08DH,09DH
DB 7EH,06EH,05EH,04EH,03EH,02EH,01EH,00EH,0FFH,0EFH,0DFH,0CFH,0BFH,0AFH,09FH,08FH
DB 91H,081H,0B1H,0A1H,0D1H,0C1H,0F1H,0E1H,010H,000H,030H,020H,050H,040H,070H,060H
DB 83H,093H,0A3H,0B3H,0C3H,0D3H,0E3H,0F3H,002H,012H,022H,032H,042H,052H,062H,072H
DB 0B5H,0A5H,095H,085H,0F5H,0E5H,0D5H,0C5H,034H,024H,014H,004H,074H,064H,054H,044H
DB 0A7H,0B7H,087H,097H,0E7H,0F7H,0C7H,0D7H,026H,036H,006H,016H,066H,076H,046H,056H
DB 0D9H,0C9H,0F9H,0E9H,099H,089H,0B9H,0A9H,058H,048H,078H,068H,018H,008H,038H,028H
DB 0CBH,0DBH,0EBH,0FBH,08BH,09BH,0ABH,0BBH,04AH,05AH,06AH,07AH,00AH,01AH,02AH,03AH
DB 0FDH,0EDH,0DDH,0CDH,0BDH,0ADH,09DH,08DH,07CH,06CH,05CH,04CH,03CH,02CH,01CH,00CH
DB 0EFH,0FFH,0CFH,0DFH,0AFH,0BFH,08FH,09FH,06EH,07EH,04EH,05EH,02EH,03EH,00EH,01EH
TAB2:
DB 00H,021H,042H,063H,084H,0A5H,0C6H,0E7H,008H,029H,04AH,06BH,08CH,0ADH,0CEH,0EFH
DB 31H,010H,073H,052H,0B5H,094H,0F7H,0D6H,039H,018H,07BH,05AH,0BDH,09CH,0FFH,0DEH
DB 62H,043H,020H,001H,0E6H,0C7H,0A4H,085H,06AH,04BH,028H,009H,0EEH,0CFH,0ACH,08DH
DB 53H,072H,011H,030H,0D7H,0F6H,095H,0B4H,05BH,07AH,019H,038H,0DFH,0FEH,09DH,0BCH
DB 0C4H,0E5H,086H,0A7H,040H,061H,002H,023H,0CCH,0EDH,08EH,0AFH,048H,069H,00AH,02BH
DB 0F5H,0D4H,0B7H,096H,071H,050H,033H,012H,0FDH,0DCH,0BFH,09EH,079H,058H,03BH,01AH
DB 0A6H,087H,0E4H,0C5H,022H,003H,060H,041H,0AEH,08FH,0ECH,0CDH,02AH,00BH,068H,049H
DB 97H,0B6H,0D5H,0F4H,013H,032H,051H,070H,09FH,0BEH,0DDH,0FCH,01BH,03AH,059H,078H
DB 88H,0A9H,0CAH,0EBH,00CH,02DH,04EH,06FH,080H,0A1H,0C2H,0E3H,004H,025H,046H,067H
DB 0B9H,098H,0FBH,0DAH,03DH,01CH,07FH,05EH,0B1H,090H,0F3H,0D2H,035H,014H,077H,056H
DB 0EAH,0CBH,0A8H,089H,06EH,04FH,02CH,00DH,0E2H,0C3H,0A0H,081H,066H,047H,024H,005H
DB 0DBH,0FAH,099H,0B8H,05FH,07EH,01DH,03CH,0D3H,0F2H,091H,0B0H,057H,076H,015H,034H
DB 4CH,06DH,00EH,02FH,0C8H,0E9H,08AH,0ABH,044H,065H,006H,027H,0C0H,0E1H,082H,0A3H
DB 7DH,05CH,03FH,01EH,0F9H,0D8H,0BBH,09AH,075H,054H,037H,016H,0F1H,0D0H,0B3H,092H
DB 2EH,00FH,06CH,04DH,0AAH,08BH,0E8H,0C9H,026H,007H,064H,045H,0A2H,083H,0E0H,0C1H
DB 1FH,03EH,05DH,07CH,09BH,0BAH,0D9H,0F8H,017H,036H,055H,074H,093H,0B2H,0D1H,0F0H
;;;;;;;;主程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MAIN:
CLR OK ;指示灯闪一下,系统开始工作
LCALL DELAY5 ;延时5ms
LCALL DELAY5 ;延时5ms
LCALL DELAY5 ;延时5ms
LCALL DELAY5 ;延时5ms
SETB OK ;
;初始化设置
MOV TMOD,#20H ;定时器T1工作于方式2(即:自动重装8位定时器)
MOV TL1,#0FDH ;
MOV TH1,#0FDH ;定时器初值为0FDH ;设定串口通信频率9600bps
MOV PCON,#00H ;令SMOD=0,即串口速率不加倍
SETB TR1 ;启动T1计数
MOV SCON,#40H ;串口工作于方式1(即:10位异步传输),禁止接收
LCALL DELAY5 ;延时5ms ,使401系统能进入稳定的工作状态
;;;;;;;;;;数据传输及AD转换;;;;;;;;;
MLOOP:
CLR OK ;系统工作,使指示灯亮
LCALL AD187 ;调用187的AD转换程序
MOV 20H,#0CCH ;加两个字头
MOV 21H,#0CCH ;
;;;;;;;;;CRC校验;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV CRCH,#00H ; 清除CRC校验位
MOV CRCL,#00H ;
MOV R5,ADH ; 将被校验数据的前两个字节分别放入R5,R6
MOV R6,ADL ;
MOV R0,#VBIT ; 将第三个字节的始地址送R0
LCALL CRC ; 调用CRC校验程序对测量的数据进行校验
MOV CRCH,R5 ; 将结果的高字节存入CRCH
MOV CRCL,R6 ; 将结果的低字节存入CRCL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;发送数据(的子程序);;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SETB TXEN ;使401为发送状态
LCALL DELAY5 ;延时5ms
MOV R0,#20H ;要发送数据的始地址送R0
MOV R1,#07H ;要发送数据的个数送R1
TLOOP:
MOV A,@R0 ;
MOV SBUF,A ;发送数据
THERE: JNB TI,THERE ;若没有发送完数据则循环等待
CLR TI
INC R0
DJNZ R1,TLOOP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SETB OK ;数据发送完,则使指示灯熄灭
MOV R0,#10
XLOOP: LCALL DELAY5 ;延迟50ms
DJNZ R0,XLOOP
LJMP MLOOP ;返回
;;;;;;;;;;;;MAX187的AD转换子程序及开关量检测;;;;;;;;;;;;;;
AD187:
CLR CS ;置CS为低电平,启动A/D转换
NOP
SETB DOUT ;DOUT置为1,以读取端口数据
NOP
NOP
ALOOP: JNB DOUT,ALOOP ;等待转换完成
CLR A ;将A清零
MOV R0,#4 ;读前4位
ALOOP1: SETB SCLK
CLR SCLK
MOV C,DOUT ;读取一位数据
RLC A
DJNZ R0,ALOOP1
MOV ADH,A ;前4位存入ADH
CLR A
MOV R0,#8 ;读后8位
ALOOP2: SETB SCLK
CLR SCLK
MOV C,DOUT
RLC A
DJNZ R0,ALOOP2
MOV ADL,A ;后8位存入ADL
SETB SCLK ;多加一个时钟
CLR SCLK
NOP
SETB CS ; 读完之后CS置1
;;;;;;;;;;;;;;;;;;;;;;;
MOV A,P0 ;从P0口检测开关量
MOV VBIT,A
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;延迟5毫秒的子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY5:
MOV R7,#10 ;
DLOOP2: MOV R6,#250 ;
DLOOP1: DJNZ R6,DLOOP1 ;
DJNZ R7,DLOOP2 ;
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;CRC校验子程序
;入口: R0(第三个字节的始地址),R5(被校验数据的第一个字节),R6(被校验数据的第二个字节)
;出口:R5(结果的高字节),R6(结果的低字节)
CRC:
CLOOP:
MOV A,@R0 ;
MOV R7,A ; 第三个字节的数送R7
;;;;;开始查表计算R5、R6和R7三个字节的数据的CRC校验码,计算结果将存放在R5和R6中;;;;;;
MOV DPTR, #TAB1 ; 指向余式表上半区 ;余式表的存放地址的低字节必须为00
MOV DPL, R5 ; 指向对应单元
CLR A ;
MOVC A, @A+DPTR ; 读余式的高字节
XRL A, R6 ; 计算余式的高字节
MOV R5, A ; 存入R5
INC DPH ; 指向余式表下半区
CLR A ;
MOVC A, @A+DPTR ; 读余式的低字节
XRL A, R7 ; 计算余式的低字节
MOV R6, A ; 存入R6
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
END ;全部程序结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -