标题:
51单片机驱动OV7670可见光定位源程序 9325tp 320x240液晶显示
[打印本页]
作者:
vana
时间:
2017-8-9 16:23
标题:
51单片机驱动OV7670可见光定位源程序 9325tp 320x240液晶显示
0.png
(10.91 KB, 下载次数: 72)
下载附件
2017-8-9 17:11 上传
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)
2017-8-9 16:25 上传
点击文件名下载附件
ov7670
下载积分: 黑币 -5
作者:
hjjkl1
时间:
2017-8-10 10:36
可见光定位,三个LED灯位置如何摆放
作者:
dkh002
时间:
2019-3-11 10:47
楼主大神,我想请教下,你程序里面宏定义了一个#define SCCB_SID_IN 这个有什么意义,还有想问下你这个SCCB的通讯协议是从STM32那个移植过来的吗?
作者:
plj213
时间:
2019-5-2 15:29
谢谢楼主分享。。。
作者:
jemery1030
时间:
2020-10-3 21:13
先謝謝你的程序,下周再來測試,希望順利。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1