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

📄 adc08090.asm

📁 selects the mux channel and configures the MAX197 for second write pulse, written with ACQMOD = 0,
💻 ASM
字号:
SMPEND BIT 01H ;1/0表示采样完毕/未完
JISUAN BIT 02H ;1/0表示可以开始计算/不需要计算
VDC BIT 03H
VAC BIT 04H
CTPoint EQU 09H ;采样点计数器
DSTORE EQU 0C0H ;采样值存储首地址
ADC0809 EQU 0FEFFH
DAC0832 EQU 0FDFFH
MAX EQU 56H
MIN EQU 55H
AMPLITUDE EQU 05H


ORG 0000H
 LJMP 0030H
ORG 0003H
LJMP S_INT0
ORG 000BH
LJMP S_T0
ORG 001BH
;LJMP S_T1
ORG 0030H
MOV IE,#00H
SETB IT1
SETB IT0 ;将两外部中断均设为脉冲触发
MOV SP,#5FH
SETB EX0
SETB PX0
SETB EA ;开外部中断0,并使之为高优先级,可保证外部中断1及时反应
MOV TMOD,#01H ;定时器0   16位  定时器1   16位 !!!!!!!!!!!!!!!
MOV TH0,#0FCH
MOV TL0,#18H ;定时器0赋初始值。定时1ms
MOV R6,#250 ;ms计数器为250
CLR JISUAN ;无需计算
CLR VDC
CLR VAC
MOV CTPOINT,#00H ;点计数器为0
SETB ET0 ;启动定时器0,其中包含采样程序
SETB TR0
CLR SMPEND
MOV R0,#DSTORE
;********************************
MAIN:
JMP $

;**************中断服务程序区*****************************
;定时中断0, 1ms 中断一次,每次开启AD0809采样64次后停止采样
;250次时重新开始
S_T0:
MOV TH0,#0FCH
MOV TL0,#1CH ;定时器0重赋初始值。定时1ms
PUSH A
DJNZ R6,S_T0_SMPING
CLR SMPEND ;下轮采样开始
MOV CTPOINT,#00H ;点计数器清零
CLR JISUAN ;未经计算标志
MOV R6,#250;ms计数器重赋初值
MOV R0,#DSTORE
LJMP S_T0_RET
S_T0_SMPING:
JB SMPEND,SMPEND_1  ;采样完毕返回,否则开始转换
MOV DPTR,#ADC0809
MOV A,#ADC0809
MOVX @DPTR,A   ;启动转换,等待外部中断来临后开始采集转换值
LJMP S_T0_RET
SMPEND_1:
JB JISUAN,OUT

CLR ET0
LCALL CALCULATION    ;计算需要3m秒,故先暂时关闭定时中断
SETB JISUAN   ;已经计算过有效值
LCALL JUDGE
SETB ET0

OUT: ;输出
JB VAC ,VDC_OUT    ;判断是交流,则输出直流
SETB ET1
;;CLR ET0 ;由于交流输出时间较长,一个周期对应一个定时中断
LCALL VAC_OUT           ;判断是直流,则输出交流,调用交流输出子程序
;;SETB ET0
LJMP S_T0_RET
VDC_OUT:
MOV A,51H
MOV DPTR,#DAC0832
MOVX @DPTR,A
MOV P1,51H
S_T0_RET:POP A
RETI

;***************外部中断0****************************
;当ADC0809完成一次AD转换时,EOC端口输出一个转换完毕信号.
;通过外部中断控制下一路信号的采集
S_INT0:
MOV DPTR ,#ADC0809
MOVX A,@DPTR
MOV P1,A
MOV @R0,A
;SETB EX0
MOV R3,CTPOINT
CJNE R3,#63,S_INT0_SMPPCONTI ;64点采样是否完
SETB SMPEND ;64点采样完毕处理
;SETB JISUAN ;设置计算标志,在主程序中计算
MOV CTPOINT,#00H ;点计数器清零
LJMP S_INT0_RET
S_INT0_SMPPCONTI:
INC CTPOINT ;64点采样未完计数器+1
INC R0
S_INT0_RET:
RETI

;*****计算子程序,64点采样值的有效值**************
;R1定义结果存放点
;数据格式按000H~03F/100H~13FH/200~23FH放置
;对六十四个数进行平方求和后,除以六十四,在对其开方
;该子程序用在主程序中,无需入栈保护
;*************************************************
CALCULATION:
PUSH 00H
PUSH 01H
PUSH 02H
PUSH 03H
PUSH 04H
PUSH 05H
PUSH 06H
PUSH 07H
MOV R3,#DSTORE ;单字节采样数据存放首地址
MOV R0,#50H ;双字节平方数据存放首地址
MOV R1,#54H ;三字节平方和累加数据存放首地址
MOV 50H,#00H
MOV 51H,#00H
MOV 52H,#00H
MOV 53H,#00H
MOV 54H,#00H;存储地址数据初始化
MOV R2,#64
SQUARE_SUM:
;以下为单字节数的平方算法,结果存放在70H~71H
MOV A,R3
MOV R0,A
MOV A,@R0 ;调用采样数据结果  平方
MOV R0,#50H ;计算结果存放首地址
MOV B,A
MUL AB ;平方运算
MOV @R0,B ;平方计算的高位存放在平方高位存储地址0C0H
INC R0 ;
MOV @R0,A ;平方计算的低位存放在平方低位存储地址0C1H
;以下为三字节加两字节算法,结果存放在72H~74H
MOV A,@R1
ADDC A,@R0
MOV @R1,A
DEC R1
DEC R0
MOV A,@R1
ADDC A,@R0
MOV @R1,A
DEC R1
MOV A,@R1
ADDC A,#00H
MOV @R1,A
INC R1
INC R1
INC R0
INC R3
DJNZ R2,SQUARE_SUM
;平方和累加结束
;以下为三个字节开方算法:三个字节数据分别存放在以R1的指针为首地址的三个内存单元
;要求对三个字节开方后直接给出一个两字节的结果,并放置于以R0的指针为首地址的两个内存单元
;标号: SH4 功能:四字节二进制无符号数开平方(快速)
;入口条件:被开方数在R2、R3、R4、R5中。
;出口信息:平方根在R2、R3中,整数部分的位数为原数的一半,其余为小数。
;影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节
SH4:
MOV R2,#00H
MOV R3,52H
MOV R4,53H
MOV R5,54H
MOV A,R2
ORL A,R3
ORL A,R4
ORL A,R5
JNZ SH40
RET ;被开方数为零,不必运算
SH40: MOV R7,#0 ;左规次数初始化
MOV A,R2
SH41: ANL A,#0C0H ;被开方数高字节小于40H否?
JNZ SQRH ;不小于40H,左规格化完成
MOV R6,#2 ;每左规一次,被开方数左移两位
SH42: 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
MOV A,R2
RLC A
MOV R2,A
DJNZ R6,SH42 ;被开方数左移完两位
INC R7 ;左规次数加一
SJMP SH41 ;继续左规
SQRH: MOV A,R2 ;规格化后高字节按折线法分为三个区间
ADD A,#57H
JC SQR2
ADD A,#45H
JC SQR1
ADD A,#24H
MOV B,#0E3H ;第一区间的斜率
MOV R4,#80H ;第一区间的平方根基数
SJMP SQR3
SQR1: MOV B,#0B2H ;第二区间的斜率
MOV R4,#0A0H;第二区间的平方根基数
SJMP SQR3
SQR2: MOV B,#8DH ;第三区间的斜率
MOV R4,#0D0H;第三区间的平方根基数
SQR3: MUL AB ;与区间基点的偏移量乘区间斜率
MOV A,B
ADD A,R4 ;累加到平方根的基数上
MOV R4,A
MOV B,A
MUL AB ;求当前平方根的幂
XCH A,R3 ;求偏移量(存放在R2R3中)
CLR C
SUBB A,R3
MOV R3,A
MOV A,R2
SUBB A,B
MOV R2,A
SQR4: SETB C ;用减奇数法校正一个字节的平方根
MOV A,R4 ;当前平方根的两倍加一存入R5R6中
RLC A
MOV R6,A
CLR A
RLC A
MOV R5,A
MOV A,R3 ;偏移量小于该奇数否?
SUBB A,R6
MOV B,A
MOV A,R2
SUBB A,R5
JC SQR5 ;小于,校正结束,已达到一个字节的精度
INC R4 ;不小于,平方根加一
MOV R2,A ;保存新的偏移量
MOV R3,B
SJMP SQR4 ;继续校正
SQR5: MOV A,R4 ;将一个字节精度的根存入R2
XCH A,R2
RRC A
MOV F0,C ;保存最终偏移量的最高位
MOV A,R3
MOV R5,A ;将最终偏移量的低八位存入R5中
MOV R4,#8 ;通过(R5R6/R2)求根的低字节
SQR6: CLR C
MOV A,R3
RLC A
MOV R3,A
CLR C
MOV A,R5
SUBB A,R2
JB F0,SQR7
JC SQR8
SQR7: MOV R5,A
INC R3
SQR8: CLR C
MOV A,R5
RLC A
MOV R5,A
MOV F0,C
DJNZ R4,SQR6 ;根的第二字节计算完,在R3中
MOV A,R7 ;取原被开方数的左规次数
JZ SQRE ;未左规,开方结束
SQR9: CLR C ;按左规次数右移平方根,得到实际根
MOV A,R2
RRC A
MOV R2,A
MOV A,R3
RRC A
MOV R3,A
DJNZ R7,SQR9
MOV 50H,R2
MOV 51H,R3
SQRE: NOP;RET
;开方结束
NOP
; 标号: DV31 功能:三字节二进制无符号数除以单字节二进制数
;入口条件:被除数在R3、R4、R5中,除数在R7中。
;出口信息:OV=0 时,双字节商在R4、R5中,OV=1 时溢出。
;影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节
DV31:
MOV R3,#00H
MOV R4,50H
MOV R5,51H
MOV R7,#08H
CLR C
MOV A,R3
SUBB A,R7
JC DV30
SETB OV ;商溢出
RET
DV30: MOV R2,#10H ;求R3R4R5/R7-→R4R5
DM23: 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
MOV F0,C
CLR C
SUBB A,R7
ANL C,/F0
JC DM24
MOV R3,A
INC R5
DM24: DJNZ R2,DM23
MOV A,R3 ;四舍五入
ADD A,R3
JC DM25
SUBB A,R7
JC DM26
DM25: INC R5
MOV A,R5
JNZ DM26
INC R4
DM26: CLR OV
MOV 50H,R4
MOV 51H,R5
;RET ;商在R4R5中
POP 07H
POP 06H
POP 05H
POP 04H
POP 03H
POP 02H
POP 01H
POP 00H
CALCAULATION:RET

;判断交直流
;先判断数据块的最大值与最小值,R0放置起始地址,注意:数据块长度
;调用时间1MS
JUDGE:
;MAX_MIN:
MOV R0,#DSTORE;数据首地址
MOV A,@R0
MOV R3,A
INC R0
MOV A,@R0
MOV R4,A
CLR C
SUBB A,R3
JC EXCHANGE
INC R0
LJMP LOOP
EXCHANGE:
MOV A,R3
XCH A,R4
MOV R3,A
INC R0
LOOP:
MOV A,@R0
MOV R5,A
CLR C
SUBB A,R3
JC LOOP1
CLR C
SUBB A,R4
JC LOOP_RET
MOV A,R5
MOV R4,A
SJMP LOOP_RET
LOOP1:MOV A,R5
MOV R3,A
LOOP_RET:
INC R0
CJNE R0,#0FEH,LOOP
MOV MAX,R4
MOV MIN,R3  ;得出最大值与最下值
MOV A,R4    ;判断交直流,直流最大幅度不超过AMPLITUDE,1V ,即33H
SUBB A,R3
CLR C
SUBB A,#AMPLITUDE
JC S_VDC
SETB VAC
CLR VDC
SJMP JUDGE_RET
S_VDC:
SETB VDC
CLR VAC
JUDGE_RET:
RET

VAC_OUT:;交流输出子程序
MOV DPTR,#DAC0832
MOV R1,#00H
VAC_OUT_1:
MOV A,R1
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV R2,A
;有效值乘1.414计算过程
MOV A,51H
MOV B,#06H
MUL AB
MOV R3,B
MOV R4,A
MOV A,R3
ANL A,#0FH
RR A
RR A
RR A
RR A
MOV R3,A
MOV A,R4
ANL A,#0F0H
RR A
RR A
RR A
RR A
MOV R4,A
MOV A,R3
ADD A,R4
ADD A,51H
MOV B,A
MOV A,R2
MUL AB
MOV A,B
;由有效值计算峰峰值结束
MOV DPTR,#DAC0832
MOVX @DPTR,A
MOV P1,51H
INC R1 ;表格加1
CJNE R1,#255,VAC_OUT_1
MOV P0,#00H
MOV P2,#00H
MOV A, #00H
MOV DPTR,#DAC0832
MOVX @DPTR,A
RET

SETTAB:
;正弦表格
DB 080H,083H,086H,089H,08CH,090H,093H,096H
DB 099H,09CH,09FH,0A3H,0A6H,0A9H,0ACH,0AFH
DB 0B2H,0B5H,0B8H,0BAH,0BDH,0C0H,0C3H,0C6H
DB 0C8H,0CBH,0CDH,0D0H,0D2H,0D5H,0D7H,0DAH
DB 0DCH,0DEH,0E0H,0E2H,0E4H,0E6H,0E8H,0EAH
DB 0ECH,0EDH,0EFH,0F0H,0F2H,0F3H,0F5H,0F6H
DB 0F7H,0F8H,0F9H,0FAH,0FBH,0FCH,0FCH,0FDH
DB 0FDH,0FDH,0FEH,0FEH,0FEH,0FFH,0FFH,0FFH

DB 0FFH,0FFH,0FFH,0FEH,0FEH,0FEH,0FDH,0FDH
DB 0FDH,0FCH,0FCH,0FBH,0FAH,0F9H,0F8H,0F7H
DB 0F6H,0F5H,0F3H,0F2H,0F0H,0EFH,0EDH,0ECH
DB 0EAH,0E8H,0E6H,0E4H,0E2H,0E0H,0DEH,0DCH
DB 0DAH,0D7H,0D5H,0D2H,0D0H,0CDH,0CBH,0C8H
DB 0C6H,0C3H,0C0H,0BDH,0BAH,0B8H,0B5H,0B2H
DB 0AFH,0ACH,0A9H,0A6H,0A3H,09FH,09CH,099H
DB 096H,093H,090H,08CH,089H,086H,083H,080H

DB 80H,7CH,79H,78H,72H,6FH,6CH,69H
DB 66H,63H,60H,5DH,5AH,57H,55H,51H
DB 4EH,4CH,48H,45H,43H,40H,3DH,3AH
DB 38H,35H,33H,30H,2EH,2BH,29H,27H
DB 25H,22H,20H,1EH,1CH,1AH,18H,16H
DB 15H,13H,11H,10H,0EH,0DH,0BH,0AH
DB 09H,08H,07H,06H,05H,04H,03H,03H
DB 02H,02H,01H,01H,01H,00H,00H,00H

DB 00H,00H,00H,01H,01H,01H,02H,02H
DB 03H,03H,04H,05H,06H,07H,08H,09H
DB 0AH,0BH,0DH,0EH,10H,11H,13H,15H
DB 16H,18H,1AH,1CH,1EH,20H,22H,25H
DB 27H,29H,2BH,2EH,30H,33H,35H,38H
DB 3AH,3DH,40H,43H,45H,48H,4CH,4EH
DB 51H,55H,57H,5AH,5DH,60H,63H,66H
DB 69H,6CH,6FH,72H,76H,79H,7CH,80H
































⌨️ 快捷键说明

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