找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8621|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

基于51單片機的超聲波測距設(shè)計程序+Proteus仿真圖

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
#
ID:264608 發(fā)表于 2018-7-3 17:57 | 只看該作者 |只看大圖 回帖獎勵 |正序瀏覽 |閱讀模式
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>             //聲明void _nop_(void);
  3. #defineuint  unsigned int
  4. #defineuchar unsigned char
  5. #defineNOP() {_nop_();_nop_();_nop_();_nop_();}
  6. sbit PL=P1^0;
  7. //------LCD引腳-----
  8. sbit LCD_RS=P2^6;                //將P2.6引腳定義為LCD寄存器選擇
  9. sbitLCD_RW=P2^5;               //將P2.5引腳定義為LCD讀寫信號線
  10. sbitLCD_EN=P2^7;                 //將P2.7引腳定義為LCD使能端
  11. //------超聲波引腳-------
  12. sbitTx=P3^3;                            //觸發(fā)控制信號輸入
  13. sbit Rx=P3^2;                           //回響信號輸出
  14. ucharcode table[]={"Distance Test:"};         //LCD第一行顯示
  15. uchartemp_dis[]= {"000.0 cm"};                        //LCD第二行
  16. longint t,distance;
  17. ucharcache[4]={0,0,0,0};
  18. //--------延時-------
  19. voiddelay(uint ms)
  20. {
  21.        uint t;
  22.        while(ms--)
  23.               for(t=0;t<120;t++);
  24. }
  25. //-------讀LCD狀態(tài)-------
  26. ucharread_lcd_state()
  27. {
  28.        uchar state;
  29.        LCD_RS=0;              //LCD選擇指令寄存器
  30.        LCD_RW=1;             //LCD進(jìn)行讀操作
  31.        LCD_EN=1;                                                      //LCD使能端為高電平
  32.        _nop_();                 // 產(chǎn)生一條NOP指令
  33.        state=P0;
  34.        LCD_EN=0;             //LCD使能端為低電平
  35.        _nop_();
  36.        returnstate;                                 //返回函數(shù)
  37. }
  38. //-------忙等待------
  39. voidlcd_busy_wait()
  40. {
  41.        while((read_lcd_state() &0x80)==0x80);
  42.        NOP();
  43. }
  44. //----------LCD寫指令----------
  45. voidlcd_write_com(uchar com)
  46. {
  47.        lcd_busy_wait();
  48.        LCD_RS=0;               //RS為0時,寫指令,RS為1時,寫數(shù)據(jù)
  49.        LCD_RW=0;          //LCD進(jìn)行寫操作
  50.        P0=com;              //把命令字送入P0
  51.        NOP();                               //延時一個機器周期1us
  52.        LCD_EN=1;
  53.        NOP();
  54.        LCD_EN=0;
  55. }
  56. //----------LCD寫數(shù)據(jù)----------
  57. voidlcd_write_data(uchar dat)
  58. {
  59.        lcd_busy_wait();
  60.        LCD_RS=1;
  61.        LCD_RW=0;
  62.        P0=dat;                   //把要顯示的數(shù)據(jù)送入P0
  63.        NOP();                              
  64.        LCD_EN=1;
  65.        NOP();
  66.        LCD_EN=0;
  67. }
  68. //-------LCD初始化-------
  69. voidlcd_init()
  70. {
  71.        LCD_EN=0;
  72.        lcd_write_com(0x38);                     //LCD顯示模式設(shè)置
  73.        lcd_write_com(0x0c);                     //LCD顯示開/關(guān)及光標(biāo)設(shè)置
  74.        lcd_write_com(0x06);                     //當(dāng)寫一個字符后地址指針加1,且光標(biāo)加1
  75.        lcd_write_com(0x01);                     //顯示清屏
  76. }
  77. //---------設(shè)置液晶顯示位置-----------
  78. voidset_lcd_pos(uchar p)
  79. {
  80.        lcd_write_com(p|0x80);
  81. }
  82. //---------液晶顯示程序----------
  83. voidlcd_print(uchar p,uchar *s,uint low)
  84. {
  85.        uint num;
  86.        set_lcd_pos(p);
  87.        for(num=0;num<low;num++)         
  88.        {
  89.               lcd_write_data(s[num]);
  90.               delay(1);      
  91.        }
  92. }
  93. voidHC05_Init()
  94. {
  95.        Tx=1;                                        //觸發(fā)脈沖
  96.        NOP();NOP();NOP();NOP();
  97.        Tx=0;
  98.        distance=0.1725*t;                  //距離計算
  99. }
  100. voiddistance_convert(long int dat)
  101. {
  102.        cache[0]=dat/1000;
  103.        cache[1]=dat/100%10;
  104.        cache[2]=dat/10%10;
  105.        cache[3]=dat%10;
  106.        temp_dis[0]=cache[0]+'0';
  107.        temp_dis[1]=cache[1]+'0';
  108.        temp_dis[2]=cache[2]+'0';
  109.        temp_dis[4]=cache[3]+'0';
  110. }
  111. //------------主程序-----------
  112. voidmain()
  113. {
  114.        PL=1;
  115.        delay(20);
  116.        PL=1;
  117.        delay(1000);
  118.        PL=0;
  119.       
  120.        lcd_init();
  121.        delay(5);
  122.        TMOD=0x19;
  123.        EA=1;                 //開總中斷
  124.        TR0=1;                //啟動定時器
  125.        EX0=1;               //開外部中斷
  126.        IT0=1;                 //設(shè)置為下降沿中斷方式
  127.        while(1)
  128.        {
  129.               HC05_Init();
  130.               distance_convert(distance);
  131.               lcd_print(0x01,table,14);
  132.               lcd_print(0x44,temp_dis,8);
  133.        }
  134. }
  135. //外部中斷0
  136. voidint0() interrupt 0
  137. {
  138.        t=(TH0*256+TL0);    //計算高電平持續(xù)的時間,上升沿到來時候開始計時,下降沿到來進(jìn)入外部中斷,關(guān)閉計時器,停止計時
  139.        TH0=0;
  140.        TL0=0;
  141. }
復(fù)制代碼


Keil代碼與Proteus仿真下載: 基于單片機超聲波測距系統(tǒng) 語音提示 程序hex 原理圖.zip (60.45 KB, 下載次數(shù): 163)

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報

板凳
ID:1015031 發(fā)表于 2022-4-3 16:09 | 只看該作者
請問36行的返回函數(shù)是沒有的嗎?為什么編譯程序一直出錯呢?
回復(fù)

使用道具 舉報

沙發(fā)
ID:1015031 發(fā)表于 2022-4-3 15:19 | 只看該作者
你好,請教一下,這個可以通過修改程序,連接兩個超聲波傳感器測兩個距離,然后用垂直距離比上兩個水平距離之差,從而求出坡度嗎?   坡度也在1602上顯示出來
回復(fù)

使用道具 舉報

樓主
ID:901776 發(fā)表于 2022-3-23 15:30 | 只看該作者
作者你好圖呢
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表