找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1903|回复: 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 单片机教程网

快速回复 返回顶部 返回列表