找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2225|回复: 0
打印 上一主题 下一主题
收起左侧

stm32 操控 ov7670 图像识别源程序

[复制链接]
跳转到指定楼层
楼主
ID:594461 发表于 2019-8-3 10:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题

  1. #include <stdio.h>
  2. #include <math.h>
  3. #include "led.h"
  4. #include "delay.h"
  5. #include "key.h"
  6. #include "sys.h"
  7. #include "lcd.h"
  8. #include "usart.h"         
  9. #include "string.h"
  10. #include "ov7725.h"
  11. #include "tpad.h"
  12. #include "timer.h"
  13. #include "exti.h"
  14. #include "usmart.h"
  15. #include "color.h"
  16. #include "xd.h"
  17. #include "ov7670.h"


  18. //传感器名字宏定义
  19. #define  OV7725 1
  20. #define  OV7670 2

  21. #define uchar unsigned char
  22. uchar xx,yy,m2;
  23. int yc,xc,ENA,ENB;

  24. //由于OV7725传感器安装方式原因,OV7725_WINDOW_WIDTH相当于LCD的高度,OV7725_WINDOW_HEIGHT相当于LCD的宽度
  25. //注意:此宏定义只对OV7725有效
  26. #define  OV7725_WINDOW_WIDTH                320 // <=320
  27. #define  OV7725_WINDOW_HEIGHT                240 // <=240


  28. //const u8*LMODE_TBL[5]={"Auto","Sunny","Cloudy","Office","Home"};                                                        //5种光照模式            
  29. //const u8*EFFECTS_TBL[7]={"Normal","Negative","B&W","Redish","Greenish","Bluish","Antique"};        //7种特效
  30. extern u8 ov_sta;        //在exit.c里 面定义
  31. extern u8 ov_frame;        //在timer.c里面定义                 


  32. //更新LCD显示
  33. //void camera_refresh(void)
  34. //{
  35. //        u32 j,i;
  36. //         u16 color;  
  37. //        if(ov_sta)//有帧中断更新?
  38. //        {
  39. //                LCD_Scan_Dir(U2D_L2R);                //从上到下,从左到右  
  40. //                if(lcddev.id==0X1963)LCD_Set_Window((lcddev.width-240)/2,(lcddev.height-320)/2,240,320);//将显示区域设置到屏幕中央
  41. //                else if(lcddev.id==0X5510||lcddev.id==0X5310)LCD_Set_Window((lcddev.width-320)/2,(lcddev.height-240)/2,320,240);//将显示区域设置到屏幕中央
  42. //                LCD_WriteRAM_Prepare();     //开始写入GRAM       
  43. ////                OV7725_RRST=0;                                //开始复位读指针
  44. ////                OV7725_RCK_L;
  45. ////                OV7725_RCK_H;
  46. ////                OV7725_RCK_L;
  47. ////                OV7725_RRST=1;                                //复位读指针结束
  48. ////                OV7725_RCK_H;
  49. //                OV7670_RRST=0;                                //开始复位读指针
  50. //                OV7670_RCK_L;
  51. //                OV7670_RCK_H;
  52. //                OV7670_RCK_L;
  53. //                OV7670_RRST=1;                                //复位读指针结束
  54. //                OV7670_RCK_H;
  55. //                for(i=0;i<OV7725_WINDOW_HEIGHT;i++)
  56. //                {
  57. //                        for(j=0;j<OV7725_WINDOW_WIDTH;j++)
  58. //                        {
  59. //                                OV7725_RCK_L;
  60. //                                color=GPIOC->IDR&0XFF;        //读数据
  61. //                                OV7725_RCK_H;
  62. //                                color<<=8;  
  63. //                                OV7725_RCK_L;
  64. //                                color|=GPIOC->IDR&0XFF;        //读数据
  65. //                                OV7725_RCK_H;
  66. //                                LCD->LCD_RAM=color;  
  67. //                        }
  68. //                }                                       
  69. //                 ov_sta=0;                                        //清零帧中断标记
  70. //                ov_frame++;
  71. //                LCD_Scan_Dir(DFT_SCAN_DIR);        //恢复默认扫描方向
  72. //        if(Trace(&condition, &result))
  73. //                {
  74. //            LCD_DrawRectangle( result.x-result.w/2, result.y-result.h/2, result.x-result.w/2+result.w,  result.y-result.h/2+result.h);
  75. //            LCD_DrawRectangle( result.x-2, result.y-2,result.x+2, result.y+2);
  76. //                       
  77. //                             
  78. //                              xx=result.x;yy=result.y;
  79. //            LCD_ShowNum(1,280.,xx,3,16);
  80. //                        LCD_ShowNum(1,300.,yy,3,16);                       
  81. //                }   
  82. //                   else  {xx=0;yy=0; LCD_ShowNum(1,280.,xx,3,16);LCD_ShowNum(1,300.,yy,3,16);}
  83. //        }
  84. //}         

  85. void camera_refresh(void)
  86. {
  87.         u32 j,i;
  88.         u16 color;  
  89.         if(ov_sta)//有帧中断更新?
  90.         {
  91.                 LCD_Scan_Dir(U2D_L2R);                //从上到下,从左到右  
  92.                 if(lcddev.id==0X1963)LCD_Set_Window((lcddev.width-240)/2,(lcddev.height-320)/2,240,320);//将显示区域设置到屏幕中央
  93.                 else if(lcddev.id==0X5510||lcddev.id==0X5310)LCD_Set_Window((lcddev.width-320)/2,(lcddev.height-240)/2,320,240);//将显示区域设置到屏幕中央
  94.                 LCD_WriteRAM_Prepare();     //开始写入GRAM       
  95. //                OV7725_RRST=0;                                //开始复位读指针
  96. //                OV7725_RCK_L;
  97. //                OV7725_RCK_H;
  98. //                OV7725_RCK_L;
  99. //                OV7725_RRST=1;                                //复位读指针结束
  100. //                OV7725_RCK_H;
  101.                 OV7670_RRST=0;                                //开始复位读指针
  102.                 OV7670_RCK_L;
  103.                 OV7670_RCK_H;
  104.                 OV7670_RCK_L;
  105.                 OV7670_RRST=1;                                //复位读指针结束
  106.                 OV7670_RCK_H;
  107.                 for(i=0;i<OV7725_WINDOW_HEIGHT;i++)
  108.                 {
  109.                         for(j=0;j<OV7725_WINDOW_WIDTH;j++)
  110.                         {
  111.                                 OV7670_RCK_L;
  112.                         color=GPIOC->IDR&0XFF;        //读数据
  113.                         OV7670_RCK_H;
  114.                         color<<=8;  
  115.                         OV7670_RCK_L;
  116.                         color|=GPIOC->IDR&0XFF;        //读数据
  117.                         OV7670_RCK_H;
  118.                         LCD->LCD_RAM=color;
  119.                         }
  120.                 }                                       
  121.                 ov_sta=0;                                        //清零帧中断标记
  122.                 ov_frame++;
  123.                 LCD_Scan_Dir(DFT_SCAN_DIR);        //恢复默认扫描方向
  124.         if(Trace(&condition, &result))
  125.                 {
  126.             LCD_DrawRectangle( result.x-result.w/2, result.y-result.h/2, result.x-result.w/2+result.w,  result.y-result.h/2+result.h);
  127.             LCD_DrawRectangle( result.x-2, result.y-2,result.x+2, result.y+2);
  128.                        
  129.                              
  130.                               xx=result.x;yy=result.y;
  131.             LCD_ShowNum(1,280.,xx,3,16);
  132.                         LCD_ShowNum(1,300.,yy,3,16);                       
  133.                 }   
  134.                    else  {xx=0;yy=0; LCD_ShowNum(1,280.,xx,3,16);LCD_ShowNum(1,300.,yy,3,16);}
  135.         }
  136. }         



  137. u16 a,b,c;
  138. u16 t=0;
  139. u8 key;
  140. u8 lightmode=4,saturation=2,contrast=2;
  141. u8 effect=0;

  142. int main(void)
  143. {       
  144.          
  145.         u8 i=0;            
  146.         u8 msgbuf[15];                                //消息缓存区
  147.         u8 tm=0;

  148.         delay_init();                     //延时函数初始化          
  149.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
  150.         uart_init(115200);                 //串口初始化为 115200
  151.         usmart_dev.init(72);                //初始化USMART               
  152.         XD_Init();
  153.         LED_Init();                                          //初始化与LED连接的硬件接口
  154.         KEY_Init();                                        //初始化按键
  155.         LCD_Init();                                           //初始化LCD  
  156.         TPAD_Init(6);                                //触摸按键初始化
  157.   
  158.   TIM3_PWM_Init(899,0);
  159.         TIM3_PWM2_Init(899,0);
  160.          
  161.         POINT_COLOR=RED;                        //设置字体为红色
  162.         LCD_ShowString(30,10,200,16,16,"WJS STM32");
  163.         LCD_ShowString(30,70,200,16,16,"ATOM@ALIENTEK");
  164.         LCD_ShowString(30,90,200,16,16,"2018/8/5");
  165.   LCD_ShowString(30,110,200,16,16,"OV7725 Init...");         
  166.         while(OV7670_Init())//初始化OV7670
  167.         {
  168.                 LCD_ShowString(30,210,200,16,16,"OV7725 Error!!");
  169.                 delay_ms(200);
  170.           LCD_Fill(30,210,239,246,WHITE);
  171.                 delay_ms(200);
  172.         }
  173.         LCD_ShowString(30,210,200,16,16,"OV7725 Init OK");
  174.         delay_ms(1500);                  
  175.   OV7670_Brightness(-2);
  176.         OV7670_Contrast(-2);
  177.         TIM6_Int_Init(9999,7199);                        //10Khz计数频率,1秒钟中断                                                                          
  178.         EXTI8_Init();                                                //使能定时器捕获
  179. //        OV7670_Window_Set(320,240,1);        //设置窗口          
  180. //  OV7725_CS=0;       
  181.        
  182.         OV7670_Window_Set(12,176,240,320);        //设置窗口          
  183.   OV7670_CS=0;
  184.         LCD_Clear(BLACK);       
  185.         while(1)
  186.         {
  187.    
  188.                 POINT_COLOR=BLACK;   
  189.     camera_refresh();//更新显示
  190.                 printf("x =  %d \r\n",xx);
  191.     printf("y =  %d \r\n",yy);
  192.        
  193.     yc=yy-220;
  194.                 xc=xx-220;
  195.                 yc=abs(yc);
  196.                 xc=abs(xc);
  197.                 ENA=yc*2+xc*1.7;
  198.                 ENB=yc*2-xc*1.7;
  199.                 if((xx<150)&&(xx>70)&&(yy<150)&&(yy>70))       {tz();ENA=0;ENB=0;}
  200.                 else if((xx<150)&&(xx>70)&&(yy<220)&&(yy>140)) {qj();}
  201.                 else if((xx<150)&&(xx>70)&&(yy<70)&&(yy>0))    {ht();}
  202.                 else if((xx<220)&&(xx>140)&&(yy<220)&&(yy>0))  {zz();}
  203.                 else if((xx<70)&&(xx>0)&&(yy<220)&&(yy>0))     {yz();}
  204.     TIM_SetCompare2(TIM3,ENA);//ENA
  205.                 TIM_SetCompare3(TIM3,ENB); //ENB
  206.        
  207.                        
  208.         }          
  209.        
  210. }
复制代码


颜色识别小车.7z

1.31 MB, 下载次数: 37, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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