程序
CSX EQU P2.0
SI EQU P2.1
SCK EQU P2.2
SO EQU P2.3
SUBF EQU 20H ;定义缓冲单元
OV EQU 21H ;设立溢出标志
F0 EQU 22H ;设立判断标志
ORG 0000H
SJMP START
ORG 0003H ;中断0入口地址
LJMP INT0
ORG 000B ; 中断1入口地址
LJMP INT1
RETI
ORG 0060H
START: MOV SP #61H ;栈指针=61H, 61H~7FH
CLR A
CLR B
MOV R0,#5FH
NEXT0:MOV @R0,A ;清01H~5FH单元
DJNZ R0,NEXT0
MOV TMOD,#0DH
MOV TL0,A
MOV TH0,A ;定时器清零
MOV DPTR,#77F8H ;P2.7=0且指向0通道
MOV R7,#2 ;置通道数
ORG 1800H
XWRSR: MOV A,#1 ;X5045写使能
ACALL X5045
CLR P2.1 ;清时钟
RET
XWRDI: MOV A,#4 ;禁止写
SJMP XCM
X5045: CLR P2.0 ;片选X5045
MOV R6,#8 ;串行8位数据
CZD: CLR P2.1
RLC A
MOV P2.3,C ;写入
NOP
SETB P2.1 ;置时钟高电平
NOP
DJNZ R6, CZD
RET
XWREN:MOV A,#06H
XCM: ACALL X5045
CLR P2.1
SETB P2.0
RET
ACALL XWREN
ACALL XWRSR
MOV A, #0DH
ACALL X5045
SETB P2.0
ACALL XBUY
XBUY: MOV R5,#0
XBUZ: ACALL XRSDR
JNB ACC.0, XBEND
DJNZ R5, XBUZ
XBEND:RET
XRSDR:MOV A,#5 ;读指令
ACALL X5045
ACALL X5IN
SETB P2.0
RET
X5IN: MOV R6,#8 ;8位数据
IPUT: SETB P2.0
NOP
CLR P2.1
MOV C,P2.3 ;读出
RLC A
DJNZ R6, IPUT
RET
CYCX:MOV DPTR, #77F8H ;从IN0开始采样
MOV R0, #30H
MOV R7, #2
CY1: MOVX @DPTR, A ;启动ADC0809
MOV A, #5 ;等10个时钟再查询EOC
DJNZ ACC,$
JNB P1.6, $
MOVX A, @DPTR ;读ADC0809结果
MOV @R0, A
INC DPTR
INC R0
DJNZ R7, CY1
MOV B, @R0
RET
CLR C
MOV R1, 30H
MOV A, 31H
SUBB A, R1
JNC KBC
MOV R3, 31H
MOV R5, 30H
KBC : MOV R3, 30H
MOV R5, 31H
LCALL DAVG
DAVG :CLR A
MOV R6,A
MOV R7,A
MOV R0,#4 ;N=4
DAV1:LCALL CYCX ;A/D输入值送寄存器B,A中
MOV R1,A ;保存输入值地位
ADD A,R7 ;累加输入值
MOV R7,A
MOV A,B
ADDC A,R6
MOV R6,A
CLR C ;输入值与最小值作比较
MOV A,R3
SUBB A,R1
MOV A,R2
SUBB A,B
JNC DAV2
MOV A,R1 ;输入值大于最大值
MOV R3,A
MOV R2,B
DAV2:CLR C ;输入值与最小值作比较
MOV A,R1
SUBB A,R5
MOV A,B
SUBB A,R4
JNC DAV3
MOV A,R1 ;输入值小于最小值
MOV R5,A
MOV R4,B
DAV3:DJNZ R0,DAV1
CLR C
MOV A,R7 ;累加和中减去最大值
SUBB A,R3
XCH A,R6
SUBB A,R2
XCH A,R6 ;累加和中减去最小值
SUBB A,R5
XCH A,R6
SUBB A,R4
CLR C ;除以2
RRC A
XCH A,R6
RRC A
MOV R7,A ;R6R7中为平均值
RET
PUSH ACC
PUSH PSW
INTC: JB P3.3,INTC ;等待/INT1变为低电平
SETB TR1
LOOP1:JNB P3.3, LOOP1 ; 等待/INT1变为高电平
JB P3.3, LOOP2 ; 等待/INT1变为低电平
CLR TR1
MOV A, TL1
MOV R3, A ;被乘数低八位存放处
MOV A, TH1
MOV R2, A ;被乘数高八位存放处
MOV R6, #00H
MOV R7, #03H
LCALL MULD
MOV R6, #03H
MOV R7, #0E8H
LCALL DIVD
MOV A, R7
MOV DPTR, TAB1 ;查余弦表
MOVC A, @A+DPTR
LCALL XSCX
MOV A, R7
MOV DPTR, TAB2 ;查正弦表
MOV A, @A+DPTR
POP PSW
POP ACC
RETI
BCCX:CJNE A, #95,LOOP1 ;A>0.95转
CJNE A, #85,LOOP ;A>0.85转
LCALL XSCX
LCALL XS2
SETB P1.0
SETB P1.1
SETB P1.2
SETB P1.3
SETB P1.4
SETB P1.5
AJMP BCCX
LOOP1:CJNE A, #98, LOOP3 ;A>0.98转
LCALL XSCX
LCALL XS1
AJMP BCCX
LOOP2:LCALL XSCX
LCALL XS2
SETB P1.3
SETB P1.4
SETB P1.5
CJNE A, #95,LOOP3 ;A <0.95转
LCALL XSCX
LCALL XS1
AJMP BCCX
LOOP4: LCALL XSCX
LCALL XS2
SETB P1.0
SETB P1.1
SETB P1.2
AJMP BCCX
LOOP3:LCALL XSCX
LCALL XS3
CLR P1.3
CLR P1.4
CLR P1.5
CJNE A, #98,LOOP5 ;A≥0.98转
AJMP BCCX
LOOP5:LCALL XSCX
LCALL XS3
CLR P1.0
CLR P1.1
CLR P1.2
RET
PUSH PSW
PUSH ACC
INTX: JNB P3.2,INTX
XSCX: MOV SCON, #00H
MOV R3, #00H
MOV A, R3
MOV DPTR, #TAB
MOV A, @A+DPTR
MOV SBUF, A
LCALL DELAY
MOV A, R6
MOVC A, @A+DPTR
MOV SBUF, A
LCALL DELAY
MOV A, R7
MOVC A, @A+DPTR
MOV SBUF, A
LCALL DELAY
L4: JNB TI, L4
CLR TI
POP PSW
POP ACC
RETI
TAB: DB 0C0H 0F9H 0A4H 0B0H
DB 99H 92H 82H 0F8H 90H
DELAY:MOV R6,#10H
L5: MOV R7,#38H
L6:DJNZ R7,L6
DJNZ R6,L5
RET
XS1:MOV A, #02H
MOV SBUF, A
RET
XS2:MOV A, #09H
MOV SBUF, A
RET
XS3:MOV A, #04H
MOV SBUF, A
RET
MULD功能:双字节二进制无符号数乘法
;入口条件:被乘数在R2、R3中,乘数在R6、R7中。
;出口信息:乘积在R2、R3、R4、R5中。
;影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节
计算原理如下:
[R2] [R3]
× [R6] [R7]
[R3R7]H [R3R7]L
[R2R7]H [R2R7]L
[R3R6]H [R3R6]L
+ [R2R6]H [R2R6]L
[R4] [R5] [R6] [R7]
MULD:MOV A,R3 ;计算R3乘R7
MOV B, R7
MUL AB
MOV R4,B ;暂存部分积
MOV R5, A
MOV A,R3 ;计算R3乘R6
MOV B, R6
MUL AB
ADD A, R4 ;累加部分积
MOV R4, A
CLR A
ADDC A, B
MOV R3,A
MOV A,R2 ;计算R2乘R7
MOV B, R7
MUL AB
ADD A, R4 ;累加部分积
MOV R4, A
MOV A, R3
ADDC A, B
MOV R3, A
CLR A
RLC A
XCH A, R2 ;计算R2乘R6
MOV B, R6
MUL AB
ADD A, R3 ;累加部分积
MOV R3, A
MOV A, R2
ADDC A, B
MOV R2, A
RET
;DIVD 功能:双字节二进制无符号数除法
;入口:被除数在R2、R3、R4、R5中,除数在R6、R7中。
;出口:OV=0 时,双字节商在R6、R7中,余数在R2、R3中,OV=1 时溢出。
;影响资源:PSW、A、B、R1~R7 堆栈需求: 2字节
DIVD: CLR C ;比较被除数和除数
MOV A, R3
SUBB A, R7
MOV A, R2
SUBB A, R6
JC DVD1
SETB OV ;溢出
RET
DVD1: MOV B, #16 ;计算双字节商
DVD2: CLR C ;部分商和余数同时左移一位
MOV A,R5
RLC A
MOV R5, A
MOV A, R4
RLC A
MOV R4, A
MOV A, R3
RLC A
MOV R3, A
XCH A, R2
RLC A
XCH A, R2
MOV F0,C ;保存溢出位
CLR C
SUBB A, R7 ;计算(R2R3-R6R7)
MOV R1, A
MOV A, R2
SUBB A, R6
ANL C,/F0 ;结果判断
JC DVD3
MOV R2, A ;够减,存放新的余数
MOV A, R1
MOV R3, A
INC R5 ;商的低位置一
DVD3:DJNZ B,DVD2 ;计算完十六位商(R4R5)
MOV A, R4 ;将商移到R6R7中
MOV R6, A
MOV A, R5
MOV R7, A
CLR OV ;设立成功标志
RET
TAB1 DB 00H, 02H ;90,89度余弦值
DB 03H, 05H ;88,87度余弦值
DB 07H, 09H ;86,85度余弦值
DB 10H, 12H ;84,83度余弦值
DB 14H, 16H ;82,81度余弦值
DB 17H,19H ;80,79度余弦值
DB 21H, 23H ;78,77度余弦值
DB 24H, 26H ;76,75度余弦值
DB 28H, 29H ;74,73度余弦值
DB 31H, 33H ;72,71度余弦值
DB 34H, 36H ;70,69度余弦值
DB 37H, 39H ;68,67度余弦值
DB 41H, 42H ;66,65度余弦值
DB 44H, 45H ;64,63度余弦值
DB 47H, 48H ;62,61度余弦值
DB 50H, 52H ;60,59度余弦值
DB 53H, 54H ;58,57度余弦值
DB 56H, 57H ;56,55度余弦值
DB 59H, 60H ;54,53度余弦值
DB 62H, 63H ;52,51度余弦值
DB 64H, 66H ;50,49度余弦值
DB 67H, 68H ;48,47度余弦值
DB 69H, 71H ;46,45度余弦值
DB 72H, 73H ;44,43度余弦值
DB 74H, 75H ;42,41度余弦值
DB 77H, 78H ;40,39度余弦值
DB 79H, 80H ;38,37度余弦值
DB 81H, 82H ;36,35度余弦值
DB 83H, 84H ;34,33度余弦值
DB 85H, 86H ;32,31度余弦值
DB 87H, 87H ;30,29度余弦值
DB 88H, 89H ;28,27度余弦值
DB 90H, 91H ;26,25度余弦值
DB 91H, 92H ;24,23度余弦值
DB 93H, 93H ;22,21度余弦值
DB 94H, 96H ;20,19度余弦值
DB 96H, 96H ;18,17度余弦值
DB 96H, 97H ;16,15度余弦值
DB 97H, 97H ;14,13度余弦值
DB 98H, 98H ;12,11度余弦值
DB 98H,99H ;10,9度余弦值
DB 99H, 99H ;8,7 度余弦值
DB 99H, 99H ;6,5度余弦值
DB 99H, 99H ;4,3度余弦值
DB 99H, 99H ;2,1度余弦值
DB 99H ;0度余弦值
TAB2 DB 99H,99H,99H,98H ;90,89度正弦值
DB 99H,93H,99H,86H ;88,87度正弦值
DB 99H,75H,99H,61H ;86,85度正弦值
DB 99H,45H,99H,25H ;84,83度正弦值
DB 99H,02H,98H,77H ;82,81度正弦值
DB 98H,48H,98H,16H ;80,79度正弦值
DB 97H,81H,97H,44H ;78,77度正弦值
DB 97H,03H,96H,59H ;76,75度正弦值
DB 96H,13H,95H,63H ;74,73度正弦值
DB 95H,11H,94H,55H ;72,71度正弦值
DB 93H,97H,93H,36H ;70,69度正弦值
DB 92H,72H,92H,05H ;68,67度正弦值
DB 91H,35H,90H,63H ;66,65度正弦值
DB 89H,88H,89H,10H ;64,63度正弦值
DB 88H,29H,87H,46H ;62,61度正弦值
DB 86H,60H,85H,72H ;60,59度正弦值
DB 84H,80H,83H,87H ;58,57度正弦值
DB 82H,90H,81H,92H ;56,55度正弦值
DB 80H,90H,79H,86H ;54,53度正弦值
DB 78H,80H,77H,71H ;52,51度正弦值
DB 76H,60H,75H,47H ;50,49度正弦值
DB 74H,31H,73H,14H ;48,47度正弦值
DB 71H,93H,70H,71H ;46,45度正弦值
DB 69H,46H,68H,20H ;44,43度正弦值
DB 66H,91H,65H,61H ;42,41度正弦值
DB 64H,28H,62H,93H ;40,39度正弦值
DB 61H,57H,60H,18H ;38,37度正弦值
DB 58H,78H,57H,36H ;36,35度正弦值
DB 55H,92H,54H,46H ;34,33度正弦值
DB 52H,99H,51H,50H ;32,31度正弦值
DB 50H,00H,48H,48H ;30,29度正弦值
DB 46H,95H,45H,40H ;28,27度正弦值
DB 43H,84H,42H,26H ;26,25度正弦值
DB 40H,67H,39H,07H ;24,23度正弦值
DB 37H,46H,35H,84H ;22,21度正弦值
DB 34H,20H,32H,56H ;20,19度正弦值
DB 30H,90H,29H,24H ;18,17度正弦值
DB 27H,56H,25H,88H ;16,15度正弦值
DB 24H,19H,22H,50H ;14,13度正弦值
DB 20H,79H,19H,08H ;12,11度正弦值
DB 17H,36H,15H,64H ;10,9度正弦值
DB 13H,92H,12H,19H ;8,7度正弦值
DB 10H,45H,08H,72H ;6,5度正弦值
DB 06H,97H,05H,23H ;4,3度正弦值
DB 03H,49H,01H,75H ;2,1度正弦值
DB 00H,00H ;0度正弦值
END