找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4193|回復(fù): 0
收起左側(cè)

AT89S51單片機(jī)超聲波測(cè)距系統(tǒng)Proteus仿真+注釋詳細(xì)的代碼

[復(fù)制鏈接]
ID:567835 發(fā)表于 2019-6-20 14:02 | 顯示全部樓層 |閱讀模式
測(cè)距精度不是特別的準(zhǔn)確。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png

單片機(jī)源程序如下:
  1. //    基于AT89C51/52單片機(jī)的超聲波測(cè)距系統(tǒng)
  2. //    測(cè)量范圍:40-690厘米
  3. //    晶振:12MH
  4. //    2015年5月
  5. #include <REGX51.H>                                //頭文件
  6. #include <intrins.h>            //頭文件
  7. #define uchar unsigned char     
  8. #define uint unsigned int      
  9. #define bjh P3_1                            //定值輸出(繼電器)
  10. #define sx P0_2                 //報(bào)警值輸出(聲音)
  11. #define csbout P2_7                         //超聲波發(fā)送
  12. #define csbint P3_5                         //超聲波接收

  13. uchar ec,cls,cs,mq,xm0,xm1,xm2,sec20,sec,sec1,buffer[3]; //程序中使用的變量   
  14. uchar convert[10]={0x81,0xED,0xA2,0xA8,0xCC,0x98,0x90,0xAD,0x80,0x88};//0~9段碼
  15. uint zzz,dz,i,jsz,t;//程序中使用的變量  zzz:測(cè)量上限,dz:報(bào)警定值,i:延時(shí)變量,jsz:距離測(cè)量結(jié)果,t:時(shí)間
  16. static uchar bdata ke;         //可位尋址的狀態(tài)寄存器
  17. float csbc;             //超聲波速儲(chǔ)存單元  

  18. sbit LED1 = P3^4;                        //數(shù)碼管位驅(qū)動(dòng)
  19. sbit LED2 = P3^2;                        //數(shù)碼管位驅(qū)動(dòng)
  20. sbit LED3 = P3^3;                        //數(shù)碼管位驅(qū)動(dòng)


  21. void delay(i);                                //延時(shí)函數(shù)
  22. void scanLED();                                //顯示函數(shù)
  23. void timeToBuffer();                //顯示轉(zhuǎn)換函數(shù)
  24. void time();                                //計(jì)時(shí)處理                        
  25. void csbcj();                                //超聲波測(cè)量處理
  26. void bgcl();                                //繼電器報(bào)警處理
  27. void csbfs();                                //超聲波發(fā)送

  28. void offmsd();              //百位為零時(shí)不顯示處理

  29. void main()                                        //主程序
  30. {
  31.         EA=1;                                           //開(kāi)中斷
  32.           TMOD=0x11;                                 //設(shè)定時(shí)器1定時(shí)
  33.         csbout=1;                                //單片機(jī)超聲波輸出端口置高電平
  34.         TR1=0;                                        //定時(shí)器1停止工作
  35.         zzz=699;                                //測(cè)量上限值
  36.         mq=40;                                        //盲區(qū)值
  37.     dz=120;                                        //報(bào)警值初值
  38.         cls=1;                                        //每秒測(cè)量次數(shù)
  39.     csbc=0.034;            //20度時(shí)的超聲波速度:厘米/uS
  40.         bjh=1;                                        //繼電器停止工作
  41.         sx=0;                                        //蜂鳴器停止工作
  42.         ec=100;
  43.         while(1)               
  44.         {
  45.             ec++;
  46.                 if (ec>100)                        //超聲波測(cè)量標(biāo)志為100時(shí)進(jìn)行測(cè)量
  47.                 {
  48.                     cls=~cls;
  49.                     ec=0;                        //超聲波測(cè)量標(biāo)志置0
  50.                         csbcj();         //調(diào)用超聲波測(cè)量程序
  51.                     timeToBuffer();                //調(diào)用轉(zhuǎn)換段碼功能模塊
  52.                         offmsd();           //調(diào)用顯示轉(zhuǎn)換程序
  53.                         bgcl();              //調(diào)用報(bào)警處理程序
  54.                 }
  55.                   scanLED();                             //調(diào)用顯示函數(shù)
  56.                 if((jsz<dz)&(cls==1))                                //判斷是否達(dá)到報(bào)警值
  57.                 {
  58.                    i=5;
  59.                    while(i--)
  60.                    {
  61.                                    sx=~sx;             //發(fā)出“滴”聲響
  62.                         delay(70);
  63.                    }

  64.                 }
  65.                 else  {sx=0;}
  66.         }
  67. }

  68. void delay(i)                                //延時(shí)子程序                                       
  69. {
  70.     while(--i);
  71. }

  72. void scanLED()                             //顯示功能模塊
  73. {
  74.         P2=buffer[2];            //顯百位段
  75.         LED1=0;                  //顯百位位
  76.         delay(40);                                 //百位顯示延時(shí)          程序要下載到實(shí)物中時(shí)改為delay(2);        下同
  77.         LED1=1;                  //關(guān)閉百位顯示
  78.         delay(2);               //關(guān)閉百位顯示延時(shí)        程序要下載到實(shí)物中時(shí)改為delay(50);        下同
  79.         P2=buffer[1];                         //顯十位段
  80.         LED2=0;                  //顯十位位
  81.         delay(40);                //百十位顯示延時(shí)
  82.         LED2=1;                  //關(guān)閉十位顯示
  83.         delay(2);               //關(guān)閉十位顯示延時(shí)
  84.         P2=buffer[0];            //顯個(gè)位段
  85.         LED3=0;                  //顯個(gè)位位
  86.         delay(40);                //顯個(gè)位段
  87.         LED3=1;                  //百關(guān)閉個(gè)位顯示
  88.         delay(2);               //百關(guān)閉個(gè)位顯示延時(shí)
  89. }

  90. void timeToBuffer()                                    //轉(zhuǎn)換段碼功能模塊
  91. {
  92.         if (jsz>zzz)                //測(cè)量值大于測(cè)量上限時(shí)顯示“CCC”
  93.         {
  94.                 buffer[0]=0x93;                //顯示 C
  95.                 buffer[1]=0x93;                        //顯示 C
  96.                 buffer[2]=0x93;                        //顯示 C
  97.         }
  98.         else if (jsz<mq)           //測(cè)量值小于測(cè)量下限時(shí)顯示“CCC"
  99.         {
  100.                 buffer[0]=0xFE;               //顯示 -
  101.                 buffer[1]=0xFE;        //顯示 -
  102.                 buffer[2]=0xFE;        //顯示 -
  103.         }
  104.         else
  105.         {
  106.                 xm0=jsz/100;            //計(jì)算百位值              
  107.                 xm1=(jsz-xm0*100)/10;   //計(jì)算十位值
  108.                 xm2=jsz-xm0*100-xm1*10; //計(jì)算個(gè)位值
  109.                 buffer[0]=convert[xm2];        //進(jìn)行個(gè)位顯示段碼轉(zhuǎn)換
  110.                 buffer[1]=convert[xm1]; //進(jìn)行十位顯示段碼轉(zhuǎn)換
  111.                 buffer[2]=convert[xm0]; //進(jìn)行百位顯示段碼轉(zhuǎn)換
  112.                 if (buffer[2]==0x81)    //判斷百位是否為零
  113.                 {
  114.                         buffer[2]=0xFF;     //百位為零時(shí)不顯示                 
  115.                 }
  116.         }
  117. }


  118. void csbcj()                                        //超聲波測(cè)距程序
  119. {
  120.         TR0=0;                  //停止定時(shí)器1工作
  121.         TH1=0x00;                                //計(jì)時(shí)器1清零
  122.         TL1=0x00;               //計(jì)時(shí)器1清零
  123.         csbint=1;               //置單片機(jī)超聲波接收口高高電平
  124.         sx=0;                   //停止報(bào)警聲響
  125.         delay(1700);            //進(jìn)行延時(shí)
  126.         csbfs();                //調(diào)用超聲波發(fā)送子程序:CSBFS.ASM
  127.         csbout=1;               //置單片機(jī)超聲波輸出端口P2.7為高電平
  128.         TR1=1;                                        //超聲波發(fā)頭發(fā)送完超聲波后,啟動(dòng)定時(shí)器1進(jìn)行計(jì)時(shí)                        
  129.         i=250;                            //盲區(qū)處理系數(shù)                        
  130.         while(i--)              //盲區(qū)延時(shí)處理
  131.         {
  132.         }
  133.         i=0;
  134.         while(csbint)                        //進(jìn)行超聲波回波判斷,判斷接收回路是否收到超聲波的回波,接收到回波時(shí),csbint=0
  135.         {
  136.                 i++;
  137.                 if(i>=3300)         //規(guī)定時(shí)間沒(méi)收到回波時(shí)退出判斷處理程序                        
  138.                 csbint=0;           //規(guī)定時(shí)間內(nèi)接收到回波時(shí),置csbint=0
  139.         }
  140.         TR1=0;                  //停止計(jì)時(shí)器1計(jì)時(shí)
  141.         t=TH1;                                        //提取計(jì)時(shí)器記錄的高8位值
  142.         t=t*256+TL1;            //計(jì)算計(jì)時(shí)的總時(shí)間
  143.         TR0=1;                  //恢復(fù)定時(shí)器0工作
  144.         csbint=1;               //超聲波接收端置高電平,這下次測(cè)量做準(zhǔn)備
  145.         jsz=t*csbc;                                //計(jì)算測(cè)量結(jié)果
  146.         jsz=jsz/2;              //計(jì)算測(cè)量結(jié)果
  147. }
  148.         
  149. void bgcl()                 //報(bào)警處理繼電器動(dòng)作判斷程序
  150. {
  151.         if (jsz<dz)             //測(cè)量值低于設(shè)定的報(bào)警值,繼電器吸合
  152.         {
  153.                 bjh=0;              //繼電器吸合
  154.         }
  155.         else
  156.         {
  157.                 bjh=1;                                //繼電器斷開(kāi)
  158.         }                        
  159. }


  160. void offmsd()                                                            //百位為數(shù)0判斷模塊
  161. {
  162.     if (buffer[2]==0x81)                                      //如果值為零時(shí)百位不顯示
  163.     buffer[2] = 0xff;
  164. }
復(fù)制代碼

所有資料51hei提供下載:
超聲波.7z (27.31 KB, 下載次數(shù): 69)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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