求大神帮忙看下为什么AD不工作?

2019-07-16 03:05发布

ADHEX DATA 054H
OUTPUT BIT P1.4 ;PWM 输出
DBUF DATA 030H
COUNT EQU 50H ;计数值
INT_L EQU 51H ;中断计数缓冲单元低地址
COUNT_tiME EQU 52H ;时间中断数
TTM EQU 5 ;软件计数值50mS*10=500mS
PWM_H EQU 55H ;PWM高脉冲宽度
PWM_L EQU 56H ;PWM低脉冲宽度
BIT_COUNT DATA 020H
DATA_OUT DATA 021H
TIMER DATA 022H
CLK BIT P1.6
DAT BIT P1.7       
DAT0 BIT P1.2
CLK0 BIT P1.3
CS BIT P1.1
ORG 0000H
LJMP START
ORG 0003H ;外部中断EX0入口地址
LJMP EX_INT0 ;外部中断服务程序
ORG 000BH
LJMP INTS_T0 ;定时器T0中断服务程序
ORG 0100H
START:
CLR A
MOV P1,A ;关闭不相干的发光管
MOV SP,#60H ;设置sp指针
CLR OUTPUT ;停止
MOV PWM_H,#50        ;设置初始速度
MOV PWM_L,#50
MOV INT_L,#00H
MOV COUNT,#00H
MOV COUNT_TIME,#TTM
MOV TMOD,#01H ;T0定时器
MOV TL0,#98H ;50ms (65536-17000*12/12=BD98)
MOV TH0,#0BDH
MOV COUNT_TIME,#TTM
SETB TR0 ;开始定时操作
SETB ET0 ;允许定时中断
CLR C ;清进位标志
SETB IT0 ;设置中断触发方式:脉冲触发
SETB EX0 ;允许外部中断EX0中断
SETB EA ;总的中断允许
MLOOP:
CLR EA
LCALL AD
MOV PWM_H,r7
MOV A,R7
CPL A
MOV R7,A
MOV PWM_L,R7
SETB ITO
SETB EX0
SETB EA
LCALL TOBCD ;十六进制整数转换成BCD码整数
LCALL DRIVE ;驱动输出
LCALL DisplayResult ;BCD码整数拆开两个字节
LCALL DRIVE ;驱动输出
LCALL DRIVE ;驱动输出
LJMP MLOOP

INTS_T0: ;定时器T0中断服务程序
PUSH ACC
CLR TR0
DJNZ COUNT_TIME,BACK ;软件计数,次数不到返回
MOV COUNT_TIME,#TTM
MOV INT_L,COUNT ;刷新显示部分
LCALL DISPLAY
LJMP BACK ;显示
MOV COUNT,#00H
MOV A,INT_L
SJMP BACK
BACK:
POP ACC
MOV TMOD,#01H ;T0定时器

MOV TL0,#98H ;50ms (65536-17000*12/12=BD98)
MOV TH0,#0BDH
SETB TR0 ;重新开始定时操作
RETI

EX_INT0: ;外部中断服务程序
INC COUNT ;将中断缓冲区低地址加1
MOV A,COUNT ;判断是否有进位
RETI ;中断返回
DRIVE: ;PWM驱动输出
SETB OUTPUT
MOV R0,PWM_H
LCALL DELAY3
CLR OUTPUT
MOV R0,PWM_L
LCALL DELAY3
RETDISPLAY:
ANL P2,#00H ; CS7279有效
MOV DATA_OUT,#10100100B ; A4H,复位命令
CALL SEND
MOV DATA_OUT,#10000000B ; 在第一个数码管上显示
CALL SEND
MOV DATA_OUT,DBUF
CALL SEND       
MOV DATA_OUT,#10000001B ; 译码方式0,2位显示在第二个数码管上显示
CALL SEND       
MOV DATA_OUT,DBUF+1
CALL SEND
MOV DATA_OUT,#10000010B ; 译码方式0,3位显示在第三个数码管上显示
CALL SEND
MOV DATA_OUT,DBUF+2
CALL SEND
MOV DATA_OUT,#10000011B ; 译码方式0,4位显示在第四个数码管上显示
CALL SEND
MOV DATA_OUT,DBUF+3
CALL SEND
MOV DATA_OUT,#10000100B ; 译码方式0,5位显示在第五个数码管上显示
CALL SEND
MOV DATA_OUT,DBUF+4
CALL SEND
RET
AD:
ACALL TLC549_ADC
MOV R7,#0
DJNZ R7,$
ACALL TLC549_ADC
MOV R7,A ;存转换结果
MOV ADHEX,A
MOV R7,A
RETTLC549_ADC: ;串行显示处理程序,结果存在A中
CLR A
CLR CLK0
CLR CS
MOV R6,#8
ADLOOP:
SETB CLK0
NOP
NOP
MOV C,DAT0
RLC A
CLR CLK0
NOP
DJNZ R6,ADLOOP
SETB CS
SETB CLK0
RETSEND:
MOV BIT_COUNT,#8 ; 发送字符子程序
ANL P2,#00H
CALL LONG_DELAY
SEND_LOOP:
MOV C,DATA_OUT.7
MOV DAT,C
SETB CLK
MOV A,DATA_OUT


RL A
MOV DATA_OUT,A
CALL SHORT_DELAY
CLR CLK
CALL SHORT_DELAY
DJNZ BIT_COUNT,SEND_LOOP
CLR DAT
RETLONG_DELAY:
MOV TIMER,#80 ;延时约200US
DELAY_LOOP:
DJNZ TIMER,DELAY_LOOP
RETSHORT_DELAY:
MOV TIMER,#6 ;延时约20USSHORT_LP:
DJNZ TIMER,SHORT_LP
RET
; 功能:双字节十六进制整数转换成双字节BCD码整数; 入口条件:待转换的双字节十六进制整数在R6、R7中。; 出口信息:转换后的三字节BCD码整数在R3、R4、R5中。

TOBCD:
MOV R7,INT_L
MOV R6,#00HHB2:
CLR A        ;BCD码初始化
MOV R3,A
MOV R4,A
MOV        R5,A
MOV        R2,#10H        ;转换双字节十六进制整数
HB3:       
MOV        A,R7        ;从高端移出待转换数的一位到CY中
RLC        A
MOV        R7,A
MOV        A,R6
RLC        A       
MOV        R6,A
MOV        A,R5        ;BCD码带进位自身相加,相当于乘2       
ADDC        A,R5
DA        A        ;十进制调整       
MOV        R5,A
MOV        A,R4
ADDC        A,R4
DA        A
MOV        R4,A       
MOV        A,R3
ADDC        A,R3
MOV        R3,A        ;双字节十六进制数的万位数不超过6,不用调整       
DJNZ        R2,HB3        ;处理完16bit        ;BCD码拆开送缓存
DisplayResult:
mov a, R3
anl a,#0fh
mov DBUF+4,A ;R3低四位送缓存0
mov a, R4
swap a
anl a,#0fh
mov DBUF+3,a ;R4高四位送缓存1
mov a, R4
anl a,#0fh
mov DBUF+2,a ;R4低四位送缓存2
mov a, R5
swap a
anl a,#0fh
mov DBUF+1,a ;R5高四位送缓存3
mov a, R5
anl a,#0fh
mov DBUF,a ;R5低四位送缓存4
ret
DELAY:
LCALL DELAY3
LCALL DELAY3
LCALL DELAY3
LCALL DELAY3
LCALL DELAY3
RETDelay2:
mov r5, #2
A0: mov r6, #20
A1: mov r7, #50
DelayLoop:
NOP
NOP
djnz r7, DelayLoop
djnz r6, A1
djnz r5, A0
RETDELAY3:
MOV R1, #0
DLOOP1:
DJNZ R1, DLOOP1
DJNZ R0, DELAY3
RET
END





友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。