新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 单片机图像采集与网络传输

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

作者:时间:2012-03-20来源:网络收藏

网络摄像头的、打包、发送的软件流程如图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;C11000;C1++); // 软件延时,确保芯片进入稳定状态
RST8019=1; for(C1=0;C11000;C1++); // 硬件复位、延时以确保芯片完全复位
RST8019=0; for(C1=0;C11000;C1++); // 硬件复位、延时以确保芯片完全复位
reg00=0x21; // 选择第0页寄存器,并使芯片停止收发和DMA操作reg0e=0xC8; // DCR: 采用普通、8位DMA方式
reg07=0xFF; reg0f=0x00; // 清除和屏蔽所有中断(本系统未采用中断)
reg0d=0xE0; // TCR:采用普通发送模式、允许CRC产生和校验
}


为了节省资源,上述对RTLS8019AS的初始化中,凡是与发送无关的寄存器都没有设置。发送时所要用的组播地址、物理地址和IP地址,则在打包时再封装到各协议层数据包的头部。

3.3 图像数据的采集

31.gif

负责图像采集的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;Line288;Line++) // 288行
{ for(Colon=0;Colon385;Colon++) // 385 列
{ databuf[Colon]=CAP_DATAr; // 从 db200读1个像点到databuf。
CAP_INCr=0xff; // db200图像数据缓存地址加1。
}
udp_send(databuf, UDP_PORT, 386); // 封装并发送1行图像数据。
}
}



评论


相关推荐

技术专区

关闭