打印
[51单片机]

振南ZN-X开发板【51版】高难实验 之 OV7670摄像头+TFT实时显示

[复制链接]
1541|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
znmcu|  楼主 | 2014-10-10 14:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
振南网站还在继续美化改进,暂时提供一个平台来发布振南的实验和相关资料!
http://www.znmcu.cn/znx_51_exp_ov7670_test.html
振南QQ:987582714  群:198521880

OV7670摄像头模块+TFT液晶实时显示实验【51版】
实验说明:
此实验主要完成对OV7670摄像头模块(配FIFO)测试。
此实验中实现OV7670摄像头采集图像实时显示在TFT液晶上。
所需硬件:
此实验中需要的硬件有:
ZN-X开发板基板(51版)【也可以使用自己的开发板,需要将摄像头模块和液晶模块与开发板通过导线相连】
USB转串口模块(用于串口通信与程序下载)
TFT液晶模块
OV7670摄像头模块
电路原理图及详解:
原理图注解:上图是此实验的ZN-X基板(51版)主要原理图(与此实验无关的部分均已裁掉)。ZN-X开发板上有一个OV7670摄像头接口,如图中红圈内它由2x10的双排母接口与摄像头模块插接,TFT模块接口有2x20的双排母接口对接,由原理图知OV7670和液晶模块共用数据线,故写程序要注意控制信号分时复用数据线。如下图所示。
ZN-X开发板右角是USB串口模块专用接口,主要用于完成供电、串口通信与程序下载,如下图。
本基板是51芯片,型号为STC15L2K60S2(60K ROM、2K RAM,主频最高33MHz)。
主要代码详解:
我们这里是使用8位总线方式来驱动TFT模块,8 位模式下使用高8 位(即DB8-DB15)。SCCB总线配置OV7670的代码具体实现细节不再赘述,详细代码请参考基板资料包OV7670程序。
下面是此实验的主函数部分的代码,用以实现摄像头模块采集的数据实时的显示到液晶模块上。
#define GB2T {SET_RCLK(1);SET_RCLK(0);TFT_CON_WR=0;TFT_CON_WR=1;} //更新FIFO输出数据,然后直接写入到TFT液晶
#define G20B2T {GB2T;GB2T;GB2T;GB2T;GB2T;GB2T;GB2T;GB2T;GB2T;GB2T;GB2T;GB2T;GB2T;GB2T;GB2T;GB2T;GB2T;GB2T;GB2T;GB2T;} //从FIFO获取20字节的像素数据写入到TFT中
void main(void)
{
unsigned char test=0;
unsigned char i=0;
TFT_Init();
TFT_Clear(0xf800);
UART_Init();
UART_Send_Str("串口初始化完成.\r\n");
while(!OV7670_Init());
UART_Send_Str("摄像头芯片初始化完成.\r\n");
P0M1=0XFF;P0M0=0X00;P0=0XFF; //将P0设置为高阻输,OV7670模块输出
                              //的像素数据不进入单片机,直接写入到
                              //TFT液晶中,因此单片机的IO要设置为高阻
CM_VSYNC=1; //用于检测场同步VSYNC,准双向IO设置为输入先要置高
while(1)
{
  while(GET_VSYNC());
  while(!GET_VSYNC()); //等待VSYNC信号的上升沿,它代表一帧图像的开始
  SET_WRST(0);
  SET_RCLK(0);
  SET_RCLK(1);
  SET_RCLK(0);
  SET_RCLK(1);           
  SET_WRST(1); //将FIFO的读写地址归0
               //ZN-X开发板上把OV7670模块上FIFO的WRST与RRST接在了一起
               //WRST置0,写地址由OV7670芯片在场同步信号期间的PCLK时钟清0
               //RRST置0,读地址由RCLK时钟清0
               //(读写复位为0时,如读写时钟有两个以上脉冲,则读写地址清0)
  SET_WEN(1); //打开FIFO写使能,以便OV7670将数据灌入FIFO
  while(GET_VSYNC());
  while(!GET_VSYNC()); //等等VSYNC信号的上升沿,它代表前一帧图像已经结束
                       //此时一帧完整的图像已在FIFO中
  SET_WEN(0); //关闭FIFO写使能
  SET_OE(0); //使能FIFO数据输出端口(原本是高阻态)
  TFT_CON_CS=0; //TFT液晶使能
  TFT_CON_RS=1; //切到数据模式
  for(i=0;i<120;i++) //FIFO输出数据直接灌入到TFT液晶(此时TFT液晶为8位模式)
  {
   //下面这种作法是为了提高图像显示的流畅度,提高代码执行效率
   G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;
   G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;
   G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;
   G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;G20B2T;
  }
  TFT_CON_CS=1; //关闭TFT片选
  SET_OE(1); //关闭FIFO数据输出端使能,现呈高阻态
  SET_TEST_PIN(test); //用于测试的LED闪灯,闪灯速度代表了帧频
  test=~test;
}
while(1);
}
实验效果:
源代码下载:


相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:振南的znFAT -- 单片机上上的FAT32文件系统 www.znmcu.cn

4474

主题

5195

帖子

33

粉丝