微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > ARM技术讨论 > 环境颜色检测开发套件测评(3)

环境颜色检测开发套件测评(3)

时间:10-02 整理:3721RD 点击:

      在套件的随机U盘中为我们提供了详细的功能源代码,为了便于进行二次开发,我们就来看看源代码的设计思想及实现手段。为了便于理解,将个人的理解直接以注释的方式加在源代码上。

  1. int main(void)      //  主函数
  2. {
  3.        uint16_t txSize;//发送字节数
  4.         uint16_t rxSize;//接收字节数
  5.         uint8_t  LSB,MSB,i;
  6.         uint16_t last_Data;//重新检测数据
  7.         uint32_t sum_data,avr_data,delay_time=100;
  8.         uint8_t times=30;//平均样本数
  9.         /* Generic Initialization */
  10.         SystemCoreClockUpdate();
  11.         Board_Init();   //套件初始化
  12.         /* Setup I2C pin muxing */
  13.         Init_I2C_PinMux();//初始化I2C引脚
  14.         /* Allocate I2C handle, setup I2C rate, and initialize I2C clocking */
  15.         setupI2CMaster();//将I2C设为主模式
  16.         /* Disable the interrupt for the I2C */
  17.         NVIC_DisableIRQ(I2C_IRQn);//禁止I2C中断
  18.        set_lcmGPIO();//设置LCM液晶屏GPIO定义
  19.         LcmInit();     //LCM液晶屏初始化
  20.         PUTImage(LOGO);//显示LOGO图标
  21.        delay_Long(60000);//延时
  22.         LcmClear();//清屏
  23.         Welcome_on();//显示欢迎界面
  24.         delay_Long(60000);//延时
  25.         LcmClear();//清屏
  26.         RGB_data();//设置检测数据的显示格式
  27.         txSize = 2;//发送字节设为2
  28.         rxSize = 0;//接收字节设为0
  29.         txData[0]=0x00;
  30.         txData[1]=0x10;//设置发送的指令
  31.         SetupXferRecAndExecute(I2C_ADDR_7BIT, txData,txSize, rxData, rxSize);
  32.         delay(delay_time);//延时
  33.         last_Data=0;
  34.         txSize = 1;//设发送字节数
  35.         rxSize = 2;//设接收字节数
  36.          /* Enter the task loop */
  37.         while(1) {            //进入循环检测状态
  38.                  sum_data=0;
  39.                  txData[0]=0x08;//读取红色R的检测值
  40.                 for (i=0; i<times; i++)//检测30次以获得平均值
  41.                 {
  42.                         SetupXferRecAndExecute(I2C_ADDR_7BIT, txData,txSize, rxData, rxSize);
  43.                         delay(delay_time);
  44.                         LSB = rxData[0];//获取低字节
  45.                         MSB = rxData[1];//获取高字节
  46.                         last_Data = ((MSB << 8) + LSB);//拼接成一个字
  47.                         sum_data += last_Data;//求累加
  48.                 }
  49.                  avr_data = sum_data/times;//获得平均值
  50.                  PUTchar8x16(4,3,"     ",0);//清除原显示内容
  51.                  PUTNum( 4, 3,avr_data, 0);//输出检测平均值
  52.                  //后面依次为检测绿色、蓝色及白色的结果,处理方法基本一样,就不再进行过多的注释。
  53.                  txData[0]=0x09;  //读取绿色G的检测值
  54.                  sum_data=0;
  55.                  for (i=0; i<times; i++)
  56.                 {
  57.                         SetupXferRecAndExecute(I2C_ADDR_7BIT, txData,txSize, rxData, rxSize);
  58.                         delay(delay_time);
  59.                         LSB = rxData[0];
  60.                         MSB = rxData[1];
  61.                         last_Data = ((MSB << 8) + LSB);
  62.                         sum_data += last_Data;
  63.                 }
  64.                 avr_data = sum_data/times;
  65.                  PUTchar8x16(4,11,"     ",0);
  66.                  PUTNum( 4, 11,avr_data, 0);
  67.                  txData[0]=0x0A;//读取蓝色B的检测值
  68.                 sum_data=0;
  69.                 for (i=0; i<times; i++)
  70.                 {
  71.                         SetupXferRecAndExecute(I2C_ADDR_7BIT, txData,txSize, rxData, rxSize);
  72.                          delay(delay_time);
  73.                         LSB = rxData[0];
  74.                         MSB = rxData[1];
  75.                         last_Data = ((MSB << 8) + LSB);
  76.                         sum_data += last_Data;
  77.                 }
  78.                 avr_data = sum_data/times;
  79.                 PUTchar8x16(6,3,"     ",0);
  80.                 PUTNum( 6, 3,avr_data, 0);
  81.                 txData[0]=0x0B;//读取白色W的检测值
  82.                sum_data=0;
  83.                for (i=0; i<times; i++)
  84.               {
  85.                         SetupXferRecAndExecute(I2C_ADDR_7BIT, txData,txSize, rxData, rxSize);
  86.                         delay(delay_time);
  87.                         LSB = rxData[0];
  88.                         MSB = rxData[1];
  89.                         last_Data = ((MSB << 8) + LSB);
  90.                         sum_data += last_Data;
  91.                 }
  92.                 avr_data = sum_data/times;
  93.                 PUTchar8x16(6,11,"     ",0);
  94.                 PUTNum( 6, 11,avr_data, 0);
  95.                 delay_Long2(20000);
  96.         }
  97. }

复制代码

综上可知,该程序的实现方法是:

1)实现进行全局的初始化;

2)对VEML6040进行相关设置;

3)对LCM_12864进行初始化;

4)以轮询方式依次对红、绿、蓝、白色环境光进行检测并显示

其中用到的关键函数为:

SetupXferRecAndExecute(I2C_ADDR_7BIT, txData,txSize, rxData, rxSize);

这里的I2C_ADDR_7BIT是VEML6040的从地址为0x10,txData为指令字,txSize为指令长度,rxData为检测结果的存储首地址,rxSize为检测结果的长度。

通过查询手册可知,检测红、绿、蓝、白色环境光的指令字分别为08H~0BH,我们在程序中可得到验证。





   此外,为了输出检测结果还主要用到了2个显示函数,分别是字符串显示函数PUTchar8x16(),主要用于清除原显示内容;数值显示函数PUTNum( ),用于显示检测结果。


     作为字符和数字显示的字模,则是存放在Eng.h中,其存储结构如下:

const unsigned char ENGLISH[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",32*/
0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,/*"!",33*/
0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*""",34*/
0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,/*"#",35*/
0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,/*"$",36*/

};


      显示LOGO的数据存放在logo.h中,存储结构为:

const unsigned char LOGO[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};   

       以此为基础,后面再讨论如何在套件上实现中文显示功能等。




Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top