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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

昨天發的多功能小車程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:309758 發表于 2018-5-29 08:30 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include<reg52.h>                                            
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define u8 unsigned char
  5. #define u16 unsigned int

  6. uchar num;
  7. unsigned char  irtime;        //紅外用全局變量
  8. unsigned char IRcord[4];          //紅外按鍵對應碼值選對應功能的數組
  9. unsigned char irdata[33];          //存儲電平持續的時間的數組
  10. u16 EchoCnt;

  11. bit irpro_ok,irok;                         //位定義,用于判斷操作是否完成

  12. sbit in1=P1^0;                             //電機引腳定義
  13. sbit in2=P1^1;
  14. sbit in3=P1^2;
  15. sbit in4=P1^3;
  16. sbit IR=P3^2;               //將IR位定義為P3.2引腳紅外模塊引腳
  17. sbit XUNJI0 =P2^2;                //循跡模塊
  18. sbit XUNJI1 =P2^3;
  19. sbit Trig = P3^6;                    //超聲波模塊
  20. sbit Echo = P3^7;
  21. sbit XUNGUANG0 = P2^0;            // 紅外尋光接口定義
  22. sbit XUNGUANG1 = P2^1;

  23. typedef enum
  24. {
  25.         FORWARD=0,
  26.         BACKUP,
  27.         LEFT,
  28.         RIGHT,
  29.         STOP,
  30.     ZHUANHUAN,
  31.         XUNJI,
  32.         BIZHANG,
  33.         XUNGUANG,
  34. }MOTOR_DIR;

  35. void qianjin();
  36. void houtui();
  37. void zuozhuan();
  38. void youzhuan();
  39. void tingzhi();
  40. void DelayMs(u16 t);                                                   //延時函數
  41. void DelayUs(u16 i);
  42. void DcMotorContorl(MOTOR_DIR dir, u8 speed);        // 小車直流電機控制,dir為方向,speed為速度
  43. void TIM0init();                                //定時器0初始化
  44. void Ircordpro();
  45. void Ir_work();
  46. void HC04_Init();
  47. void HC04_Loop();
  48. void hongwaiyaokong();                                  //紅外遙控函數
  49. void lanya();                                                  //藍牙遙控函數
  50. void xunji();                                          //循跡函數
  51. void bizhang();                                                  //壁障函數
  52. void xunguang();                                          //尋光函數

  53. void init_t1()                                  //初始化函數
  54. {
  55. TMOD=0x20;            //設置定時器1為工作方式2
  56. TH1=0xfd;             //波特率初始值
  57. TL1=0xfd;
  58. TR1=1;                //定時器打開
  59. REN=1;                //允許串行接受
  60. SM0=0;                //串行口工作方式設置為1
  61. SM1=1;
  62. EA=1;                                  //打開總中斷
  63. ES=1;
  64. }


  65. void main()                      //主函數
  66. {
  67.   init_t1();
  68.    while(1)
  69.     {
  70.           lanya();
  71.      }
  72. }

  73. void EX0init(void)                                   // 外部中斷初始化
  74. {
  75. IT0 = 1;   //指定外部中斷0下降沿觸發,INT0 (P3.2)
  76. EX0 = 1;   //允許外部中斷0
  77. EA = 1;    //開總中斷
  78. }


  79. void ex0_isr (void) interrupt 0 using 0   //外部中斷0服務函數
  80. {
  81.   static unsigned char  i;                //接收紅外信號處理
  82.   static bit startflag;                   //是否開始處理標志位

  83. if(startflag)                        
  84. {
  85.     if(irtime<63&&irtime>=33)//引導碼 TC9012的頭碼,9ms低電平+4.5ms高電平
  86.             i=0;
  87.                     irdata[i]=irtime;//存儲每個電平的持續時間,用于以后判斷是0還是1
  88.                     irtime=0;
  89.                     i++;
  90.                             if(i==33)
  91.                               {
  92.                                    irok=1;
  93.                                  i=0;
  94.                                   }
  95.           }
  96.            else
  97.                 {irtime=0;
  98.                 startflag=1;
  99.                 }
  100. }

  101. void tim0_isr (void) interrupt 1 using 1//定時器0中斷服務函數
  102. {
  103.   irtime++;                             //用于計數2個下降沿之間的時間
  104. }

  105. void TIM0init(void)//定時器0初始化
  106. {

  107.   TMOD=0x02;//定時器0工作方式2,TH0是重裝值,TL0是初值
  108.   TH0=0x00; //重載值
  109.   TL0=0x00; //初始化值
  110.   ET0=1;    //開中斷允許位
  111.   TR0=1;    //開啟定時器功能  
  112. }

  113. void t1() interrupt 4//中斷服務函數
  114. {
  115. if(RI)
  116.   {
  117.    RI=0;
  118.    num=SBUF-48;                //將接收到的碼值轉換為十進制整數以選擇對應功能
  119.    }
  120. }

  121. void HC04_Init(void)            //初始化超聲波模塊
  122. {
  123.         Trig = 0;
  124.         Echo = 0;
  125.         TMOD &=0X0f;
  126.         TMOD |=0X10;              //使用模式1,16位定時器1;
  127.         TH1=0;                    //裝初值
  128.         TL1=0;
  129.         EA=1;                     //開總中斷
  130.         ET1=1;                    //開定時器1中斷
  131.         TR1=0;                    //定時器1
  132. }

  133. void HC04_Loop(void)             //數據處理函數計算前方物體和小車的距離
  134. {  
  135.         Trig = 1;
  136.         DelayUs(20);
  137.         Trig = 0;
  138.         while(Echo == 0);
  139.         TH1=0;
  140.         TL1=0;
  141.         TR1=1;
  142.         while(Echo == 1);
  143.         EchoCnt = (TH1*256 + TL1)*1.7/100;
  144. }

  145. void lanya()
  146. {
  147.    while(1)
  148.     {
  149.       switch(num)
  150.        {
  151.          case 1: qianjin();break;         //前進
  152.          case 2: zuozhuan();break;        //左轉
  153.          case 3: tingzhi();break;         //停止
  154.          case 4: youzhuan();break;        //右轉
  155.          case 5: houtui();break;          //后退
  156.          case 6: hongwaiyaokong();break;  //啟動紅外遙控
  157.          case 7: xunji();break;                          //啟動循跡功能
  158.                  case 8: bizhang();break;         //啟動壁障功能
  159.                  case 9: xunguang();break;              //啟動尋光功能
  160.                  default:break;
  161.         }
  162.      }
  163. }


  164. /*藍牙遙控電機程序*/
  165. void qianjin()
  166. {
  167.     in1=1;
  168.     in2=0;
  169.     in3=1;
  170.     in4=0;
  171. }

  172. void houtui()
  173. {
  174.     in1=0;
  175.     in2=1;
  176.     in3=0;
  177.     in4=1;
  178. }

  179. void zuozhuan()
  180. {
  181.     in1=1;
  182.     in2=0;
  183.     in3=0;
  184.     in4=0;
  185. }

  186. void youzhuan()
  187. {
  188.     in1=0;
  189.     in2=0;
  190.     in3=1;
  191.     in4=0;
  192. }

  193. void tingzhi()
  194. {
  195.     in1=0;
  196.     in2=0;
  197.     in3=0;
  198.     in4=0;
  199. }

  200. void hongwaiyaokong()                        // 紅外遙控函數
  201. {
  202.         TIM0init();
  203.          EX0init();
  204.         while(1)        
  205.         {
  206.                 if(irok)                        //如果接收好了進行紅外處理        紅外解碼
  207.                 {   
  208.                         Ircordpro();
  209.                         irok=0;
  210.                 }
  211.                 if(irpro_ok)                   //如果處理好后進行工作處理,執行對應功能
  212.                 {
  213.                         Ir_work();
  214.                 }        
  215.         }
  216. }

  217. void xunji()                        // 循跡函數
  218. {
  219.         DelayMs(1000);                // 默認延時,等待系統穩定
  220.         while(1)               
  221.         {
  222.                    DcMotorContorl(FORWARD, 10);
  223.                 if((XUNJI0 == 1) && (XUNJI1 == 0))                        // 尋跡右邊紅外檢測到黑線
  224.                 {
  225.                         DcMotorContorl(RIGHT, 14);                                // 小車往右邊走
  226.                 }
  227.                 else if((XUNJI0 == 0) && (XUNJI1 == 1))                // 小車左邊紅外檢測到黑線
  228.                 {
  229.                         DcMotorContorl(LEFT, 14);                                // 小車往左邊走
  230.                 }
  231.                 else if((XUNJI0 == 0) && (XUNJI1 == 0))                // 小車左右都沒有檢測到黑線
  232.                 {
  233.                         DcMotorContorl(FORWARD, 10);                        // 小車直走
  234.                 }
  235.         }
  236. }

  237. void bizhang(void)                        //壁障函數                                             
  238. {
  239.         HC04_Init();
  240.         while(1)               
  241.         {
  242.                 HC04_Loop();                          //調用數據處理函數
  243.                 if(EchoCnt < 25)                                // 距離小于25CM
  244.                 {
  245.                         DcMotorContorl(STOP, 20);        // 小車停止
  246.                         DcMotorContorl(RIGHT, 20);        //小車右轉
  247.                         DelayUs(1500);
  248.                           if(EchoCnt < 25)
  249.                                   {
  250.                                   DcMotorContorl(STOP, 20);           // 小車停止
  251.                               DcMotorContorl(RIGHT, 25);   //小車右轉
  252.                                   }
  253.                            else
  254.                                    {
  255.                                    DcMotorContorl(FORWARD, 20);        // 小車前進
  256.                                         }
  257.          }
  258.                 else
  259.                 {
  260.                         DcMotorContorl(FORWARD, 20);        // 小車前進
  261.                 }
  262.         }
  263. }

  264. void xunguang(void)                        //尋光函數
  265. {
  266.         DelayMs(1000);                // 延時,等待系統穩定
  267.         while(1)               
  268.         {
  269.                 if((XUNGUANG0 == 1) && (XUNGUANG1 == 0))                        // 尋光右邊紅外檢測到光線
  270.                 {
  271.                         DcMotorContorl(RIGHT, 15);                                // 小車往右邊走
  272.                 }
  273.                 else if((XUNGUANG0 == 0) && (XUNGUANG1 == 1))                // 小車左邊紅外檢測到光線
  274.                 {
  275.                         DcMotorContorl(LEFT, 15);                                // 小車往左邊走
  276.                 }
  277.                 else if((XUNGUANG0 == 0) && (XUNGUANG1 == 0))                // 小車左右都有檢測到光線
  278.                 {
  279.                         DcMotorContorl(FORWARD, 20);                        // 小車直走
  280.                 }
  281.         }
  282. }


  283. /*紅外遙控電機程序*/
  284. void DcMotorContorl(MOTOR_DIR dir,u8 speed)
  285. {
  286.         switch(dir)
  287.         {
  288.                 case FORWARD:                          // 前進
  289.                         in1 = 1;
  290.                         in2 = 0;
  291.                         in3 = 1;
  292.                         in4 = 0;
  293.                 break;
  294.                 case BACKUP:                   // 后退
  295.                         in1 = 0;
  296.                         in2 = 1;
  297.                         in3 = 0;
  298.                         in4 = 1;
  299.                 break;
  300.                 case LEFT:                           // 左轉
  301.                         in1 = 0;
  302.                         in2 = 1;
  303.                         in3 = 1;
  304.                         in4 = 0;
  305.                 break;
  306.                 case RIGHT:                       // 右轉
  307.                         in1 = 1;
  308.                         in2 = 0;
  309.                         in3 = 0;
  310.                         in4 = 1;
  311.                 break;        
  312.                 case STOP:                           // 停止
  313.                         in1 = 0;
  314.                         in2 = 0;
  315.                         in3 = 0;
  316.                         in4 = 0;
  317.                 break;
  318.         case ZHUANHUAN:                  //轉換功能
  319.                     lanya();
  320.         break;        
  321.                 case XUNJI:                          //循跡功能
  322.                     xunji();
  323.             break;
  324.                 case BIZHANG:                  //壁障功能
  325.                     bizhang();
  326.             break;
  327.                 case XUNGUANG:              //尋光功能
  328.                     xunguang();
  329.                 break;
  330.                 default:                          // 其他
  331.                         in1 = 0;
  332.                         in2 = 0;
  333.                         in3 = 0;
  334.                         in4 = 0;
  335.                 break;
  336.         }
  337.         DelayMs(speed);                // speed的值越大,速度越快
  338.         in1 = 1;
  339.         in2 = 1;
  340.         in3 = 1;
  341.         in4 = 1;
  342.         DelayMs(25 - speed);        // speed的值越大,延時時間越短,速度越快
  343. }

  344. void DelayMs(u16 t)
  345. {
  346.         u16 i,j;
  347.         for(i=0; i<t; i++)
  348.                 for(j=0; j<120; j++);
  349. }

  350. void DelayUs(u16 i)
  351. {
  352.         while(--i);
  353. }

  354. void Ir_work(void)      //紅外鍵值處理,紅外鍵值轉程序
  355. {
  356.         
  357.         switch(IRcord[2])   //判斷第三個數碼值
  358.         {
  359.                 case 0x0c:                        // 數字1                        //轉換為藍牙
  360.                         DcMotorContorl(ZHUANHUAN, 0);
  361.             break;
  362.                 case 0x18:                        // 數字2
  363.                         DcMotorContorl(FORWARD, 20);                // 小車直行
  364.                         break;
  365.                 case 0x5e:                        // 數字3
  366.                     DcMotorContorl(XUNJI, 0);                        //循跡功能
  367.                         break;
  368.                 case 0x08:                        // 數字4
  369.                         DcMotorContorl(LEFT, 20);                        // 小車左轉
  370.                         break;
  371.                 case 0x1c:                        // 數字5
  372.                         DcMotorContorl(STOP, 20);                        // 小車停止
  373.                         break;
  374.                 case 0x5a:                        // 數字6
  375.                         DcMotorContorl(RIGHT, 20);                        // 小車右轉
  376.                         break;
  377.                 case 0x42:                        // 數字7
  378.                         DcMotorContorl(BIZHANG, 0);                        //壁障功能
  379.                         break;
  380.                 case 0x52:                        // 數字8
  381.                         DcMotorContorl(BACKUP, 20);                        // 小車后退
  382.                         break;
  383.                 case 0x4a:                        // 數字9               
  384.                      DcMotorContorl(XUNGUANG, 0);                //尋光功能
  385.                         break;
  386.                 case 0x16:                        // 數字0
  387.                         break;
  388.                 case 0x46:                        // Mode
  389.                         DcMotorContorl(FORWARD, 20);                // 小車直行
  390.                         break;
  391.                 case 0x40:                        // <-
  392.                         DcMotorContorl(STOP, 20);                        // 小車停止
  393.                         break;
  394.                 case 0x44:                        // >||
  395.                         DcMotorContorl(LEFT, 20);                        // 小車左轉
  396.                         break;
  397.                 case 0x43:                        //->
  398.                         DcMotorContorl(RIGHT, 20);                        // 小車右轉
  399.                         break;
  400.                 case 0x15:                        // VOL-
  401.                         DcMotorContorl(BACKUP, 20);                        // 小車后退
  402.                         break;
  403.                 default:
  404.                         break;
  405.         }
  406.         //irpro_ok=0;//處理完成標志

  407. }

  408. void Ircordpro(void)        //紅外解碼碼值處理函數
  409. {
  410.   unsigned char i, j, k;
  411.   unsigned char cord,value;
  412.   k=1;
  413.   for(i=0;i<4;i++)      //處理4個字節
  414.      {
  415.       for(j=1;j<=8;j++) //處理1個字節8位
  416.          {
  417.           cord=irdata[k];
  418.           if(cord>7)     //大于某值為1,這個和晶振有絕對關系,此值可以有一定誤差
  419.                     {
  420.              value=value|0x80;
  421.                         }
  422.           else
  423.                     {
  424.              value=value;
  425.                         }
  426.           if(j<8)
  427.                     {
  428.                          value=value>>1;
  429.                         }
  430.            k++;
  431.          }
  432.      IRcord[i]=value;
  433.      value=0;     
  434.      }
  435.          irpro_ok=1;     //處理完畢標志位置1

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一级免费看 | 玖玖综合在线 | 欧美一级二级在线观看 | hitomi一区二区三区精品 | 亚洲精品一区二区冲田杏梨 | 91最新视频 | 黑人中文字幕一区二区三区 | 在线91| 日韩在线成人 | 国产成人精品a视频一区www | 热99精品视频| 一a级片| 国产美女黄色片 | 欧美日韩综合一区 | 国产做a爱免费视频 | 久草网址| 中文字幕第一页在线 | 免费在线一区二区三区 | 亚洲免费视频在线观看 | 久久91精品 | 国产成人免费在线 | 国产.com | 一级黄色毛片a | 欧美视频一区二区三区 | 成人做爰www免费看视频网站 | 国产高清自拍视频在线观看 | 久久33 | 国产一区二区久久久 | 国产精品视频一区二区三区不卡 | 日韩精品视频在线观看一区二区三区 | 国产精品视频在线观看 | 欧美日韩大片 | 人人看人人搞 | 亚洲黄色在线免费观看 | 成人精品国产一区二区4080 | 成人免费一区二区三区视频网站 | 亚洲精品在线看 | 亚洲精品一二三区 | 国产综合久久 | 日韩欧美操| 国产一区不卡在线观看 |