迪文科技论坛

 找回密码
 立即注册
搜索
查看: 3167|回复: 11

【开源】"迪文屏驱动OV2640摄像头"的项目

[复制链接]

12

主题

70

回帖

2126

积分

金牌会员

Rank: 6Rank: 6

积分
2126
发表于 2021-3-28 21:27:50 | 显示全部楼层 |阅读模式
这次应网友"奔奔仔"的要求,开源"迪文屏驱动OV2640摄像头"的项目,下次还有机会的话,应该是应网友"1715605760"的要求,用C来写一个优雅的MODBUS通讯架构(RTU主机模式)!


    好,废话不多说,先看本次开源项目的一些细节,我使用的是EK043迪文屏,因为此迪文屏把IO引脚全部引出来了,方便我通过杜邦线连接OV2640摄像头,这种摄像头在淘宝很容易买到,请确保迪文屏和摄像头之间的杜邦线或者飞线尽量短,否则可能会造成出不来图片,或者图片卡死等情况,本项目也是由二部分源码组成,分别是GUI代码和C51代码.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

12

主题

70

回帖

2126

积分

金牌会员

Rank: 6Rank: 6

积分
2126
 楼主| 发表于 2021-3-28 21:28:01 | 显示全部楼层

二.C51代码部分
      这部分的核心主要是OV2640摄像头的驱动代码以及jpg图片的显示代码,对于OV2640的驱动代码,主要由如下图中的5个文件组成:
                                    
因为OV2640摄像头是采用SCCB接口对外通信的,这种接口类似于IIC接口,下面我再给出OV2640与EK043迪文屏的硬件连线说明,如下代码所示:
    sbit OV2640_PWDN         = P2^2; //POWER DOWN控制信号
    sbit OV2640_RST         = P2^3;         //复位控制信号
    sbit OV2640_VSYNC = P2^4;             //VSYNC信号
    sbit OV2640_HREF         = P2^5; //HREF信号
    sbit OV2640_PCLK         = P2^6;         //PCLK信号
    #define OV2640_DATA   P1             //数据输入端口,8位
    sbit SCCB_SCL = P2^0;               //SCCB接口的SCL
    sbit SCCB_SDA = P2^1;              //SCCB接口的SDA线

再次说明一下,大家用杜邦线或者飞线连接时,尽量保持短,然后再来看一下main.c文件:

xdata u8 jpg_buf[20000];//定义一个大缓冲区,用来存放摄像头传出来的jpg图片数据
xdata u32 jpg_len;

void main(void)
{   
        u16 res;
       
        sys_init();//系统初始化
        res = OV2640_Init();//初始化OV2640摄像头
        sys_write_vp(0x1000,(u8*)&res,1);//把初始化结果显示到屏幕上
       
       
        //开始采集摄像头的jpg图片
        OV2640_JPEG_Mode();//将摄像头设置为JPG模式
        OV2640_OutSize_Set(320,240);//图片输出大小,注意这个大小不能随意设置,
        SCCB_WR_Reg(0XFF,0X00);
        SCCB_WR_Reg(0XD3,30);
        SCCB_WR_Reg(0XFF,0X01);
        SCCB_WR_Reg(0X11,0X1);

        while(1)
        {   
                //开始采集一张jpg图片
                jpg_len = 0;
                while(OV2640_VSYNC)       
                {
                        while(OV2640_HREF)
                        {  
                                while(OV2640_PCLK==0);
                                jpg_buf[jpg_len] = OV2640_DATA;
                                while(OV2640_PCLK);  
                                jpg_len++;
                        }
                }               
                //将jpg图片显示到屏幕上
                sys_draw_jpg(0x2000,jpg_buf,jpg_len);
        }
}

在main.c中主要是先采集jpg图片数据,然后通过sys_draw_jpg函数把图片显示到迪文屏上,sys_draw_jpg函数的实现,我是根据官方文档来编写的,具体代码如下所示:

//动态绘制jpg图片
//vp:图标叠加控件的vp地址,必须为偶数
//jpg_data:jpg图片的原始数据
//data_len:jpg图片的原始数据的长度,单位字节
void sys_draw_jpg(u16 vp,u8 *jpg_data,u32 data_len)
{
        u32 i;
       
        for(i=0;i<data_len;i++)//查找0xFF,0xD8,也就是jpg图像的起始数据
        {
                if((jpg_data[i]==0xFF)&&(jpg_data[i+1]==0xD8))
                        break;
        }
        if(i==data_len)
                return;
       
        data_len = (data_len-i)/2+1;//得到字节,宁可多写一个字
        sys_write_vp(vp+2,jpg_data+i,data_len);
        data_len |= 0x5AA50000;
        sys_write_vp(vp,(u8*)&data_len,2);
}

好了,整个项目的实现细节差不多就这么多!
回复

使用道具 举报

12

主题

70

回帖

2126

积分

金牌会员

Rank: 6Rank: 6

积分
2126
 楼主| 发表于 2021-3-28 21:41:56 | 显示全部楼层
最后再上传一个完整的教程文档!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

12

主题

70

回帖

2126

积分

金牌会员

Rank: 6Rank: 6

积分
2126
 楼主| 发表于 2021-3-28 21:52:55 | 显示全部楼层
回复

使用道具 举报

2

主题

679

回帖

1万

积分

论坛元老

Rank: 8Rank: 8

积分
12161
发表于 2021-3-29 09:40:19 | 显示全部楼层
插个眼
回复

使用道具 举报

1

主题

18

回帖

473

积分

中级会员

Rank: 3Rank: 3

积分
473
发表于 2021-3-29 09:46:26 | 显示全部楼层
太感谢了,提议让迪文给你一些补助,这种开源精神难能可贵啊
回复

使用道具 举报

12

主题

73

回帖

481

积分

中级会员

Rank: 3Rank: 3

积分
481
发表于 2021-3-29 09:51:15 | 显示全部楼层
顶顶顶!
回复

使用道具 举报

12

主题

161

回帖

962

积分

高级会员

Rank: 4

积分
962
QQ
发表于 2021-3-30 16:09:13 | 显示全部楼层
看到咱们去年就做这个,获取图片上传的话,是可以实现,就像用stm32f103c8t6单片机来驱动2640摄像头上传给lcd屏一样,只能是入门啊,图像太卡了,除非分辨率特别低,勉强可以接受,
回复

使用道具 举报

0

主题

7

回帖

291

积分

中级会员

Rank: 3Rank: 3

积分
291
发表于 2022-1-6 17:42:03 | 显示全部楼层
EK043与摄像头OV2640的飞线连接的管脚关系如何哈?能给个原理图么?
回复

使用道具 举报

23

主题

291

回帖

1968

积分

金牌会员

Rank: 6Rank: 6

积分
1968
QQ
发表于 2022-1-8 16:54:52 | 显示全部楼层
大佬,,插个眼
运动,编程,热爱生活
回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2024-11-22 09:32 , Processed in 0.099639 second(s), 32 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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