新聞中心

        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行圖像數據。
        }
        }



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 宣汉县| 德令哈市| 莱芜市| 肥东县| 抚远县| 定日县| 溧阳市| 华安县| 桂平市| 平昌县| 天门市| 镇赉县| 阿合奇县| 新竹市| 宜君县| 谷城县| 会昌县| 屏东市| 修武县| 无极县| 清丰县| 开江县| 牙克石市| 江口县| 黔西| 二连浩特市| 金秀| 吴江市| 周宁县| 武陟县| 奉新县| 济宁市| 商洛市| 永登县| 百色市| 长汀县| 玉山县| 石景山区| 融水| 贞丰县| 宁都县|