找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6323|回复: 3
收起左侧

51单片机超声波测距Proteus仿真 lcd1602显示按键设置报警范围 汇编语言程序

[复制链接]
ID:120108 发表于 2019-4-28 08:43 | 显示全部楼层 |阅读模式
利用51单片机做的超声波测距仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
1.png

单片机源程序如下:
  1.         LCD_RS BIT P1.0  //LCD1602引脚定义
  2.         LCD_RW BIT P1.1
  3.         LCD_EN BIT P1.2
  4.         LCD_DATA EQU P0   //数据并行口
  5.                
  6.         key1 BIT P1.3       //设置
  7.         key2 BIT P1.4       //减1
  8.         key3 BIT P1.5      //加1
  9.         ECHO BIT P3.6       //回波信号端
  10.         TRIG BIT P3.7       //触发信号端
  11.                
  12.         LED       BIT P2.0       //
  13.         BEE       BIT P2.1
  14.         water_in  BIT P2.2
  15.         water_out BIT P2.3
  16.         TIME_FULL BIT 20H
  17.         START_FLAG BIT 21H
  18.          TX       EQU 40H   //定时器用
  19.          S_HH    EQU 41H    //距离上限高8位
  20.          S_HL    EQU 42H    //距离上限低8位
  21.          S_LH    EQU 43H    //距离下限高8位
  22.          S_LL    EQU 44H    //距离下限低8位
  23.          S_H     EQU 45H    //距离高8位
  24.      S_L     EQU 46H    //距离低8位
  25.         
  26.         SET_FLAG EQU 47H    //设置按键按下标志 1设置上限 2设置下限
  27.         ORG 0000H
  28.         LJMP MAIN
  29.         ORG 000BH         //定时器0入口
  30.         LJMP TIME0
  31.         ORG 001BH
  32.         LJMP TIME1
  33.         ORG 0030H
  34.         MAIN:
  35.         CLR TRIG
  36.         CLR TIME_FULL
  37.         MOV SP,#52H   //预置堆栈地址
  38.         MOV R0,#40H     
  39.         MOV A,#0
  40.         CLR_ADD:     //把40H-5FH的内容清零
  41.         MOV @R0,A
  42.         INC R0
  43.         CJNE R0,#60H,CLR_ADD
  44.         
  45.         MOV S_HH,#1
  46.         MOV S_HL,#00H   ;上限=S_HH*256+S_HL
  47.         MOV S_LH,#0
  48.         MOV S_LL,#00H
  49.         
  50.         MOV S_H,#1
  51.         MOV S_L,#0
  52.         MOV SET_FLAG,#0
  53.         CLR START_FLAG
  54.         LCALL  LCD1602_INIT  //1602初始化
  55.         LCALL DELAY2
  56.         
  57.         MOV A,#80H
  58.         LCALL WRITE_1602COM
  59.         MOV DPTR,#CODE_PRINT1  
  60.         LCALL PRINT            //格式:"Now S:   "
  61.         
  62.         MOV A,#0C0H
  63.         LCALL WRITE_1602COM
  64.         MOV DPTR,#CODE_PRINT2  
  65.         LCALL PRINT            //格式:"Set H    L  "
  66.         

  67.         
  68.         MOV TMOD,#11H               //初始化定时器
  69.         MOV TH0,#0;               //用于检测超时
  70.         MOV TL0,#0;
  71.         MOV TH1,#(65536-50000)/256  //50MS 触发
  72.         MOV TL1,#(65536-50000)MOD 256
  73.         SETB EA
  74.         SETB ET0
  75.         SETB ET1        //开启中断
  76.         SETB TR1
  77.         LCALL DISPLAY1
  78.         
  79.         
  80.         
  81.         //主循环
  82.         LOOP:
  83.         LCALL KEYBOARD     //调用按键        
  84.         
  85.         MOV A,#0
  86.         CJNE A,SET_FLAG,LOOP1
  87.         SETB TR1
  88.         LOOP7:
  89.         JB ECHO,LOOP2
  90.         SETB START_FLAG
  91.         SJMP LOOP7
  92.         LOOP2:
  93.         JNB START_FLAG,LOOP3  //为0表示不正常的值 不更新
  94.         CLR START_FLAG
  95.         SETB TR0
  96.         LOOP6:
  97.         JNB ECHO,LOOP4
  98.         JB TIME_FULL,LOOP5  //超出范围
  99.         SJMP LOOP6
  100.         LOOP4:
  101.         CLR TR0
  102.         LCALL COUNT
  103.         LCALL DISPLAY2     //显示距离
  104.         LCALL FUNTION      //判断范围
  105.         SJMP LOOP3
  106.         LOOP5:
  107.         CLR TIME_FULL
  108.         CLR TR0
  109.         MOV TH0,#0;   
  110.         MOV TL0,#0;
  111.         
  112.         MOV A,#89H
  113.         LCALL WRITE_1602COM
  114.         MOV DPTR,#CODE_PRINT3  
  115.         LCALL PRINT            //格式:"Err"
  116.         CLR LED
  117.         CLR BEE   //超时   仅报警
  118.         LOOP3:
  119.         
  120.         
  121.         SJMP LOOP


  122.         LOOP1:
  123.         CLR TR1  //按键设置的时候禁止测量
  124.         CLR TR0
  125.         LCALL DISPLAY1         //有按键时在屏幕上更新上下限的值
  126.         LJMP LOOP
  127.         
  128.         
  129.         FUNTION:
  130.         CLR C
  131.         MOV A,S_H      //实际值减去下限
  132.         SUBB A,S_LH
  133.         MOV B,A
  134.         JNC FUN0     //为0跳转继续判断  为1说明低于下限
  135.         FUN1:
  136.         CLR water_in  //注水 开灯 报警
  137.         CLR LED
  138.         CLR BEE
  139.         SJMP FUN
  140.         FUN0:
  141.         MOV A,S_L
  142.         SUBB A,S_LL
  143.         JNC FUN2        //低8位是否有借位
  144.         MOV A,B
  145.         CJNE A,#1,FUN1   //有借位B为1说明测量值大于下限  判断上限
  146.         FUN2:          //实际值和上限相比较
  147.         CLR C
  148.         MOV A,S_HH
  149.         SUBB A,S_H
  150.         MOV B,A
  151.         JNC FUN3
  152.         FUN4:
  153.         CLR water_out
  154.         CLR LED
  155.         CLR BEE
  156.         SJMP FUN
  157.         FUN3:
  158.         MOV A,S_HL
  159.         SUBB A,S_L
  160.         JNC FUN5        //
  161.         MOV A,B
  162.         CJNE A,#1,FUN4
  163.         FUN5:
  164.         SETB water_in
  165.         SETB water_out
  166.         SETB LED
  167.         SETB BEE
  168.         FUN:
  169.         RET
  170.         
  171.         COUNT:  //计算距离 cm=us/58
  172.         MOV R1,TH0
  173.         MOV R0,TL0
  174.         MOV S_L,#0
  175.         MOV S_H,#0
  176.         MOV TH0,#0
  177.         MOV TL0,#0
  178.         _D1:
  179.       CLR  C             //循环被除数减去除数的次数就是这个商
  180.       MOV  A, R0
  181.       SUBB A, #3AH
  182.       MOV  R0, A
  183.       MOV  A, R1
  184.       SUBB A, #0
  185.       MOV  R1, A
  186.       JC   _D2
  187.       INC  S_L
  188.           MOV A,S_L
  189.           CJNE A,#0,_D1
  190.           INC S_H
  191.       SJMP _D1
  192.         _D2:
  193.       RET

  194. //显示数字函数
  195.         
  196.         DISPLAY1:
  197. //显示上下限
  198.         MOV A,#0C5H
  199.         LCALL WRITE_1602COM
  200.         MOV A,#' '
  201.         LCALL WRITE_1602DAT
  202.         
  203.         MOV A,SET_FLAG
  204.         CJNE A,#1,DIS1
  205.         MOV A,#0C5H
  206.         LCALL WRITE_1602COM
  207.         MOV A,#'*'
  208.         LCALL WRITE_1602DAT
  209.         SJMP DIS2
  210.         DIS1:
  211.         CJNE A,#2,DIS2
  212.         MOV A,#0CBH
  213.         LCALL WRITE_1602COM
  214.         MOV A,#'*'
  215.         LCALL WRITE_1602DAT        
  216.         DIS2:
  217.         MOV R6,S_HH   
  218.         MOV R7,S_HL
  219.         LCALL HB2           //2字节16进制数转换为3字节压缩BCD码
  220.         MOV A,#0C6H
  221.         MOV B,R4
  222.         LCALL DIS_1WEI
  223.         MOV A,R5
  224.         LCALL DIS_2WEI
  225.         
  226.         
  227.         MOV R6,S_LH
  228.         MOV R7,S_LL
  229.         LCALL HB2           //2字节16进制数转换为3字节压缩BCD码
  230.         MOV A,#0CCH
  231.         MOV B,R4
  232.         LCALL DIS_1WEI
  233.         MOV A,R5
  234.         LCALL DIS_2WEI     

  235.         RET
  236.         DISPLAY2:
  237. //显示距离
  238.         MOV R6,S_H   
  239.         MOV R7,S_L
  240.         LCALL HB2           //2字节16进制数转换为3字节压缩BCD码
  241.         MOV A,#089H
  242.         MOV B,R4
  243.         LCALL DIS_1WEI
  244.         MOV A,R5
  245.         LCALL DIS_2WEI
  246.         RET
  247.         
  248.         //按键函数
  249.         KEYBOARD:
  250.         JB KEY1,K06            //设置
  251.         LCALL DELAY2
  252.         JB KEY1,K06
  253.         INC SET_FLAG
  254.         MOV A,SET_FLAG
  255.         CJNE A,#3,K07      //为3退出设置状态
  256.         MOV SET_FLAG,#0
  257.         
  258.         MOV A,#0CBH
  259.         LCALL WRITE_1602COM
  260.         MOV A,#' '           //把*号去掉
  261.         LCALL WRITE_1602DAT
  262.         K07:
  263.         JNB KEY1,$
  264.         LJMP K00
  265.         K06:
  266.         MOV A,SET_FLAG
  267.         CJNE A,#0,K060
  268.         SJMP K00
  269.         K060:
  270.         JB KEY2,K04           //加
  271.         LCALL DELAY2
  272.         JB KEY2,K04
  273.         CJNE A,#1,K061        //按下设置键第一次上限 第二次下限
  274.         INC S_HL              //上限加 不能高于500即可
  275.         MOV A,S_HL
  276.         CJNE A,#0F5H,K063                       //最大值为1F4(500),所以得先判断是否到最大值
  277.         MOV A,S_HH
  278.         CJNE A,#1,K063                          //不相等表示没到500 继续设置
  279.         DEC S_HL
  280.         SJMP K05
  281.         K063:
  282.         MOV A,S_HL                     
  283.         CJNE A,#0,K05
  284.         INC S_HH        //进位
  285.         SJMP K05   
  286.         K061:
  287.         MOV A,S_LL              //下限加 不能高于上限且判断进位
  288.         CJNE A,S_HL,K062
  289.         MOV A,S_LH
  290.         CJNE A,S_HH,K062      //下限不能超过上限 可以相等
  291.         SJMP K05
  292.         K062:
  293.         INC S_LL
  294.         MOV A,S_LL
  295.         CJNE A,#0,K05
  296.         INC S_LH
  297.         K05:
  298.         JNB KEY2,$
  299.         SJMP K00
  300.         K04:
  301.         JB KEY3,K00
  302.         LCALL DELAY1
  303.         JB KEY3,K00
  304.         MOV A,SET_FLAG
  305.         CJNE A,#1,K040
  306.         MOV A,S_HL          //上限减 不能低于下限 且还得判断借位
  307.         CJNE A,S_LL,K041   //相等再判断高8位 不相等直接减
  308.         MOV A,S_HH
  309.         CJNE A,S_LH,K041  //相等不做任何操作 ,不相等直接减
  310.         K042:
  311.         JNB KEY3,$
  312.         SJMP K00
  313.         K041:
  314.         DEC S_HL
  315.         MOV A,S_HL
  316.         CJNE A,#255,K042   //判断是否借位 否直接退出
  317.         DEC S_HH
  318.         SJMP K042         
  319.         K040:         //下限减
  320.         MOV A,S_LL
  321.         CJNE A,#0,K043  
  322.         MOV A,S_LH
  323.         CJNE A,#0,K043
  324.         SJMP K042       //下限为0不做任何操作
  325.         K043:
  326.         DEC S_LL
  327.         MOV A,S_LL
  328.         CJNE A,#255,K042  //判断是否有借位
  329.         DEC S_LH
  330.         SJMP K042
  331.         K00:
  332.         RET
  333.         
  334.         
  335.         //LCD1602初始化函数
  336.         LCD1602_INIT:
  337.         MOV A,#38H
  338.         LCALL WRITE_1602COM
  339.         MOV A,#0CH
  340.         LCALL WRITE_1602COM
  341.         MOV A,#06H
  342.         LCALL WRITE_1602COM
  343.         MOV A,#01H
  344.         LCALL WRITE_1602COM
  345.         RET
  346.         
  347.         WRITE_1602COM:  //写命令
  348.         CLR LCD_RS
  349.         CLR LCD_RW
  350.         MOV P0,A
  351.         LCALL DELAY1
  352.         SETB LCD_EN
  353.         LCALL DELAY1
  354.         CLR LCD_EN
  355.         RET
  356.         WRITE_1602DAT: //写数据
  357.         SETB LCD_RS
  358.         CLR LCD_RW
  359.         MOV P0,A
  360.         LCALL DELAY1
  361.         SETB LCD_EN
  362.         LCALL DELAY1
  363.         CLR LCD_EN
  364.         RET
  365.         
  366.         
  367.         //1602显示字符串函数
  368.         PRINT:
  369.         MOV R0,#0
  370.         PRINT01:
  371.         MOV A,R0
  372.         MOVC A,@A+DPTR
  373.         CJNE A,#0,PRINT00
  374.         RET
  375.         PRINT00:
  376.         LCALL WRITE_1602DAT
  377.         INC R0
  378.         SJMP PRINT01
  379.         
  380.         //1602显示3位整数
  381.         DIS_3WEI:
  382.         MOV R0,A
  383.         MOV B,#100
  384.         DIV AB
  385.         CJNE A,#0,W1
  386.         MOV A,#' '
  387.         SJMP W2
  388.         W1:
  389.         ADD A,#30H
  390.         W2:
  391.         LCALL WRITE_1602DAT
  392.         MOV A,B
  393.         MOV B,#10
  394.         DIV AB
  395.         CJNE A,#0,W3
  396.         CJNE R0,#100,W5
  397.         SJMP W3
  398.         W5:
  399.         MOV A,#' '
  400.         SJMP W4
  401.         W3:
  402.         ADD A,#30H
  403.         W4:
  404.         LCALL WRITE_1602DAT
  405.         MOV A,B
  406.         ADD A,#30H
  407.         LCALL WRITE_1602DAT
  408.         RET
  409.         
  410.         //1602显示2位整数
  411.         DIS_2WEI:
  412.         MOV B,#16
  413.         DIV AB
  414.         ADD A,#30H
  415.         LCALL WRITE_1602DAT
  416.         MOV A,B
  417.         ADD A,#30H
  418.         LCALL WRITE_1602DAT
  419.         RET
  420.         
  421.         //1602显示1位整数
  422.         DIS_1WEI:                ;A是地址 B放数据
  423.         LCALL WRITE_1602COM
  424.         MOV A,B
  425.         ADD A,#30H
  426.         LCALL WRITE_1602DAT
  427.         RET
  428.         
  429.         DELAY1:       ;延时1
  430.         MOV 30H,#20
  431.         DJNZ 30H,$
  432.         RET
  433.         
  434.         DELAY2:       ;延时2
  435.         MOV 30H,#50
  436.         DELAY20:
  437.         MOV 31H,#50
  438.         DJNZ 31H,$
  439.         DJNZ 30H,DELAY20
  440.         RET
  441.         
  442.         ;//定时器0中断函数
  443.         TIME0:
  444.         PUSH PSW
  445.         PUSH ACC
  446.         
  447.         SETB TIME_FULL

  448.         POP ACC
  449.         POP PSW
  450.         RETI
  451.         
  452.         
  453.         TIME1:
  454.         PUSH PSW
  455.         PUSH ACC
  456.         MOV TH1,#(65536-50000)/256;    //50MS
  457.         MOV TL1,#(65536-50000)MOD 256;
  458.         INC TX
  459.         MOV A,TX
  460.         CJNE A,#8,TIME10  //400MS测量一次
  461.         MOV TX,#0
  462.         SETB TRIG
  463.         LCALL DELAY1
  464.         CLR TRIG
  465.         TIME10:
  466.         POP ACC
  467.         POP PSW
  468.         RETI
  469.         
  470. ; 功能:双字节十六进制整数转换成双字节BCD码整数
  471. ; 入口条件:待转换的双字节十六进制整数在R6、R7中。
  472. ; 出口信息:转换后的三字节BCD码整数在R3、R4、R5中。


  473. HB2:
  474.         CLR        A        ;BCD码初始化
  475.         MOV        R3,A
  476.         MOV        R4,A
  477.         MOV        R5,A
  478.         MOV        R2,#10H        ;转换双字节十六进制整数
  479. HB3:        
  480.         MOV        A,R7        ;从高端移出待转换数的一位到CY中
  481.         RLC        A
  482.         MOV        R7,A
  483.         MOV        A,R6
  484.         RLC        A
  485.         MOV        R6,A
  486.         MOV        A,R5        ;BCD码带进位自身相加,相当于乘2
  487.         ADDC        A,R5
  488.         DA        A        ;十进制调整
  489.         MOV        R5,A
  490.         MOV        A,R4
  491.         ADDC        A,R4
  492.         DA        A
  493.         MOV        R4,A
  494.         MOV        A,R3
  495.         ADDC        A,R3
  496.         MOV        R3,A        ;双字节十六进制数的万位数不超过6,不用调整
  497.         DJNZ        R2,HB3        ;处理完16bit
  498.         RET        
  499.         
  500.         CODE_PRINT1:
  501.         DB "  Now S:      cm",0
  502.         CODE_PRINT2:
  503.         DB "Set H     L    ",0
  504.         CODE_PRINT3:
  505.         DB "Err",0
  506.         END
复制代码
0.png
仿真如上图所示,有需要欢迎下载。全部资料51hei下载地址:

仿真.zip (24.09 KB, 下载次数: 112)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:89286 发表于 2019-4-29 22:22 | 显示全部楼层
thanks for sahring
回复

使用道具 举报

ID:557094 发表于 2019-6-21 23:57 | 显示全部楼层
请问楼主有四路超声波的汇编程序吗?
回复

使用道具 举报

ID:716236 发表于 2020-3-26 15:01 | 显示全部楼层
谢谢分享,很经典
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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