764.asm
来自「一个简单的煤矿继电保护的电路和代码」· 汇编 代码 · 共 334 行
ASM
334 行
;/* 定义I2CFG的位掩码 */
CTVAL EQU 02H ;/*为I2CFG寄存器的参数定义,置位 ,CT1=1,CT0=0*/
BTIR EQU 10H ;/*使用时只要用或运算即可取相应状态,TIRUN=1*/
BMRQ EQU 40H ;/*MASTRQ=1*/
;/* 定义I2CON的位掩码 */
BCXA EQU 80H ;/*为I2CON寄存器的参数定义,置位CXA */
BIDLE EQU 40H ;/*置位IDLE*/
BCDR EQU 20H ;/*清DRDY*/
BCARL EQU 10H ;/*清ARL*/
BCSTR EQU 08H ;/*清STR*/
BCSTP EQU 04H ;/*清STP*/
BXSTR EQU 02H ;/*置位XSTR*/
BXSTP EQU 01H ;/*置位XSTP*/
;用于本程序的RAM定位
FLAGS DATA 20H ;/*I2C软件标志位*/
BITCNT DATA 21H ;/*I2C计数器*/
BYTECNT DATA 22H ;/*数据字节长度计数器*/
SLVAADR DATA 23H ;/*丛机寻址字节*/
SUBADR DATA 24H ;/*丛机内指定地址*/
STACKSAVE DATA 25H ;/*为恢复I2C总线存储堆栈地址*/
XMTDAT DATA 30H ;/*接受数据缓冲区*/
NOACK BIT FLAGS.0 ;/*无应答标志位*/
FAULT BIT FLAGS.1 ;/*某些原因引起的总线失败标志*/
RETRY BIT FLAGS.2 ;/*恢复总线后的重入标志*/
;复位和中断向量
ORG 0000H
AJMP RESET ;硬件复位向量
ORG 0073H
AJMP TIMER1 ;定时器I中断向量,用作为I2C总线的看门狗
TIME BIT 00H ;定时标志位
K32 BIT P0.7 ;CD4051选通
K33 BIT P0.6
K34 BIT P0.5
K13 BIT P0.3 ;AD2543 P1口控制
K14 BIT P0.2
KEOC BIT P0.4
K16 BIT P0.1
K17 BIT P0.0
LWDAT EQU 0F0H
HIDAT EQU 07H
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP INT0
ORG 0023H
LJMP SERVE1
;------------------------
ORG 0100H
MAIN: MOV SP,#60H
MOV TMOD,#21H ;T0,工作方式1,16位;T1,工作方式2,通信
MOV TH0,#0FAH ;T0定时1.67ms,11.0592MHz
MOV TL0,#00H
;XXXXXXXXXXX
mov 50h,#00h
mov 51h,#00h
mov 52h,#00h
mov 53h,#00h
mov 54h,#00h
mov 55h,#00h
mov 56h,#00h
mov 57h,#00h
mov 58h,#00h
mov 59h,#00h
mov 5Ah,#00h
mov 5Bh,#00h
;mov 5Ch,#11h
;XXXXXXXXXXX
LCALL D100 ;100ms
LCALL D100
MOV TH1,#0FDH ;T1, 9600b/s
MOV TL1,#0FDH ;
MOV PCON,#00H ;SMOD0=0
MOV SCON,#50H ;串行通讯工作方式1,10bit
SETB TR1 ;启动定时器T1
SETB ES
MOV 30H,#40H ;面积存放首地址, R0,#40H
MOV 31H,#50H ;通信发射区首地址,R1,#50H
MOV 32H,#0CH ;每周期20ms采集12次记数
; 33H,#0CH ;12个RAM单元的数据异或处理
; 34H ;通道控制字
MOV 35H,#50H ;通信服务 发送区首地址
MOV 36H,#0DH ;通信服务 记数单元
CLR RS0
CLR RS1
CLR TIME ;清定时标志位
SETB ET0
SETB TR0 ;启动T0
SETB EA ;开中断
STA:
mov 40h,#00h
mov 41h,#00h
mov 42h,#00h
mov 43h,#00h
mov 44h,#00h
mov 45h,#00h
mov 46h,#00h
mov 47h,#00h
mov 48h,#00h
mov 49h,#00h
mov 4Ah,#00h
mov 4Bh,#00h
;---------------------若定时到,开始
BEGIN: JNB TIME,BEGIN ;定时时间是否到达
CLR TIME
;-------------------AD采样通道选择
MOV 34H,#00H;通道控制字
CH0: CLR K32
CLR K33 ;CH0通道选通
CLR K34
LCALL LPAD ;采样
CH1: CLR K32
CLR K33
SETB K34 ;CH1通道
LCALL LPAD
CH2: CLR K32
SETB K33
CLR K34 ;CH2
LCALL LPAD
CH3: CLR K32
SETB K33
SETB K34 ;CH3
LCALL LPAD
CH7: SETB K32
SETB K33
SETB K34
LCALL LPAD
AIN1: MOV 34H,#10H;通道控制字#00010000B
LCALL LPAD
MOV 30H,#40H;6路采样完成一次
DJNZ 32H,BEGIN ;AD采样次数减一,减至0把新面积值送通信发送区
;---------------------数据送发送区
CLR EA ;@@@@@@@@@@@@@@@@@@@
MOV 30H,#40H ;R0,#40H
MOV 31H,#50H ;R1,#50H
MOV 33H,#0CH ;12个RAM单元的数据异或处理
MOV 5CH,#00H
MOVE: ;CLR A
MOV R0,30H ;12次采集完成,开始往50H单元起的RAM送数据
MOV R1,31H
MOV A,@R0 ;XCH A,@R0 ;清旧面积数据单元
MOV @R1,A
;---------------------进行异或处理
XRL A,5CH
MOV 5CH,A
; mov r7,a
INC 30H
INC 31H
DJNZ 33H,MOVE ;异或处理结束
SETB EA ;数据存放结束,开中断
;---------------------数据存放发送区结束,重置
MOV 30H,#40H ;R0,#40H,重设
MOV 31H,#50H ;R1,#50H
MOV 32H,#0CH ;R6,#0CH,重设 ,12次采集次数
LJMP STA ;重新开始
;xxxxxxxxxxxxxxx数据采集
LPAD: LCALL A_DREAD ;第一次舍弃不保存
NOP
LCALL A_DREAD
LCALL AREA ;AVERAGE
RET ;LPAD程序段退出
A_DREAD:CLR EA ;关中断
MOV C,KEOC ;查询EOC是否为1
JNC A_DREAD ;继续查询EOC
CLR C
CLR K16 ;CLK=0
SETB K17 ;CS=1
MOV A,34H ;通道控制字R4
CLR K17 ;CS=0,开始AD
MSB: MOV R5,#04H ;高4位数据
LOOP1: MOV C,K13
RLC A
MOV K14,C
SETB K16 ;CLK=1
CLR K16 ;CLK=0
;#################
mov r7,a
DJNZ R5,LOOP1
ANL A,#0FH
MOV R2,A ;高4位放R2
MOV A,34H ;通道控制字
SWAP A
LSB: MOV R5,#08H ;低8位数据
LOOP2: MOV C,K13
RLC A
MOV K14,C
SETB K16 ;CLK=1
CLR K16 ;CLK=0
;##################
mov r7,a
DJNZ R5,LOOP2
MOV R3,A ;低8位放R3
SETB K17
SETB EA ;开中断
RET
;xxxxxxxxxxxxxxxxx采样数据值比较,求信号波形面积
AREA: CLR C
MOV A,R3 ;低位数据
;SUBB A,#0E5H
SUBB A,#LWDAT
MOV A,R2 ;高位数据
;SUBB A,#07H
SUBB A,#HIDAT
JNC HIGH ;高于参考电压
LOW: ;MOV A,#0E5H ;低于参考值
MOV A,#LWDAT
CLR C
SUBB A,R3
MOV R3,A
;MOV A,#07H
MOV A,#HIDAT
SUBB A,R2
MOV R2,A
SJMP SUMAREA
HIGH: CLR C
MOV A,R3
;SUBB A,#0E5H
SUBB A,#LWDAT
MOV R3,A
MOV A,R2
;SUBB A,#07H
SUBB A,#HIDAT
MOV R2,A
SJMP SUMAREA
;---------------------------------------
SUMAREA:CLR C ;每一路采样结束,采样数据求和
MOV R0,30H ;30H中存放面积地址,40H开始的RAM区
MOV A,@R0
ADD A,R3
MOV @R0,A ;低位保存
INC 30H ;R0+1
MOV R0,30H
MOV A,@R0
ADDC A,R2
MOV @R0,A ;高位保存
INC 30H ;R0+1
RET
;************定时服务程序****
INT0: MOV TL0,#00H
MOV TH0,#0FAH
SETB TIME
RETI
;************通信服务程序****
SERVE1: PUSH PSW
SETB RS0
CLR RS1
PUSH ACC
JBC RI,RX_ACK
CLR TI
DJNZ 36H,TXD1;36H为记数单元,判断是否发送完毕
MOV 36H,0DH ;记数标志重新设置
SJMP RETURN
TXD1: MOV R1,35H
MOV A,@R1
MOV SBUF,A
INC 35H
SJMP RETURN
;----------------------------
RX_ACK: MOV A,SBUF
XRL A,#06H
JZ FIRST ;第一次发送
SJMP RETURN
FIRST: MOV 36H,#0DH ;设置记数标志,13个TI信号
MOV 35H,#50H ;确认第一次发送前,设置指针,50H开始的RAM区
MOV R1,35H
MOV A,@R1
INC 35H
MOV SBUF,A
SJMP RETURN
RETURN: POP ACC
CLR RS1
CLR RS0
POP PSW
RETI
;------------------------------
D100: MOV 37H,#100 ;100ms
D1001: MOV 38H,#250
D1002: NOP
NOP
DJNZ 38H,D1002
DJNZ 37H,D1001
RET
;----------------------
END
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?