找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机驱动OV7670可见光定位源程序 9325tp 320x240液晶显示

  [复制链接]
跳转到指定楼层
楼主


OV7670摄像头模块,输出黑白图像的办法:
http://www.51hei.com/bbs/dpj-92273-1.html

OV7670单片机源程序如下:
  1. #include <STC12C5A.h>  
  2. #include <stdio.h>
  3. #include "9325tp.h"
  4. #include "ov7670_fifo.h"
  5. #include "UART.h"

  6. void main_init()
  7. {
  8.         EX0=1;          //红外中断
  9.         IT0=1;    //下降沿有效
  10. }
  11. unsigned char bn=0;

  12. void main(void)
  13. {
  14.         unsigned int  a,b;
  15.         unsigned int  c_data;
  16.         
  17.         unsigned char tmp;
  18.         
  19.         main_init();
  20.         UART1_init();
  21.         UART1_Send_String("UART初始化成功!\r\n");
  22.         
  23.         ILI9325_Initial();
  24.         UART1_Send_String("LCD初始化成功!\r\n");

  25.         CLR_Screen(Blue2);  
  26.         
  27.         FIFO_CS_L();
  28.         FIFO_WE_L();
  29.         do
  30.         {
  31.                 tmp = Sensor_init();
  32.         }
  33.         while(!tmp);         
  34.         UART1_Send_String("OV7670初始化成功!\r\n");  
  35.         
  36.         EA=1;          //总中断
  37.         
  38.         while(1)
  39.         {
  40.                 while(bn!=2)
  41.                 {
  42.                
  43.                 }
  44.                
  45.                 FIFO_RRST_L();        //复位FIFO读指针
  46.                 FIFO_RD_L();
  47.                 FIFO_RD_H();
  48.                 FIFO_RD_L();
  49.                 FIFO_RRST_H();
  50.                 FIFO_RD_H();
  51.                
  52.                 LCD_SetPos(0,239,0,319);
  53.                 EA=0;
  54.                 for(a=0;a<320;a++)
  55.                 {
  56.                         for(b=0;b<240;b++)
  57.                         {
  58.                                 FIFO_RD_L();
  59.                                 c_data = CAMERA2MCU_Data;//读高位
  60.                                 c_data <<= 8;
  61.                                 FIFO_RD_H();
  62.                                 FIFO_RD_L();
  63.                                 c_data |= CAMERA2MCU_Data;//读低位
  64.                                 FIFO_RD_H();
  65.                                 
  66.                                 Write_Data_U16(c_data);
  67.                         }
  68.                 }
  69.                 EA=1;
  70.                 bn=0;
  71.         }        
  72. }
  73.         
  74. void int0() interrupt 0
  75. {  
  76.         if(bn==0)
  77.         {
  78.                 FIFO_WRST_L();    //复位FIFO写指针
  79.                 FIFO_RD_L();
  80.                 FIFO_RD_H();
  81.                 FIFO_RD_L();
  82.                 FIFO_WRST_H();
  83.                 FIFO_RD_H();
  84.                 bn=1;
  85.                 FIFO_WE_H();
  86.         }
  87.         else if(bn==1)
  88.         {
  89.                 FIFO_WE_L();
  90.                 bn=2;
  91.         }
  92. }

复制代码

ov7670_fifo.c:

  1. /********************AL422+OV7670外接引脚************************/
  2. // 1、SCL_SCCB       摄像头输出配置时钟引脚           
  3. // 2、SDA_SCCB       摄像头输出配置数据引脚
  4. // 3、VSYNC          摄像头的帧信号引脚
  5. // 4、WEN(WR)        AL422 FIFO的输入使能引脚
  6. // 5、RRST           AL422 FIFO的输出复位引脚,可以将地址指针值为0
  7. // 6、OE/CS(CS)      AL422 FIFO的输出使能引脚 ,OE为低电平时,允许数据输出 ,高电平时,数据输出高阻态     
  8. // 7、RCLK/WR(RD)    AL422 FIFO的读使能引脚
  9. // 8、XCLK           摄像头的时钟信号
  10. // 9、D0~D7          AL422 FIFO的8位数据入口,直接连接摄像头的8位数据输出
  11. /*****************************************************************/

  12. /********************AL422+OV7670外接引脚******************************************/
  13. //1\SIC                P2_0
  14. //2\SID                P2_1
  15. //3\VSYNC              P2_2
  16. //4\WEN                P2_3
  17. //5\RRST               P2_4
  18. //6\CS                 P2_5
  19. //7\WR/(RD)            P2_6
  20. /////////////////////////////////////////////////////////////////////////////////////////         
  21. //9\D0~D7              P6_0~P6_7
  22. /**********************************************************************************/


  23. /*************************************AL422+OV7670使用方法*************************/
  24. //1\SCCB      摄像头输出配置
  25. //2\XCLK      为摄像头提供时钟
  26. //3\VSYN      场中断的处理,判断是否需要保存和读取图像
  27. //4\FIFO      对其进行操作,读取图像信息和保存图像信息
  28. /**********************************************************************************/
  29. #include <STC12C5A.h>
  30. #include "ov7670_fifo.h"
  31. #include "Sensor_config.h"

  32. void delay_us(unsigned int n)
  33. {
  34.         n=n>>1;
  35.         while(n--);
  36. }

  37. /*
  38. -----------------------------------------------
  39.    功能: start命令,SCCB的起始信号
  40.    参数: 无
  41. 返回值: 无
  42. -----------------------------------------------
  43. */
  44. void startSCCB(void)
  45. {
  46.     SCCB_SID_H();     //数据线高电平
  47.     delay_us(50);

  48.     SCCB_SIC_H();     //在时钟线高的时候数据线由高至低
  49.     delay_us(50);

  50.     SCCB_SID_L();
  51.     delay_us(50);

  52.     SCCB_SIC_L();     //数据线恢复低电平,单操作函数必要
  53.     delay_us(50);
  54. }


  55. /*
  56. -----------------------------------------------
  57.    功能: stop命令,SCCB的停止信号
  58.    参数: 无
  59. 返回值: 无
  60. -----------------------------------------------
  61. */
  62. void stopSCCB(void)
  63. {
  64.     SCCB_SID_L();
  65.     delay_us(50);

  66.     SCCB_SIC_H();        
  67.     delay_us(50);
  68.   

  69.     SCCB_SID_H();        
  70.     delay_us(50);
  71.    
  72. }

  73. /*
  74. -----------------------------------------------
  75.    功能: noAck,用于连续读取中的最后一个结束周期
  76.    参数: 无
  77. 返回值: 无
  78. -----------------------------------------------
  79. */
  80. void noAck(void)
  81. {
  82.         
  83.         SCCB_SID_H();        
  84.         delay_us(50);
  85.         
  86.         SCCB_SIC_H();        
  87.         delay_us(50);
  88.         
  89.         SCCB_SIC_L();        
  90.         delay_us(50);
  91.         
  92.         SCCB_SID_L();        
  93.         delay_us(50);

  94. }

  95. /*
  96. -----------------------------------------------
  97.    功能: 写入一个字节的数据到SCCB
  98.    参数: 写入数据
  99. 返回值: 发送成功返回1,发送失败返回0
  100. -----------------------------------------------
  101. */
  102. unsigned char SCCBwriteByte(unsigned char m_data)
  103. {
  104.   unsigned char j,tem;
  105.   
  106.   for(j=0;j<8;j++) //循环8次发送数据
  107.   {
  108.     if((m_data<<j)&0x80)
  109.     {
  110.        SCCB_SID_H();        
  111.     }
  112.     else
  113.     {
  114.        SCCB_SID_L();        
  115.     }
  116.     delay_us(50);
  117.     SCCB_SIC_H();        
  118.     delay_us(50);
  119.     SCCB_SIC_L();        
  120.     delay_us(20);
  121.   }
  122.   //delay_us(50);
  123.   SCCB_SID_IN;/*设置SDA为输入*/
  124.   delay_us(10);
  125.   SCCB_SIC_H();        
  126.   delay_us(80);
  127.   
  128.   if(SCCB_SID_STATE){tem=0;}   //SDA=1发送失败,返回0}
  129.   else {tem=1;}   //SDA=0发送成功,返回1
  130.   SCCB_SIC_L();        
  131.   delay_us(50);        
  132.   SCCB_SID_OUT;/*设置SDA为输出*/
  133.   
  134.   return (tem);  
  135. }

  136. /*
  137. -----------------------------------------------
  138.    功能: 一个字节数据读取并且返回
  139.    参数: 无
  140. 返回值: 读取到的数据
  141. -----------------------------------------------
  142. */
  143. unsigned char SCCBreadByte(void)
  144. {
  145.         unsigned char read,j;
  146.         read=0x00;
  147.         
  148.         SCCB_SID_IN;/*设置SDA为输入*/
  149.         delay_us(50);
  150.         for(j=8;j>0;j--) //循环8次接收数据
  151.         {                     
  152.                 //delay_us(100);
  153.                 SCCB_SIC_H();
  154.                 delay_us(50);
  155.                 read=read<<1;
  156.                 if(SCCB_SID_STATE)
  157.                 {
  158.                         read=read+1;
  159.                 }
  160.                 SCCB_SIC_L();
  161.                 delay_us(50);
  162.         }        
  163.     SCCB_SID_OUT;/*设置SDA为输出*/
  164.         return(read);
  165. }

  166. //功能:写OV7660寄存器
  167. //返回:1-成功        0-失败
  168. unsigned char wr_Sensor_Reg(unsigned char regID, unsigned char regDat)
  169. {
  170.   startSCCB();//发送SCCB 总线开始传输命令
  171.   if(0==SCCBwriteByte(0x42))//写地址
  172.   {
  173.     stopSCCB();//发送SCCB 总线停止传输命令
  174.     return(0);//错误返回
  175.   }
  176.   delay_us(20);
  177.   if(0==SCCBwriteByte(regID))//寄存器ID
  178.   {
  179.     stopSCCB();//发送SCCB 总线停止传输命令
  180.     return(0);//错误返回
  181.   }
  182.   delay_us(20);
  183.   if(0==SCCBwriteByte(regDat))//写数据到积存器
  184.   {
  185.     stopSCCB();//发送SCCB 总线停止传输命令
  186.     return(0);//错误返回
  187.   }
  188.   stopSCCB();//发送SCCB 总线停止传输命令
  189.   
  190.   return(1);//成功返回
  191. }

  192. //功能:读OV7660寄存器
  193. //返回:1-成功        0-失败
  194. unsigned char rd_Sensor_Reg(unsigned char regID, unsigned char *regDat)
  195. {
  196.         //通过写操作设置寄存器地址
  197.         startSCCB();
  198.         if(0==SCCBwriteByte(0x42))//写地址
  199.         {
  200.                 stopSCCB();//发送SCCB 总线停止传输命令
  201.                 return(0);//错误返回
  202.         }
  203.         delay_us(20);
  204.           if(0==SCCBwriteByte(regID))//积存器ID
  205.         {
  206.                 stopSCCB();//发送SCCB 总线停止传输命令
  207.                 return(0);//错误返回
  208.         }
  209.         stopSCCB();//发送SCCB 总线停止传输命令
  210.         
  211.         delay_us(20);
  212.         
  213.         //设置寄存器地址后,才是读
  214.         startSCCB();
  215.         if(0==SCCBwriteByte(0x43))//读地址
  216.         {
  217.                 stopSCCB();//发送SCCB 总线停止传输命令
  218.                 return(0);//错误返回
  219.         }
  220.         delay_us(20);
  221.           *regDat=SCCBreadByte();//返回读到的值
  222.           noAck();//发送NACK命令
  223.           stopSCCB();//发送SCCB 总线停止传输命令
  224.           return(1);//成功返回
  225. }

  226. /* Sensor_init() */
  227. //返回1成功,返回0失败
  228. unsigned char Sensor_init(void)
  229. {
  230.   unsigned char temp;
  231.   unsigned int i=0;
  232.   
  233.   SCCB_SID_OUT;  //AL422+OV7670 控制引脚初始化
  234.   camera_DataIn; //摄像头8位数据端口初始化
  235.   
  236.   temp=0x80;
  237.   
  238.   if(0==wr_Sensor_Reg(0x12, temp)) //Reset SCCB
  239.   {
  240.     return 0 ;//错误返回
  241.   }
  242.   
  243.   delay_us(20000);
  244.   
  245.   if(0==rd_Sensor_Reg(0x0b, &temp))//读ID
  246.   {
  247.     return 0 ;//错误返回
  248.   }
  249.   
  250.   if(temp==0x73)//OV7670
  251.   {
  252.     for(i=0;i<OV7670_REG_NUM;i++)
  253.     {
  254.       if( 0==wr_Sensor_Reg(OV7670_reg[i][0],OV7670_reg[i][1]))
  255.       {
  256.         return 0;//错误返回
  257.       }
  258.     }
  259.   }
  260.   
  261.   else if(temp==0x21)//OV7725
  262.   {
  263.     for(i=0;i<OV7725_REG_NUM;i++)
  264.     {
  265.       if( 0==wr_Sensor_Reg(OV7725_reg[i][0],OV7725_reg[i][1]))
  266.       {
  267.         return 0;//错误返回
  268.       }
  269.     }
  270.   }
  271.   return temp; //ok
  272. }
复制代码


所有资料51hei提供下载:
OV7670摄像头.zip (78.69 KB, 下载次数: 99)


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

使用道具 举报

沙发
ID:226478 发表于 2017-8-10 10:36 | 只看该作者
可见光定位,三个LED灯位置如何摆放
回复

使用道具 举报

板凳
ID:487629 发表于 2019-3-11 10:47 | 只看该作者
楼主大神,我想请教下,你程序里面宏定义了一个#define SCCB_SID_IN       这个有什么意义,还有想问下你这个SCCB的通讯协议是从STM32那个移植过来的吗?
回复

使用道具 举报

地板
ID:138247 发表于 2019-5-2 15:29 | 只看该作者

谢谢楼主分享。。。
回复

使用道具 举报

5#
ID:585455 发表于 2020-10-3 21:13 | 只看该作者
先謝謝你的程序,下周再來測試,希望順利。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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