单片机图像采集与网络传输

发布者:心若清泉最新更新时间:2012-03-08 来源: 微计算机信息 关键字:RTL8019AS  图像采集  网络摄像头 手机看文章 扫描二维码
随时随地手机看文章

1.引言
    随着网络技术的发展和网络应用的普及,如何充分利用网络资源来实现低成本、高可靠的远程视频监控,已成为一个技术热点。本文介绍一个用单片机与图像采集模块接口,嵌入TCP/IP协议栈,制作“网络摄像头”的方法。本网络摄像头在一个组播式视频图像监控系统中,只作为组播源向以太网发送视频图像数据;其它监控计算机则作为组播成员接收数据。整个视频图像发送和监控系统在局域网中使用时,监控接收端的PC机只要加入了组播组,不必知道网络摄像头的IP地址和 MAC地址,也不需要两者的IP地址是在同一网段,均可接收到网络摄像头发出的图像数据,使用起来相当方便。

2. 硬件接口电路
    网络摄像头的硬件接口电路如图1所示。该电路采用的单片机是89C52芯片,另扩展32K的外部存储器,供网络和图像数据处理用。


    图1中的DB200是一个产品摄像模块,它由微型摄像镜头、图像缓存、时序发生、总线接口等电路构成;其外接信号是一个16脚的插座(9 ~ 16脚分别对应数据线D7 ~ D0,其它为地址、电源和读写控制线)。
    图1中,U1、U4和DB200的片选信号由89C52的地址线A14、A15和74HC00的3个与非门提供:A15=0时选通U4;A15=1及A14=0时选通U1;A15=1及A14=1时选通DB200。DB200的第8脚接A13用来选择其内部寄存器。[page]
    RTL8019AS有3种工作方式:(1)跳线方式。(2)即插即用方式。(3)免跳线方式。RTL8019AS使用哪种工作方式由第65脚(JP)决定。为减少连线,我们采用跳线方式(把65脚接高电平)。这样网卡的传输介质、I/O基地址和中断号就由74、77、78、79、80、81、82、 84、85等引脚状态决定。
    RTL8019AS的81、82、84、85(BD0-BD3)脚接低电平,对应32个I/O寄存器地址范围为300H - 31FH;78-80(BD4-BD6)脚接低电平,对应中断号为INT0(IRQ2/9);74(BA14)、77(BD7)脚接低电平,为自动检测传输介质方式。
    RTL8019AS有20根地址(SA0-SA19)线,将其5、7、8、9、10(SA0-SA4)脚接89C52的A8-A12,将15、 16(SA8、SA9)脚接高电平来确保基地址为300H,其余地址线则全部接地。由于RTL8019AS的使能(AEN)信号是由89C52的 A15=1及A14=0时提供,因此我们可得出以下地址关系:
89C52:   A15 A14 A13 A12 A11 A10 A9  A8   A7………A0
8019:                 SA4 SA3 SA2 SA1 SA0   …………
2进制数:   1  0   0    0   0   0   0   0   0000 0000    16进制数: 0X8000
2进制数:   1  0   0    1   1   1   1   1   0000 0000    16进制数: 0X9F00
可见,如果89C52输出地址0X8000至0X9F00,均可选中RTL8019AS。由于RTL8019AS的SA9和SA8恒接高电平,当89C52 的地址信号由0X8000至0X9F00变动时,会有:SA9 SA8 SA7 SA6 SA5 SA4 SA3 SA2 SA1 SA0 =11 0000 0000 至 11 0001 1111,即对应选择RTL8019AS的I/O寄存器地址300H至31FH。
RTL8019AS的96脚(IOCS16B)接低电平,使其工作在8位总线模式;64脚接低电平,使用非AUI接口;31、32脚接高电平,屏蔽远程自举加载功能;33脚所需复位信号,由89C52的P1.5提供;29、30脚对应接89C52的读写脚。

3. 软件模块设计
    嵌入式系统一般采用简化的TCP/IP协议栈。常用的有IP、ARP、UDP、ICMP、TCP以及HTTP等协议。为了尝试实现一个最简易的嵌入式TCP/IP协议,我们选用UDP通讯方式。
    UDP的通讯方式有3种:点对点、广播和组播。考虑到点对点通讯需要ARP协议来取得目标节点的物理地址,我们不用点对点通讯。至于广播通讯和组播通讯,两者都不需要ARP协议。但广播方式有如下缺陷:(1)广播数据报不能跨过路由器传播;(2)广播时本地子网的所有主机都会接收到广播并作出响应,既增加了非接收者的开销,保密性也不好。我们采用的组播方式不存在这些问题,较适合作为网络视频监控的信息传输。

3.1 主程序工作流程


    网络摄像头的图像采集、打包、发送的软件流程如图2所示,对应的主程序源码见例程1。为了便于接收端正确判断每帧图像的开始,主程序在发送1帧图像数据前,先用Send_lwm( ) 函数发送特征字为“lwm”的4字节长的数据包(该函数从略),然后再发送图像数据。
void main(void)   //(例程1--循环采集和发送图像数据的主程序):
{  init_8019( );    // RTLS8019AS初始化。
     while(1)     // 循环采集和发送图像:
  {  img_capture( );  //  采集1帧图像。
    Send_lwm( );  // 发送图像开始的特征字“lwm”
    Send_img( );  // 发送1帧图像数据。
  }
}
3.2  以太网控制芯片的初始化
RTL8019AS 芯片有32个寄存器地址,映射到4个页面,每页有16个寄存器。本系统只用0页的14个(00-01H,04-0BH,0D-0EH,0F-10H)寄存器。程序先定义reg00-reg10, 然后用初始化函数init_8019( )对RTL8019AS各寄存器进行配置:
#define  XBYTE ((unsigned char volatile xdata *) 0)
#define  reg00   XBYTE[0x8000]  //对应300H  A15=1, A14=0,A13=A12=A11=A10=A9=A8=0
………………..
#define  reg10   XBYTE[0x9000]  //对应310H  A15=1, A14=0,A13=0,A12=1,A11=A10=A9=A8=0
sbit   RST8019  = P1 ^ 5;      // RST8019AS的硬件复位端。
void  init_8019(void)           // (例程2--RTL8019AS的初始化):
{  UINT C1; for(C1=0;C1<1000;C1++);  // 软件延时,确保芯片进入稳定状态
RST8019=1;   for(C1=0;C1<1000;C1++);  // 硬件复位、延时以确保芯片完全复位
RST8019=0;   for(C1=0;C1<1000;C1++);  // 硬件复位、延时以确保芯片完全复位
reg00=0x21;       // 选择第0页寄存器,并使芯片停止收发和DMA操作reg0e=0xC8;       // DCR: 采用普通、8位DMA方式
reg07=0xFF; reg0f=0x00;    // 清除和屏蔽所有中断(本系统未采用中断)  
reg0d=0xE0;       // TCR:采用普通发送模式、允许CRC产生和校验
}[page]
    为了节省资源,上述对RTLS8019AS的初始化中,凡是与发送无关的寄存器都没有设置。发送时所要用的组播地址、物理地址和IP地址,则在打包时再封装到各协议层数据包的头部。

3.3  图像数据的采集


    负责图像采集的DB200摄像模块内部有数据、状态、采集控制和地址控制4个寄存器,表1是它们的寻址方式。对各寄存器的操作规则如下:
    (1)写操作-对采集控制寄存器(CAP_CTRLr)D0位写1,可启动采集过程;对地址控制寄存器(CAP_INCr)D0位写一次1,其图像缓存的地址就加1。
    (2)读操作-如果状态寄存器(CAP_STAUSr)的D0=1,表示可以开始图像采集过程;D1=1表示已完成1帧图像采集,可以读取数据寄存器(CAP_DATAr)的图像数据。
    DB200工作的地址范围是:1100 0000 0000 0000 ~ 1110 0000 0000 0000 = 0C00H ~ 0E00H。据此,我们可写出如下图像采集函数(例程3):
#define CAP_CONTROLr XBYTE[0X0C000]     //A15=1=A14, A13=0
#define CAP_STATUSr XBYTE[0X0C000]
void img_capture( )            // (例程3--图像采集):
{ while(!(CAP_STATUSr & 0x01));     // 检查DB200是否准备就绪?
 CAP_CONTROLr=0xff;        // 启动采集1帧图像过程。
 while(!(CAP_CONTROLr & 0x02));     // 是否采集完1帧图像?是就结束。
}
 img_capture( )函数只完成了1帧图像数据的采集,采集好的数据存在DB200的数据缓冲区内,留待Send_img( )函数读取和发送。Send_img( )是以读1行图像数据就发送1行的方式工作。其源码如下:
#define CAP_INCr  XBYTE[0X0E000]     //A15=1=A14,A13=1
#define CAP_DATAr  XBYTE[0X0E000] 
extern  UCHAR xdata  outbuf[1520]; 
void Send_img( )           // (例程4--图像数据的读取和发送):
{ UINT data Colon, Line ;
  for(Line=0;Line<288;Line++)        // 288行
  { for(Colon=0;Colon<385;Colon++)       // 385 列
   { databuf[Colon]=CAP_DATAr;     // 从 db200读1个像点到databuf。
    CAP_INCr=0xff;        // db200图像数据缓存地址加1。
   }
   udp_send(databuf, UDP_PORT, 386);        // 封装并发送1行图像数据。
  } 
}
3.4  图像数据的封装


    DB200采集完1帧图像后,通过数据总线传送给89C52;89C52则将图像数据按TCP/IP协议封装成以太网帧(图3),然后通过数据总线送给RTL8019AS;RTL8019AS则将以太网帧经RJ45接口送到10M以太网上。
从图3可以看到,每个以太网帧的最大长度为1518字节,最小为64字节。其数据部分最大为1500字节,最小为46字节。每个UDP数据传输前,必须加上 8字节的UDP头来构成UDP数据报;再加上20字节的IP头来构成IP数据报;最后加上14字节的帧头来构成以太网帧。这就是所谓的数据包封装。为了避免分段操作的麻烦,UDP数据报的最大长度应为1500 - 28=1472字节。在实际应用中,我们采用每行图像数据(385字节)封装一个包的方式传输数据。
void Data_send( UINT src_port, UINT datalen)    // (例程5--UDP数据报封装):
{ UDP_HEADER xdata * udp;    
 udp = (UDP_HEADER xdata *)(outbuf + 34); // 34=14(以太网帧头长)+ 20(IP报头长)  udp->dest_port = 2001;      // 目的端口号
 udp->source_port = 20011;     // 源端口号
 udp->length = 8 + datalen;     // UDP包总长= UDP头长度+数据长度
udp->checksum = 0;       // 不校验UDP数据报
 ip_pack(outbuf, dest_ipaddr, udp->length); // 封装IP包
}[page]

void ip_pack(UCHAR xdata * outbuf, ULONG dest_ipaddr,  UINT datalen)//(例程6-封装IP包)
{   IP_HEADER xdata * ip;    static UINT ip_ident;  // datalen为UDP数据报总长度
   ip = (IP_HEADER xdata *)(outbuf + 14);    // 14字节为以太网帧头长度。
   ip->ver_len = 0x45;    ip->type_of_service = 0;  // 版本号和服务类型。
   ip->total_length = 20 + datalen;        // 数据报总长=IP头长度+数据长度
ip->identifier = ip_ident++;        // IP数据报序列号。
   ip->fragment_info = 0;                // IP数据报不分段。
   ip->time_to_live = 32;                // 生存时间。
   ip->protocol_id = UDP_TYPE;          // 协议类型为UDP=17。
   ip->header_cksum = 0;          // 校验和清0。
 ip->dest_ipaddr = 0xEA050607L;    // 0xEA050607L=234.5.6.7 为目标组播地址
 ip->source_ipaddr = 0xD224446FL;     // 0xD224446FL=210.36.68.111为本地IP地址
   ip->header_cksum = ~cksum(outbuf + 14, 20);  // 计算20字节的IP数据报头校验和
 eth_send(outbuf,  34 + datalen);     // 封装以太网帧并发送。
}
在上述例程5和例程6中,UDP的校验和是可选的,IP头的校验和是必需的。例程5将UDP检验和置为0,例程6则用cksum( )函数来计算IP头校验和。本地IP地址可取任意有效值。

3.5  以太网帧的封装和发送
    从图3可知,以太网帧封装就是要将目的MAC地址、源MAC地址和所要传输的数据类型放到待发送的IP数据报前(成为以太网帧头)。因为我们要进行的是组播发送,所以目的MAC地址也必须是组播的MAC地址;而本地的源MAC地址我们就用01:02:03:04:05:06。
    上面说到,“IP组播地址”范围是224.0.0.0到239.255.255.255。而以太网帧用到的“MAC组播地址”范围是 01:00:5E:00:00:00-01:00:5E:7F:FF:FF 。MAC组播地址的构成方法是:前3个字节固定用01:00:5E,后3个字节则用IP组播地址的后3个字节。所以我们用234.5.6.7作IP组播地址时,对应的MAC组播地址就是 01:00:5E:05:06:07。
    在下面的程序中,RTL8019AS用查询方式进行发送操作。
UCHAR code dest_hwaddr[6] = { 0x01, 0x00, 0x5E, 0x05, 0x06, 0x07}; // 目标MAC组播地址
UCHAR code my_hwaddr[6] =  { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 }; // 源MAC地址
void eth_send(UCHAR xdata * outbuf,  UINT Data_len)  // (例程7--以太网帧封装和发送):
{ UINT i , send_len;  ETH_HEADER xdata * eth;   eth = (ETH_HEADER xdata *)outbuf;
 for(i=0;i<6;i++)          
 { eth->dest_hwaddr[i]= dest_hwaddr[i];     // 装入目的MAC地址。
  eth->source_hwaddr[i]= my_hwaddr[i];     // 装入源MAC地址。
 }
 eth->frame_type = IP_PACKET;       // 数据类型为IP数据报
// send_len为实际要发送的以太网帧长度,它不能小于60字节:
 send_len = (Data_len>=60) ? Data_len : 60 ;
 reg00=0x22;         // 选择0页寄存器,启动芯片。
 while( reg00 & 0x04 );      // 原来的数据发送完没有?完了往下执行
 reg08=0x00;  reg09=0x40;     // 设置发送缓冲区开始地址为4000H。
//设置(RBCR0-1)远端DMA传送数据包长度(高、低字节):
 reg0a=(unsigned char)(Data_len); reg0b=(unsigned char)(Data_len>>8); 
 reg00=0x16;      // 设置远端DMA写,启动远端DMA传送数据到发送缓冲区
 for(i=0;i reg04=0x40;           // 设置发送缓冲区开始地址高字节
//设置(TBCR0-1)发送字节计数器的计数长度(高、低字节):   
 reg05=(unsigned char)(send_len); reg06=(unsigned char)(send_len>>8);   
 reg00=0x26;         // 启动本地DMA操作,向网络发送图像数据。
}
上述程序先设置好远端DMA开始地址(RSAR)和远端DMA数据字节数(RBCR),并设置远端DMA写( reg00=0x16),就可以把图像数据写入RTL8019AS的数据缓冲区。给出发送缓冲区首地址和数据包长度后,启动发送命令 (reg00=0x26), RTL8019AS就会按以太网协议将图像数据发送到网络上。

4. 结束语
    TCP/IP协议较复杂,嵌入式系统自身的资源又很有限,动辄几十K的TCP/IP协议栈,使很多入门者望而却步。其实要在嵌入式系统实现TCP/IP协议,只不过就是编制各个符合TCP/IP协议规则的软件模块罢了。根据自己系统的具体情况编制专门的功能模块,也可以实现相当简化的TCP/IP协议栈。本文在此给出了一个可供借鉴的实例。

参考文献:
[1] 吴礼发, 网络程序设计教程[M],北京:希望电子出版社,2002.1
[2]  RTL8019AS SPECIFICATION[EB/OL],REALTEKSEMI-CONDUCTOR CO., LTD ,  2000.8.20
[3] 单片机与TCP/IP网络[EB/OL], HTTP:// WWW.LAOGU.COM

关键字:RTL8019AS  图像采集  网络摄像头 引用地址:单片机图像采集与网络传输

上一篇:80C196KC在永磁无刷直流电动机中的应用
下一篇:基于80C196的采样与A/D处理

推荐阅读最新更新时间:2024-03-16 12:54

高保真实时准动态图像采集压缩和远程传输平台的研究与实现
摘要:基于大量的实际研究工作,论述了高保真实时准动态图像采集压缩和远程传输平台的设计思想、总体结构、关键技术和优化策略。着重对视频采集技术、压缩技术、图像实时传输技术、同步技术和自适应技术作了具体阐述。在相关技术领域有重要的学术价值和实际意义。 关键词:高保真 自适应 帧间压缩 双向调节 在Internet飞速发展和广泛普及的今天,信息传输从两方面加强力度:一是多媒体化;二是实时化。在此基础上,高保真准动态图像采集、压缩和远程传输技术成为许多先进国家计算机领域的重要研究课题。在军事上,战场信息已经不只是文字类型,而需要为决策者提供高质量的动态实时图像信息,以便及时准确地了解战场真实情况;另外,对国外新式战斗机、导弹等先进武器
[应用]
基于ARM和FPGA的嵌入式高速图像采集存储系统
现代化生产和科学研究对图像采集系统要求日益提高。传统图像采集系统大都是基于PC机上,而在一些特殊的场合,尤其是在实时性要求较高时,普通的PC机显然无法满足应用要求。文中设计了一种基于ARM和FPGA的嵌入式的图像采集存储系统,可以很好地解决实时的嵌入式图像采集和存储问题。它主要包括图像采集模块、图像处理模块以及图像存储模块等。 1 系统结构及工作原理 本系统的结构模型,如图1所示。图像采集模块负责采集原始图像,并将原始图像数据送给FPGA,采用了可编程视频输入处理器SAA7113H。原始图像数据送到FPGA后,FPGA将原始图像数据暂存于两个SRAM中,系统采用了Alter公司的EPlK30TCl44—3和ICSI公司的I
[单片机]
基于ARM和FPGA的嵌入式高速<font color='red'>图像采集</font>存储系统
TMS320C54xDSP的视频图像采集接口设计
    摘要: 介绍一种基于DSP的黑白电视信号采集电路。电路由通信视频A/D转换器构成,DSP启动A/D转换并读取A/D转换结果。电路结构简洁、成本低、容易实现,能满足黑白电视信号采集的需要。     关键词: 视频图像采集 A/D转换 DSP TMS320C54x 引言 视频图像采集的方法很多,基本上可分为2大类:自动图像采集和基于处理的图像采集。前者采用专用图像采集芯片,自动完成图像的采集、帧存储器地址生成以及图像数据的刷新;除了要对采集模式进行设定外,主处理器不参与采集过程。这种方法的特点是采集不占用CPU的时间,实时性好,适合活动图像的采集,但电路较复杂、成本高。后者采用通用视频A/D转换器实现图
[嵌入式]
商场安装远程网络监控摄像头解决方案
在收银台、电梯、各楼层走道及出入口等位置分别安装TP-LINK红外摄像机,形成无死角监控。拓扑中使用PoE交换机通过网线为PoE IPC(网络摄像机)供电,可以避免额外布线。本方案支持远程监控。 如果网络中已有路由器和普通交换机,可以选择直流供电的IPC。 安装部署 下面对监控点位安装进行指导: 收银台监控 收银台是最容易引发纠纷的地方,安装TP-LINK高清摄像头不仅能快速解决矛盾纠纷,还能监督员工的服务态度和工作效率,提升商场的服务质量。 电梯监控 大型商场为了给顾客提供便利,都配置了垂直电梯。电梯作为狭小封闭的空间,需要安装视场角大的半球型摄像机进行监控。 传统的有线线缆有传输距离的限制,且施工复杂、
[安防电子]
商场安装远程<font color='red'>网络</font>监控<font color='red'>摄像头</font>解决方案
基于FPGA的图像采集和快速移动物体检测
近年来,计算机技术、通信技术、微电子技术迅猛发展,数字监控系统逐步从传统方式的监控系统走向小型化、多样化和智能化。监控系统的发展首先是从图像采集开始的,本文根据项目需要提出了一种基于FPGA的图像采集和移动物体检测的设计方案,用以实现对特定背景下的图像采集和移动物体快速检测。 1 系统总体设计 本系统主要由摄像头初始化模块、图像采集模块、数据传输模块和运动物体检测模块构成。本系统中所使用的FPGA 芯片型号是FUSION系列的AFS600。如果只是完成本文中所要实现的内容,则完全可以选择更低性能的FPGA芯片,例如 ProASIC3 系列的 A3P060 ;如果所选择的芯片没有片内RAM或者片内RAM很小,需要对本文的设计做适当的
[安防电子]
基于FPGA的<font color='red'>图像采集</font>和快速移动物体检测
图像采集综合评估的嵌入式指纹识别系统(一)
  由于具有其持久性和唯一性,指纹被广泛应用在个人身份识别系统。指纹识别在全世界范围内的广泛应用,不仅为防范犯罪,同时也作为处理个人事务和信息安全的一个关键技术。   在指纹识别技术领域,欧美国家在研究和开发中处于领先地位。美国ZK Software在1992年就发布了ZKFinger 1.0版,2008年发布了ZKTime7.0、ADMS解决方案、指纹锁、集成具有美国联邦政府推出的FIPS201认证的Lumidign和Secugen指纹仪;法国Segam公司,是安全解决方案的市场领导者之一,有遍布5大洲超过85个分公司和分支机构,其生产的集成系统部署在100多个国家和地区。亚洲在指纹识别技术上较为先进的公司有:韩国现代、朝鲜的培
[电源管理]
<font color='red'>图像采集</font>综合评估的嵌入式指纹识别系统(一)
图像采集综合评估的嵌入式指纹识别系统(二)
2.4指纹图像质量分析   通过图像质量判断条件,比较质量评估参数Q与阈值TQ.若Q≤TQ,说明图像质量未达到要求,需要进行手指干/湿状态分析,并在汉字显示屏上提示分析结果;若Q TQ,说明图片质量达到要求,但还需判断手指位置是否放置正确。具体如下:   1)依据该块内的各点是否大部分属于某一特定方向,判断一个前景图像块是否具有方向优势;   2)计算各图像块的方向,求出各块的方向直方图。如果具有某一个方向D的像素数目超过预设值T1,则该块的优势方向被标记为D;   3)指纹图像的质量可以通过计算连续的优势方向区域占所有指纹前景图的比例进行描述。采取一种加权的方法,距离参考点越远的图像块,它所包含的信息越可靠,其权值也就越高;  
[电源管理]
<font color='red'>图像采集</font>综合评估的嵌入式指纹识别系统(二)
基于TMS320F206 DSP的图像采集卡设计
  数字信号处理器DSP是数字信号处理理论与超大规模集成电路VLSI技术融合的结晶。目前DSP技术正广泛地应用于通信、语音、图像、航天航空、仪器仪表等领域,在推动当代信息处理数字化方面正发挥着越来越大的作用。   在利用电话线传输视频图像这一低比特率多媒体通信领域中,如果选用图像处理的专用芯片,如SAA7110、8×8 3104VCP以及LSI公司的专用芯片等,或者选用具有高速运算性能的高档DSP进行图像处理,都会使产品价格大幅度标升。本文介绍的采用TI公司的低档DSP芯片TMS320F206和视频A/D芯片TLC5510的图像采集卡,则为低比特率多媒体通信提供了一个廉价的解决方案。    1 TLC5510芯片和TMS320
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved