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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

  [復制鏈接]
跳轉到指定樓層
樓主
仿真原理圖如下(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;                            //觸發控制信號輸入
  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狀態-------
  26. ucharread_lcd_state()
  27. {
  28.        uchar state;
  29.        LCD_RS=0;              //LCD選擇指令寄存器
  30.        LCD_RW=1;             //LCD進行讀操作
  31.        LCD_EN=1;                                                      //LCD使能端為高電平
  32.        _nop_();                 // 產生一條NOP指令
  33.        state=P0;
  34.        LCD_EN=0;             //LCD使能端為低電平
  35.        _nop_();
  36.        returnstate;                                 //返回函數
  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時,寫數據
  49.        LCD_RW=0;          //LCD進行寫操作
  50.        P0=com;              //把命令字送入P0
  51.        NOP();                               //延時一個機器周期1us
  52.        LCD_EN=1;
  53.        NOP();
  54.        LCD_EN=0;
  55. }
  56. //----------LCD寫數據----------
  57. voidlcd_write_data(uchar dat)
  58. {
  59.        lcd_busy_wait();
  60.        LCD_RS=1;
  61.        LCD_RW=0;
  62.        P0=dat;                   //把要顯示的數據送入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顯示模式設置
  73.        lcd_write_com(0x0c);                     //LCD顯示開/關及光標設置
  74.        lcd_write_com(0x06);                     //當寫一個字符后地址指針加1,且光標加1
  75.        lcd_write_com(0x01);                     //顯示清屏
  76. }
  77. //---------設置液晶顯示位置-----------
  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;                                        //觸發脈沖
  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;                 //設置為下降沿中斷方式
  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);    //計算高電平持續的時間,上升沿到來時候開始計時,下降沿到來進入外部中斷,關閉計時器,停止計時
  139.        TH0=0;
  140.        TL0=0;
  141. }
復制代碼


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

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

使用道具 舉報

沙發
ID:901776 發表于 2022-3-23 15:30 | 只看該作者
作者你好圖呢
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久久久久久久久久久国产 | 久久天堂网 | 国产精品地址 | 国产三级网站 | 亚洲精品一区二区网址 | 国产福利在线 | 久久乐国产精品 | 国产一区二区不卡 | 免费在线黄色av | 成年人免费看的视频 | 91精品久久久久久久久久入口 | 在线亚洲欧美 | 91精品久久久久久综合五月天 | 日韩有码在线观看 | 国产小视频在线观看 | 中文字幕第一页在线 | 爱爱小视频 | 欧美久久久久久 | www.日本精品 | 91精品久久久久久久久中文字幕 | www.亚洲视频.com | 亚洲一区二区视频 | 伊人网影院 | 亚洲精品乱码久久久久久久久久 | 日韩成人免费视频 | 亚洲黄色高清视频 | 亚洲三区在线播放 | 久久国产精品久久 | 午夜影院网站 | 国产精品区一区二区三区 | 水蜜桃亚洲一二三四在线 | 国产91成人| 偷拍自拍第一页 | 国产不卡一 | 免费能直接在线观看黄的视频 | 亚洲+变态+欧美+另类+精品 | 97人人草 | 在线欧美亚洲 | 99爱在线| 久久国产一区 | 国产999精品久久久 午夜天堂精品久久久久 |