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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6282|回復: 6
打印 上一主題 下一主題
收起左側

超聲波避障(51單片機程序)

[復制鏈接]
跳轉到指定樓層
樓主
ID:389243 發表于 2018-8-23 13:34 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
超聲波避障程序,使用51單片機芯片

單片機源程序如下:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define MOTOR_C P2                //P1口作為電機的控制口。
  5. #define BACK 0xfa                 //后退,0b1111 1010
  6. #define FORWARD 0xf5    //前進,0b1111 0101
  7. #define Sum 100                  //總周期,為100倍的定時器時間大約27ms
  8. #define tim 200         //初值數 200約270us
  9. uint distance;
  10. sbit Trig=P2^6;
  11. sbit Echo=P2^7;

  12. sbit PWM_L=P2^0;                //左電機前進
  13. sbit PWM_R=P2^2;        //右電機前進
  14. sbit PWM_HL=P2^1;                //左電機后退
  15. sbit PWM_HR=P2^3;                //右電機后退
  16. void timer0_init(void); //定時器0初始化函數。
  17. void timer1_init(void); //定時器1初始化函數。
  18. void right(void);       //前進右轉彎函數。
  19. void left(void);                //前進左轉彎函數。
  20. void forward(void);                //前進函數。
  21. void hright(void);                //后退右轉函數。
  22. void hleft(void);                //后退左轉函數。
  23. void back(void);                //后退函數。
  24. void stop(void);                //停止
  25. void backright(void);        //右后倒車
  26. void Delayms();                  //延時1ms
  27. void Delay100ms(unsigned int d);//延時100ms??

  28. void bizhang();                        //避障;

  29. uchar percent_l=0;                //(前進)左輪占空比。
  30. uchar percent_r=0;                //(前進)右輪占空比。
  31. uchar percent_hl=0;                //(后退)左輪占空比。
  32. uchar percent_hr=0;                //(后退)右輪占空比。
  33. uchar run_time=0;                //車輪運行一步的時間。??
  34. int shu,i;

  35. void delay(uint z)
  36. {
  37.   uint x,y;
  38.   for(x=z;x>0;x--)
  39.    for(y=110;y>0;y--);
  40.    
  41. }

  42. void delay_us()
  43. {     
  44.         uchar t;
  45.         for(t=0;t<10001;t++)
  46.         {
  47.         if(Echo==1)
  48.                 shu=t;
  49.         else
  50.                 break;
  51.         }
  52. }
  53. void turn_on()
  54. {
  55.         Trig=Echo=0;
  56.         delay(1);
  57.         Trig=1;
  58.         delay(1);
  59.         Trig=0;
  60.         while(Echo!=1);
  61.         delay_us();
  62. }
  63. void bizhang()
  64. {
  65.                 timer0_init();
  66.                 timer1_init();
  67.                 MOTOR_C=0x00;
  68.         if(0<distance&&distance<20)
  69.         {
  70. //                timer0_init();
  71. //                timer1_init();
  72. //                MOTOR_C=0x00;
  73.                 backright();  
  74. //                Delay100ms(10);
  75.         }                                 
  76.         else
  77.         {
  78. //                timer0_init();
  79. //                timer1_init();
  80. //                MOTOR_C=0x00;
  81.                 forward();
  82. //                Delay100ms(10);                 
  83.         }
  84. }

  85. void main()
  86. {
  87.         while(1)
  88.         {
  89.                 turn_on();
  90.                 distance=shu*0.45/2.0;
  91.             delay(5);
  92.                 for(i=0;i<2;i++)
  93.                 {
  94.                         bizhang();
  95.                         delay(20);
  96.                 }
  97.         }
  98. }

  99. void timer0_init(void)
  100. {
  101.         TMOD=0X11;
  102.         TH0=(65536-tim)/256;
  103.         TL0=(65536-tim)%256;
  104.         EA=1;                                        //開總中斷。
  105.         ET0=1;                                        //開定時器0中斷。
  106.         TR0=1;                                        //啟動定時器0。
  107. }
  108. void timer1_init(void)
  109. {
  110.         TH1=(65536-tim)/256;
  111.         TL1=(65536-tim)%256;
  112.         ET1=1;
  113.         TR1=1;
  114.         }
  115. /**************前進方向****/
  116. void right(void)
  117. {
  118.         percent_l=50;                        //左輪速度快,最好去50以上
  119.         percent_r=0;                        //右輪速度慢。
  120.         percent_hl=0;
  121.         percent_hr=0;
  122. }
  123. void left(void)
  124. {
  125.         percent_l=0;            //左輪速度慢。
  126.         percent_r=50;                        //右輪速度快。
  127.         percent_hl=0;
  128.         percent_hr=0;
  129. }
  130. void back(void)
  131. {
  132.         percent_l=50;//左輪同速度。
  133.         percent_r=50;//右輪同速度。
  134.         percent_hl=0;
  135.         percent_hr=0;
  136. }
  137. /************后退方向*************///void?hright(void?)?//{?
  138. //?percent_hr?=?90;?//?percent_hl?=?0;?//?percent_r?=?0;?//?percent_l?=?0;?//}?//?
  139. //void?hleft(?void?)?//{?
  140. //?percent_hr?=?0;?//?percent_hl?=?90;?//?percent_r?=?0;?//?percent_l?=?0;?//}??
  141. void forward(void)
  142. {       
  143.         percent_hl=50;
  144.         percent_hr=50;
  145.         percent_l=0;
  146.         percent_r=0;
  147. }
  148. void stop(void)
  149. {
  150.         percent_l=0;                                                                //左輪零速度。
  151.         percent_r=0;                                                                //右輪零速度。
  152.         percent_hl=0;
  153.         percent_hr=0;
  154. }
  155. void backright(void)
  156. {
  157.         percent_hl=0;
  158.         percent_hr=0;
  159.         percent_l=50;
  160.         percent_r=0;       
  161. }
  162. /**************中斷服務*******************/
  163. void timer_0 (void) interrupt 1 using 1
  164. {
  165.         static uchar temp=0;                                                //中斷次數計數
  166.         TR0=0;
  167.         if(temp<Sum)
  168.                 {                                                                                //關總中斷,屏蔽其他中斷。
  169.                         if(temp<percent_l)
  170.                         {
  171.                                 PWM_L=1;                                                //左電機高電平。
  172.                         }
  173.                         else
  174.                         {
  175.                                 PWM_L=0;                                                //左電機低電平。
  176.                         }
  177.                         if(temp<percent_r)
  178.                         {
  179.                                 PWM_R=1;                                                //右電機高電平。
  180.                         }
  181.                         else
  182.                         {
  183.                                 PWM_R=0;                                                //右電機低電平。
  184.                         }
  185.                 }
  186.         else
  187.         {
  188.                 temp=0;
  189.         }
  190.         temp++;
  191.         TH0=(65536-tim)/256;
  192.         TL0=(65536-tim)%256;                                                //實現計數。
  193.         TR0=1;                                                                                //開總中斷。
  194. }
  195. void timer1(void) interrupt 3 using 2
  196. {
  197.         static uchar temp1=0;
  198.         TR1=0;                                                                                //關總中斷,屏蔽其他中斷。
  199.         if(temp1<Sum)
  200.         {
  201.                 if(temp1<percent_hl)
  202.                 {
  203.                         PWM_HL=1;                                                        //左電機高電平。
  204.                 }
  205.                 else
  206.                 {
  207.                         PWM_HL=0;                                                        //左電機低電平。
  208.                 }
  209.                 if(temp1<percent_hr)
  210.                 {
  211.                         PWM_HR=1;                                                        //右電機高電平。
  212.                 }
  213.                 else
  214.                 {
  215.                         PWM_HR=0;                                                        //右電機低電平。
  216.                 }
  217.         }
  218.         else
  219.         {
  220.                 temp1=0;
  221.         }
  222.         temp1++;
  223.         TH1=(65536-tim)/256;
  224.         TL1=(65536-tim)%256;                                                //實現計數。
  225.         TR1=1;                                                                                //開總中斷。
  226.         }
  227. /*void?Delayms(void)????{?
  228. ????unsigned?char?a,b,c;?????for(c=1;c>0;c--)?
  229. ????????for(b=23;b>0;b--)?
  230. ????????????for(a=13;a>0;a--);?}*/
  231. void Delay100ms(unsigned int d)
  232. {                                                                       
  233.         unsigned int a,b,c;
  234.         for(c=d;c>0;c--)
  235.                 for(b=60;b>0;b--)
  236.                         for(a=130;a>0;a--);
  237. }
復制代碼

所有資料51hei提供下載:
51.zip (28.35 KB, 下載次數: 43)


評分

參與人數 1黑幣 +5 收起 理由
嘖嘖嘖嘖嘖嘖嘖 + 5 絕世好帖!

查看全部評分

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

使用道具 舉報

沙發
ID:518433 發表于 2019-5-20 19:46 | 只看該作者
首先感謝樓主的分享,小白想問一下 電機驅動模塊是用的L298N嗎?P1口與電機接線是怎樣的 ?
回復

使用道具 舉報

板凳
ID:595011 發表于 2019-8-5 17:04 | 只看該作者
謝謝樓主的分享 想問一下距離計算中0.45是什么?
回復

使用道具 舉報

地板
ID:595011 發表于 2019-8-5 20:01 | 只看該作者
這個程序是直接將超聲波探頭按到開發板上的嗎 不是用線連的對吧
回復

使用道具 舉報

5#
ID:361216 發表于 2019-8-9 12:36 | 只看該作者
不錯,學習了
回復

使用道具 舉報

6#
ID:829883 發表于 2020-10-14 18:18 | 只看該作者
我看了你的超聲波避障程序 下載了后小車不能驅動是什么原因
回復

使用道具 舉報

7#
ID:328014 發表于 2020-10-14 21:45 | 只看該作者
cxml 發表于 2020-10-14 18:18
我看了你的超聲波避障程序 下載了后小車不能驅動是什么原因

你的電路和這個程序不配套吧
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 81精品国产乱码久久久久久 | 国产精品黄| 日韩精品在线免费 | 欧美性区 | 一区不卡在线观看 | 高清色 | 亚洲免费在线观看 | 久久成人免费视频 | 91精品国产综合久久久久久丝袜 | 午夜不卡一区二区 | 国产日韩欧美一区二区在线播放 | 国产精品久久久久久久久久 | 欧美日韩三级在线观看 | 成人在线中文字幕 | 精品免费在线 | 精品欧美一区二区三区久久久 | 国产精品日韩一区二区 | 欧美日韩国产精品激情在线播放 | 日本黄色不卡视频 | 亚洲欧美日韩中文在线 | 日韩高清一区 | 亚洲美女在线一区 | 日日夜夜91 | 午夜视频一区二区三区 | 国产91黄色 | 亚洲成人久久久 | 天天艹逼网 | 黄视频在线网站 | 欧美日韩精品免费 | www午夜视频 | 国产精品不卡一区 | 国产成人av在线 | 欧美亚洲国产精品 | 欧美猛交 | 日韩三级在线 | 成人综合在线视频 | 亚洲欧美国产精品一区二区 | 亚欧精品一区 | 夜夜爽99久久国产综合精品女不卡 | 亚洲成色777777在线观看影院 | 九九热精品视频 |