找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5180|回复: 3
打印 上一主题 下一主题
收起左侧

基于AT89c51单片机的超声波测距汇编语言源程序

[复制链接]
跳转到指定楼层
楼主
ID:198058 发表于 2017-5-8 11:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序清单
以下是用汇编语言编写的超声波测距控制源程序:
采用AT89S51 12MHz晶振
显示缓冲单元在40H~43H,使用内存44H、45H、46H用于计算距离
20H用于标志

完整资料下载:
asdfdf.doc (59 KB, 下载次数: 57)

单片机源程序:
  1. VOUT   EQU    P1.0   ;脉冲输出端口
  2. *中断入口程序*
  3. ORG  0000H
  4.       LJMP  START
  5. ORG  0003H
  6.       LJMP  PINT0
  7. ORG  000BH
  8.       LJMP  INTT0
  9. ORG  0013H
  10.       RETI
  11. ORG  001BH
  12.       LJMP  INTT1
  13. ORG  0023H
  14. RETI
  15. ORG  002BH
  16.       RETI

  17. *主程序*
  18. START: MOV  SP, #4FH
  19.        MOV  R0, #40H   ;40~43H为显示数据存放单元(40为最高位)
  20.        MOV  R7,#0BH

  21. CLEARDISP:MOV  @R0, #00H
  22.             INC   R0
  23.             DJNZ  R7, CLEARDISP
  24.             MOV  20H, #00H
  25.             MOV  TMOD, #21H    ;T1为8位自动重装模式,T0为16位定时器
  26.             MOV  TH0, #00H      ;65ms初值
  27.             MOV  TL0, #00H      ;40KHz初值      
  28.             MOV  TH1, #0F2H
  29.             MOV  TL1, #0F2H
  30.             MOV  P0, #0FFH
  31. MOV  P1, #0FFH
  32.             MOV  P2, #0FFH
  33.             MOV  P3, #0FFH
  34. MOV  R4, #04H        ;超声波脉冲个数控制(为赋值的一半)
  35. SETB  PX0
  36. SETB  ET0
  37. STEB  EA
  38. CLR   00H
  39. SETB  TR0                    ;开启测距定时器

  40. START1:    LCALL  DISPLAY
  41.             JNB     00H, START1       ;收到反射信号时标志位为1
  42.             CLR  EA
  43.             LCALL  WORK          ;计算距离子程序
  44.             SETB    EA
  45.             CLR     00H
  46.             SETB    TR0             ;重新开启测距定时器
  47.             MOV    R2, #64H         ; 测量间隔控制(约4*100=400ms)

  48. LOOP:      LCALL  DISPLAY
  49.             DJNZ   R2, LOOP
  50.             SJMP   START 1

  51. *中断程序*
  52. ;T0中断,65ms中断一次
  53. INTT0:      CLR    EA
  54.             CLR    TR0
  55.             MOV   TH0, #00H
  56.             MOV   TL0, #00H
  57.             SETB   ET1
  58.             SETB   EA
  59.             SETB   TR0                ;启动计时器T0,用以计算超声波来回时间
  60.             SETB   TR1                ;开启发超声波用定时器T1
  61. OUT:        RETI


  62. ;T1中断,发超声波用
  63. INTT1:      CPL    VOUT
  64.             DJNZ   R4,RETIOUT
  65.             CLR    TR1               ;超声波发送完毕,关T1
  66.             CLR    ET1
  67.             MOV   R4,#04H
  68.             SETB   EX0               ;开启接收回波中断
  69. RETIOUT:   RETI

  70. ;外中断0,收到回波时进入
  71. PINT0:       CLR   TR0                ;关计数器
  72.              CLR   TR1
  73.              CLR   ET1
  74.              CLR   EA
  75.              CLR   EX0
  76.              MOV  44H, TL0            ;将计数值移入处理单元
  77.              MOV  45H, TH0
  78.              SETB  00H                 ;接收成功标志
  79.              RETI

  80. *延时程序*
  81. DL1MS:      MOV  R6, #14H
  82. DL1:         MOV  R7, #19H
  83. DL2:         DJNZ  R6, DL2
  84.              DJNZ  R6, DL1
  85.              RET


  86. *显示程序*
  87. ;40H为最高位,43H为最低位,先扫描高位
  88. DISPLAY:                MOV        R1, #40H;G
  89.                                 MOV        R5,#0F7H;G

  90.         PLAY:                MOV        A, R5
  91.                                 MOV        P0, #0FFH               
  92.                                 MOV        P2, A
  93.                                 MOV        A, @R1
  94.                                 MOV        DPTR, #TAB
  95. MOVC        A, @A+DPTR
  96. MOV        P0, A
  97. LCALL DLIMS
  98. INC                R1
  99. MOV        A, R5
  100. JNB        ACC.0, ENDOUT;G
  101. RR                A
  102. MOV        R5, A
  103. AJMP        PLAY

  104. ENDOUT;                MOV        P2, #0FFH
  105.                                 MOV        P0, #0FFH
  106.                                 RET

  107. TAB; DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,88H,0BFH
  108. ;共阳数码管  0 ,1, 2,3,4,5,6,7,8,9,不亮,A, —

  109. *距离计算程序(=计算值×17/1000cm)  近似
  110. WORK:                        PUSH        ACC
  111.         PUSH        PSW
  112.               PUSH        B
  113.         MOV        PSW, #18H
  114.         MOV        R3, 45H
  115.         MOV        R2, 44H
  116.         MOV        R1, #00D
  117.         MOV        R0, #17D
  118.         LCALL MUL2BY2
  119.         MOV        R3, #03H
  120.         MOV        R2, #0E8H
  121.           LCALL        DIV4BY2
  122.         LCALL        DIV4BY2
  123.         MOV        40H, R4        
  124.         MOV        A, 40H
  125.         JNZ        JJ0
  126.         MOV        40H, #0AH           ;最高位为0,不点亮

  127. JJ0:        MOV        A        R0
  128.         MOV        R4, A
  129.         MOV        A        R1
  130.         MOV        R5         A
  131.         MOV         R3, #00D
  132.         MOV        R2, #100D
  133.         LCALL        DIV4BY2
  134.         MOV        41H, R4
  135.         MOV        A, 41H
  136.          JNZ        JJ1
  137.         MOV        A, 40H         ;此高位为0,先看最高位是否为不亮
  138.          SUBB        A, #0AH
  139.         JNZ        JJ1
  140.         MOV        41H, #0AH      ; 最高位不亮,次高位也不亮

  141. JJ1:        MOV        A, R0
  142.         MOV        R4, A
  143.         MOV        A, R1
  144.         MOV        R5, A
  145.         MOV        R3, #00D
  146.         MOV        R2, #10D
  147.         LCALL DIV4BY2
  148.         MOV        42H, R4
  149.         MOV        A        42H        
  150.         JNZ        JJ2
  151.         MOV        A, 41H         ;次高位为0,先看次高位是否为不亮
  152.         SUBB        A, #0AH
  153.         JNZ        JJ2
  154.         MOV        42H, #0AH     ;次高位不亮,次高位也不亮

  155. JJ2:        MOV        43H, R0
  156.         POP        B
  157.         POP        PSW
  158.         POP        ACC
  159.         RET  

  160. *两字节无符号数乘法程序
  161. MUL2BY2:        CLR        A
  162.         MOV        R7, A
  163.         MOV        R6, A
  164.         MOV  R5, A
  165.         MOV        R4, A
  166.         MOV        46H, #10H
  167. MULLOOP1:        CLR        C
  168.         MOV        A, R4
  169.         RLC        A
  170.         MOV        R4, A
  171.         MOV        A,        R5
  172.         RLC        A
  173.         MOV        R5, A
  174.         MOV        A, R6
  175.         RLC        A
  176.         MOV        R6, A
  177.         MOV        A, R7
  178.         RLC        A
  179.         MOV  R7, A
  180.         MOV  A, R0
  181.         RLC   A
  182.         MOV        R0, A
  183.         MOV        A, R1
  184.         RLC        A
  185.         MOV        R1, A
  186.         JNC        MULLOOP2
  187.         MOV        A, R4
  188.         ADD        A, R2
  189.         MOV        R4, A
  190.         MOV        A, R5
  191.         ADDC        A, R3
  192.         MOV        R5, A
  193.         MOV        A, R6
  194.         ADDC        A, #00H
  195.         MOV        R6, A
  196.         MOV        A, R7
  197.         ADDC        A, #00H
  198.         MOV        R7, A
  199. MULLOOP2:        DJNZ        46H, MULLOOP1
  200.         RET
  201.         
  202. *四字节/两字节无符号数除法程序*
  203. DIV4BY2:        MOV        46H, #20H
  204.         MOV        R0,        #00H
  205.         MOV        R1, #00H

  206. DIVLOOP1:          MOV        A, R4
  207.                  RLC        A
  208.         MOV        R4, A
  209.         MOV        A, R5
  210.         RLC        A
  211.         MOV        R5, A
  212.         MOV        A, R6
  213.         RLC        A
  214.         MOV        R6, A
  215.         MOV        A, R7
  216.         RLC        A
  217.         MOV        R7, A
  218.         MOV        A, R0
  219.         RLC        A
  220.         MOV        R0, A
  221.         MOV        A, R1
  222.         RLC        A
  223.         MOV        R1, A
  224.         CLR        C
  225.         MOV        A, R0
  226.         SUBB        A, R2
  227.         MOV        B, A
  228.         MOV  A, R1
  229.         SUBB        A, R3
  230.         JC                DIVLOOP2
  231.         MOV        R0, B
  232.         MOV        R1, A
  233.         
  234. DIVLOOP2:        CPL        C
  235.         DJNZ        46H, DIVLOOP1
  236.         MOV        A, R4
  237.         RLC        A
  238.         MOV        R4,        A
  239.         MOV        A,        R5
  240.         RLC        A
  241.         MOV        R5,        A
  242.         MOV        A, R6
  243.                      RLC        A
  244.         MOV        R6, A
  245.         MOV        A, R7
  246.         RLC        A
  247.         MOV        R7, A
  248.         RET
  249. ;
  250.         END

  251.            附C51程序

  252. #INCLUDE <REG51.H>
  253. #DEFINE UCHAR UNSIGNED CHAR
  254. #DEFINE UINT UNSIGNED INT
  255. #DEFINE ULONG UNSIGNED LONG

  256. EXTERN VOID CS_T(VOID);
  257. EXTERN VOID DELAY(UINT);
  258. EXTERN VOID DISPLAY(UCHAR*);
  259. //DATA UCHAR DISPLAY(UCHAR*);
  260. DATA UCHAR TESTOK;



  261. VOID MAIN (VOID)
  262. {
  263. DATA UCHAR DISPRAM[5];
  264. DATA UINT I;
  265. DATA ULONG TIME;
  266. P0=0XFF;
  267. P2=0XFF;
  268. TMOD=0X11;
  269. IE=0X80;
  270. WHILE (1)
  271. {
  272. CS_T();
  273. DELAY(1);
  274. TESTOK=0;
  275. EX0=1;
  276. ET0=1;
  277. WHILE(! TESTOK) DISPLAY(DISPRAM);
  278. IF (1==TESTOK)
  279.    {
  280.    TIME=TH0;
  281.    TIME=(TIME<<8)| TL0;
  282.    TIME*=172;  
  283.    TIME/=10000;
  284.    DISPRAM[0]=(UCHAR) (TIME%10);
  285.    TIME/=10;
  286.    DISPRAM[1]=(UCHAR) (TIME%10);
  287.    TIME/=10;
  288.    DISPRAM[2]=(UCHAR) (TIME%10);
  289.    DISPRAM[3]=(UCHAR) (TIME/10);
  290.    IF (0==DISPRAM[3]) DISPRAM[3]=17;
  291.    } ELSE
  292.    {
  293.    DISPRAM [0]=16;
  294.    DISPRAM [1]=16;
  295.    DISPRAM [2]=16;
  296.    DISPRAM [3]=16;
  297.    }
  298. FOR (I=0;I<300;I++) DISPLAY(DISPRAM);
  299. }
  300. }



  301. VOID CS_R(VOID) INTERRUPT 0
  302. {
  303. TR0=0;
  304. ET0=0;
  305. EX0=0;
  306. TESTOK=1;
  307. }



  308. VOID OVERTIME(VOID) INTERRUPT 1
  309. {
  310. EX0=0;
  311. TR0=0;
  312. ET0=0;
  313. TESTOK=2;
  314. }
  315.                      NAME      CS_T
  316. ?PR?CS_T?CS_T             SEGMENT   CODE
  317.                      PUBLIC   CS_T   
  318.                         RSEG     ?PR?CS_T?CS_T
  319. CS_T:                PUSH      ACC
  320.                      MOV       TH0, #00H
  321.                      MOV       TL0, #00H
  322.                      MOV       A, #4D
  323.                      SETB       TR0
  324. CS_T1:               CPL        p1.0
  325.                      NOP
  326.                              NOP
  327.                              NOP
  328.                      NOP
  329.                      NOP
  330.                      NOP
  331.                      NOP
  332.                      NOP
  333.                      NOP
  334.                      NOP
  335.                      DJNZ       ACC,CS_T1
  336.                      POP        ACC
  337.                      RET
  338. ;
  339.                      END  
  340. NAME   DELAY
  341. ?PR?_DELAY?DELAY   SEGMENT   CODE
  342. PUBLIC   _DELAY
  343. RSEG    ?PR?_DELAY?DELAY
  344. _DELAY:    PUSH   ACC
  345.            MOV A,R7
  346.            JZ   DELA1
  347.            INC   R6
  348. DELA1:   MOV   R5,#50D
  349.          DJNZ   R5, $
  350.          DJNZ   R7,DELA1
  351.          DJNZ    R6,DELA1
  352.             POP   ACC
  353.            RET
  354. END
  355.     NAME  DISPLAY
  356. ?PR?_DISPLAY?DISPLAY   SEGMENT  CODE
  357. ?CO?_DISPLAY?DISPLAY    SEGMENT  DATA
  358.                         EXTRN    CODE    (_DELAY)
  359.                         PUBLIC    _DISPLAY
  360.                         RSEG    ?CO?_DISPLAY?DISPLAY
  361. ?_DISPLAY?BYTE:
  362. DISPBIT:   DS  1
  363. DISPNUM:   DS  1
  364.            RSEG    ?PR?_DISPLAY?DISPLAY
  365. _DISPLAY:  PUSH ACC
  366.            PUSH  DPH
  367.            PUSH  DPL
  368.           PUSH  PSW
  369.            INC   DISPNUM
  370.             MOV A,DISPNUM
  371.            CJNE  A,#4D,DISP1
  372. DISP1:    JC  DISP2
  373.            MOV  DISPNUM,#00H
  374.            MOV  DISPBIT,#0FEH
  375. DISP2:     MOV  A,R1
  376.            ADD   A,DISPNUM
  377.            MOV  R0,A
  378.            MOV  A,@R0
  379.            MOV  DPTR,#DISPTABLE
  380.            MOVC   A,@A+DPTR
  381.            MOV P0,A
  382.            MOV A,DISPNUM
  383.            CJNE  A,#2D,DISP3
  384.            CLR   P0.7
  385. DISP3:       MOV P2,DISPBIT
  386.              MOV R5,#00H
  387.              MOV  R7,#0AH
  388.              LCALL  _DELAY
  389.              MOV P0,#0FFH
  390.              MOV  P2,#0FFH
  391.              MOV A,DISPBIT
  392.              RL   A
  393.               MOV DISPBIT,A
  394.              POP  PSW
  395.              POP   DPL


  396. …………限于本文篇幅 余下代码请从51黑下载附件…………

复制代码

评分

参与人数 1黑币 +3 收起 理由
阿佳啊 + 3 很给力!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:256444 发表于 2017-12-2 21:57 | 只看该作者
你好,楼主,请问有没有仿真文件啊
回复

使用道具 举报

板凳
ID:333970 发表于 2018-5-19 23:47 | 只看该作者
同问 请问有仿真文件吗
回复

使用道具 举报

地板
ID:434819 发表于 2018-11-30 15:10 | 只看该作者
想问一下,超声波的trig  tcho分别接在哪个io口?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表