找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機(jī)超聲波四方向測距系統(tǒng)Proteus仿真+源碼設(shè)計

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:318030 發(fā)表于 2018-6-19 17:44 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
這是一個基于51單片機(jī)設(shè)計的超聲波四方向測距系統(tǒng),能夠在LCD1602上顯示四路的距離,通過調(diào)試,可以執(zhí)行。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
  1. #include "LCD1602DRV.h"
  2. #include "STCEEPROM.h"
  3. sbit  RX1 = P3^3;
  4. sbit  RX2 = P3^4;
  5. sbit  RX3 = P3^5;
  6. sbit  RX4 = P3^6;
  7. sbit  TX = P3^7;

  8. sbit LED3 = P2^2;
  9. sbit LED2 = P2^1;
  10. sbit LED1 = P2^0;
  11. sbit SPEAK = P2^3;

  12. sbit KEY1 = P1^3;
  13. sbit KEY2 = P1^4;
  14. sbit KEY3 = P1^5;

  15. uint  time=0;
  16. uint  timer=0;
  17. uint S=0,S1=0,S2=0,S3=0,S4=0;

  18. bit flag =0;
  19. uchar KEY_flag=0;
  20. //延時函數(shù)
  21. void Conut(void)
  22. {
  23.          time=TH0*256+TL0;
  24.          TH0=0;
  25.          TL0=0;
  26.        
  27.          S=(time*1.87)/100;     //算出來是CM
  28.          if((S>=700)||flag==1) //超出測量范圍顯示“-”
  29.          {         
  30.           flag=0;
  31.          }
  32. }
  33. void main(void)
  34. {       
  35.         uint SET_H=90,SET_L=30;
  36.   LCD1602_Init();//液晶初始化
  37.   SetRowCol(0,0);
  38.         printf("000 000 000 000");
  39.         SetRowCol(1,0);
  40.         printf("Set H:    L:   ");
  41.         TMOD=0x11;                   //設(shè)T0為方式1,GATE=1;
  42.         TH0=0;
  43.         TL0=0;         
  44.         TH1=0xf8;                   //2MS定時
  45.         TL1=0x30;
  46.         ET0=1;             //允許T0中斷
  47.         ET1=1;                           //允許T1中斷
  48.         TR1=1;                           //開啟定時器
  49.         EA=1;                           //開啟總中斷
  50.         EA=0;
  51.         //SET_H = ISP_READ(0x2c00)*256+ISP_READ(0x2c01);
  52.         //SET_L = ISP_READ(0x2c02)*256+ISP_READ(0x2c03);
  53.         EA=1;

  54.         while(1)
  55.         {

  56.                 while(!RX1);                    //當(dāng)RX為零時等待
  57.                 TR0=1;                            //開啟計數(shù)
  58.                 while(RX1);                        //當(dāng)RX為1計數(shù)并等待
  59.                 TR0=0;                                //關(guān)閉計數(shù)
  60.                 Conut();
  61.                 S1=S;
  62.                 /////////////////////////////
  63.                 while(!RX2);                    //當(dāng)RX為零時等待
  64.                 TR0=1;                            //開啟計數(shù)
  65.                 while(RX2);                        //當(dāng)RX為1計數(shù)并等待
  66.                 TR0=0;                                //關(guān)閉計數(shù)
  67.                 Conut();
  68.                 S2=S;
  69.                 /////////////////////////////
  70.                 while(!RX3);                    //當(dāng)RX為零時等待
  71.                 TR0=1;                            //開啟計數(shù)
  72.                 while(RX3);                        //當(dāng)RX為1計數(shù)并等待
  73.                 TR0=0;                                //關(guān)閉計數(shù)
  74.                 Conut();
  75.                 S3=S;
  76.                 /////////////////////////////
  77.                 while(!RX4);                    //當(dāng)RX為零時等待
  78.                 TR0=1;                            //開啟計數(shù)
  79.                 while(RX4);                        //當(dāng)RX為1計數(shù)并等待
  80.                 TR0=0;                                //關(guān)閉計數(shù)
  81.                 Conut();
  82.                 S4=S;
  83.                 /////////////////////////////////////
  84.                 SetRowCol(0,0);
  85.                 printf("%3d",S1);
  86.                 SetRowCol(0,4);
  87.                 printf("%3d",S2);
  88.                 SetRowCol(0,8);
  89.                 printf("%3d",S3);
  90.                
  91.                 SetRowCol(0,12);
  92.                 printf("%3d",S4);
  93.                 /////////////////////////////////
  94.                 if((S1>SET_H)&&(S2>SET_H)&&(S3>SET_H)&&(S4>SET_H))//遠(yuǎn),不報警
  95.                 {
  96.                         LED1=0;LED2=1;LED3=1;SPEAK=0;
  97.                         delayms(10);
  98.                 }
  99.                 if((S1<SET_H&&S1>SET_L)||(S2<SET_H&&S2>SET_L)||(S3<SET_H&&S3>SET_L)||(S4<SET_H&&S4>SET_L))//中,警告       
  100.                 {
  101.                         LED1=1;LED2=1;LED3=0;SPEAK=1;
  102.                         delayms(10);
  103.                 }       
  104.                 if((S1<SET_L)||(S2<SET_L)||(S3<SET_L)||(S4<SET_L))//近,報警
  105.                 {
  106.                         LED1=1;LED2=0;LED3=1;SPEAK=1;
  107.                         delayms(10);
  108.                 }
  109.                 if(!KEY1)
  110.                 {
  111.                         delayms(10);
  112.                         if(!KEY1)
  113.                         {
  114.                                 KEY_flag++;       
  115.                                 ISP_ERASE(0x2c00);                //注意:字節(jié)編程時必須要先要擦除整個扇區(qū)       
  116.                                 ISP_PROGRAM(0x2c00, SET_H/256);
  117.                                 ISP_PROGRAM(0x2c01, SET_H);
  118.                                 ISP_PROGRAM(0x2c02, SET_L/256);
  119.                                 ISP_PROGRAM(0x2c03, SET_L);
  120.                         }
  121.                         while(!KEY1);
  122.                         delayms(10);
  123.                 }
  124.                 if(!KEY2)
  125.                 {
  126.                         delayms(10);
  127.                         if(!KEY2)
  128.                         {
  129.                                 if(KEY_flag%2==0)SET_H++;
  130.                                 if(KEY_flag%2==1)SET_L++;
  131.                         }
  132.                         while(!KEY2);
  133.                         delayms(10);
  134.                 }
  135.                 if(!KEY3)
  136.                 {
  137.                         delayms(10);
  138.                         if(!KEY3)
  139.                         {
  140.                                 if(KEY_flag%2==0)SET_H--;
  141.                                 if(KEY_flag%2==1)SET_L--;
  142.                         }
  143.                         while(!KEY3);
  144.                         delayms(10);
  145.                 }
  146.           SetRowCol(1,6);
  147.                 printf("%03d",SET_H);
  148.                 SetRowCol(1,12);
  149.                 printf("%03d",SET_L);
  150.         }
  151. }

  152. /********************************************************/
  153. void zd0() interrupt 1                  //T0中斷用來計數(shù)器溢出,超過測距范圍
  154.   {
  155.     flag=1;                                                         //中斷溢出標(biāo)志
  156.   }
  157. ……………………

  158. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載(仿真+源代碼):
keil.zip (167.1 KB, 下載次數(shù): 117)


評分

參與人數(shù) 2黑幣 +53 收起 理由
zsyzdx + 3 贊一個!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:495096 發(fā)表于 2019-4-17 07:59 | 只看該作者
學(xué)習(xí)了
回復(fù)

使用道具 舉報

板凳
ID:543604 發(fā)表于 2019-5-22 11:19 | 只看該作者
請問超聲波HC-SR04.hex文件怎么編寫的呢
回復(fù)

使用道具 舉報

地板
ID:434366 發(fā)表于 2019-5-22 18:06 | 只看該作者
收到,謝謝,贊一個
回復(fù)

使用道具 舉報

5#
ID:231648 發(fā)表于 2020-3-25 15:18 | 只看該作者
學(xué)習(xí)了,多謝博主
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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