找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3194|回复: 2
收起左侧

学校小比赛做的一个带颜色识别寻迹小车程序,STM32+5110屏幕

[复制链接]
ID:405625 发表于 2019-3-24 20:43 | 显示全部楼层 |阅读模式
5110屏幕做小车的主显示屏,然后颜色识别传感器
大概就是做到下面这几点
它以在特定赛道上能自主行驶且具有优性能的智能小车这类复杂工程问题为任务,鼓励组成团队,综合运用多学科知识,提出、分析、设计、开发并研究智能小车的机械结构、电子线路、运动控制和经济成本等问题,让综合工程素质、创新能力、团队协作能力都得到全面的培养和提升。因此,特邀各专业电子设计爱好者参加自制小车跑道赛”,促进电子设计能力提高和智能小车竞赛活动的普及

将赛车放置在赛道出发区,赛车应在得到出发信号后5秒之内离开出发区,沿着赛道黑色引导线跑一圈,由计时定位起始线进行自动计时。
小车从赛道出发区离开,赛道黑色引导线上排列若干包裹两组不同颜色(可由自己准备)1元硬币,其中一种颜色硬币二枚,另一种颜色硬币二枚,硬币比赛时随机摆放。由计时起始线开始进行自动计时,小车沿引导线前进,检测到指定颜色的硬币后将其搬运至起点

单片机源程序如下:
  1. /**
  2.   ******************************************************************************
  3.   * @file    main.c
  4.   * @author  fire
  5.   * @version V1.0
  6.   * @date    2013-xx-xx
  7.   * @brief   USART printf example
  8.   */
  9.   
  10. #include "stm32f10x.h"
  11. #include "bsp_SysTick.h"
  12. #include "bsp_usart1.h"
  13. #include "UltrasonicWave.h"
  14. #include "5110.h"
  15. #include "sys.h"
  16. #include "tcs3200.h"
  17. #include "TIM2.h"
  18. #include "bsp_exti.h"
  19. #include "bsp_led.h"
  20. #include "PWM.h"
  21. #include "trace.h"
  22. #include "delay.h"
  23. #include "key.h"
  24. #include "gpio.h"
  25. #define CLI()      __set_PRIMASK(1)                /* 关闭总中断 */  
  26. #define SEI() __set_PRIMASK(0)                                /* 开放总中断 */

  27. extern         u16 CCR1_Val ;        
  28. extern         u16 CCR2_Val ;
  29. extern        u16 CCR3_Val ;
  30. extern        u16 CCR4_Val ;
  31. u16 state=0;
  32. u16 past=0;

  33. extern unsigned short int Ultras_Distance;

  34. volatile u32 time = 0; // ms 计时变量
  35. volatile u16 amount = 0; // ms 计时变量
  36. volatile u8 n = 0; // ms 计时变量
  37. /**
  38.   * @brief  主函数
  39.   * @param  无
  40.   * @retval 无
  41.   */
  42.         
  43.         
  44.         void Init_NVIC(void)
  45. {
  46.         NVIC_InitTypeDef  NVIC_InitStructure;
  47.                  
  48.         #ifdef  VECT_TAB_RAM                                                          //向量表基地址选择

  49.           NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);          //将0x20000000地址作为向量表基地址(RAM)
  50.         #else  

  51.           NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); //将0x08000000地址作为向量表基地址(FLASH)  
  52.         #endif

  53.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                                  //设置中断优先级分组2

  54.         NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;                //设定中断源为PC13
  55.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;        //中断占优先级为2
  56.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                        //副优先级为0
  57.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                //使能中断
  58.         NVIC_Init(&NVIC_InitStructure);                                                                   //根据参数初始化中断寄存器

  59.         NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;                        //设定中断源为PE0
  60.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;        //中断占优先级为1
  61.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                        //副优先级为0
  62.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                //使能中断
  63.         NVIC_Init(&NVIC_InitStructure);                                                                   //根据参数初始化中断寄存器
  64. }

  65. void EXTI0_IRQHandler(void)
  66. {
  67.         if(EXTI_GetITStatus(EXTI_Line0)!= RESET)         //判断是否发生中断,发生则中断标志置1
  68.         {
  69.             n++;                                                
  70.         }
  71.         EXTI_ClearITPendingBit(EXTI_Line0);                     //清楚中断挂起位,重要!!                        
  72. }
  73. int main(void)
  74. {
  75.                 u8 R=0x00,G=0x00,B=0x00;
  76.                   u8 R1=0x00,G2=0x00,B3=0x00;
  77.                   u8 RR1=0x00,GG2=0x00,BB3=0x00;
  78.                           u8 RRR1=0x00,GGG2=0x00,BBB3=0x00;
  79.         u8 RRRR1=0x00,GGGG2=0x00,BBBB3=0x00;
  80.                 u8 RRRRR1=0x00,GGGGG2=0x00,BBBBB3=0x00;
  81.                 u16 states;
  82.                 u16 i=0;
  83.         u8 j=0;
  84.         u8 z=0;
  85.         u8 a=0;
  86.                         u8 r[200],b[200],g[200];
  87.         u8 r1[100],b1[100],g1[100];
  88.                 u8 m=0;
  89.                 /* USART1 config 115200 8-N-1 */
  90.         LCD_GPIO_Init();
  91.         diancid;
  92.         
  93.                 USART1_Config();
  94.                 LED_GPIO_Config();         
  95.                 CLI();
  96.                 SEI();
  97.         SystemInit();
  98.         delay_init();
  99.                 Init_NVIC();                                //中断向量表注册函数
  100.                         LCD_init();
  101.                         LCD_clear();
  102.                         LCD_set_XY(0,0);
  103.                         LCD_write_str("Nokia5110");

  104.                         
  105.           SysTick_Init();
  106.                 Init_TI_KEY();                                //按键引脚中断初始化
  107.           Delay_us(1000);            // 10000 * 10us = 100ms
  108.                 TIM4_PWM_Init();
  109.                 Delay_us(100);            // 10000 * 10us = 100ms
  110.                 TIM2_Configuration();
  111.                 UltrasonicWave_Configuration();
  112.                 Delay_ms(20);
  113.                 LED1_OFF;
  114.                                                         LCD_set_XY(40,4);
  115.                         Write_num(n);
  116.                 tcs3200_init(1,1);//初始化(速率调整)
  117.                 whitebalance();        //白平衡
  118. Delay_ms(3000);
  119.                  while(1)
  120.          {

  121.                   LCD_set_XY(40,4);
  122.                         Write_num(n);
  123.                                          if(n>5)
  124.                                 n=0;
  125.                          j++;
  126.                   R = tcs3200_RED();
  127.                         G = tcs3200_GREEN();        //取RGB值
  128.                         B = tcs3200_BLUE();        
  129.                         LCD_set_XY(1,1);
  130.                         Write_num(R);
  131.                         LCD_set_XY(1,2);
  132.                         Write_num(G);
  133.                         LCD_set_XY(1,3);
  134.                         Write_num(B);
  135.                         ggd;
  136. ddd;
  137.                  r[j]=R;
  138.                  b[j]=B;
  139.                  g[j]=G;
  140.                         if(j==200)
  141.                         {
  142.                                         LCD_set_XY(0,4);
  143.                               LCD_write_str("get");
  144.                                                 Delay_ms(200);
  145.                                 LCD_set_XY(41,4);
  146.                                 LCD_write_str("ready");
  147.                                 Delay_ms(3000);
  148.         break;
  149.                         }        
  150.          }

  151.                 while(1)
  152.                 {
  153.                                                 LCD_set_XY(40,4);
  154.                         Write_num(n);
  155.                         
  156.                         
  157.                         if(n==1) //xunji
  158.                         {
  159.                                                                         i++;
  160.                                   if(i==5900)
  161.                                         {z++;
  162.                                          i=0;
  163.                                         }
  164.                                         LCD_set_XY(40,3);
  165.                         Write_num((z));
  166. GPIO_SetBits(GPIOB, GPIO_Pin_5);
  167.                         TIM4_Mode_Config();        //更新电机状态        
  168.                          states        =        read_state();
  169.                         states        =        read_state();
  170.       if(states==1) left();
  171.                         if(states==3) right();
  172.                         if(states==2) zhizou();
  173.                         if(states==5) left_L();
  174.                         if(states==6) right_L();
  175.                                 n=1;
  176.                         }
  177.                         
  178.                         
  179.                         if(n==2)  //xunji+bizhan
  180.                         {
  181.                         GPIO_SetBits(GPIOB, GPIO_Pin_5);
  182.                         TIM4_Mode_Config();        //更新电机状态        
  183.         
  184.                                         i++;
  185.                                   if(i==5900)
  186.                                         {z++;
  187.                                          i=0;
  188.                                         }
  189.                                         LCD_set_XY(40,3);
  190.                         Write_num((z));
  191.                         states        =        read_state();
  192.       if(states==1) left();
  193.                         if(states==3) right();
  194.                         if(states==2) zhizou();
  195.                         if(states==5) left_L();
  196.                         if(states==6) right_L();
  197.                                                 TIM4_Mode_Config();        //更新电机状态
  198.                                 

  199.                         if(z>17)
  200.                         {
  201.                                                         states        =        read_state();
  202.       if(states==1) leftm();
  203.                         if(states==3) rightm();
  204.                         if(states==2) zhizoum();
  205.                         if(states==5) left_Lm();
  206.                         if(states==6) right_Lm();
  207.                                                 TIM4_Mode_Config();        //更新电机状态
  208.                                                                 UltrasonicWave_StartMeasure();                //开始测距,发送一个>10us的脉冲,然后测量返回的高电平时间
  209.                                                         LCD_set_XY(45,2);
  210.                 Write_num(Ultras_Distance);
  211.                                                                 if(Ultras_Distance        < 13&& Ultras_Distance        >4)
  212.                                         {
  213.                                                 left();
  214.                                         TIM4_Mode_Config();        //更新电机状态                                                
  215.                                         Delay_ms(300);
  216.                                         zhizoumm();               
  217.                                         TIM4_Mode_Config();        //更新电机状态
  218.           Delay_ms(400);        
  219.                                         right();
  220.                                        
  221.                                                 TIM4_Mode_Config();        //更新电机状态
  222.                                         Delay_ms(450);
  223.                                        
  224.                                  

  225.                                         zhizoumm();
  226.                                                                                         TIM4_Mode_Config();        //更新电机状态
  227.             Delay_ms(300);        
  228.                                                 while(1)
  229.                                                 {
  230.                                                 states        =        read_state();
  231.       if(states==1) left();
  232.                         if(states==3) right();
  233.                         if(states==2) zhizou();
  234.                         if(states==5) left_L();
  235.                         if(states==6) right_L();
  236.                                                 TIM4_Mode_Config();        //更新电机状态
  237.                                                 
  238.                                                 }
  239.                                         }
  240.                 }
  241.         }
  242.                         if(n==3)
  243.                         {
  244.                                                                         i++;
  245.                                   if(i==5900)
  246.                                         {z++;
  247.                                          i=0;
  248.                                         }
  249.                                         LCD_set_XY(40,3);
  250.                         Write_num((z));
  251.                                         GPIO_SetBits(GPIOB, GPIO_Pin_5);
  252.                         TIM4_Mode_Config();        //更新电机状态        
  253.                          states        =        read_state();
  254.                         states        =        read_state();
  255.       if(states==1) leftm();
  256.                         if(states==3) rightm();
  257.                         if(states==2) zhizoum();
  258.                         if(states==5) leftm();
  259.                         if(states==6) rightm();
  260.                         
  261.                         
  262.                                           R = tcs3200_RED();
  263.                         G = tcs3200_GREEN();        //取RGB值
  264.                         B = tcs3200_BLUE();        
  265.                         LCD_set_XY(1,1);
  266.                         Write_num(R);
  267.                         LCD_set_XY(1,2);
  268.                         Write_num(G);
  269.                         LCD_set_XY(1,3);
  270.                         Write_num(B);
  271.                         for(m=0;m<201;m++)
  272.                         {
  273.                         if(((R > r[m]-10)&&(R < r[m]+10)) && ((G>g[m]-10)&&(G<g[m]+10)) && ((B>b[m]-10)&&( B<b[m]+10 )))
  274.                         {

  275.                                 gg; dianciu;
  276.                                 LCD_set_XY(0,5);
  277.                               LCD_write_str("get");
  278.                                 
  279.                         }

  280.                         else
  281.                         {
  282.                                                         LCD_set_XY(0,5);
  283.                               LCD_write_str("   ");}
  284.                 }
  285.         }
  286.                         if(n==4)  //xunji+bizhan
  287.                         {
  288.                                                                         i++;
  289.                                   if(i==5900)
  290.                                         {z++;
  291.                                          i=0;
  292.                                         }
  293.                                         LCD_set_XY(40,3);
  294.                         Write_num((z));
  295.                                                         states        =        read_state();
  296.       if(states==1) leftm();
  297.                         if(states==3) rightm();
  298.                         if(states==2) zhizoum();
  299.                         if(states==5) left_Lm();
  300.                         if(states==6) right_Lm();
  301.                                                 TIM4_Mode_Config();        //更新电机状态
  302.                                                                 UltrasonicWave_StartMeasure();                //开始测距,发送一个>10us的脉冲,然后测量返回的高电平时间
  303.                                                         LCD_set_XY(45,2);
  304.                 Write_num(Ultras_Distance);
  305.                                                                 if(Ultras_Distance        < 13&& Ultras_Distance        >4)
  306.                                         {
  307.                                                 left();
  308.                                         TIM4_Mode_Config();        //更新电机状态                                                
  309.                                         Delay_ms(300);
  310.                                         zhizoumm();               
  311.                                         TIM4_Mode_Config();        //更新电机状态
  312.           Delay_ms(400);        
  313.                                         right();
  314.                                        
  315.                                                 TIM4_Mode_Config();        //更新电机状态
  316.                                         Delay_ms(450);
  317.                                        
  318.                                  

  319.                                         zhizoumm();
  320.                                                                                         TIM4_Mode_Config();        //更新电机状态
  321.             Delay_ms(300);        
  322.                                                 while(1)
  323.                                                 {
  324.                                                 states        =        read_state();
  325.       if(states==1) left();
  326.                         if(states==3) right();
  327.                         if(states==2) zhizou();
  328.                         if(states==5) left_L();
  329.                         if(states==6) right_L();
  330.                                                 TIM4_Mode_Config();        //更新电机状态
  331.                                                 
  332.                                                 }
  333.                                                                                        
  334.                                         }
  335.                         }
  336. if(n==5)
  337.                         {
  338.                                 Delay_ms(3000);
  339.                   LCD_set_XY(40,4);
  340.                         Write_num(n);
  341.                          j++;
  342.                         for(j=0;j<101;j++)
  343.                                 {
  344.                   R = tcs3200_RED();
  345.                         G = tcs3200_GREEN();        //取RGB值
  346.                         B = tcs3200_BLUE();        
  347.                         LCD_set_XY(1,1);
  348.                         Write_num(R);
  349.                         LCD_set_XY(1,2);
  350.                         Write_num(G);
  351.                         LCD_set_XY(1,3);
  352.                         Write_num(B);
  353.                         ggd;

  354.                  r1[j]=R;
  355.                  b1[j]=B;
  356.                  g1[j]=G;
  357.          }
  358.                         if(j==101)
  359.                         {
  360.                                         LCD_set_XY(20,0);
  361.                               LCD_write_str("get");
  362.                                                 Delay_ms(200);
  363.                                 LCD_set_XY(20,1);
  364.                 LCD_write_str("ready");
  365.                                 Delay_ms(3000);
  366.          while(1)
  367.          {
  368.                                                                         i++;
  369.                                   if(i==5900)
  370.                                         {z++;
  371.                                          i=0;
  372.                                         }
  373.                                         LCD_set_XY(40,3);
  374.                         Write_num((z));
  375.                                         GPIO_SetBits(GPIOB, GPIO_Pin_5);
  376.                         TIM4_Mode_Config();        //更新电机状态        
  377.                          states        =        read_state();
  378.                         states        =        read_state();
  379.       if(states==1) leftm();
  380.                         if(states==3) rightm();
  381.                         if(states==2) zhizoum();
  382.                         if(states==5) leftm();
  383.                         if(states==6) rightm();
  384.                                                                 LCD_set_XY(40,2);
  385.                         Write_num((456));
  386.                         
  387.                                           R = tcs3200_RED();
  388.                         G = tcs3200_GREEN();        //取RGB值
  389.                         B = tcs3200_BLUE();        
  390.                         LCD_set_XY(1,1);
  391.                         Write_num(R);
  392.                         LCD_set_XY(1,2);
  393.                         Write_num(G);
  394.                         LCD_set_XY(1,3);
  395.                         Write_num(B);
  396.                         for(m=0;m<201;m++)
  397.                         {
  398.                         if(((R > r[m]-10)&&(R < r[m]+10)) && ((G>g[m]-10)&&(G<g[m]+10)) && ((B>b[m]-10)&&( B<b[m]+10 )))
  399.                         {
  400. ……………………

  401. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
V3_超声波+颜色识别+PWM.7z (206.67 KB, 下载次数: 36)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:505045 发表于 2019-5-18 18:22 | 显示全部楼层
楼主可以发给我吗?17382569964@163.com
回复

使用道具 举报

ID:405372 发表于 2019-8-2 15:14 | 显示全部楼层
我来移植下试试看
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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