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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機(jī)超聲波測距倒車?yán)走_(dá)Proteus仿真+源代碼

  [復(fù)制鏈接]
ID:367685 發(fā)表于 2020-11-22 09:25 | 顯示全部樓層 |閱讀模式
1) 基本任務(wù)
(1) 當(dāng)車距(HC-SR04 超聲波測距的位置)離障礙物小于 1 米,報警器響起, 發(fā)出一定
頻率的“滴滴” 聲音, 報警指示燈閃爍。
(2) LCD1602 液晶屏顯示超聲波模塊安裝位置與障礙物之間的距離。
2) 擴(kuò)展任務(wù):
(1) 隨著車距與障礙物的距離的縮小,報警器聲音越來越尖銳急促(聲音頻率越來越高)。
(2) 隨著車距與障礙物的距離的縮小, 報警指示燈閃爍頻率增加。
(3) 按鍵調(diào)整報警門限距離, 當(dāng)車距離障礙物小于該值(默認(rèn)值為 1 米),聲音報警。
(4) LCD1602 第一行顯示超聲波模塊安裝位置與障礙物之間的距離;第二行實時顯示按
鍵所調(diào)整的報警門限距離。  

倒車?yán)走_(dá)仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
91ddfc666990f6c4225837a76f00884f.png 51hei.png
倒車?yán)走_(dá)的單片機(jī)源程序如下:
  1. #include <REGX52.H>
  2. #include <stdio.h>
  3. #include "LCD.H"
  4. #include "delay.h"
  5. #define  uint unsigned int
  6. #define  uchar unsigned char        
  7.         
  8. //定義引腳
  9. sbit k1=P3^5;
  10. sbit k2=P3^6;
  11. sbit Trig=P2^5;   //trig 發(fā)射脈沖
  12. sbit Echo=P3^2;  //echo 接受脈沖
  13. sbit bg=P2^6;
  14. sbit beep=P3^3;  //beep
  15. sbit led=P1^2;
  16. //定義固定顯示
  17. uchar juli[5]={'A','.','A','A','m'};
  18. uchar set_juli[]={'A','.','A','A','m'};
  19. uchar zifu[]={'D','i','s',':'};           //Distance
  20. //定義全局變量
  21. uchar time0_flag=0;  //定時器溢出中斷
  22. uint time=0;        //定時器定時時間
  23. uchar one_final=0;   //一次測量完成
  24. uint distance=0.0,set_dis=100;   //距離和設(shè)定報警距離

  25. void display();
  26. void Trig_SR04();
  27. void button_choose();
  28. void judge_baojing();
  29. void main()
  30. {
  31.         
  32.         EA=1;       //外部中斷0下降沿觸發(fā)  定時器0加門控位 高電平開啟
  33.         TMOD=0x09;  //16位 TR0=1; INT0=1; 開啟
  34.         TR0=1;
  35.         EX0=1;
  36.         IT0=1;      //下降沿觸發(fā)
  37.         
  38.         TH0=0;
  39.         TL0=0;
  40.         init();     //1602初始化        
  41.         Trig_SR04();
  42.         while(1)
  43.         {
  44.                 if(one_final)   //一次完成后再次觸發(fā)
  45.                 {
  46.                         Trig_SR04();
  47.                         one_final=0;
  48.                 }
  49.                 judge_baojing();
  50.                 display();    //液晶顯示
  51.                 button_choose();  //按鍵調(diào)整
  52.         }
  53. }

  54. void INT0_hander() interrupt 0
  55. {
  56.         time = TH0*256+TH0;    //  time us
  57.         distance=time*0.0170;  //cm    34000cm*10e-6*time/2
  58.         one_final=1;
  59.         TH0=0;
  60.         TL0=0;
  61. }

  62. void Trig_SR04()  //仿真里是地脈沖觸發(fā)
  63. {
  64.         Trig=0;
  65.         Trig=1;
  66.         _nop_();
  67.         _nop_();
  68.         _nop_();
  69.         _nop_();
  70.         _nop_();
  71.         _nop_();
  72.         _nop_();
  73.         _nop_();
  74.         _nop_();
  75.         _nop_();
  76.         _nop_();
  77.         _nop_();
  78.         _nop_();
  79.         _nop_();
  80.         _nop_();
  81.         _nop_();
  82.         _nop_();
  83.         _nop_();
  84.         _nop_();
  85.         _nop_();
  86.         _nop_();
  87.         Trig=0;
  88. }


  89. void judge_baojing()
  90. {
  91.         uint time_baojing,i;
  92.         if(distance<set_dis)
  93.         {
  94.                         time_baojing=distance*10;
  95.                           for (i=0;i<time_baojing;i++)
  96.                           {
  97.                             DelayUs2x(100);
  98.                             beep=!beep;       //BEEP取反
  99.                           }
  100.                                 for (i=0;i<time_baojing;i++)
  101.                           {
  102.                                         led=~led;
  103.                                         DelayUs2x(time_baojing);
  104.                           }
  105.         }
  106. }
  107. void display()
  108. {
  109.         if(distance<5) //測量值小于下限
  110.                 {
  111.                         juli[0]='-';
  112.                         juli[2]='-';
  113.                         juli[3]='-';
  114.                 }
  115.         else if(distance>500)        //測量值大于上限
  116.                 {
  117.                         juli[0]='C';
  118.                         juli[2]='C';
  119.                         juli[3]='C';
  120.                 }
  121.         else
  122.         {
  123.                 juli[0]=distance/100+'0';
  124.                 juli[2]=distance/10%10+'0';
  125.                 juli[3]=distance%10+'0';
  126.         }
  127.         set_juli[0]=set_dis/100+'0';
  128.         set_juli[2]=set_dis/10%10+'0';
  129.         set_juli[3]=set_dis%10+'0';
  130.         
  131.         LCD_Write_String(11,0,juli);  //顯示測距
  132.         LCD_Write_String(5,0,zifu);   //顯示distance
  133.         LCD_Write_String(11,1,set_juli); //顯示報警距離
  134. }


  135. void button_choose()
  136. {
  137.         uint k,e,xs;   //e 控制個性化顯示 xs顯示周期
  138.         uchar a1,a2,a3,n=0,m=0,z=0;   //按鍵調(diào)整 a1,a2,a3調(diào)整設(shè)定距離的三位從高到低  nmz控制循環(huán)
  139.                 if(!k1)      //按鍵處理程序
  140.                 {
  141.                         EA=0;
  142.                         TR0=0;
  143.                   set_juli[0]='A';
  144.                         set_juli[1]='.';
  145.                         set_juli[2]='A';
  146.                         set_juli[3]='A';
  147.                         set_juli[4]='m';
  148.                         LCD_Write_String(11,1,set_juli);
  149.                         k=500;
  150.                   while(k)
  151.                         {
  152.                                  k--;
  153.                                 DelayMs(2);
  154.                         }
  155.                   set_juli[0]=set_dis/100+'0';
  156.                         set_juli[2]=set_dis/10%10+'0';
  157.                         set_juli[3]=set_dis%10+'0';
  158.                         LCD_Write_String(11,1,set_juli);
  159.                         a1=set_dis/100;
  160.                         a2=set_dis/10%10;
  161.                         a3=set_dis%10;
  162.                         
  163.                         
  164.                         //按鍵調(diào)整最小距離
  165.                         n=1;
  166.                   while(n)
  167.                         {
  168.                                 if(!k2)
  169.                                 {
  170.                                         while(!k2);
  171.                                         e=1;
  172.                                         xs=3;
  173.                                         a1+=1;
  174.                                         if(a1>5)
  175.                                         a1=0;
  176.                                           juli[0]=a1+'0';
  177.                                 }

  178.                                 if (e==1)
  179.                                 {
  180.                                         xs++;
  181.                                            juli[0]=a1+'0';
  182.                                           if(xs>6)
  183.                                           {
  184.                                     xs=0;
  185.                                                                         e=0;
  186.                                           }
  187.                                 }
  188.                                 else
  189.                                 {
  190.                                         juli[0]=' ';
  191.                                         xs++;
  192.                                         if(xs>3)
  193.                                         {
  194.                                                 xs=0;
  195.                                                 e=1;
  196.                                         }
  197.                                 }
  198.                                 LCD_Write_String(11,1,juli);
  199.                                 if(!k1)
  200.                                 {
  201.                                         while(!k1);
  202.                                            juli[0]=a1+'0';
  203.                                         m=1;
  204.                                         while(m)
  205.                                         {
  206.                                                 if(!k2)
  207.                                                 {
  208.                                                         while(!k2);
  209.                                                         e=1;
  210.                                                         xs=3;
  211.                                                         a2+=1;
  212.                                                         if(a2>9)
  213.                                                         a2=0;
  214.                                                           juli[2]=a2+'0';
  215.                                                         LCD_Write_String(11,1,juli);
  216.                                                 }

  217.                                                 if (e==1)
  218.                                                 {
  219.                                                         xs++;
  220.                                                            juli[2]=a2+'0';
  221.                                                           if(xs>6)
  222.                                                           {
  223.                                                     xs=0;
  224.                                                                                         e=0;
  225.                                                           }
  226.                                                 }
  227.                                                 else
  228.                                                 {
  229.                                                         juli[2]=' ';
  230.                                                         xs++;
  231.                                                         if(xs>3)
  232.                                                         {
  233.                                                                 xs=0;
  234.                                                                 e=1;
  235.                                                         }
  236.                                                 }
  237.                                                 LCD_Write_String(11,1,juli);
  238.                                                 
  239.                                                 if(!k1)
  240.                                                 {
  241.                                                         while(!k1);
  242.                                                         juli[2]=a2+'0';
  243.                                                         z=1;
  244.                                                         while(z)
  245.                                                         {
  246.                                                                 if(!k2)
  247.                                                                 {
  248.                                                                         while(!k2);
  249.                                                                         e=1;
  250.                                                                         xs=3;
  251.                                                                         a3+=1;
  252.                                                                         if(a3>9)
  253.                                                   a3=0;
  254.                                                                   juli[3]=a3+'0';
  255.                                                                         LCD_Write_String(11,1,juli);
  256.                                                                 }

  257.                                                                 if (e==1)
  258.                                                                 {
  259.                                                                         xs++;
  260.                                                                            juli[3]=a3+'0';
  261.                                                                           if(xs>6)
  262.                                                                           {
  263.                                                     xs=0;
  264. ……………………

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

附件如下:帶仿真和keil源碼 51超聲波測距報警.zip (113.86 KB, 下載次數(shù): 382)

評分

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

查看全部評分

回復(fù)

使用道具 舉報

ID:328014 發(fā)表于 2020-11-22 16:17 | 顯示全部樓層
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報

ID:935889 發(fā)表于 2021-6-12 15:19 | 顯示全部樓層
樓主,仿真沒有反應(yīng)
回復(fù)

使用道具 舉報

ID:328014 發(fā)表于 2021-6-12 16:07 | 顯示全部樓層
GEYI123546 發(fā)表于 2021-6-12 15:19
樓主,仿真沒有反應(yīng)

用Proteus7.5打開才有反應(yīng),如圖
51hei.gif
回復(fù)

使用道具 舉報

ID:648123 發(fā)表于 2021-10-16 22:51 | 顯示全部樓層
你好,請問為什么我把顯示的位置改成第一行0位后就出現(xiàn)了這種情況?
E6E45CF41617F9ED8669BE19F8E69F8B.jpg
回復(fù)

使用道具 舉報

ID:982171 發(fā)表于 2021-11-19 00:24 來自手機(jī) | 顯示全部樓層
那超聲波測距和測速的原理圖是不是一樣的呢
回復(fù)

使用道具 舉報

ID:965040 發(fā)表于 2023-11-6 15:51 | 顯示全部樓層
proteus 8 打開沒有顯示,改天換個版本試下吧
回復(fù)

使用道具 舉報

ID:1124222 發(fā)表于 2024-6-7 16:16 | 顯示全部樓層
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区欧美 | 亚洲精品乱码久久久久v最新版 | 久久夜视频 | 亚洲精品乱码久久久久久蜜桃91 | 欧美h视频| 激情毛片| 国产露脸国语对白在线 | 欧美一级久久久猛烈a大片 日韩av免费在线观看 | 毛片视频观看 | 国产一区欧美 | 亚洲 一区| 成人一区二区三区在线观看 | 一级片子 | 国产高清在线观看 | 成年人在线视频 | 在线成人 | 欧美一页| 懂色中文一区二区在线播放 | 午夜99 | 亚洲国产成人久久久 | 国产在线精品免费 | 欧美.com | 欧美一级欧美三级在线观看 | 欧美精品乱码久久久久久按摩 | 国产最新视频在线 | 极品的亚洲 | 黄色av网站在线观看 | 欧美一区二区三区在线看 | www.色综合| 一级中国毛片 | 日韩毛片免费看 | 亚洲精品www久久久久久广东 | 国产亚洲精品综合一区 | 台湾av在线 | 在线成人www免费观看视频 | 在线成人精品视频 | 国产一级毛片精品完整视频版 | 午夜天堂精品久久久久 | 91久久精品日日躁夜夜躁欧美 | 国产一区二区三区视频 | 一级毛片视频在线 |