找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5526|回复: 5
收起左侧

OV7670在stm32上实现颜色跟踪 EasyTrace演示工程

[复制链接]
ID:161768 发表于 2017-8-11 03:41 | 显示全部楼层 |阅读模式
EasyTrace演示工程
0.png


stm32单片机实现颜色跟踪源程序如下:
  1. //注:此文件代码由王工提供

  2. #include "Sensor.h"
  3. #include "sccb.h"

  4. const  char OV7670_reg[OV7670_REG_NUM][2]=
  5. {         
  6.     /*以下为OV7670 QVGA RGB565参数  */
  7.           {0x3a, 0x04},
  8.     {0x40, 0x10},
  9.         {0x12, 0x14},
  10.         {0x32, 0x80},
  11.         {0x17, 0x16},   
  12.         {0x18, 0x04},//5
  13.         {0x19, 0x02},
  14.         {0x1a, 0x7b},//0x7a,
  15.         {0x03, 0x06},//0x0a,
  16.         {0x0c, 0x0c},
  17.     {0x15, 0x02},
  18.         {0x3e, 0x00},//10
  19.         {0x70, 0x00},
  20.         {0x71, 0x01},
  21.         {0x72, 0x11},
  22.         {0x73, 0x09},//   
  23.         {0xa2, 0x02},//15
  24.         {0x11, 0x00},
  25.         {0x7a, 0x20},
  26.         {0x7b, 0x1c},
  27.         {0x7c, 0x28},
  28.         {0x7d, 0x3c},//20
  29.         {0x7e, 0x55},
  30.         {0x7f, 0x68},
  31.         {0x80, 0x76},
  32.         {0x81, 0x80},
  33.         {0x82, 0x88},
  34.         {0x83, 0x8f},
  35.         {0x84, 0x96},
  36.         {0x85, 0xa3},
  37.         {0x86, 0xaf},
  38.         {0x87, 0xc4},//30
  39.         {0x88, 0xd7},
  40.         {0x89, 0xe8},
  41.         {0x13, 0xe0},
  42.         {0x00, 0x00},//AGC
  43.         {0x10, 0x00},
  44.         {0x0d, 0x00},
  45.         {0x14, 0x30},//0x38, limit the max gain
  46.         {0xa5, 0x05},
  47.         {0xab, 0x07},
  48.         {0x24, 0x75},//40
  49.         {0x25, 0x63},
  50.         {0x26, 0xA5},
  51.         {0x9f, 0x78},
  52.         {0xa0, 0x68},
  53.         {0xa1, 0x03},//0x0b,
  54.         {0xa6, 0xdf},//0xd8,
  55.         {0xa7, 0xdf},//0xd8,
  56.         {0xa8, 0xf0},
  57.         {0xa9, 0x90},  
  58.         {0xaa, 0x94},//50
  59.         {0x13, 0xe5},
  60.         {0x0e, 0x61},
  61.         {0x0f, 0x4b},
  62.         {0x16, 0x02},
  63.         {0x1e, 0x07},//0x07,
  64.         {0x21, 0x02},
  65.         {0x22, 0x91},
  66.         {0x29, 0x07},
  67.         {0x33, 0x0b},
  68.         {0x35, 0x0b},//60
  69.         {0x37, 0x1d},
  70.         {0x38, 0x71},
  71.         {0x39, 0x2a},
  72.         {0x3c, 0x78},
  73.         {0x4d, 0x40},
  74.         {0x4e, 0x20},
  75.         {0x69, 0x5d},
  76.         {0x6b, 0x40},//PLL
  77.         {0x74, 0x19},
  78.         {0x8d, 0x4f},
  79.         {0x8e, 0x00},//70
  80.         {0x8f, 0x00},
  81.         {0x90, 0x00},
  82.         {0x91, 0x00},
  83.         {0x92, 0x00},//0x19,//0x66
  84.         {0x96, 0x00},
  85.         {0x9a, 0x80},
  86.         {0xb0, 0x84},
  87.         {0xb1, 0x0c},
  88.         {0xb2, 0x0e},
  89.         {0xb3, 0x82},//80
  90.         {0xb8, 0x0a},
  91.         {0x43, 0x14},
  92.         {0x44, 0xf0},
  93.         {0x45, 0x34},
  94.         {0x46, 0x58},
  95.         {0x47, 0x28},
  96.         {0x48, 0x3a},
  97.         {0x59, 0x88},
  98.         {0x5a, 0x88},
  99.         {0x5b, 0x44},//90
  100.         {0x5c, 0x67},
  101.         {0x5d, 0x49},
  102.         {0x5e, 0x0e},
  103.         {0x64, 0x04},
  104.         {0x65, 0x20},
  105.         {0x66, 0x05},
  106.         {0x94, 0x04},
  107.         {0x95, 0x08},
  108.         {0x6c, 0x0a},
  109.         {0x6d, 0x55},
  110.         {0x4f, 0x80},
  111.         {0x50, 0x80},
  112.         {0x51, 0x00},
  113.         {0x52, 0x22},
  114.         {0x53, 0x5e},
  115.         {0x54, 0x80},
  116.         {0x6e, 0x11},//100
  117.         {0x6f, 0x9f},//0x9e for advance AWB
  118.     {0x55, 0x00},//亮度
  119.     {0x56, 0x45},//对比度
  120.     {0x57, 0x80},//0x40,  change according to Jim's request             
  121. };

  122. extern const char OV7670_reg[OV7670_REG_NUM][2];

  123. static void delay_us(unsigned long i)
  124. {     
  125.         while( i--);
  126. }

  127. void Sensor_GPIO_Init(void)
  128. {
  129.   GPIO_InitTypeDef GPIO_InitStructure;
  130.    // Enable GPIOC  clock
  131.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  132.   GPIO_InitStructure.GPIO_Pin =  Sensor_VSYNC_BIT;
  133.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;////上拉
  134.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  135.   GPIO_Init(GPIOC, &GPIO_InitStructure);
  136. }

  137. //////////////////////////////////////////////////
  138. ////函数功能:中断配制
  139. //guanfu_wang

  140. void Sensor_Interrupts_Config(void)//VSYNC 中断
  141. {
  142.   NVIC_InitTypeDef NVIC_InitStructure;

  143.   /* Configure one bit for preemption priority */
  144.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  145.   

  146.     /* Configure one bit for preemption priority */
  147.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  148.   
  149.   /* Enable the EXTI9_5 Interrupt */
  150.   NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
  151.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  152.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  153.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  154.   NVIC_Init(&NVIC_InitStructure);
  155. }
  156. ////////////////////////////////////////////////////////////////////////
  157. void Sensor_EXTI_Config(void)//VSYNC 中断
  158. {
  159.   EXTI_InitTypeDef EXTI_InitStructure;
  160.   
  161.   GPIO_EXTILineConfig(GPIO_PORT_SOURCE_VSYNC_CMOS, GPIO_PIN_SOURCE_VSYNC_CMOS);
  162.   EXTI_InitStructure.EXTI_Line = EXTI_LINE_VSYNC_CMOS;
  163.   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  164.   EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  165.   EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  166.   EXTI_Init(&EXTI_InitStructure);
  167.   EXTI_GenerateSWInterrupt(EXTI_LINE_VSYNC_CMOS);

  168. }


  169. ///////////////////////////////////////////////////////////////////////////
  170. //功能:写OV7660寄存器
  171. //返回:1-成功        0-失败
  172. //guanfu_wang
  173. unsigned char wr_Sensor_Reg(unsigned char regID, unsigned char regDat)
  174. {
  175.                 startSCCB();//发送SCCB 总线开始传输命令
  176.         if(0==SCCBwriteByte(0x42))//写地址
  177.         {
  178.                 stopSCCB();//发送SCCB 总线停止传输命令
  179.                 return(0);//错误返回
  180.         }
  181.         delay_us(20);
  182.           if(0==SCCBwriteByte(regID))//积存器ID
  183.         {
  184.                 stopSCCB();//发送SCCB 总线停止传输命令
  185.                 return(0);//错误返回
  186.         }
  187.         delay_us(20);
  188.           if(0==SCCBwriteByte(regDat))//写数据到积存器
  189.         {
  190.                 stopSCCB();//发送SCCB 总线停止传输命令
  191.                 return(0);//错误返回
  192.         }
  193.           stopSCCB();//发送SCCB 总线停止传输命令
  194.        
  195.           return(1);//成功返回
  196. }
  197. ////////////////////////////
  198. //功能:读OV7660寄存器
  199. //返回:1-成功        0-失败
  200. //guanfu_wang
  201. unsigned char rd_Sensor_Reg(unsigned char regID, unsigned char *regDat)
  202. {
  203.         //通过写操作设置寄存器地址
  204.         startSCCB();
  205.         if(0==SCCBwriteByte(0x42))//写地址
  206.         {
  207.                 stopSCCB();//发送SCCB 总线停止传输命令
  208.                 return(0);//错误返回
  209.         }
  210.         delay_us(20);
  211.           if(0==SCCBwriteByte(regID))//积存器ID
  212.         {
  213.                 stopSCCB();//发送SCCB 总线停止传输命令
  214.                 return(0);//错误返回
  215.         }
  216.         stopSCCB();//发送SCCB 总线停止传输命令
  217.        
  218.         delay_us(20);
  219.        
  220.         //设置寄存器地址后,才是读
  221.         startSCCB();
  222.         if(0==SCCBwriteByte(0x43))//读地址
  223.         {
  224.                 stopSCCB();//发送SCCB 总线停止传输命令
  225.                 return(0);//错误返回
  226.         }
  227.         delay_us(20);
  228.           *regDat=SCCBreadByte();//返回读到的值
  229.           noAck();//发送NACK命令
  230.           stopSCCB();//发送SCCB 总线停止传输命令
  231.           return(1);//成功返回
  232. }

  233. /* Sensor_init() */
  234. //返回1成功,返回0失败
  235. //guanfu_wang
  236. unsigned char Sensor_init(void)
  237. {
  238.         unsigned char temp;
  239.        
  240.         unsigned int i=0;
  241.    //      XCLK_init_ON();//开启MCO功能 提供时钟给CMOS传感器
  242.         //uchar ovidmsb=0,ovidlsb=0;
  243.         Sensor_GPIO_Init();
  244.         SCCB_GPIO_Config();//io init..
  245.         
  246.         temp=0x80;
  247.         if(0==wr_Sensor_Reg(0x12, temp)) //Reset SCCB
  248.         {
  249.           return 0 ;//错误返回
  250.         }
  251.    
  252.         delay_us(10000);
  253.        
  254.         if(0==rd_Sensor_Reg(0x0b, &temp))//读ID
  255.         {
  256.                 return 0 ;//错误返回
  257.         }
  258.       
  259.          if(temp==0x73)//OV7670
  260.          {
  261.            for(i=0;i<OV7670_REG_NUM;i++)
  262.            {
  263.                 if( 0==wr_Sensor_Reg(OV7670_reg[i][0],OV7670_reg[i][1]))
  264.                 {
  265.                         return 0;//错误返回
  266.                 }
  267.             }
  268.            
  269.           Sensor_EXTI_Config();
  270.           Sensor_Interrupts_Config();
  271.         }

  272.         return 0x01; //ok   
  273. }
复制代码

所有资料51hei提供下载:
http://www.51hei.com/bbs/dpj-92244-1.html (2楼下载)



回复

使用道具 举报

ID:439705 发表于 2018-12-4 23:48 | 显示全部楼层
hao好好
回复

使用道具 举报

ID:138247 发表于 2019-4-4 16:39 | 显示全部楼层

谢谢分享,,,,,,,,,
回复

使用道具 举报

ID:407518 发表于 2019-12-30 11:28 | 显示全部楼层
不错啊,可以移植性很高哦
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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