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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

注釋很詳細的單片機模塊化智能循跡小車代碼

[復制鏈接]
ID:970314 發表于 2021-10-7 15:57 | 顯示全部樓層 |閱讀模式
  1. /****************************************************************************
  2. *File name:        main.c
  3. *Description:在第一個十字路口打開閘道

  4. timer0:
  5. timer1:
  6. timer2: uart2/4
  7. timer3: uart3
  8. timer4: 1ms 時鐘滴答

  9. ****************************************************************************/

  10. /*引入頭文件*/
  11. #include <STC8.H>
  12. #include "car_control.h"
  13. #include "pwm_pca.h"
  14. #include "delay.h"
  15. #include "ir.h"
  16. #include "hc-sr04.h"

  17. #include "uart.h"
  18. #include "timer.h"
  19. #include "disp.h"
  20. #include "user_string.h"

  21. #include "intrins.h"
  22. #include "color.h"

  23. #define KEY4   P54

  24. signed char temperature = 0;  // 溫度
  25. signed char humidity = 0;     // 濕度
  26. signed long encode_count_chA = 0;  // 通道A編碼器計數值
  27. signed long encode_count_chB = 0;  // 通道B編碼器計數值

  28. unsigned char at_com_type = 0;  // AT指令讀數據狀態

  29. extern unsigned short R_data,G_data,B_data;
  30. /****************************************************************************
  31. * 名    稱:main
  32. * 功    能:程序入口
  33. * 入口參數:無
  34. * 出口參數:無
  35. * 說    明:無
  36. * 調用方法:無
  37. ****************************************************************************/
  38. void main()
  39. {
  40.     unsigned char t_10s = 10;
  41.         unsigned int dat=0;
  42.    
  43.     unsigned char pre_tick = 0;
  44.    
  45.     xdata unsigned char u4_txBuf[20];
  46.    
  47.    
  48.     P1M0 = 0xC0;
  49.     P1M1 = 0x0;
  50.     // P54口設為輸入口
  51.     P5M0 &= ~0x10;
  52.     P5M1 |= 0x10;

  53.    
  54.         uart4_init();
  55.     uart3_init();
  56.     uart2_init();

  57.         EA = 1;                                                /*  開總中斷  */
  58.         car_init();                                /* 小車初始化 */
  59.    
  60.         HC_SR04_Init();                /*超聲波初始化*/
  61.    
  62.     delay_ms(100);
  63.    
  64.     MOTOR_GO_EN;
  65.    
  66.     delay_ms(10);
  67.    
  68.     // disp_number(temperature);
  69.     disp_number(distance);  // 數碼管顯示距離
  70.    
  71.     uart4_tx_idle = 10;
  72.     uart4_send_array("AT+EON\r\n", sizeof("AT+EON\r\n"));  // 控制指令不返回OK
  73.    
  74.     delay_ms(10);
  75.     uart4_tx_idle = 10;
  76.    
  77.     Timer4Init();
  78.     tick = 0;
  79.    
  80.     //Color_Init();//開啟顏色檢測

  81.     // 使能串口2/3接收狀態
  82.     uart2_restart_rx();
  83.     uart3_restart_rx();
  84.    
  85.         while(1)
  86.         {
  87.         if (pre_tick != tick)
  88.         {   // 每1ms刷新一次數碼管
  89.             pre_tick = tick;
  90.             disp_isr_call();
  91.             
  92.             if (carWorking.delay != 0)  // 特殊任務計時
  93.                 carWorking.delay--;
  94.             
  95.             if (trafficLight_opevmv.tick != 0)  // 攝像頭計時
  96.                 trafficLight_opevmv.tick--;
  97.             else
  98.                 trafficLight_opevmv.light = 0;
  99.         }
  100.         if (tick >= 100)
  101.         {
  102.             tick = 0;

  103.             /*//disp_number(G_data);
  104.             u4_txBuf[0] = 'E';
  105.             u4_txBuf[1] = 'S';
  106.             u4_txBuf[2] = 'P';
  107.             u4_txBuf[3] = 1;
  108.             u4_txBuf[4] = 9;
  109.             u4_txBuf[5] = 6;
  110.             u4_txBuf[6] = R_data >> 8;
  111.             u4_txBuf[7] = R_data;
  112.             u4_txBuf[8] = G_data >> 8;
  113.             u4_txBuf[9] = G_data;
  114.             u4_txBuf[10] = B_data >> 8;
  115.             u4_txBuf[11] = B_data;
  116.             u4_txBuf[12] = 0xF8 + u4_txBuf[6] + u4_txBuf[7] + u4_txBuf[8] + u4_txBuf[9] + u4_txBuf[10] + u4_txBuf[11];
  117.             u4_txBuf[13] = 'E';
  118.             u4_txBuf[14] = 'N';
  119.             u4_txBuf[15] = 'D';
  120.             uart4_send_array(u4_txBuf, 16);*/
  121.             /*if (R_data >= G_data){
  122.                 disp_number(R_data - G_data);
  123.             }
  124.             else{
  125.                 disp_number(G_data - R_data);
  126.                 disp_number_1(10);
  127.             }*/
  128.             
  129.             dat = HC_SR04_Read();//讀取超聲波距離  每100ms測量一次
  130.             if(dat != -1)//距離采集成功
  131.             {
  132.                 distance = dat;
  133.                 disp_number(distance);
  134.             }
  135.             t_10s--;
  136.             if (t_10s == 0)
  137.             {
  138.                 t_10s = 100;
  139.                 uart4_send_array("AT+TEMPERATURE?\r\n", 17);
  140.                 // 重新開始接收數據
  141.                 uart4_restart_rx();
  142.                 at_com_type = 1;  // AT指令讀數據類型  1溫度  2濕度  3編碼器計數值  4速度  5電池電量
  143.             }
  144.         }
  145.         if (uart4_rx_idle == 3)
  146.         {   // 驅動板接收數據解析
  147.             unsigned char rx_len = 100 - uart4_buf.r_free;
  148.             if (rx_len > 6)
  149.             {
  150.                 // if (uart4_rx_buf[0] == '+')
  151.                 {
  152.                     unsigned char st;
  153.                     switch (at_com_type)
  154.                     {
  155.                         case 1:  // 溫度
  156.                             {
  157.                                 st = user_array_seek(uart4_rx_buf, rx_len, "+TEMPERATURE:", 13);
  158.                                 if (st != 0xFF)
  159.                                 {
  160.                                     signed long buf;
  161.                                     if (user_str_DECnumStr2num(uart4_rx_buf + st + 15, &buf) != 0)
  162.                                     {
  163.                                         temperature = buf;
  164.                                         // disp_number(temperature);
  165.                                     }
  166.                                 }
  167.                                 break;
  168.                             }
  169.                         case 2:  // 濕度
  170.                             {
  171.                                 st = user_array_seek(uart4_rx_buf, rx_len, "+HUMIDITY:", 10);
  172.                                 if (st != 0xFF)
  173.                                 {
  174.                                     signed long buf;
  175.                                     if (user_str_DECnumStr2num(uart4_rx_buf + st + 12, &buf) != 0)
  176.                                     {
  177.                                         humidity = buf;
  178.                                         //disp_number(humidity);
  179.                                     }
  180.                                 }
  181.                                 break;
  182.                             }
  183.                         case 3:  // 編碼器
  184.                             {
  185.                                 st = user_array_seek(uart4_rx_buf, rx_len, "+MTENCODER:", 11);
  186.                                 if (st != 0xFF)
  187.                                 {
  188.                                     signed long buf;
  189.                                     register unsigned char len = user_str_DECnumStr2num(uart4_rx_buf + st + 13, &buf);
  190.                                     if (len != 0)
  191.                                     {   // <channel A>
  192.                                         encode_count_chA = buf;
  193.                                         st = len + st + 1;
  194.                                         len = user_str_DECnumStr2num(uart4_rx_buf + st + 13, &buf);
  195.                                         if (len != 0)
  196.                                         {   // <channel B>
  197.                                             encode_count_chB = buf;
  198.                                         }
  199.                                     }
  200.                                 }
  201.                                 break;
  202.                             }
  203.                         case 4:  // 速度
  204.                             {   // 需用戶自行完善
  205.                                 st = user_array_seek(uart4_rx_buf, rx_len, "+MTRPM:", 6);
  206.                                 if (st != 0xFF)
  207.                                 {   // <channel A>,<channel B>  轉/分鐘
  208.                                     signed long buf;
  209.                                     register unsigned char len = user_str_DECnumStr2num(uart4_rx_buf + st + 8, &buf);
  210.                                     if (len != 0)
  211.                                     {   // <channel A>
  212.                                     }
  213.                                 }
  214.                                 break;
  215.                             }
  216.                         case 5:  // 電池電量
  217.                             {   // 需用戶自行完善
  218.                                 st = user_array_seek(uart4_rx_buf, rx_len, "+BATTERY:", 8);
  219.                                 if (st != 0xFF)
  220.                                 {   // <電壓>,<電流>,<剩余電量>,<節數>,<已消耗電量>
  221.                                     signed long buf;
  222.                                     register unsigned char len = user_str_DECnumStr2num(uart4_rx_buf + st + 10, &buf);
  223.                                     if (len != 0)
  224.                                     {   // <電壓>
  225.                                     }
  226.                                 }
  227.                                 break;
  228.                             }
  229.                         case 6:  // 報警狀態
  230.                             {   // 需用戶自行編寫
  231.                                 break;
  232.                             }
  233.                     }
  234.                     at_com_type = 0;
  235.                 }
  236.             }
  237.             if (rx_len != 0)
  238.             {   // 重新開始接收數據
  239.                 uart4_restart_rx();
  240.             }
  241.         }
  242.         else if (uart4_rx_idle >= 50)
  243.         {
  244.             uart4_rx_idle = 5;
  245.             if (at_com_type != 0)
  246.             {
  247.                 at_com_type = 0;
  248.             }
  249.         }
  250.         
  251.                 if((distance<300) && //距離小于300mm    如果有路障重新規劃路線,則建議將此部分屏蔽掉
  252.             (carWorking.type == 0)) // 非特殊任務時,才執行
  253.                 {
  254.                         MOTOR_GO_STOP;//停車
  255.                 }
  256.                 else
  257.                 {
  258.                         car_FollowLine();//循跡
  259.                 }
  260.         
  261.         if (uart3_rx_idle == 5)
  262.         {   // lora通信測試
  263.             unsigned char len = 100 - uart3_buf.r_free;
  264.             if ((len >= 6) && (uart3_rx_buf[4] + 6 <= len))
  265.             {   // 紅綠燈命令解析,用戶可根據實際情況進行修改
  266.                 if (uart3_rx_buf[5] == 'r')
  267.                     disp_number_1(1);
  268.                 else if (uart3_rx_buf[5] == 'g')
  269.                     disp_number_1(0);
  270.                 else if (uart3_rx_buf[5] == 'y')
  271.                     disp_number_1(2);
  272.                 disp_number_2(0);
  273.                 disp_number_3(uart3_rx_buf[7] / 10);
  274.                 disp_number_4(uart3_rx_buf[7] % 10);
  275.                
  276.                 uart3_restart_rx();
  277.             }
  278.         }
  279.         
  280.         if (uart2_rx_idle == 5)
  281.         {   // 攝像頭通信測試
  282.             unsigned char len = 100 - uart2_buf.r_free;
  283.             if (len > 17)
  284.             {   // 攝像頭檢測到紅綠燈時,發送以下字符串
  285.                 // "traffic light is red"
  286.                 // "traffic light is green"
  287.                 // "traffic light is yellow"
  288.                 if (user_str_cmp(uart2_rx_buf, "traffic light is ") >= 17)
  289.                 {   //
  290.                     if (uart2_rx_buf[17] == 'r')
  291.                     {   // "red"
  292.                         trafficLight_opevmv.light = 'r';
  293.                         //disp_number_1(1);
  294.                     }
  295.                     else if (uart2_rx_buf[17] == 'g')
  296.                     {   // "green"
  297.                         trafficLight_opevmv.light = 'g';
  298.                         //disp_number_1(3);
  299.                     }
  300.                     else if (uart2_rx_buf[17] == 'y')
  301.                     {   // "yellow"
  302.                         trafficLight_opevmv.light = 'y';
  303.                         //disp_number_1(2);
  304.                     }
  305.                     trafficLight_opevmv.tick = 250;
  306.                 }
  307.                 uart2_restart_rx();
  308.             }
  309.             else
  310.                 uart2_restart_rx();
  311.         }
  312.         }
  313. }


復制代碼
Keil代碼工程: 小車綜合任務-源碼.rar (157.88 KB, 下載次數: 16)

評分

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

查看全部評分

回復

使用道具 舉報

無效樓層,該帖已經被刪除
無效樓層,該帖已經被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产日韩欧美精品一区二区三区 | 国产东北一级毛片 | 成人精品国产 | 久久久久久免费毛片精品 | 日韩精品一区二区在线 | 337p日本欧洲亚洲大胆 | 在线观看国产wwwa级羞羞视频 | 婷婷在线免费 | 亚洲综合久久久 | 国产精品成人在线观看 | 日韩精品一区二区三区第95 | 久久精品一区 | 99久久免费精品 | 99综合网| 色综合天天综合网国产成人网 | av成年人网站 | 欧美日韩在线一区二区三区 | 久久久久久久电影 | 亚洲精品国产精品国自产在线 | 久久久精品一区 | 国产丝袜一区二区三区免费视频 | 日韩av一区二区在线观看 | 中文在线视频观看 | 视频一区二区中文字幕 | 日韩在线免费视频 | 激情综合五月 | 亚洲视频一区 | 成人免费共享视频 | 精品国产91久久久久久 | 欧美日韩不卡合集视频 | 国产精品一区二区三区四区 | 99pao成人国产永久免费视频 | 青青草社区 | 欧美一区二区三区四区视频 | 成人妇女免费播放久久久 | 日韩欧美在线视频 | 欧美成人精品一区二区男人看 | 久久av一区 | 亚洲在线高清 | 久久久久久九九九九 | 中日韩毛片 |