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

📄 401.asm

📁 AD_CRM401将AD采集到的数据通过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 + -