5110屏幕做小车的主显示屏,然后颜色识别传感器
大概就是做到下面这几点
它以在特定赛道上能自主行驶且具有更优性能的智能小车这类复杂工程问题为任务,鼓励组成团队,综合运用多学科知识,提出、分析、设计、开发并研究智能小车的机械结构、电子线路、运动控制和经济成本等问题,让综合工程素质、创新能力、团队协作能力都得到全面的培养和提升。因此,特邀各专业电子设计爱好者参加“自制小车跑道赛”,促进电子设计能力提高和智能小车竞赛活动的普及。
将赛车放置在赛道出发区,赛车应在得到出发信号后5秒之内离开出发区,沿着赛道黑色引导线跑一圈,由计时定位起始线进行自动计时。 小车从赛道出发区离开,赛道黑色引导线上排列若干包裹两组不同颜色(可由自己准备) 的1 元硬币,其中一种颜色硬币二枚,另一种颜色硬币二枚,硬币比赛时随机摆放。由计时起始线开始进行自动计时,小车沿引导线前进,检测到指定颜色的硬币后将其搬运至起点
单片机源程序如下:
- /**
- ******************************************************************************
- * @file main.c
- * @author fire
- * @version V1.0
- * @date 2013-xx-xx
- * @brief USART printf example
- */
-
- #include "stm32f10x.h"
- #include "bsp_SysTick.h"
- #include "bsp_usart1.h"
- #include "UltrasonicWave.h"
- #include "5110.h"
- #include "sys.h"
- #include "tcs3200.h"
- #include "TIM2.h"
- #include "bsp_exti.h"
- #include "bsp_led.h"
- #include "PWM.h"
- #include "trace.h"
- #include "delay.h"
- #include "key.h"
- #include "gpio.h"
- #define CLI() __set_PRIMASK(1) /* 关闭总中断 */
- #define SEI() __set_PRIMASK(0) /* 开放总中断 */
- extern u16 CCR1_Val ;
- extern u16 CCR2_Val ;
- extern u16 CCR3_Val ;
- extern u16 CCR4_Val ;
- u16 state=0;
- u16 past=0;
- extern unsigned short int Ultras_Distance;
- volatile u32 time = 0; // ms 计时变量
- volatile u16 amount = 0; // ms 计时变量
- volatile u8 n = 0; // ms 计时变量
- /**
- * @brief 主函数
- * @param 无
- * @retval 无
- */
-
-
- void Init_NVIC(void)
- {
- NVIC_InitTypeDef NVIC_InitStructure;
-
- #ifdef VECT_TAB_RAM //向量表基地址选择
- NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); //将0x20000000地址作为向量表基地址(RAM)
- #else
- NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); //将0x08000000地址作为向量表基地址(FLASH)
- #endif
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断优先级分组2
- NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //设定中断源为PC13
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //中断占优先级为2
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //副优先级为0
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断
- NVIC_Init(&NVIC_InitStructure); //根据参数初始化中断寄存器
- NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //设定中断源为PE0
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //中断占优先级为1
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //副优先级为0
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断
- NVIC_Init(&NVIC_InitStructure); //根据参数初始化中断寄存器
- }
- void EXTI0_IRQHandler(void)
- {
- if(EXTI_GetITStatus(EXTI_Line0)!= RESET) //判断是否发生中断,发生则中断标志置1
- {
- n++;
- }
- EXTI_ClearITPendingBit(EXTI_Line0); //清楚中断挂起位,重要!!
- }
- int main(void)
- {
- u8 R=0x00,G=0x00,B=0x00;
- u8 R1=0x00,G2=0x00,B3=0x00;
- u8 RR1=0x00,GG2=0x00,BB3=0x00;
- u8 RRR1=0x00,GGG2=0x00,BBB3=0x00;
- u8 RRRR1=0x00,GGGG2=0x00,BBBB3=0x00;
- u8 RRRRR1=0x00,GGGGG2=0x00,BBBBB3=0x00;
- u16 states;
- u16 i=0;
- u8 j=0;
- u8 z=0;
- u8 a=0;
- u8 r[200],b[200],g[200];
- u8 r1[100],b1[100],g1[100];
- u8 m=0;
- /* USART1 config 115200 8-N-1 */
- LCD_GPIO_Init();
- diancid;
-
- USART1_Config();
- LED_GPIO_Config();
- CLI();
- SEI();
- SystemInit();
- delay_init();
- Init_NVIC(); //中断向量表注册函数
- LCD_init();
- LCD_clear();
- LCD_set_XY(0,0);
- LCD_write_str("Nokia5110");
-
- SysTick_Init();
- Init_TI_KEY(); //按键引脚中断初始化
- Delay_us(1000); // 10000 * 10us = 100ms
- TIM4_PWM_Init();
- Delay_us(100); // 10000 * 10us = 100ms
- TIM2_Configuration();
- UltrasonicWave_Configuration();
- Delay_ms(20);
- LED1_OFF;
- LCD_set_XY(40,4);
- Write_num(n);
- tcs3200_init(1,1);//初始化(速率调整)
- whitebalance(); //白平衡
- Delay_ms(3000);
- while(1)
- {
- LCD_set_XY(40,4);
- Write_num(n);
- if(n>5)
- n=0;
- j++;
- R = tcs3200_RED();
- G = tcs3200_GREEN(); //取RGB值
- B = tcs3200_BLUE();
- LCD_set_XY(1,1);
- Write_num(R);
- LCD_set_XY(1,2);
- Write_num(G);
- LCD_set_XY(1,3);
- Write_num(B);
- ggd;
- ddd;
- r[j]=R;
- b[j]=B;
- g[j]=G;
- if(j==200)
- {
- LCD_set_XY(0,4);
- LCD_write_str("get");
- Delay_ms(200);
- LCD_set_XY(41,4);
- LCD_write_str("ready");
- Delay_ms(3000);
- break;
- }
- }
- while(1)
- {
- LCD_set_XY(40,4);
- Write_num(n);
-
-
- if(n==1) //xunji
- {
- i++;
- if(i==5900)
- {z++;
- i=0;
- }
- LCD_set_XY(40,3);
- Write_num((z));
- GPIO_SetBits(GPIOB, GPIO_Pin_5);
- TIM4_Mode_Config(); //更新电机状态
- states = read_state();
- states = read_state();
- if(states==1) left();
- if(states==3) right();
- if(states==2) zhizou();
- if(states==5) left_L();
- if(states==6) right_L();
- n=1;
- }
-
-
- if(n==2) //xunji+bizhan
- {
- GPIO_SetBits(GPIOB, GPIO_Pin_5);
- TIM4_Mode_Config(); //更新电机状态
-
- i++;
- if(i==5900)
- {z++;
- i=0;
- }
- LCD_set_XY(40,3);
- Write_num((z));
- states = read_state();
- if(states==1) left();
- if(states==3) right();
- if(states==2) zhizou();
- if(states==5) left_L();
- if(states==6) right_L();
- TIM4_Mode_Config(); //更新电机状态
-
- if(z>17)
- {
- states = read_state();
- if(states==1) leftm();
- if(states==3) rightm();
- if(states==2) zhizoum();
- if(states==5) left_Lm();
- if(states==6) right_Lm();
- TIM4_Mode_Config(); //更新电机状态
- UltrasonicWave_StartMeasure(); //开始测距,发送一个>10us的脉冲,然后测量返回的高电平时间
- LCD_set_XY(45,2);
- Write_num(Ultras_Distance);
- if(Ultras_Distance < 13&& Ultras_Distance >4)
- {
- left();
- TIM4_Mode_Config(); //更新电机状态
- Delay_ms(300);
- zhizoumm();
- TIM4_Mode_Config(); //更新电机状态
- Delay_ms(400);
- right();
-
- TIM4_Mode_Config(); //更新电机状态
- Delay_ms(450);
-
-
- zhizoumm();
- TIM4_Mode_Config(); //更新电机状态
- Delay_ms(300);
- while(1)
- {
- states = read_state();
- if(states==1) left();
- if(states==3) right();
- if(states==2) zhizou();
- if(states==5) left_L();
- if(states==6) right_L();
- TIM4_Mode_Config(); //更新电机状态
-
- }
- }
- }
- }
- if(n==3)
- {
- i++;
- if(i==5900)
- {z++;
- i=0;
- }
- LCD_set_XY(40,3);
- Write_num((z));
- GPIO_SetBits(GPIOB, GPIO_Pin_5);
- TIM4_Mode_Config(); //更新电机状态
- states = read_state();
- states = read_state();
- if(states==1) leftm();
- if(states==3) rightm();
- if(states==2) zhizoum();
- if(states==5) leftm();
- if(states==6) rightm();
-
-
- R = tcs3200_RED();
- G = tcs3200_GREEN(); //取RGB值
- B = tcs3200_BLUE();
- LCD_set_XY(1,1);
- Write_num(R);
- LCD_set_XY(1,2);
- Write_num(G);
- LCD_set_XY(1,3);
- Write_num(B);
- for(m=0;m<201;m++)
- {
- 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 )))
- {
- gg; dianciu;
- LCD_set_XY(0,5);
- LCD_write_str("get");
-
- }
- else
- {
- LCD_set_XY(0,5);
- LCD_write_str(" ");}
- }
- }
- if(n==4) //xunji+bizhan
- {
- i++;
- if(i==5900)
- {z++;
- i=0;
- }
- LCD_set_XY(40,3);
- Write_num((z));
- states = read_state();
- if(states==1) leftm();
- if(states==3) rightm();
- if(states==2) zhizoum();
- if(states==5) left_Lm();
- if(states==6) right_Lm();
- TIM4_Mode_Config(); //更新电机状态
- UltrasonicWave_StartMeasure(); //开始测距,发送一个>10us的脉冲,然后测量返回的高电平时间
- LCD_set_XY(45,2);
- Write_num(Ultras_Distance);
- if(Ultras_Distance < 13&& Ultras_Distance >4)
- {
- left();
- TIM4_Mode_Config(); //更新电机状态
- Delay_ms(300);
- zhizoumm();
- TIM4_Mode_Config(); //更新电机状态
- Delay_ms(400);
- right();
-
- TIM4_Mode_Config(); //更新电机状态
- Delay_ms(450);
-
-
- zhizoumm();
- TIM4_Mode_Config(); //更新电机状态
- Delay_ms(300);
- while(1)
- {
- states = read_state();
- if(states==1) left();
- if(states==3) right();
- if(states==2) zhizou();
- if(states==5) left_L();
- if(states==6) right_L();
- TIM4_Mode_Config(); //更新电机状态
-
- }
-
- }
- }
- if(n==5)
- {
- Delay_ms(3000);
- LCD_set_XY(40,4);
- Write_num(n);
- j++;
- for(j=0;j<101;j++)
- {
- R = tcs3200_RED();
- G = tcs3200_GREEN(); //取RGB值
- B = tcs3200_BLUE();
- LCD_set_XY(1,1);
- Write_num(R);
- LCD_set_XY(1,2);
- Write_num(G);
- LCD_set_XY(1,3);
- Write_num(B);
- ggd;
- r1[j]=R;
- b1[j]=B;
- g1[j]=G;
- }
- if(j==101)
- {
- LCD_set_XY(20,0);
- LCD_write_str("get");
- Delay_ms(200);
- LCD_set_XY(20,1);
- LCD_write_str("ready");
- Delay_ms(3000);
- while(1)
- {
- i++;
- if(i==5900)
- {z++;
- i=0;
- }
- LCD_set_XY(40,3);
- Write_num((z));
- GPIO_SetBits(GPIOB, GPIO_Pin_5);
- TIM4_Mode_Config(); //更新电机状态
- states = read_state();
- states = read_state();
- if(states==1) leftm();
- if(states==3) rightm();
- if(states==2) zhizoum();
- if(states==5) leftm();
- if(states==6) rightm();
- LCD_set_XY(40,2);
- Write_num((456));
-
- R = tcs3200_RED();
- G = tcs3200_GREEN(); //取RGB值
- B = tcs3200_BLUE();
- LCD_set_XY(1,1);
- Write_num(R);
- LCD_set_XY(1,2);
- Write_num(G);
- LCD_set_XY(1,3);
- Write_num(B);
- for(m=0;m<201;m++)
- {
- 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 )))
- {
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
V3_超声波+颜色识别+PWM.7z
(206.67 KB, 下载次数: 37)
|