0.png (10.91 KB, 下載次數: 72)
下載附件
2017-8-9 17:11 上傳
OV7670攝像頭模塊,輸出黑白圖像的辦法:
http://www.zg4o1577.cn/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)
2017-8-9 16:25 上傳
點擊文件名下載附件
ov7670 下載積分: 黑幣 -5
|