久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7644|回復: 3
打印 上一主題 下一主題
收起左側

51單片機超聲波測距Proteus仿真 lcd1602顯示按鍵設置報警范圍 匯編語言程序

[復制鏈接]
跳轉到指定樓層
樓主
利用51單片機做的超聲波測距仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  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
復制代碼

仿真如上圖所示,有需要歡迎下載。全部資料51hei下載地址:

仿真.zip (24.09 KB, 下載次數: 112)

51超聲波測距 匯編語言.zip (37.92 KB, 下載次數: 92)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品一区二区电影 | 精品无码三级在线观看视频 | 久久精品视频在线观看 | 中文字幕一区二区三区四区五区 | 国产一区二 | 成人超碰在线 | 久久精品亚洲一区二区三区浴池 | 久久精品国产一区二区三区不卡 | 欧美精品一区在线观看 | 国产日韩欧美在线观看 | 欧美乱做爰xxxⅹ久久久 | h视频在线观看免费 | 色婷婷激情 | 日韩在线观看网站 | 一级毛片视频 | 国产午夜精品一区二区三区四区 | 欧美午夜精品 | 亚洲社区在线 | 91免费观看 | 亚洲成人三级 | 国产精品久久久久久久久婷婷 | 日韩精品一区二区三区久久 | 国产成人精品一区二区三 | 91精品一区二区三区久久久久久 | 久久久久久99 | 黑色丝袜三级在线播放 | 欧美精品一区二区三区在线播放 | 精品综合在线 | 午夜不卡一区二区 | www.久久久久久久久 | 亚洲精精品 | 一a一片一级一片啪啪 | 瑞克和莫蒂第五季在线观看 | 国产免费福利在线 | h视频免费在线观看 | 亚洲精品久久久久久久久久久久久 | 日韩一二三区视频 | 精品www| 99久久亚洲| 午夜网| 亚洲欧美在线观看视频 |