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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機程序如何用紅外實現超聲波功能的開啟和關閉?

[復制鏈接]
跳轉到指定樓層
樓主
ID:473410 發表于 2019-3-29 17:08 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
我做了一個智能小車,用了紅外線控制小車左右轉動,和超聲波實現簡單的避障功能,但是有時候超聲波執行功能的時候會影響紅外線的功能使用,我想用紅線的開關鍵通過解碼直接控制超聲波功能,我就直接在紅外線的中斷里面解碼對應關掉超聲波的功能,但是不知道為什么好像不太管用。請大佬幫忙看一下,初學51單片機,請多指教!

單片機源程序:
  1. #include<reg52.h>
  2. #include<intrins.h>      

  3. typedef unsigned int uint;          //對數據類型進行聲明定義
  4. typedef unsigned char uchar;

  5. sbit IN1=P0^0;
  6. sbit IN2=P0^1;
  7. sbit IN3=P0^2;
  8. sbit IN4=P0^3;
  9. sbit IRIN=P3^2;
  10. sbit led3=P2^2;
  11. sbit led8=P2^7;
  12. sbit led7=P2^6;
  13. sbit Trig = P2^1;
  14. sbit Echo = P2^0;



  15. uchar IrValue[6];
  16. uchar Time;

  17. static unsigned int  time1=0;
  18.            unsigned long S=0;
  19.            unsigned char disbuff[4] = { 0,0,0,0,};
  20.            bit      flag =0;



  21. void delay(uint i)
  22. {
  23.         while(i--);      
  24. }

  25. void delayms(unsigned int ms)
  26. {
  27.         unsigned char i=100,j;
  28.         for(;ms;ms--)
  29.         {
  30.                 while(--i)
  31.                 {
  32.                         j=10;
  33.                         while(--j);
  34.                 }
  35.         }
  36. }

  37. //左邊電機前進
  38. void leftqian()
  39. {
  40.         IN1=0;
  41.         IN2=1;
  42. }

  43. //左邊電機后退
  44. void lefthou()
  45. {
  46.         IN1=1;
  47.         IN2=0;
  48. }

  49. //右邊電機前進
  50. void rightqian()
  51. {
  52.         IN3=0;
  53.         IN4=1;
  54. }

  55. //右邊電機后退
  56. void righthou()
  57. {
  58.         IN3=1;
  59.         IN4=0;
  60. }

  61. //初始化紅外線
  62. void IrInit()
  63. {
  64.         IT0=1;//下降沿觸發
  65.         EX0=1;//打開中斷0允許
  66.         EA=1;        //打開總中斷
  67.         IRIN=1;//初始化端口
  68. }


  69. void Conut(void)
  70. {
  71.         time1=TH0*256+TL0;
  72.         TH0=0;
  73.         TL0=0;
  74.       
  75.         S=(time1*1.7)/100;     //算出來是CM
  76.         if((S>=600)||flag==1)
  77.         {         
  78.                 flag=0;
  79.                 leftqian();
  80.                 rightqian();
  81.         }
  82.         else if(S<80)
  83.         {
  84.                 leftqian();
  85.                 righthou();
  86.                 delay(200);
  87. //                led7=1;
  88.         }
  89.         else
  90.         {
  91.                 leftqian();
  92.                 rightqian();
  93.                 led7=0;
  94.         }
  95.         led8=0;
  96. }

  97. void zd0() interrupt 1                  //T0中斷用來計數器溢出,超過測距范圍
  98. {
  99.         flag=1;                                                         //中斷溢出標志
  100. }


  101. void  StartModule()                          //啟動模塊
  102. {
  103.         Trig=1;                                             //啟動一次模塊
  104.         _nop_();
  105.         _nop_();
  106.         _nop_();
  107.         _nop_();
  108.         _nop_();
  109.         _nop_();
  110.         _nop_();
  111.         _nop_();
  112.         _nop_();
  113.         _nop_();
  114.         _nop_();
  115.         _nop_();
  116.         _nop_();
  117.         _nop_();
  118.         _nop_();
  119.         _nop_();
  120.         _nop_();
  121.         _nop_();
  122.         _nop_();
  123.         _nop_();
  124.         _nop_();
  125.         Trig=0;
  126. }


  127. void main()
  128. {
  129.         TMOD|=0x01;                   //設T0為方式1,GATE=1;
  130.         TH0=0;
  131.         TL0=0;         
  132.         ET0=1;             //允許T0中斷
  133.         EA=1;                           //開啟總中斷
  134.         IrInit();
  135.         leftqian();
  136.         rightqian();
  137.         while(1)
  138.         {
  139.                 switch(IrValue[2])
  140.                 {
  141.                         case 24: leftqian();rightqian(); break;
  142.                         case 82: lefthou();righthou(); break;
  143.                         case  8: lefthou();rightqian(); break;
  144.                         case 90: leftqian();righthou(); break;
  145.                         default : break;
  146.                 }
  147.                 StartModule();
  148.                 led8=0;
  149.             while(!Echo);                //當RX為零時等待
  150.             TR0=1;                            //開啟計數
  151.             while(Echo);                        //當RX為1計數并等待
  152.             TR0=0;                                //關閉計數
  153.         Conut();                        //計算
  154.                 led8=1;
  155.                 delayms(80);
  156.         }
  157. }



  158. void ReadIr() interrupt 0
  159. {
  160.         uchar j,k;
  161.         uint err;
  162.         Time=0;                                         
  163.         delay(700);        //7ms
  164.         if(IRIN==0)                //確認是否真的接收到正確的信號
  165.         {         
  166.                
  167.                 err=1000;                                //1000*10us=10ms,超過說明接收到錯誤的信號
  168.                 /*當兩個條件都為真是循環,如果有一個條件為假的時候跳出循環,免得程序出錯的時
  169.                 侯,程序死在這里*/      
  170.                 while((IRIN==0)&&(err>0))        //等待前面9ms的低電平過去                 
  171.                 {                       
  172.                         delay(1);
  173.                         err--;
  174.                 }
  175.                 if(IRIN==1)                        //如果正確等到9ms低電平
  176.                 {
  177.                         err=500;
  178.                         while((IRIN==1)&&(err>0))                 //等待4.5ms的起始高電平過去
  179.                         {
  180.                                 delay(1);
  181.                                 err--;
  182.                         }
  183.                         for(k=0;k<4;k++)                //共有4組數據
  184.                         {                              
  185.                                 for(j=0;j<8;j++)        //接收一組數據
  186.                                 {

  187.                                         err=60;               
  188.                                         while((IRIN==0)&&(err>0))//等待信號前面的560us低電平過去
  189.                                         {
  190.                                                 delay(1);
  191.                                                 err--;
  192.                                         }
  193.                                         err=500;
  194.                                         while((IRIN==1)&&(err>0))         //計算高電平的時間長度。
  195.                                         {
  196.                                                 delay(10);         //0.1ms
  197.                                                 Time++;
  198.                                                 err--;
  199.                                                 if(Time>30)
  200.                                                 {
  201.                                                         return;
  202.                                                 }
  203.                                         }
  204.                                         IrValue[k]>>=1;         //k表示第幾組數據
  205.                                         if(Time>=8)                        //如果高電平出現大于565us,那么是1
  206.                                         {
  207.                                                 IrValue[k]|=0x80;
  208.                                         }
  209.                                         Time=0;                //用完時間要重新賦值                                                      
  210.                                 }
  211.                         }
  212.                 }
  213.                 if(IrValue[2]!=~IrValue[3])
  214.                 {
  215.                         return;
  216.                 }
  217.                 led3=~led3;
  218. //                if(IrValue[2]==69)
  219. //                        ET0=0;
  220.         }                       
  221. }        
復制代碼

                          

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

使用道具 舉報

沙發
ID:473410 發表于 2019-3-31 09:16 | 只看該作者
求助大神
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一级在线视频 | 亚洲一区二区三区在线 | 国产精品爱久久久久久久 | 欧美视频1区 | 亚洲va欧美va天堂v国产综合 | 中文字幕 国产精品 | 91xxx在线观看 | 综合色导航 | 九九久久久 | 国产精品久久久久久久久久久久 | 国产高清视频在线观看播放 | 国产精品激情在线 | 精品一区欧美 | 成人自拍视频网站 | 亚洲精品一区二区三区蜜桃久 | 波多野结衣电影一区 | 奇米四色在线观看 | jvid精品资源在线观看 | 99reav| 看毛片的网站 | 国产乱肥老妇国产一区二 | 午夜欧美一区二区三区在线播放 | 超碰3| 国户精品久久久久久久久久久不卡 | 99国产精品99久久久久久 | 一区二区三区国产好 | 国产欧美一区二区三区国产幕精品 | 日日夜夜精品 | 久久久久久久久久久福利观看 | 欧美久久一区 | 免费看黄视频网站 | 在线观看www视频 | 日韩欧美亚洲 | 日日摸夜夜爽人人添av | 国产一区二区三区在线 | 午夜免费福利电影 | 久久99精品国产 | 欧美综合精品 | 久久黄网| 国产精品成人久久久久a级 久久蜜桃av一区二区天堂 | 亚洲人人 |