哪位大神帮我看一下为什么测距不运行呢
时间:10-02
整理:3721RD
点击:
/* 超声波测距主程序 */
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
extern void cs_t(void);
extern void delay(uint);
extern void display(uchar *);
data uchar testok;
/*主程序*/
void main(void)
{
data uchar dispram[5];
data uint i;
data ulong time;
P0=0xFF;
P2=0xa0;
TMOD=0x11;
IE=0x80;
while(1)
{
cs_t();
delay(1);
testok=0;
EX0=1;
ET0=1;
while(!testok) display(dispram);
if(1==testok)
{
time=TH0;
time=(time<<8)|TL0;
time*=172;
time/=10000;
dispram[0]=(uchar)(time%10);
time/=10;
dispram[1]=(uchar)(time%10);
time/=10;
dispram[1]=(uchar)(time%10);
dispram[2]=(uchar)(time%10);
dispram[3]=(uchar)(time/10);
if(0==dispram[3]) dispram[3]=17;
}
else
{
dispram[0]=16;
dispram[1]=16;
dispram[2]=16;
dispram[3]=16;
}
for(i=0;i<300;i++) display(dispram);
}
}
/*超声波接受程序(外中断0)*/
void cs_r(void) interrupt 0
{
TR0=0;
ET0=0;
EX0=0;
testok=1;
}
/*超时清楚程序(内中断T0)*/
void overtime(void) interrupt 1
{
EX0=0;
TR0=0;
ET0=0;
testok=2;
}
/*超声波发生子程序*/ NAME CS_T?PR?CS_T?CS_T SEGMENT CODE PUBLIC CS_T RSEG ?PR?CS_T?CS_TCS_T : PUSH ACC MOV TH0,#00H MOV TL0,#00H MOV A,#4D SETB TR0
CS_T1 : CPL P1.0 NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP DJNZ ACC,CS_T1 POP ACC RET
END
/*延时*/NAME DELAY?PR?_DELAY?DELAY SEGMENT CODE PUBLIC _DELAY RSEG ?PR?_DELAY?DELAY_DELAY: PUSH ACC ;2 MOV A,R7 ;1 JZ DELA1 ;2 INC R6 ;1
DELA1: MOV R5,#50D ;2 DJNZ R5,$ ;2 DJNZ R7,DELA1 ;2 DJNZ R6,DELA1 ;2 POP ACC ;2 RET ;2 END
/*4位共阳LED动态扫描显示程序*/
NAME DISPLAY
?PR?_DISPLAY?DISPLAY SEGMENT CODE
?C0?_DISPLAY?DISPLAY SEGMENT DATA
EXTRN CODE(_DELAY)
PUBLIC _DISPLAY
RSEG ?C0?_DISPLAY?DISPLAY
?_DISPLAY?BYTE:
DISPBIT : DS 1
DISPNUM : DS 1
RSEG ?PR?_DISPLAY?DISPLAY
_DISPLAY: PUSH ACC
PUSH DPH
PUSH DPL
PUSH PSW
INC DISPNUM
MOV A,DISPNUM
CJNE A,#4D,DISP1
DISP1: JC DISP2
MOV DISPNUM,#00H
MOV DISPBIT,#0FEH
DISP2: MOV A,R1
ADD A,DISPNUM
MOV R0,A
MOV A,@R0
MOV DPTR,#DISPTABLE
MOVC A,@A+DPTR
MOV P0,A
MOV A,DISPNUM
CJNE A,#2D,DISP3
CLR P0.7
DISP3: MOV P2,DISPBIT
MOV R6,#00H
MOV R7,#0AH
LCALL _DELAY
MOV P0,#0FFH
MOV P2,#0FFH
MOV A,DISPBIT
RL A
MOV DISPBIT,A
POP PSW
POP DPL
POP DPH
POP ACC
RET
DISPTABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H
DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0BFH,0FFH
DB "0","1","2","3","4","5","6","7","8"
DB "9","A","B","C","D","E","F","_"," "
END
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
extern void cs_t(void);
extern void delay(uint);
extern void display(uchar *);
data uchar testok;
/*主程序*/
void main(void)
{
data uchar dispram[5];
data uint i;
data ulong time;
P0=0xFF;
P2=0xa0;
TMOD=0x11;
IE=0x80;
while(1)
{
cs_t();
delay(1);
testok=0;
EX0=1;
ET0=1;
while(!testok) display(dispram);
if(1==testok)
{
time=TH0;
time=(time<<8)|TL0;
time*=172;
time/=10000;
dispram[0]=(uchar)(time%10);
time/=10;
dispram[1]=(uchar)(time%10);
time/=10;
dispram[1]=(uchar)(time%10);
dispram[2]=(uchar)(time%10);
dispram[3]=(uchar)(time/10);
if(0==dispram[3]) dispram[3]=17;
}
else
{
dispram[0]=16;
dispram[1]=16;
dispram[2]=16;
dispram[3]=16;
}
for(i=0;i<300;i++) display(dispram);
}
}
/*超声波接受程序(外中断0)*/
void cs_r(void) interrupt 0
{
TR0=0;
ET0=0;
EX0=0;
testok=1;
}
/*超时清楚程序(内中断T0)*/
void overtime(void) interrupt 1
{
EX0=0;
TR0=0;
ET0=0;
testok=2;
}
/*超声波发生子程序*/ NAME CS_T?PR?CS_T?CS_T SEGMENT CODE PUBLIC CS_T RSEG ?PR?CS_T?CS_TCS_T : PUSH ACC MOV TH0,#00H MOV TL0,#00H MOV A,#4D SETB TR0
CS_T1 : CPL P1.0 NOP NOP NOP NOP NOP NOP NOP NOP NOP NOP DJNZ ACC,CS_T1 POP ACC RET
END
/*延时*/NAME DELAY?PR?_DELAY?DELAY SEGMENT CODE PUBLIC _DELAY RSEG ?PR?_DELAY?DELAY_DELAY: PUSH ACC ;2 MOV A,R7 ;1 JZ DELA1 ;2 INC R6 ;1
DELA1: MOV R5,#50D ;2 DJNZ R5,$ ;2 DJNZ R7,DELA1 ;2 DJNZ R6,DELA1 ;2 POP ACC ;2 RET ;2 END
/*4位共阳LED动态扫描显示程序*/
NAME DISPLAY
?PR?_DISPLAY?DISPLAY SEGMENT CODE
?C0?_DISPLAY?DISPLAY SEGMENT DATA
EXTRN CODE(_DELAY)
PUBLIC _DISPLAY
RSEG ?C0?_DISPLAY?DISPLAY
?_DISPLAY?BYTE:
DISPBIT : DS 1
DISPNUM : DS 1
RSEG ?PR?_DISPLAY?DISPLAY
_DISPLAY: PUSH ACC
PUSH DPH
PUSH DPL
PUSH PSW
INC DISPNUM
MOV A,DISPNUM
CJNE A,#4D,DISP1
DISP1: JC DISP2
MOV DISPNUM,#00H
MOV DISPBIT,#0FEH
DISP2: MOV A,R1
ADD A,DISPNUM
MOV R0,A
MOV A,@R0
MOV DPTR,#DISPTABLE
MOVC A,@A+DPTR
MOV P0,A
MOV A,DISPNUM
CJNE A,#2D,DISP3
CLR P0.7
DISP3: MOV P2,DISPBIT
MOV R6,#00H
MOV R7,#0AH
LCALL _DELAY
MOV P0,#0FFH
MOV P2,#0FFH
MOV A,DISPBIT
RL A
MOV DISPBIT,A
POP PSW
POP DPL
POP DPH
POP ACC
RET
DISPTABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H
DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0BFH,0FFH
DB "0","1","2","3","4","5","6","7","8"
DB "9","A","B","C","D","E","F","_"," "
END
原理图
我司代理中颖单片机,晶致马达驱动,海芯AD。详情咨寻
黄生:15112661137
QQ:370138333