超声波测距仪编程_51单片机控制的超声波测距仪程序

本文提供了一段基于AT89C51单片机的超声波测距仪程序代码,包括主程序、超声接收程序、超时清除程序和延时函数。通过中断和定时器实现超声波测距,计算并显示距离数据。
摘要由CSDN通过智能技术生成

展开全部

/*--------------------------------------

超声测距器单片机程序e69da5e6ba9062616964757a686964616f31333262353436

MCU AT89C51 XAL 12MHz

2008.2.25

--------------------------------------*/

#include

#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 = 0xff;

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[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;

}

;-------------------------------------

;超声发生子程序(12M晶振38.5Hz)

;-------------------------------------

NAME CS_T

?PR?CS_T?CS_T SEGMENT CODE

PUBLIC CS_T

RSEG ?PR?CS_T?CS_T

CS_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

;-------------------------------------

;延时100机器周期*参数(1~65535)

;-------------------------------------

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

;---------------------------------------

; 四位共阳LED动态扫描显示程序

; P0为段码口,P2为位选口(低电平有效)

; 参数为要显示的字符串指针

;---------------------------------------

NAME DISPLAY

?PR?_DISPLAY?DISPLAY SEGMENT CODE

?CO?_DISPLAY?DISPLAY SEGMENT DATA

EXTRN CODE (_DELAY)

PUBLIC _DISPLAY

RSEG ?CO?_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,80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0BFH,0FFH

; "0", "1", "2", "3","4", "5","6","7", "8","9","A","B","C", "D", "E","F", "-", " "

END

这个给你参考~

本回答由网友推荐

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值