OV7670摄像头模块,输出黑白图像的办法:
http://www.51hei.com/bbs/dpj-92273-1.html
OV7670单片机源程序如下:
- #include <STC12C5A.h>
- #include <stdio.h>
- #include "9325tp.h"
- #include "ov7670_fifo.h"
- #include "UART.h"
- void main_init()
- {
- EX0=1; //红外中断
- IT0=1; //下降沿有效
- }
- unsigned char bn=0;
- void main(void)
- {
- unsigned int a,b;
- unsigned int c_data;
-
- unsigned char tmp;
-
- main_init();
- UART1_init();
- UART1_Send_String("UART初始化成功!\r\n");
-
- ILI9325_Initial();
- UART1_Send_String("LCD初始化成功!\r\n");
- CLR_Screen(Blue2);
-
- FIFO_CS_L();
- FIFO_WE_L();
- do
- {
- tmp = Sensor_init();
- }
- while(!tmp);
- UART1_Send_String("OV7670初始化成功!\r\n");
-
- EA=1; //总中断
-
- while(1)
- {
- while(bn!=2)
- {
-
- }
-
- FIFO_RRST_L(); //复位FIFO读指针
- FIFO_RD_L();
- FIFO_RD_H();
- FIFO_RD_L();
- FIFO_RRST_H();
- FIFO_RD_H();
-
- LCD_SetPos(0,239,0,319);
- EA=0;
- for(a=0;a<320;a++)
- {
- for(b=0;b<240;b++)
- {
- FIFO_RD_L();
- c_data = CAMERA2MCU_Data;//读高位
- c_data <<= 8;
- FIFO_RD_H();
- FIFO_RD_L();
- c_data |= CAMERA2MCU_Data;//读低位
- FIFO_RD_H();
-
- Write_Data_U16(c_data);
- }
- }
- EA=1;
- bn=0;
- }
- }
-
- void int0() interrupt 0
- {
- if(bn==0)
- {
- FIFO_WRST_L(); //复位FIFO写指针
- FIFO_RD_L();
- FIFO_RD_H();
- FIFO_RD_L();
- FIFO_WRST_H();
- FIFO_RD_H();
- bn=1;
- FIFO_WE_H();
- }
- else if(bn==1)
- {
- FIFO_WE_L();
- bn=2;
- }
- }
复制代码
ov7670_fifo.c:
- /********************AL422+OV7670外接引脚************************/
- // 1、SCL_SCCB 摄像头输出配置时钟引脚
- // 2、SDA_SCCB 摄像头输出配置数据引脚
- // 3、VSYNC 摄像头的帧信号引脚
- // 4、WEN(WR) AL422 FIFO的输入使能引脚
- // 5、RRST AL422 FIFO的输出复位引脚,可以将地址指针值为0
- // 6、OE/CS(CS) AL422 FIFO的输出使能引脚 ,OE为低电平时,允许数据输出 ,高电平时,数据输出高阻态
- // 7、RCLK/WR(RD) AL422 FIFO的读使能引脚
- // 8、XCLK 摄像头的时钟信号
- // 9、D0~D7 AL422 FIFO的8位数据入口,直接连接摄像头的8位数据输出
- /*****************************************************************/
- /********************AL422+OV7670外接引脚******************************************/
- //1\SIC P2_0
- //2\SID P2_1
- //3\VSYNC P2_2
- //4\WEN P2_3
- //5\RRST P2_4
- //6\CS P2_5
- //7\WR/(RD) P2_6
- /////////////////////////////////////////////////////////////////////////////////////////
- //9\D0~D7 P6_0~P6_7
- /**********************************************************************************/
- /*************************************AL422+OV7670使用方法*************************/
- //1\SCCB 摄像头输出配置
- //2\XCLK 为摄像头提供时钟
- //3\VSYN 场中断的处理,判断是否需要保存和读取图像
- //4\FIFO 对其进行操作,读取图像信息和保存图像信息
- /**********************************************************************************/
- #include <STC12C5A.h>
- #include "ov7670_fifo.h"
- #include "Sensor_config.h"
- void delay_us(unsigned int n)
- {
- n=n>>1;
- while(n--);
- }
- /*
- -----------------------------------------------
- 功能: start命令,SCCB的起始信号
- 参数: 无
- 返回值: 无
- -----------------------------------------------
- */
- void startSCCB(void)
- {
- SCCB_SID_H(); //数据线高电平
- delay_us(50);
- SCCB_SIC_H(); //在时钟线高的时候数据线由高至低
- delay_us(50);
-
- SCCB_SID_L();
- delay_us(50);
- SCCB_SIC_L(); //数据线恢复低电平,单操作函数必要
- delay_us(50);
- }
- /*
- -----------------------------------------------
- 功能: stop命令,SCCB的停止信号
- 参数: 无
- 返回值: 无
- -----------------------------------------------
- */
- void stopSCCB(void)
- {
- SCCB_SID_L();
- delay_us(50);
-
- SCCB_SIC_H();
- delay_us(50);
-
- SCCB_SID_H();
- delay_us(50);
-
- }
- /*
- -----------------------------------------------
- 功能: noAck,用于连续读取中的最后一个结束周期
- 参数: 无
- 返回值: 无
- -----------------------------------------------
- */
- void noAck(void)
- {
-
- SCCB_SID_H();
- delay_us(50);
-
- SCCB_SIC_H();
- delay_us(50);
-
- SCCB_SIC_L();
- delay_us(50);
-
- SCCB_SID_L();
- delay_us(50);
- }
- /*
- -----------------------------------------------
- 功能: 写入一个字节的数据到SCCB
- 参数: 写入数据
- 返回值: 发送成功返回1,发送失败返回0
- -----------------------------------------------
- */
- unsigned char SCCBwriteByte(unsigned char m_data)
- {
- unsigned char j,tem;
-
- for(j=0;j<8;j++) //循环8次发送数据
- {
- if((m_data<<j)&0x80)
- {
- SCCB_SID_H();
- }
- else
- {
- SCCB_SID_L();
- }
- delay_us(50);
- SCCB_SIC_H();
- delay_us(50);
- SCCB_SIC_L();
- delay_us(20);
- }
- //delay_us(50);
- SCCB_SID_IN;/*设置SDA为输入*/
- delay_us(10);
- SCCB_SIC_H();
- delay_us(80);
-
- if(SCCB_SID_STATE){tem=0;} //SDA=1发送失败,返回0}
- else {tem=1;} //SDA=0发送成功,返回1
- SCCB_SIC_L();
- delay_us(50);
- SCCB_SID_OUT;/*设置SDA为输出*/
-
- return (tem);
- }
- /*
- -----------------------------------------------
- 功能: 一个字节数据读取并且返回
- 参数: 无
- 返回值: 读取到的数据
- -----------------------------------------------
- */
- unsigned char SCCBreadByte(void)
- {
- unsigned char read,j;
- read=0x00;
-
- SCCB_SID_IN;/*设置SDA为输入*/
- delay_us(50);
- for(j=8;j>0;j--) //循环8次接收数据
- {
- //delay_us(100);
- SCCB_SIC_H();
- delay_us(50);
- read=read<<1;
- if(SCCB_SID_STATE)
- {
- read=read+1;
- }
- SCCB_SIC_L();
- delay_us(50);
- }
- SCCB_SID_OUT;/*设置SDA为输出*/
- return(read);
- }
- //功能:写OV7660寄存器
- //返回:1-成功 0-失败
- unsigned char wr_Sensor_Reg(unsigned char regID, unsigned char regDat)
- {
- startSCCB();//发送SCCB 总线开始传输命令
- if(0==SCCBwriteByte(0x42))//写地址
- {
- stopSCCB();//发送SCCB 总线停止传输命令
- return(0);//错误返回
- }
- delay_us(20);
- if(0==SCCBwriteByte(regID))//寄存器ID
- {
- stopSCCB();//发送SCCB 总线停止传输命令
- return(0);//错误返回
- }
- delay_us(20);
- if(0==SCCBwriteByte(regDat))//写数据到积存器
- {
- stopSCCB();//发送SCCB 总线停止传输命令
- return(0);//错误返回
- }
- stopSCCB();//发送SCCB 总线停止传输命令
-
- return(1);//成功返回
- }
- //功能:读OV7660寄存器
- //返回:1-成功 0-失败
- unsigned char rd_Sensor_Reg(unsigned char regID, unsigned char *regDat)
- {
- //通过写操作设置寄存器地址
- startSCCB();
- if(0==SCCBwriteByte(0x42))//写地址
- {
- stopSCCB();//发送SCCB 总线停止传输命令
- return(0);//错误返回
- }
- delay_us(20);
- if(0==SCCBwriteByte(regID))//积存器ID
- {
- stopSCCB();//发送SCCB 总线停止传输命令
- return(0);//错误返回
- }
- stopSCCB();//发送SCCB 总线停止传输命令
-
- delay_us(20);
-
- //设置寄存器地址后,才是读
- startSCCB();
- if(0==SCCBwriteByte(0x43))//读地址
- {
- stopSCCB();//发送SCCB 总线停止传输命令
- return(0);//错误返回
- }
- delay_us(20);
- *regDat=SCCBreadByte();//返回读到的值
- noAck();//发送NACK命令
- stopSCCB();//发送SCCB 总线停止传输命令
- return(1);//成功返回
- }
- /* Sensor_init() */
- //返回1成功,返回0失败
- unsigned char Sensor_init(void)
- {
- unsigned char temp;
- unsigned int i=0;
-
- SCCB_SID_OUT; //AL422+OV7670 控制引脚初始化
- camera_DataIn; //摄像头8位数据端口初始化
-
- temp=0x80;
-
- if(0==wr_Sensor_Reg(0x12, temp)) //Reset SCCB
- {
- return 0 ;//错误返回
- }
-
- delay_us(20000);
-
- if(0==rd_Sensor_Reg(0x0b, &temp))//读ID
- {
- return 0 ;//错误返回
- }
-
- if(temp==0x73)//OV7670
- {
- for(i=0;i<OV7670_REG_NUM;i++)
- {
- if( 0==wr_Sensor_Reg(OV7670_reg[i][0],OV7670_reg[i][1]))
- {
- return 0;//错误返回
- }
- }
- }
-
- else if(temp==0x21)//OV7725
- {
- for(i=0;i<OV7725_REG_NUM;i++)
- {
- if( 0==wr_Sensor_Reg(OV7725_reg[i][0],OV7725_reg[i][1]))
- {
- return 0;//错误返回
- }
- }
- }
- return temp; //ok
- }
复制代码
所有资料51hei提供下载:
OV7670摄像头.zip
(78.69 KB, 下载次数: 99)
|