找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于TCS3200颜色识别实验报告

[复制链接]
ID:263543 发表于 2017-12-19 10:49 | 显示全部楼层 |阅读模式
实验内容;
实验程序;
测试结果

苏州大学 应用技术学院
《电子技术综合设计》实验报告
实验名称
基于TCS3200的颜色识别
班级/小组
15电子转第七组
报告人姓名/学号
付亚茹/13
陈佳玲/22
成澄/34
完成日期
2016.11.16.
《电子技术综合设计》实验报告

实验名称:温度显示仪的设计与制作
苏州大学 应用技术学院
15电子转/第七组
付亚茹/13,陈佳玲/22,成澄/34
2016年11月
目 录
1. 团队风采和作品展示
1.1. 团队风采
1.2. 作品展示
2. 任务
2.1. 描述
2.1.1. 组成
2.1.2. 功能
2.1.3. 性能
2.2. 要求
2.2.1. 基本要求
2.2.2. 扩展要求
3. 方案
3.1. 可选方案
3.1.1. 方案1
3.1.2. 方案2
3.2. 方案确定
3.2.1. 基本结构
3.2.2. 主要思路
4. 设计
4.1. 硬件设计
4.1.1. 核心板
4.1.2. 用户按键
4.1.3. 彩色液晶屏端口
4.2. 软件设计
4.3. 流程图
5. 测试
5.1. 测试内容
5.1.1. 测试结果
5.1.2. 测试评价
6. 总结
6.1. 任务完成情况
6.2. 总结报告

1.     团队风采和作品展示1.1.     团队风采
NO
学号
姓名
分工
1
1516936013
付茹
软件调试,调试
2
1516936022
陈玲
报告撰写,调试
3
1516936034
成澄
硬件测试,调试
4

范新
外援
5

丁杰
外援
团队风采


1.2.     作品展示
作品名称:基于TCS3200的颜色识别
功能描述:小组Logo,白平衡检测,色块显示,液晶显示屏显示等。
(照片标题1:全貌)
(照片标题2:局部1)
(照片标题3:局部2)



2.     任务2.1.     描述2.1.1.     组成
硬件设计是以STM32 OPEN407Z-C测试版,颜色识别传感器以及彩色液晶显示屏组成。
2.1.2.     功能
启动后,在液晶屏上显示欢迎界面,按USER键进入主界面,主界面的屏幕被分为三个部分,其中三个部分:左边为RGB数值,也分上中下三个部分,最上面3个值是白平衡时的值,也就是白色的RGB值;中间3个值是实时测得的RGB值;最后3个HVS是把RGB值转换到HVS值;当传感器放在一种颜色上,按B,C,D键,分别设置此颜色为标准颜色,然后对颜色依次扫描,当扫到标准颜色界面会显示“识别一”,“识别二”,“识别三”;当扫到其它颜色界面会显示“未识别”。
2.1.3.     性能
白平衡检测后可识别三种颜色
2.2.     要求2.2.1.     基本要求
定了标准色后,可识别对应的颜色,其他颜色未识别。
2.2.2.     扩展要求
加上小组logo,在按下指定的几个按键,可识别多种相应的颜色。
3.     方案
3.1.     可选方案
使用KEIL uvision5 软件对STM32 OPEN407Z-C测试版编程。

3.1.1.     方案1
选择使用STM32F103ZET6的开发板。

3.1.2.     方案2
选择使用STM32 OPEN407Z-C的开发板。

3.2.     方案确定3.2.1.     基本结构
使用方案2.
3.2.2.     主要思路
将传感器相应的线连接到开发板,修改编译好的程序下载进入,再通过按键来进行颜色识别。
4.     设计4.1.     硬件设计4.1.1.     核心板
核心板   F407及芯片外围电路

4.1.2.     用户按键

4.1.3.     彩色液晶屏端口
4.2.     软件设计
1. 按键USER控制
  1. /*********************************************************************************
  2. * File                : KEY.C
  3. * Hardware Environment:
  4. * Build Environment   : REALVIEW MDK-ARM  Version: 4.20
  5. * Version             : V1.0
  6. * By                  : DING.J.Q_TEC.SUDA  2013-10-26
  7. *                       Department of Electronics and Information
  8. *                                  (c) Copyright 2013,Applied Technology College
  9. *                                       http://tec.suda.edu.cn
  10. *                                          All Rights Reserved
  11. **********************************************************************************/

  12. //== 包含的 h 文件
  13. #include "KEY.H"
  14. #include "stm32f4xx.h"

  15. //== 定义KEY端口
  16. //-- USER KEY  --> PF10
  17. #define USER_KEY_PORT                                                                      GPIOF
  18. #define USER_KEY_PIN                                                                      GPIO_Pin_10
  19. #define USER_KEY_RCC_AHBPERIPH                                          RCC_AHB1Periph_GPIOF
  20. //-- WAKEUP Key --> PA0
  21. #define WAKEUP_KEY_PORT                                                                      GPIOA
  22. #define WAKEUP_KEY_PIN                                                                      GPIO_Pin_0
  23. #define WAKEUP_KEY_RCC_AHBPERIPH                            RCC_AHB1Periph_GPIOA
  24. //-- JOY Key A-B-C-D-CTR--> PC13-PE6-PE4-PE2-PA5
  25. #define JOY_A_KEY_PORT                                                                      GPIOC
  26. #define JOY_A_KEY_PIN                                                                      GPIO_Pin_13
  27. #define JOY_A_KEY_RCC_AHBPERIPH                                          RCC_AHB1Periph_GPIOC
  28. //--
  29. #define JOY_B_KEY_PORT                                                                      GPIOE
  30. #define JOY_B_KEY_PIN                                                                      GPIO_Pin_6
  31. #define JOY_B_KEY_RCC_AHBPERIPH                                          RCC_AHB1Periph_GPIOE
  32. //--
  33. #define JOY_C_KEY_PORT                                                                      GPIOE
  34. #define JOY_C_KEY_PIN                                                                      GPIO_Pin_4
  35. #define JOY_C_KEY_RCC_AHBPERIPH                                          RCC_AHB1Periph_GPIOE
  36. //--
  37. #define JOY_D_KEY_PORT                                                                      GPIOE
  38. #define JOY_D_KEY_PIN                                                                      GPIO_Pin_2
  39. #define JOY_D_KEY_RCC_AHBPERIPH                                          RCC_AHB1Periph_GPIOE
  40. //--
  41. #define JOY_CTR_KEY_PORT                                                        GPIOA
  42. #define JOY_CTR_KEY_PIN                                                                      GPIO_Pin_5
  43. #define JOY_CTR_KEY_RCC_AHBPERIPH                            RCC_AHB1Periph_GPIOA

  44. //== 定义函数的实现

  45. //-- 初始化 JOY_KEY GPIO
  46. void               JOY_KEY_GPIO_INIT(void){
  47. //  定义 GPIO初始化结构变量
  48.               GPIO_INITTYPEDEF GPIO_INITSTRUCTURE;            
  49. //  使能外设时钟  GPIO PERIPH clock enable
  50.               RCC_AHB1PeriphClockCmd(USER_KEY_RCC_AHBPERIPH | WAKEUP_KEY_RCC_AHBPERIPH | JOY_A_KEY_RCC_AHBPERIPH |
  51.                                                                                                   JOY_B_KEY_RCC_AHBPERIPH |  JOY_C_KEY_RCC_AHBPERIPH |  JOY_D_KEY_RCC_AHBPERIPH |
  52.                                                                                                     JOY_CTR_KEY_RCC_AHBPERIPH, ENABLE);
  53. //  配置输入上拉模式              Configure Input PUSHPULL mode
  54.               GPIO_INITSTRUCTURE.GPIO_PIN = USER_KEY_PIN;
  55.               GPIO_INITSTRUCTURE.GPIO_MODE = GPIO_MODE_IN;
  56.               GPIO_INITSTRUCTURE.GPIO_OTYPE = GPIO_OTYPE_PP;
  57.               GPIO_INITSTRUCTURE.GPIO_SPEED = GPIO_Speed_100MHz;
  58.               GPIO_INITSTRUCTURE.GPIO_PUPD = GPIO_PUPD_UP;
  59.               GPIO_INIT(USER_KEY_PORT, &GPIO_INITSTRUCTURE);
  60. //--
  61.               GPIO_INITSTRUCTURE.GPIO_PIN = WAKEUP_KEY_PIN;
  62.               GPIO_INIT(WAKEUP_KEY_PORT, &GPIO_INITSTRUCTURE);
  63. //--
  64.               GPIO_INITSTRUCTURE.GPIO_PIN = JOY_A_KEY_PIN;
  65.               GPIO_INIT(JOY_A_KEY_PORT, &GPIO_INITSTRUCTURE);
  66.               GPIO_INITSTRUCTURE.GPIO_PIN = JOY_B_KEY_PIN;
  67.               GPIO_INIT(JOY_B_KEY_PORT, &GPIO_INITSTRUCTURE);
  68.               GPIO_INITSTRUCTURE.GPIO_PIN = JOY_C_KEY_PIN;
  69.               GPIO_INIT(JOY_C_KEY_PORT, &GPIO_INITSTRUCTURE);
  70.               GPIO_INITSTRUCTURE.GPIO_PIN = JOY_D_KEY_PIN;
  71.               GPIO_INIT(JOY_D_KEY_PORT, &GPIO_INITSTRUCTURE);
  72.               GPIO_INITSTRUCTURE.GPIO_PIN = JOY_CTR_KEY_PIN;
  73.               GPIO_INIT(JOY_CTR_KEY_PORT, &GPIO_INITSTRUCTURE);

  74. }

  75. //-- 读取状态 JOY_KEY
  76. unsigned char READ_JOY_KEY_STATE(void) {
  77.               if(!GPIO_READINPUTDATABIT(USER_KEY_PORT,USER_KEY_PIN))
  78.                             return USER_KEY;
  79.               else if(!GPIO_READINPUTDATABIT(WAKEUP_KEY_PORT,WAKEUP_KEY_PIN))
  80.                             return WAKEUP_KEY;
  81.               else if(!GPIO_READINPUTDATABIT(JOY_A_KEY_PORT,JOY_A_KEY_PIN))
  82.                             return JOY_A_KEY;
  83.               else if(!GPIO_READINPUTDATABIT(JOY_B_KEY_PORT,JOY_B_KEY_PIN))
  84.                             return JOY_B_KEY;
  85.               else if(!GPIO_READINPUTDATABIT(JOY_C_KEY_PORT,JOY_C_KEY_PIN))
  86.                             return JOY_C_KEY;
  87.               else if(!GPIO_READINPUTDATABIT(JOY_D_KEY_PORT,JOY_D_KEY_PIN))
  88.                             return JOY_D_KEY;
  89.               else if(!GPIO_READINPUTDATABIT(JOY_CTR_KEY_PORT,JOY_CTR_KEY_PIN))
  90.                             return JOY_CTR_KEY;
  91.               return NULL_KEY;
  92. }
  93. //===============
  94. // End of KEY.C
  95. //===============

  96. 2. TCS3200传感器驱动函数
  97. #include "stm32f4xx.h"                  // Device header
  98. #include "tcs3200.h"
  99. //02#include "EXTI.H"
  100. //03#include "DELAY.H"

  101. uint8_t RGENA,GGENA,BGENA;
  102. uint16_t RAMOUNT,GAMOUNT,BAMOUNT;
  103. uint16_t amount;

  104. void tcs3200_init(uint8_t s0,uint8_t s1)
  105. {
  106.               GPIO_INITTYPEDEF GPIO_INITSTRUCTURE;
  107.    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);

  108.               //A0123
  109.   GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
  110. GPIO_INITSTRUCTURE.GPIO_MODE=GPIO_MODE_OUT;
  111. GPIO_INITSTRUCTURE.GPIO_OTYPE=GPIO_OTYPE_PP;
  112.               GPIO_INITSTRUCTURE.GPIO_PUPD=GPIO_PUPD_UP;
  113.               GPIO_INITSTRUCTURE.GPIO_SPEED=GPIO_Speed_50MHz;

  114.               GPIO_INIT(GPIOA,&GPIO_INITSTRUCTURE);            
  115.   GPIO_SETBITS(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);

  116.               //A4
  117. GPIO_INITSTRUCTURE.GPIO_PIN=GPIO_PIN_4;
  118.   GPIO_INITSTRUCTURE.GPIO_MODE=GPIO_MODE_IN;
  119.   GPIO_INITSTRUCTURE.GPIO_OTYPE=GPIO_OTYPE_PP;
  120.               GPIO_INITSTRUCTURE.GPIO_PUPD=GPIO_PUPD_UP;
  121.               GPIO_INITSTRUCTURE.GPIO_SPEED=GPIO_SPEED_50MHZ;

  122. GPIO_INIT(GPIOA,&GPIO_INITSTRUCTURE);            
  123.   GPIO_SETBITS(GPIOA,GPIO_PIN_4);

  124.               if(s0==0)
  125.                             S0L;
  126.               else
  127.                             S0H                            ;
  128.               if(s1==0)
  129.                             S1L;
  130.               else
  131.                             S1H                            ;
  132. }

  133. void WHITEBALANCE(void)
  134. {
  135.               EXTIX_INIT();                            //外部中断初始化
  136.               S2L;S3L;//红色通道
  137.               amount=0;                                          //开始计数
  138.               DELAY_MS(10);
  139.               RGENA = amount;   //求出红色因子     
  140.               amount=0;
  141. //----------------------------------
  142.               S2H;S3H;//绿色通道
  143.               amount=0;
  144.               DELAY_MS(10);
  145.               GGENA = amount;              //求出绿色因子
  146.               amount=0;
  147. //----------------------------------
  148.               S2L;S3H;//蓝色通道
  149.               amount=0;
  150.               DELAY_MS(10);
  151.               BGENA = amount;                //求出蓝色因子
  152.               amount=0;
  153.               S2H;S3L;//关闭通道                 
  154. }

  155. uint16_t tcs3200_RED(void)
  156. {
  157.               S2L;S3L;
  158.               amount=0;
  159.               DELAY_MS(10);
  160.               RAMOUNT=(uint32_t) amount*255/RGENA;              //取R值
  161.               if(RAMOUNT>255) RAMOUNT = 255;
  162.               return RAMOUNT;
  163. //              amount=0;
  164. }

  165. uint16_t tcs3200_GREEN(void)
  166. {
  167.               S2H;S3H;
  168.               amount=0;
  169.               DELAY_MS(10);
  170.               GAMOUNT=(uint32_t) amount*255/GGENA;              //取G值
  171.               if(GAMOUNT>255) GAMOUNT = 255;
  172.               return GAMOUNT;
  173. //              amount=0;
  174. }

  175. uint16_t tcs3200_BLUE(void)
  176. {
  177.               S2L;S3H;
  178.               amount=0;
  179.               DELAY_MS(10);
  180.               BAMOUNT=(uint32_t) amount*255/BGENA;//去B值
  181.               if(BAMOUNT>255) BAMOUNT = 255;
  182.               return BAMOUNT;
  183. //              amount=0;
  184. }


  185. void EXTI4_IRQHandler(void)
  186. {
  187.               amount++;                           
  188.               EXTI->PR=1<<4;
  189. }

  190. void EXTIX_INIT(void)
  191. {
  192.               NVIC_INITTYPEDEF   NVIC_INITSTRUCTURE;
  193.               EXTI_INITTYPEDEF   EXTI_INITSTRUCTURE;

  194.               RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);


  195.               SYSCFG_EXTILINECONFIG(EXTI_PORTSOURCEGPIOA, EXTI_PinSource4);


  196.               EXTI_INITSTRUCTURE.EXTI_LINE = EXTI_LINE4;
  197.   EXTI_INITSTRUCTURE.EXTI_MODE = EXTI_MODE_INTERRUPT;
  198.   EXTI_INITSTRUCTURE.EXTI_TRIGGER = EXTI_TRIGGER_FALLING;
  199.   EXTI_INITSTRUCTURE.EXTI_LINECMD = ENABLE;
  200.   EXTI_INIT(&EXTI_INITSTRUCTURE);


  201. NVIC_INITSTRUCTURE.NVIC_IRQCHANNEL = EXTI4_IRQN;
  202.   NVIC_INITSTRUCTURE.NVIC_IRQCHANNELPREEMPTIONPRIORITY = 0X02;
  203.   NVIC_INITSTRUCTURE.NVIC_IRQCHANNELSUBPRIORITY = 0X02;
  204.   NVIC_INITSTRUCTURE.NVIC_IRQCHANNELCMD = ENABLE;
  205.   NVIC_INIT(&NVIC_INITSTRUCTURE);
  206. }
复制代码


3. 主函数
  1. #include "stm32f4xx.h"
  2. #include "LCD/LCD.H"
  3. #include <STDIO.H>
  4. #include "tcs3200.h"
  5. #include "PICTURE.H"
  6. #include "ASCIILIB.H"
  7. #include "KEY.H"
  8. /*******************************************************************************
  9. * Function Name  : Delay
  10. * Description    : Delay Time
  11. * Input          : - NCOUNT: Delay Time
  12. * Output         : None
  13. * Return         : None
  14. * Attention                            : None
  15. *******************************************************************************/



  16. /*****************************************************************************
  17.    H指hue(色相)、S指saturation(饱和度)、L指lightness(亮度)、V指value(色调)、B指brightness(明度)。


  18.   色相(H)是色彩的基本属性,就是平常所说的颜色名称,如红色、黄色等。
  19.   饱和度(S)是指色彩的纯度,越高色彩越纯,低则逐渐变灰,取0-100%的数值。
  20.   明度(V),亮度(B),取0-100%。              

  21.    0度: 红色,RGB:(255, 0, 0), 255:R, 0:B,G+  
  22.    60度: 黄色,RGB:(255,255, 0),255:G, 0:B, R-  
  23.    120度: 绿色,RGB:( 0,255, 0),255:G, 0:R,B+  
  24.    180度: 青色,RGB:( 0,255,255),255:B, 0:R,G-  
  25.    240度: 蓝色,RGB:( 0, 0,255),255:B, 0:G,R+  
  26.    300度: 紫色,RGB:(255, 0,255),255:R, 0:G,B-  
  27.    360度: 红色,RGB:(255, 0, 0),255:R, 0:B,G+            


  28.   RGB转化到HSV的算法                                                                                          
  29.     max=max(R,G,B)
  30.     min=min(R,G,B)
  31.      if R = max, H = (G-B)/(max-min)
  32.     if G = max, H = 2 + (B-R)/(max-min)
  33.     if B = max, H = 4 + (R-G)/(max-min)
  34.     H = H * 60
  35.     if H < 0, H = H + 360
  36.     V=max(R,G,B)
  37.     S=(max-min)/max
  38. ******************************************************************************/
  39. //============================
  40. void chromatogram(void);  //函数声明
  41. //============================

  42. /*******************************************************************************
  43. * Function Name  : main
  44. * Description    : Main program
  45. * Input          : None
  46. * Output         : None
  47. * Return         : None
  48. * Attention                            : None
  49. *******************************************************************************/
  50. int main(void)
  51. {
  52.               uint8_t ss[20];

  53.               //01添加
  54.               float Max=0,Min=0;
  55.               float Rhsv=0,Ghsv=0,Bhsv=0;
  56.               float H=0,S=0,V=0;
  57.               uint16_t i;
  58.               uint8_t R=0x00,G=0x00,B=0x00;
  59.               uint16_t RGB=0x0000;

  60.               //-- 定义 基准变量
  61.   uint8_t R0=0xff,G0=0xff,B0=0xff,R1=0xff,G1=0xff,B1=0xff,R2=0xff,G2=0xff,B2=0xff,R3=0xff,G3=0xff,B3=0xff,R4=0xff,G4=0xff,B4=0xff;
  62.   int dR0=0,dG0=0,dB0=0;
  63.   uint16_t RGB1=0xff,RGB2=0xff,RGB3=0xff,RGB4=0xff;
  64.               uint8_t wc=50;                            //-- 误差


  65.               //
  66.               NVIC_PRIORITYGROUPCONFIG(NVIC_PriorityGroup_2);//
  67.               LCD_INITIALIZTION();
  68.               JOY_KEY_GPIO_INIT();
  69.               //02添加
  70.               LCD_CLEAR(Yellow);
  71.                             LCD_DRAWPICTURE(0,17,74,91,gImage_picture);
  72.                             GUI_CHINESE(125,40,"苏州大学",BLACK,YELLOW);
  73.                             GUI_CHINESE(105,60,"应用技术学院",BLACK,YELLOW);
  74.                             GUI_TEXT(125,80,"15",Black,Yellow);
  75.                             GUI_CHINESE(140,80,"电子转",BLACK,YELLOW);            
  76.               GUI_CHINESE(80,105,"基于",BLACK,YELLOW);
  77.                             GUI_TEXT(110,105,"TCS3200",Black,Yellow);
  78.                             GUI_CHINESE(170,105,"的颜色识别",BLACK,YELLOW);
  79.                             GUI_CHINESE(80,125,"外援",BLACK,YELLOW);
  80.                             GUI_CHINESE(80+15+15+15,125,"丁高杰",BLACK,YELLOW);
  81.                             GUI_CHINESE(80+15+15+15+15+15+15+15,125,"范佳新",BLACK,YELLOW);
  82.                             GUI_CHINESE(80,150,"陈佳玲",BLACK,YELLOW);            
  83.                             GUI_CHINESE(150,150,"付亚茹",BLACK,YELLOW);
  84.                             GUI_CHINESE(160+15+15+15+15,150,"成澄",BLACK,YELLOW);
  85.                             GUI_TEXT(10,220,"2016.11",BLACK,YELLOW);
  86.     GUI_CHINESE(160,220,"按",BLACK,YELLOW);
  87.                             GUI_TEXT(180,220,"USER",Black,Yellow);
  88.                             GUI_CHINESE(220,220,"键进入主界面",BLACK,YELLOW);
  89. //-- 等待User键
  90.                             while(USER_KEY!=READ_JOY_KEY_STATE())
  91.                                           ;
  92. //-- 进入第二界面  
  93.               //for(i=0;i<20;i++) Delay_Ms(5000);  
  94.   LCD_CLEAR(WHITE);
  95.                             GUI_CHINESE(125,60,"请在此进行",BLACK,RED);
  96.                             GUI_CHINESE(125,80,"白平衡调整",BLACK,RED);
  97.               DELAY_MS(5000);            

  98. //-- 显示 基准色块
  99.               //LCD_DRAWSQUARE(10,170,200,190,RGB0);


  100.               //03添加
  101.               GUI_TEXT(10,210,"TCS3200",RED,WHITE);
  102.   DELAY_MS(5000);
  103.               FOR(I=0;I<20;I++) DELAY_MS(5000);  

  104.               tcs3200_init(1,1);//初始化(速率调整)
  105.               WHITEBALANCE();              //白平衡

  106.               GUI_TEXT(0,0,"Rgena:",Red,White);
  107.               GUI_TEXT(0,18,"Ggena:",Red,White);
  108.               GUI_TEXT(0,36,"Bgena:",Red,White);
  109.               //PUTCHAR(50,0,5,Red,White);  //显示一个数字
  110.               SPRINTF((char *)ss,"%3d",Rgena);
  111.                             GUI_TEXT(50,0,ss,Black,White);
  112.               //PUTCHAR(50,18,6,Red,White);  //显示一个数字
  113.               SPRINTF((char *)ss,"%3d",Ggena);
  114.                             GUI_TEXT(50,18,ss,Black,White);
  115.               //PUTCHAR(50,36,7,Red,White);  //显示一个数字
  116.               SPRINTF((CHAR *)SS,"%3D",BGENA);
  117.                             GUI_TEXT(50,36,ss,Black,White);
  118.               //03添加

  119.               //04添加
  120.               GUI_TEXT(30,50,"R:",Black,White);
  121.               GUI_TEXT(30,70,"G:",Black,White);
  122.               GUI_TEXT(30,90,"B:",Black,White);
  123.               GUI_TEXT(30,110,"H:",Black,White);
  124.               GUI_TEXT(30,130,"V:",Black,White);
  125.               GUI_TEXT(30,150,"S:",Black,White);
  126.               chromatogram();//色谱调出

  127.               /* Infinite loop */
  128.               while (1)
  129.               {


  130. //=================================================================================
  131.                             R = tcs3200_RED();
  132.                             G = tcs3200_GREEN();              //取RGB值
  133.                             B = tcs3200_BLUE();            

  134.                             RGB = 0x0000;
  135.                             RGB |=(unsigned long) R*1000/8225<<11;                                            
  136.                             RGB |=(unsigned long) G*1000/4047<<5;                //转换成屏幕的4W色显示
  137.                             RGB |=(unsigned long) B*1000/8225;                           

  138. //================================================================================
  139.                             RHSV = (float) R/25/10;
  140.                             GHSV = (float) G/25/10;              //RGB转换成0,1.
  141.                             BHSV = (float) B/25/10;

  142. //=================================================================================
  143.                                                                                                                                                                                                                                               //RGB转HSV算法
  144.                             Max = (RHSV>GHSV)?RHSV:GHSV;                                                                                                                  //RGB转HSV算法
  145.                             Max = (MAX>BHSV)?MAX:BHSV;                            //取RGB最大值                            //RGB转HSV算法
  146.                             Min = (RHSV<GHSV)?RHSV:GHSV;                                                                                                                    //RGB转HSV算法
  147.                             Min = (Min<BHSV)?MIN:BHSV;                            //去RGB最小值                                                        //RGB转HSV算法
  148.                                                                                                                                                                                                                                                 //RGB转HSV算法                                                      
  149.                             if(RHSV==Max) H = (GHSV-BHSV)/(Max-Min);                                                        //RGB转HSV算法
  150.                             if(GHSV==Max) H = 2+(BHSV-RHSV)/(Max-Min);                                                                                      //RGB转HSV算法
  151.                             if(BHSV==Max) H = 4+(RHSV-GHSV)/(Max-Min);                                          //RGB转HSV算法
  152.                             H =(INT) (H*60);                                                                                                                                              //RGB转HSV算法
  153.                             if(H<0) H = H+360;                                                                                                                                                                        //RGB转HSV算法
  154.                                                                                                                                                                                                                                               //RGB转HSV算法
  155.                             V = (RHSV>GHSV)?RHSV:GHSV;                                                                                                                              //RGB转HSV算法
  156.                             V = (V>BHSV)?V:BHSV;                            //取V的数值                                                                                                  //RGB转HSV算法
  157.                                                                                                                                                                                                                                                                                            //RGB转HSV算法
  158.                             S = (Max-Min)/Max;                                          //取S的数值                                                                                                                                            //RGB转HSV算法
  159.                                                                                                                                                                                                                                                                                                       //RGB转HSV算法
  160.                             V = (INT) (V*100);                                                                                                                  //RGB转HSV算法
  161.                             S = (INT) (S*100);                                                                                                                                                                                                                     //RGB转HSV算法

  162. //==============================
  163. //-- 记录 基准色块
  164. //              while(USER_KEY == READ_JOY_KEY_STATE())
  165. //                            {
  166. //                            R0=R;G0=G;B0=B;
  167. //                            RGB0=RGB;
  168. //                            LCD_DRAWSQUARE( 233, 60, 317, 120, RGB0 );
  169. //                                          DELAY_MS(100);
  170. //              };
  171.                             /*
  172.               while (JOY_A_KEY == READ_JOY_KEY_STATE())
  173.               {
  174.                                           R1=R;G1=G;B1=B;
  175.                             RGB1=RGB;
  176.                             LCD_DRAWSQUARE( 233, 60, 317, 120, RGB1 );
  177.                                           DELAY_MS(100);
  178.               };              */
  179.               while (JOY_B_KEY == READ_JOY_KEY_STATE())
  180.               {
  181.                                           R2=R;G2=G;B2=B;
  182.                             RGB2=RGB;
  183.                             LCD_DRAWSQUARE( 233, 60, 317, 120, RGB2 );
  184.                                           DELAY_MS(100);
  185.               };
  186.               while (JOY_C_KEY == READ_JOY_KEY_STATE())
  187.               {
  188.                                           R3=R;G3=G;B3=B;
  189.                             RGB3=RGB;
  190.                             LCD_DRAWSQUARE( 233, 60, 317, 120, RGB3 );
  191.                                           DELAY_MS(100);
  192.               };
  193.               while (JOY_D_KEY == READ_JOY_KEY_STATE())
  194.               {
  195.                                           R4=R;G4=G;B4=B;
  196.                             RGB4=RGB;
  197.                             LCD_DRAWSQUARE( 233, 60, 317, 120, RGB4 );
  198.                                           DELAY_MS(100);
  199.               };
  200.               //if
  201. //==============================

  202. //======================================================================================================
  203.               //              PUTCHAR(50,50,R,BLACK,WHITE);  //显示一个数字
  204.                             SPRINTF((CHAR *)SS,"%3D",R);
  205.                             GUI_TEXT(50,50,SS,BLACK,WHITE);
  206.               //              PUTCHAR(50,70,G,BLACK,WHITE);  //显示一个数字
  207.                                           SPRINTF((CHAR *)SS,"%3D",G);
  208.                             GUI_TEXT(50,70,SS,BLACK,WHITE);
  209.                             //PUTCHAR(50,90,B,BLACK,WHITE);  //显示一个数字
  210.                                           SPRINTF((CHAR *)SS,"%3D",B);
  211.                             GUI_TEXT(50,90,SS,BLACK,WHITE);
  212.               //              PUTCHAR(50,110,H,BLACK,WHITE);  //显示一个数字
  213.                                           SPRINTF((CHAR *)SS,"%3.0F",H);
  214.                             GUI_TEXT(50,110,SS,BLACK,WHITE);
  215.               //              PUTCHAR(50,130,V,BLACK,WHITE);  //显示一个数字
  216.                                           SPRINTF((CHAR *)SS,"%3.0F",V);
  217.                             GUI_TEXT(50,130,SS,BLACK,WHITE);
  218.               //              PUTCHAR(50,150,S,BLACK,WHITE);  //显示一个数字
  219.                                           SPRINTF((CHAR *)SS,"%3.0F",S);
  220.                             GUI_TEXT(50,150,SS,BLACK,WHITE);



  221. //==============================
  222. //-- 判断 白色的

  223.               //if(R==255& G == 255& B == 255) {
  224.               //              GUI_CHINESE(50,220,"白色的",BLACK,RED);

  225.               //h}
  226. //-- 判断 基准色

  227.               dR0=R-R0;dG0=G-G0;dB0=B-B0;
  228.               //              PUTCHAR(50,50,R,BLACK,WHITE);  //显示一个数字
  229.                             SPRINTF((CHAR *)SS,"%3D",DR0);
  230.                             GUI_TEXT(240,145,SS,BLACK,WHITE);
  231.               //              PUTCHAR(50,70,G,BLACK,WHITE);  //显示一个数字
  232.                                           SPRINTF((CHAR *)SS,"%3D",DG0);
  233.                             GUI_TEXT(240,165,SS,BLACK,WHITE);
  234.                             //PUTCHAR(50,90,B,BLACK,WHITE);  //显示一个数字
  235.                                           SPRINTF((CHAR *)SS,"%3D",DB0);
  236.                             GUI_TEXT(240,185,ss,Black,White);




  237. //              if ((R>(R0-wc)&&R<(R0+wc)) && (G>(G0-wc) && G<(G0+wc)) && (B>(B0-wc) && B<(B0+wc)) )
  238. //              {
  239. //                              GUI_CHINESE(240,125,"识别一",BLACK,GREEN);
  240. //              }            

  241. // if((R>(R1-wc)&&R<(R1+wc)) && (G>(G1-wc) && G<(G1+wc)) && (B>(B1-wc) && B<(B1+wc)) )
  242. // {
  243. //                                          GUI_CHINESE(240,125,"识别一 ",BLACK,GREEN);
  244. // }
  245. if((R>(R2-wc)&&R<(R2+wc)) && (G>(G2-wc) && G<(G2+wc)) && (B>(B2-wc) && B<(B2+wc)))
  246. {
  247.                                           GUI_CHINESE(240,125,"识别一",BLACK,GREEN);
  248. }

  249. else if((R>(R3-wc)&&R<(R3+wc)) && (G>(G3-wc) && G<(G3+wc)) && (B>(B3-wc) && B<(B3+wc)) )
  250. {
  251.                                           GUI_CHINESE(240,125,"识别二",BLACK,GREEN);
  252. }
  253. else if((R>(R4-wc)&&R<(R4+wc)) && (G>(G4-wc) && G<(G4+wc)) && (B>(B4-wc) && B<(B4+wc)) )
  254. {
  255.                                           GUI_CHINESE(240,125,"识别三",BLACK,GREEN);
  256. }
  257.               else
  258.               {
  259.   GUI_CHINESE(240,125,"未识别",BLACK,RED);

  260.    }

  261.               // GUI_CHINESE(240,125,"未识别",BLACK,RED);
  262. LCD_DRAWSQUARE( 233, 0, 317, 50, RGB );

  263.               }
  264. }

  265. void chromatogram(void)
  266. {

  267.               uint16_t I=0;
  268.               uint16_t color;
  269.               uint16_t RI=0,Gi=0,Bi=0;

  270. //======================================================================                           
  271.               RI = 240;Gi = 0x00;Bi = 0x00;                           
  272.               for(I=0;i<60;i++)
  273.               {
  274.                             color  = (unsigned long) GI*1000/4047<<5;
  275.                             color |= (unsigned long) RI*1000/8225<<11;              //G加上去                                            
  276.                             color |= (unsigned long) Bi*1000/8225;                                         
  277.                             LCD_DRAWLINE(100,i,230,i,color);            

  278.                             GI = Gi+4;            
  279.               }
  280.               RI = 240;Gi = 240;Bi = 0x00;
  281.               for(I=60;i<120;i++)
  282.               {
  283.                             color  = (unsigned long) RI*1000/8225<<11;                                                         
  284.                             color |= (unsigned long) GI*1000/4047<<5;              //R降下来
  285.                             color |= (unsigned long) Bi*1000/8225;            
  286.                             LCD_DRAWLINE(100,i,230,i,color);

  287.                             RI = Ri-4;
  288.               }
  289.               RI = 0x00;Gi = 240;Bi = 0x00;
  290.               for(I=120;i<180;i++)
  291.               {
  292.                             color  = (unsigned long) Bi*1000/8225;            
  293.                             color |= (unsigned long) RI*1000/8225<<11;              //B加上去                                            
  294.                             color |= (unsigned long) GI*1000/4047<<5;
  295.                             LCD_DRAWLINE(100,i,230,i,color);

  296.                             Bi = Bi+4;
  297.               }
  298.               RI = 0x00;Gi = 240;Bi = 240;
  299.               for(I=180;i<240;i++)
  300.               {
  301.                             color  = (unsigned long) GI*1000/4047<<5;
  302.                             color |= (unsigned long) Bi*1000/8225;                            //G降下来
  303.                             color |= (unsigned long) RI*1000/8225<<11;                                                         
  304.                             LCD_DRAWLINE(100,i,230,i,color);

  305.                             GI = Gi-4;
  306.               }
  307.               RI = 0x00;Gi = 0x00;Bi = 240;
  308.               for(I=240;i<300;i++)
  309.               {
  310.                             color = (unsigned long) RI*1000/8225<<11;                                                         
  311.                             color |= (unsigned long) GI*1000/4047<<5;                //R加上去
  312.                             color |= (unsigned long) Bi*1000/8225;            
  313.                             LCD_DRAWLINE(100,i,230,i,color);

  314.                             RI = Ri+4;
  315.               }
  316.               RI = 240;Gi = 0x00;Bi = 240;
  317.               for(i=300;i<360;i++)
  318.               {
  319.                             color  = (unsigned long) Bi*1000/8225;            
  320.                             color |= (unsigned long) RI*1000/8225<<11;                                                         
  321.                             color |= (unsigned long) GI*1000/4047<<5;                            //B降下来
  322.                             LCD_DRAWLINE(100,i,230,i,color);

  323.                             Bi = Bi-4;
  324.               }
  325. //===========================================================================

  326. }
复制代码


4.3.     流程图(见附件)5.1.     测试内容5.1.1.     测试结果
启动后,用液晶屏上显示欢迎界面,按USER键进入主界面,主界面的屏幕被分为三个部分,其中三个部分:左边为RGB数值,也分上中下三个部分,最上面3个值是白平衡时的值,也就是白色的RGB值;中间3个值是实时测得的RGB值;最后3个是把RGB值转换到HVS值;可以识别三种颜色,当传感器放在一种颜色上,按用户键,设置此颜色为标准颜色,然后对颜色依次扫描,当扫到标准颜色界面会显示“识别一”,“识别二”,“识别三”;当扫到其它颜色界面会显示“未识别”。
主界面
识别一:红色
识别二:绿色
识别三:蓝色
未识别:黑色

5.1.2.     测试评价
可以调节按键来分别识别三种颜色,还可以进行深度扩展。
6.     总结6.1.     任务完成情况
基本完成老师所布置的要求,能够很好扫描显示颜色并显示颜色的RGB值,并且在彩色显示屏上显示出来。
6.2.     总结报告
进行了为期一周的实训,我们对RAM开发板有了初步的了解,对TCS3200颜色传感器进行了深入研究。进行调试时,一定要白平衡。在我们的共同努力下,不断地进行调试,终于解决问题。在解决困难的过程中,让我们深刻的体会到,在工作的时候,我们一定要细心、耐心才能最终解决问题以达到实训的最终目的。
这次实训让我们得到了很多的锻炼,也让我们发现了自身的不足与缺陷。最后也很感谢丁老师对于我们实训中帮助和指导。

完整的Word格式文档51黑下载地址:
15电子转-07组-报告.docx (6.92 MB, 下载次数: 63)
回复

使用道具 举报

ID:371593 发表于 2018-7-14 17:13 | 显示全部楼层
很nice
回复

使用道具 举报

ID:421720 发表于 2018-11-6 14:46 | 显示全部楼层
支持很赞
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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