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

QQ登錄

只需一步,快速開始

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

我的倒車?yán)走_(dá),超聲波測(cè)距(含源碼,工程圖)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
倒車?yán)走_(dá),超聲波測(cè)速。
內(nèi)喊源碼和工程圖,通俗易懂。


所有資料下載:
超聲波帶報(bào)警 原理圖PCB圖.doc (61.5 KB, 下載次數(shù): 58)
程序.doc (41.5 KB, 下載次數(shù): 42)

下面是部分程序預(yù)覽:
  1. #include<reg51.h>
  2. #include<math.h>
  3. /*定義數(shù)據(jù)類型*/
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. /*定義系統(tǒng)常數(shù)*/
  7. long int  time;      /*    時(shí)間   */
  8. bit   CLflag;   /*  測(cè)量標(biāo)志  */
  9. char  cshu;       /* 串?dāng)?shù) */
  10. #define  T12us   (256-12)    /*定時(shí)器設(shè)初值   T=(256-T12us)*12/12MHZ  */
  11. sbit VOLCK=P1^0;    /* 發(fā)射 */
  12. //接收從P3^2口輸入,采用外部中斷方式

  13. sbit S1=P2^1;
  14. sbit S2=P2^3;
  15. sbit S3=P2^5;
  16. sbit S4=P2^7;

  17. sbit alam=P3^7;                                        //報(bào)警

  18. unsigned char  number[5];      /* 用于存放距離顯示數(shù)據(jù) */
  19. unsigned char  temp_number[5];

  20. unsigned char fr_alam;      //報(bào)警頻率控制計(jì)數(shù)
  21. unsigned char icont;                //距離計(jì)數(shù)

  22. char  code table[] ={0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x45,0xDF,0xD7}; //數(shù)字0-9的編碼
  23. //{0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};
  24.                 /* 碼表 0,1,2,3,4,5,6,7,8,9 */


  25. /*    通用延時(shí)子程序  */
  26. void delay( int j)
  27. {   
  28.         int i;   
  29.         for(i=0;i<j;i++);
  30. }

  31. void display(void)     /*  顯示5位數(shù)據(jù)   */
  32. {        
  33.         P0=~table[number[4]];
  34.         S1=0;
  35.         delay(200);
  36.         S1=1;
  37.         P0=~(table[number[3]]|0x20);
  38.         S2=0;
  39.         delay(200);
  40.         S2=1;
  41.         P0=~table[number[2]];
  42.         S3=0;
  43.         delay(200);
  44.         S3=1;
  45.         P0=~table[number[1]];
  46.         S4=0;
  47.         delay(200);
  48.         S4=1;
  49. }

  50. /*  初始化定時(shí)器,CTC0、CTC1用于定時(shí)     */
  51. void   init_CTC(void )
  52. {
  53.         TMOD = 0x21;      /*  設(shè)CTC1工作于模式2 */
  54.         ET0 = 0;              /* 不允許CTC0中斷  */
  55. }

  56. void init_INT( )    /*  外部中斷初始化為高優(yōu)先級(jí),并開中斷  */
  57. {
  58.         IP=0x01;   /*  置外部中斷INT0優(yōu)先級(jí)為高   */
  59.         TCON=0;   /*  設(shè)置外部中斷0的中斷方式為電平觸發(fā)  */
  60. }


  61. //=========距離與頻率之間的轉(zhuǎn)化==============
  62. void Distance_Frequency(void)
  63. {
  64.         //以下語句用于計(jì)算距離與報(bào)警的頻率大小
  65.         if(number[3]>0)                //表示距離大于1米時(shí),不報(bào)警
  66.                 icont=0;
  67.         else                                //否則
  68.         {
  69.                 if(number[2]>0)                //小于1米時(shí),但分米大于0時(shí),報(bào)警頻率與分米的數(shù)據(jù)成正比
  70.                 {
  71.                     switch(number[2])
  72.                         {
  73.                                 case 9: icont=9; break;
  74.                                 case 8: icont=8; break;
  75.                                 case 7: icont=7; break;
  76.                                 case 6: icont=6; break;
  77.                                 case 5: icont=5; break;
  78.                                 case 4: icont=4; break;
  79.                                 case 3: icont=3; break;
  80.                                 case 2: icont=2; break;
  81.                                 case 1: icont=1; break;
  82.                                 default: break;
  83.                         }
  84.                 }
  85.                 else                                         //距離只在厘米時(shí),高頻率輸出報(bào)警
  86.                 {
  87.                         if(number[1]>0)
  88.                                 icont=1;
  89.                         else
  90.                                 icont=0;
  91.                 }
  92.         }
  93. }

  94. void Timetojuli(void)   /*   將測(cè)量的時(shí)間轉(zhuǎn)換為距離 */
  95. {
  96.         long  i;
  97.         i=(long)time*170;
  98.         temp_number[4]=i/10000000;     /* 十米  */
  99.         i=i-temp_number[4]*10000000;
  100.         temp_number[3]=i/1000000;   /*  米  */
  101.         i=i-temp_number[3]*1000000;
  102.         temp_number[2]=i/100000;    /*  分米  */
  103.         i=i-temp_number[2]*100000;
  104.         temp_number[1]=i/10000;     /*  厘米  */
  105.         i=i-(long)temp_number[1]*10000;
  106.         temp_number[0]=i/1000;     /*  毫米  */
  107.         //以下用于控制是否測(cè)到距離,如全為0,表明沒有測(cè)到距離
  108.         if((temp_number[4]!=0)||(temp_number[3]!=0)||(temp_number[2]!=0)||(temp_number[1]!=0))  
  109.         {
  110.                 number[4]=temp_number[4];   //更新一次數(shù)據(jù)
  111.                 number[3]=temp_number[3];
  112.                 number[2]=temp_number[2];
  113.                 number[1]=temp_number[1];
  114.                 number[0]=temp_number[0];

  115.                 Distance_Frequency();                //轉(zhuǎn)化一次
  116.         }
  117. }


  118. void serve_INT0( ) interrupt 0
  119. {
  120.         /*  外部中斷0,用于檢測(cè)接收信號(hào)  */
  121.         TR0=0;       /*  關(guān)閉定時(shí)器0 */
  122.         EX0=0;       /* 關(guān)中斷  */
  123.         time=(long)TL0;
  124.         time+=(long)TH0*256;
  125.         Timetojuli();                                        //更新一次數(shù)據(jù)
  126.         CLflag=1;
  127.         TH0=0;
  128.         TL0=0;
  129. }

  130. void CTC0_INT (  )   interrupt  1
  131. {
  132.         TR0=0;
  133.         ET0=0;
  134. }


  135. /*  CTC1中斷服務(wù)程序,12.5us 中斷一次,用于發(fā)射  */
  136. void CTC1_INT (  )   interrupt  3
  137. {
  138.         VOLCK=~VOLCK;
  139.         cshu++;
  140. }



  141. /*主程序*/
  142. void main()
  143. {
  144.         init_CTC(  );                      /*   初始化定時(shí)器 */
  145.         init_INT(  );                      /* 初始化外部中斷  */
  146.         CLflag=1;                         /*    測(cè)量標(biāo)志    */
  147.         cshu=0;                          /*  傳數(shù) */
  148.         IE=0x80;                           /* 開中斷  */
  149.         ET1=1;       ET0=1;
  150.         TR1=0;       TR0=0;
  151.         TL1=T12us;   TH1=T12us;
  152.         while(1)
  153.         {       
  154.                 CLflag=0;
  155.                 cshu=0;
  156.                 EX0=0;
  157.                 TH1=T12us;
  158.                 TL1=T12us;
  159.                 TL0 = 0;     TH0 = 0;            /*  定時(shí)器0的初始時(shí)間 */
  160.                 VOLCK=0;
  161.                 TR1=1;                                        /*  啟動(dòng)定時(shí)器1,發(fā)送信號(hào)  */
  162.                 while(cshu<20) ;                    /*  發(fā)10個(gè)脈沖串 */                        
  163.                 TR1=0;
  164.                 TR0=1;                                   /*  啟動(dòng)定時(shí)器0,開始記時(shí)  */
  165.                 EX0=1;
  166.                 display();                                        //調(diào)用顯示
  167.         //        Distance_Frequency();                //調(diào)用距離頻率轉(zhuǎn)化程序
  168.                 fr_alam++;                                        //程序執(zhí)行次數(shù)加1        用于控制報(bào)警頻率與距離成正比
  169.                 if(icont>0)                                        //表示距離控制位達(dá)到報(bào)警時(shí)
  170.                 {
  171.                         if(fr_alam>=icont)               
  172.                         {
  173.                                 fr_alam=0;
  174.                                 alam=~alam;                        //蜂鳴器取反一次,即響一聲
  175.                         }
  176.                 }
  177.                 else                                                //不報(bào)警時(shí)
  178.                 {
  179.                         alam=1;
  180.                 }
  181.         }
  182. }

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

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:233124 發(fā)表于 2017-9-21 11:34 | 只看該作者
沒有仿真的原理圖呀
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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