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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1672|回復: 0
收起左側

超聲波測距顯示程序

[復制鏈接]
ID:357101 發表于 2018-6-23 10:47 | 顯示全部樓層 |閱讀模式
超聲波測距顯示程序
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include <math.h>
  4. /************************************宏定義************************************/
  5. #define VELOCITY_30C        3495       //30攝氏度時的聲速,聲速V= 331.5 + 0.6*溫度;
  6. #define VELOCITY_23C        3453       //23攝氏度時的聲速,聲速V= 331.5 + 0.6*溫度;
  7. #define uchar unsigned char
  8. #define uint unsigned int
  9. /************************************位定義************************************/
  10. sbit LED = P1^4;                                                                 //危險距離指示燈
  11. sbit rs    = P3^5;                                                         //LCD顯示器重置端
  12. sbit lcden = P3^4;                                                         //LCD顯示器使能端
  13. sbit INPUT  = P3^6;              //回聲接收端口  echo
  14. sbit OUTPUT = P3^7;              //超聲觸發端口trig
  15. sbit ds = P1^0;                                                                         //溫度傳感器通訊
  16. sbit Ztai=P1^1;                                                                         //電機運行狀態傳輸通道1 U5,P2.5
  17. sbit Cju=P1^2;                                                                         //測距狀態傳輸通道2 U5,P2.4
  18. sbit warn=P1^3;                                                                         //連接至U5 P3.2 INT_0
  19. /********************************定義變量和數組********************************/
  20. uchar table1[]="There's no echo.";
  21. uchar table2[]="system online^_^";
  22. uchar table3[]="Distance:";
  23. uchar count;
  24. long int distance=0;                                      //距離變量
  25. uint Di;                                                                                                 //報警距離
  26. /***********************************函數聲明***********************************/
  27. extern void initLCD();
  28. extern void write_date(uchar date);
  29. extern void write_com(uchar com);
  30. extern void delay(uint x);
  31. /******************************************************************************/

  32. void delay(uint x)
  33. {
  34.         uint a,b;
  35.         for(a = x;a > 0;a--)
  36.     {
  37.                 for(b = 10;b > 0;b--)
  38.         {
  39.             ;
  40.         }
  41.     }
  42. }
  43. void delayt(uint x)
  44. {
  45.     uchar j;
  46.     while(x-- > 0)
  47.     {
  48.               for(j = 0;j < 125;j++)
  49.         {
  50.             ;
  51.         }
  52.     }
  53. }
  54. void write_com(uchar com)
  55. {
  56.         P2 = com;
  57.         rs = 0;
  58.         lcden = 0;
  59.         delay(10);
  60.         lcden = 1;
  61.         delay(10);
  62.         lcden = 0;       
  63. }
  64. void write_date(uchar date)
  65. {
  66.         P2 = date;
  67.         rs = 1;
  68.         lcden = 0;
  69.         delay(10);
  70.         lcden = 1;
  71.         delay(10);
  72.         lcden = 0;       
  73. }
  74. void writeString(uchar * str, uchar length)
  75. {
  76.      uchar i;
  77.     for(i = 0; i < length; i++)
  78.     {
  79.          write_date(str[i]);
  80.      }
  81. }
  82. void initLCD(void)
  83. {
  84.         write_com(0x38);
  85.         delay(20);
  86.         write_com(0x0f);
  87.         delay(20);
  88.         write_com(0x06);
  89.         delay(20);
  90.         write_com(0x01);
  91.         delay(20);       
  92. }
  93. /*********溫度傳感器**************/
  94. void dsInit()
  95. {
  96.    
  97.     unsigned int i;  
  98.     ds = 0;
  99.     i = 100;  
  100.      while(i>0) i--;
  101.     ds = 1;   
  102.     i = 4;
  103.      while(i>0) i--;
  104. }
  105. void dsWait()
  106. {
  107.       unsigned int i;
  108.       while(ds);  
  109.       while(~ds);
  110.       i = 4;
  111.       while(i > 0) i--;
  112. }
  113. bit readBit()
  114. {
  115.     unsigned int i;
  116.     bit b;
  117.     ds = 0;
  118.     i++;   
  119.     ds = 1;
  120.     i++; i++;  
  121.     b = ds;
  122.     i = 8;
  123.     while(i>0) i--;
  124.     return b;
  125. }
  126. unsigned char readByte()
  127. {
  128.     unsigned int i;
  129.     unsigned char j, dat;
  130.    dat = 0;
  131.     for(i=0; i<8; i++)
  132.     {
  133.         j = readBit();
  134.       
  135.         dat = (j << 7) | (dat >> 1);
  136.     }
  137.     return dat;
  138. }
  139. void writeByte(unsigned char dat)
  140. {
  141.     unsigned int i;
  142.     unsigned char j;
  143.     bit b;
  144.     for(j = 0; j < 8; j++)
  145.     {
  146.         b = dat & 0x01;
  147.         dat >>= 1;
  148.    
  149.         if(b)   
  150.         {
  151.            ds = 0;          i++; i++;  
  152.             ds = 1;   
  153.             i = 8; while(i>0) i--;  
  154.         }
  155.         else  
  156.         {
  157.             ds = 0;
  158.           i = 8; while(i>0) i--;  
  159.             ds = 1;
  160.            i++; i++;
  161.         }
  162.    }
  163. }
  164. void sendChangeCmd() //發出改變指令
  165. {
  166.     dsInit();   
  167.     dsWait();   
  168.     delayt(1);   
  169.     writeByte(0xcc);
  170.     writeByte(0x44);
  171. }

  172. void sendReadCmd()         //發出讀取指令
  173. {
  174.     dsInit();
  175.     dsWait();
  176.     delayt(1);
  177.     writeByte(0xcc);
  178.     writeByte(0xbe);
  179. }
  180. int getTmpValue()
  181. {
  182.     unsigned int tmpvalue;
  183.     int value;
  184.     float t;
  185.     unsigned char low, high;
  186.     sendReadCmd();
  187.    
  188.     low = readByte();
  189.     high = readByte();
  190.    
  191.     tmpvalue = high;
  192.     tmpvalue <<= 8;
  193.     tmpvalue |= low;
  194.     value = tmpvalue;
  195.     t = value * 0.0625;
  196.     value = t * 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0減0.5
  197.     return value;
  198. }
  199. void display1(int v)
  200. {
  201.     unsigned char Count;
  202.     unsigned char datas[] = {0, 0, 0, 0, 0};
  203.     unsigned int tmp = abs(v);
  204.     datas[0] = tmp / 10000;
  205.     datas[1] = tmp % 10000 / 1000;
  206.     datas[2] = tmp % 1000 / 100;
  207.     datas[3] = tmp % 100 / 10;
  208.     datas[4] = tmp % 10;
  209.     write_com(0xc0);
  210.     if(v < 0)
  211.     {
  212.         writeString("- ", 2);
  213.     }
  214.     else
  215.     {
  216.        writeString("+ ", 2);
  217.     }
  218.     if(datas[0] != 0)
  219.     {
  220.         write_date('0'+datas[0]);
  221.     }
  222.     for(Count = 1; Count != 5; Count++)
  223.     {
  224.         write_date('0'+datas[Count]);
  225.         if(Count == 2)
  226.         {
  227.             write_date('.');
  228.         }
  229.     }
  230.                 write_date('A'+2);           //"c"的ASCII
  231. }
  232. /*********************************/
  233. void Init_MCU(void)
  234. {
  235.         TMOD=0x11;          //定時器0,1初始化,設置為16位自動重裝模式
  236.         TL0=0x66;
  237.         TH0=0xfc;            //1ms
  238.         EA=1;                                        //總中斷使能
  239.   ET0=1;              //開定時器0
  240. }
  241. void Init_Parameter(void)                                                                                  //I/O口初始化
  242. {
  243.          OUTPUT =1;
  244.          INPUT = 1;
  245.          count = 0;
  246.          distance = 0;
  247. }
  248. void display_char(uchar *point,uchar address) //顯示字符串函數,寫入的字符串的地址指針 1602顯示對應的地址   
  249. {
  250.         uchar i;
  251.         write_com(0x80 + address);
  252.         for(i = 0;i < 16; i++)
  253.         {
  254.                 write_date(*point);
  255.                 point++;
  256.         }
  257. }
  258. void display(int number,uchar address)                                //顯示數字,number寫入的數據,address地址
  259. {
  260.         uchar b,c,d,e;
  261.         b= (number / 1000);
  262.         c= (number / 100) % 10;
  263.         d= (number / 10) % 10;
  264.         e= number % 10;
  265.         Di=b*100+c*10+d;          //獲得警報距離
  266.        
  267.         write_com(0x80 + address);
  268.   write_date(b + 48);
  269.         write_date(c + 48);
  270.         write_date(d + 48);
  271.         write_date(46);           //小數點的ASCII
  272.         write_date(e + 48);
  273.   write_date(99);           //"c"的ASCII
  274.         write_date(109);          //"m"的ASCII
  275.         if(Di<20) //發出警報
  276.         {
  277.                 if(Di==0)//提示為假警報
  278.                 {
  279.                         LED=1;
  280.                         warn=1;
  281.                         Cju=1;        //關閉中斷控制
  282.                 }
  283.                 if(Di!=0)
  284.                 {
  285.                         LED=0;
  286.                         warn=0; //開啟中斷控制
  287.                         Cju=0;
  288.                 }
  289.         }
  290.         if(Di>=20)
  291.         {       
  292.                 LED=1;
  293.                 warn=1;
  294.                 Cju=1;        //關閉中斷控制
  295.         }
  296. }
  297. void Trig_SuperSonic(void)                                                                                //發出聲波
  298. {
  299.          OUTPUT = 1;
  300.          delayt(1);
  301.          OUTPUT = 0;
  302. }
  303. void Measure_Distance(void)
  304. {
  305.         uchar l;
  306.         uint h,y;
  307.         TR0 = 1;
  308.         while(INPUT)
  309.     {
  310.         ;
  311.     }       
  312.         TR0 = 0;
  313.         l = TL0;
  314.         h = TH0;
  315.         y = (h << 8) + l;
  316.         y = y - 0xfc66;//us部分
  317.         distance = y + 1000 * count;//計算總時間
  318.         TL0 = 0x66;
  319.         TH0 = 0xfc;
  320.         delayt(30);
  321.         distance = VELOCITY_30C * distance / 20000; //單位是cm
  322. }
  323. void main(void)
  324. {
  325.         initLCD();
  326.         Init_MCU();
  327.         Init_Parameter();
  328.         display_char(table2,0x00);
  329.         sendChangeCmd();
  330.         delayt(1000); //溫度轉換時間需要750ms以上
  331.   write_com(0xc0);
  332.   display1(getTmpValue());
  333.         while(1)
  334.         {
  335.                 //電機運轉的時候不測距
  336.                 if(Ztai==1)
  337.                 {
  338.                         Trig_SuperSonic();         //觸發超聲波發射
  339.                         while(INPUT == 0)          //等待回聲
  340.                         {
  341.                                 ;
  342.                         }
  343.                         Measure_Distance();        //計算脈寬并轉換為距離
  344.                         display(distance,0x49);    //顯示距離
  345.                         Init_Parameter();          //參數重新初始化
  346.                         delayt(100);               //延時,兩次發射之間要至少有10ms間隔
  347.                 }
  348.                 if(Ztai==0)
  349.                 {                                       
  350.                         ;
  351.                 }
  352.         }
  353. }
  354. /********************************中斷程序*****************************************/
  355. void Timer0 (void) interrupt 1                                                                 //回收超聲波回聲
  356. {
  357.         TF0 = 0;
  358.         TL0 = 0x66;
  359.         TH0 = 0xfc;
  360.         count++;
  361.         if(count == 18)//超聲波回聲脈寬最多18ms
  362.         {
  363.                 TR0 =0;
  364.                 TL0 = 0x66;
  365.                 TH0 = 0xfc;
  366.                 count = 0;
  367.         }
  368. }
復制代碼


超聲波測距顯示.zip

60.31 KB, 下載次數: 4, 下載積分: 黑幣 -5

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久久影院8一贰佰 | 观看av| 久久精品亚洲国产奇米99 | 国产精品欧美一区二区 | 韩国欧洲一级毛片 | 成人精品鲁一区一区二区 | 日韩有码在线观看 | 欧美三区| 国产精品视频久久 | 成人在线黄色 | 好姑娘高清在线观看电影 | 成人av鲁丝片一区二区小说 | 久久精品 | 久久99精品久久久久蜜桃tv | 成人午夜网站 | 国产小u女发育末成年 | 午夜视频在线免费观看 | 麻豆国产一区二区三区四区 | 亚洲精品中文在线 | 一区二区三区欧美在线观看 | 美女久久久久久久 | 精品av| 91色啪 | 欧美毛片免费观看 | 日本成人中文字幕 | 成人深夜小视频 | 91亚洲国产成人久久精品网站 | 亚洲欧洲精品在线 | 色五月激情五月 | 亚洲一区亚洲二区 | 欧美日韩一区在线 | 亚洲精品自在在线观看 | 国产黄色网址在线观看 | 国产高清视频在线 | 久久国产视频一区 | 国产一区二区三区高清 | 久久夜视频| 久久这里只有精品首页 | 色偷偷噜噜噜亚洲男人 | 黄色一级电影免费观看 | 日韩一区二区在线看 |