51单片机超声波测距程序(C调汇编)

#include <reg51.h>

#include <absacc.h>              //绝对地址存取

#include  <math.h>

#pragma NOREGPARMS         //固定单元参数传递,以减少C与汇编在寄存器Rn参数传

#define f DBYTE[0x40]           //cm

#define g DBYTE[0x41]          //dm

#define h DBYTE[0x42]          //m

#define i DBYTE[0x43]

unsigned data a _at_ 0x32;   //  #define a DWORD(双字节)[0x32]/ DBYTE1个字节),这两种做法都不行?定义错

                                           //误导致数据传送不过来,导致不能进行计算,显示0000。高字节TH0存放于32h,低字节TL0存放               

                                          // 33h,在c语言中只定义高字节即可,运算时,将高字节低字节看作一个整体进行运                     

                                            // 算,见《混合编程》20页;此为无符号整型,两个字节,可以存放高低16位。。

unsigned data a0 _at_ 0x52;     //第一个数存储单元

unsigned data a1 _at_ 0x54;     //第二个数存储单元

unsigned data a2 _at_ 0x56;

void count()                     //被汇编调用的子程序

{

  unsigned long int temp; //中间变量定义

    a0=a/10;

       a1=a0*17;

       a2=a1/100;

    f=a2%10;

    temp=a2/10;

    g=temp%10;

    temp=temp/10;

    h=temp%10;

    i=temp/10;

   }

  

 

 

      EXTRN CODE(COUNT)

      ORG 0000H

      JMP MAIN

      ORG 0003H

      LJMP EXT0

MAIN: MOV TMOD,#01H     ;设置为定时器且为方式为1   

      CLR P3.1          ;为了使系统稳定,P3.1硬件须接地,软件须清零

      SETB P3.2      

      SETB EA           ;开总中断  

      CLR IT0           ;设置为电平触发方式,为低电平则会触发外部零中断           MOV SP,#60H

START:MOV R6,#0         ;进入中断的标识

      MOV R7,#4 

      MOV 40H,#00H      ;存放厘米位的数字

      MOV 41H,#00H      ;存放分米位的数字

      MOV 42H,#00H      ;存放  米位的数字

      MOV 43H,#00H      ;存放十米位的数字

      MOV TL0,#00H      ;设置定时时间为65536微秒

      MOV TH0,#00H

      CLR TF0           ;溢出标志位清

      SETB P3.0         ;从此处开始到下一个高电平到来的时间必须在***12--13                                   ;微秒***之间,保证频率为40khz,若频率范围相差太大                                    ;则导致接收器接收不到信号                                                                         ;/***要注意程序运行时时间带来的影响***/

INT:  CPL  P3.0         ;40KHZ超声波发射子程序   1    

      LCALL DELAY1

      DJNZ R7,INT       ;超声波发送完毕                 

      CALL DELAY2       ;延时0.1MS避免错误

      SETB EX0

      SETB TR0          ;开始计时 

LOOP2:JBC TF0,LOOP3     ;检查是否有溢出,若为1则跳到LOOP3,并清零             

     CJNE R6,#0,LOOP4

      JMP LOOP2

LOOP4:                 

      LCALL COUNT

      LCALL dis

      LJMP  START

LOOP3:CLR TR0

      CLR EX0

      MOV 40H,#09H

      MOV 41H,#09H     

      MOV 42H,#09H

      MOV 43H,#09H

      LCALL dis

      LJMP  START

EXT0: CLR TR0           ;进入外部中断后,一般所做的工作为:关闭定时器/计数器,关闭外部                        ;中断,保护当前的值

        

      CLR EX0                ;改动 1

      PUSH ACC

      PUSH PSW

      MOV 32H,TH0

      MOV 33H,TL0            ;改动

      MOV R6,#1

      POP PSW

      POP ACC

      RETI

dis:  MOV R0,#250             ;目前显示时间为1S

D0:   MOV A,40H

      MOV P2, A

      ACALL DELAY             

      MOV A, 41H

      ADD A, #10H

      MOV P2, A

      ACALL DELAY

      MOV A, 42H

      ADD A, #20H

      MOV P2, A

      ACALL DELAY

      MOV A, 43H

      MOV P2, A

      ADD A, #30H

      MOV P2, A

      ACALL DELAY

      DJNZ R0,D0

      RET

DELAY: MOV R1,#02                ;1MS

D1:    MOV R2,#248

       DJNZ R2,$

       DJNZ R1,D1

       RET    

DELAY1:MOV R3,#2               ;1US

D3:    DJNZ R3,D3                ;6*2=12US+1=13US

       RET

DELAY2:MOV R4,#50

D4:    DJNZ R4,D4                ;50*2=100US=0.1MS

       RET                    

       END

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值