久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7133|回復: 4
打印 上一主題 下一主題
收起左側

51單片機驅動OV7670可見光定位源程序 9325tp 320x240液晶顯示

  [復制鏈接]
跳轉到指定樓層
樓主


OV7670攝像頭模塊,輸出黑白圖像的辦法:
http://www.zg4o1577.cn/bbs/dpj-92273-1.html

OV7670單片機源程序如下:
  1. #include <STC12C5A.h>  
  2. #include <stdio.h>
  3. #include "9325tp.h"
  4. #include "ov7670_fifo.h"
  5. #include "UART.h"

  6. void main_init()
  7. {
  8.         EX0=1;          //紅外中斷
  9.         IT0=1;    //下降沿有效
  10. }
  11. unsigned char bn=0;

  12. void main(void)
  13. {
  14.         unsigned int  a,b;
  15.         unsigned int  c_data;
  16.         
  17.         unsigned char tmp;
  18.         
  19.         main_init();
  20.         UART1_init();
  21.         UART1_Send_String("UART初始化成功!\r\n");
  22.         
  23.         ILI9325_Initial();
  24.         UART1_Send_String("LCD初始化成功!\r\n");

  25.         CLR_Screen(Blue2);  
  26.         
  27.         FIFO_CS_L();
  28.         FIFO_WE_L();
  29.         do
  30.         {
  31.                 tmp = Sensor_init();
  32.         }
  33.         while(!tmp);         
  34.         UART1_Send_String("OV7670初始化成功!\r\n");  
  35.         
  36.         EA=1;          //總中斷
  37.         
  38.         while(1)
  39.         {
  40.                 while(bn!=2)
  41.                 {
  42.                
  43.                 }
  44.                
  45.                 FIFO_RRST_L();        //復位FIFO讀指針
  46.                 FIFO_RD_L();
  47.                 FIFO_RD_H();
  48.                 FIFO_RD_L();
  49.                 FIFO_RRST_H();
  50.                 FIFO_RD_H();
  51.                
  52.                 LCD_SetPos(0,239,0,319);
  53.                 EA=0;
  54.                 for(a=0;a<320;a++)
  55.                 {
  56.                         for(b=0;b<240;b++)
  57.                         {
  58.                                 FIFO_RD_L();
  59.                                 c_data = CAMERA2MCU_Data;//讀高位
  60.                                 c_data <<= 8;
  61.                                 FIFO_RD_H();
  62.                                 FIFO_RD_L();
  63.                                 c_data |= CAMERA2MCU_Data;//讀低位
  64.                                 FIFO_RD_H();
  65.                                 
  66.                                 Write_Data_U16(c_data);
  67.                         }
  68.                 }
  69.                 EA=1;
  70.                 bn=0;
  71.         }        
  72. }
  73.         
  74. void int0() interrupt 0
  75. {  
  76.         if(bn==0)
  77.         {
  78.                 FIFO_WRST_L();    //復位FIFO寫指針
  79.                 FIFO_RD_L();
  80.                 FIFO_RD_H();
  81.                 FIFO_RD_L();
  82.                 FIFO_WRST_H();
  83.                 FIFO_RD_H();
  84.                 bn=1;
  85.                 FIFO_WE_H();
  86.         }
  87.         else if(bn==1)
  88.         {
  89.                 FIFO_WE_L();
  90.                 bn=2;
  91.         }
  92. }

復制代碼

ov7670_fifo.c:

  1. /********************AL422+OV7670外接引腳************************/
  2. // 1、SCL_SCCB       攝像頭輸出配置時鐘引腳           
  3. // 2、SDA_SCCB       攝像頭輸出配置數據引腳
  4. // 3、VSYNC          攝像頭的幀信號引腳
  5. // 4、WEN(WR)        AL422 FIFO的輸入使能引腳
  6. // 5、RRST           AL422 FIFO的輸出復位引腳,可以將地址指針值為0
  7. // 6、OE/CS(CS)      AL422 FIFO的輸出使能引腳 ,OE為低電平時,允許數據輸出 ,高電平時,數據輸出高阻態     
  8. // 7、RCLK/WR(RD)    AL422 FIFO的讀使能引腳
  9. // 8、XCLK           攝像頭的時鐘信號
  10. // 9、D0~D7          AL422 FIFO的8位數據入口,直接連接攝像頭的8位數據輸出
  11. /*****************************************************************/

  12. /********************AL422+OV7670外接引腳******************************************/
  13. //1\SIC                P2_0
  14. //2\SID                P2_1
  15. //3\VSYNC              P2_2
  16. //4\WEN                P2_3
  17. //5\RRST               P2_4
  18. //6\CS                 P2_5
  19. //7\WR/(RD)            P2_6
  20. /////////////////////////////////////////////////////////////////////////////////////////         
  21. //9\D0~D7              P6_0~P6_7
  22. /**********************************************************************************/


  23. /*************************************AL422+OV7670使用方法*************************/
  24. //1\SCCB      攝像頭輸出配置
  25. //2\XCLK      為攝像頭提供時鐘
  26. //3\VSYN      場中斷的處理,判斷是否需要保存和讀取圖像
  27. //4\FIFO      對其進行操作,讀取圖像信息和保存圖像信息
  28. /**********************************************************************************/
  29. #include <STC12C5A.h>
  30. #include "ov7670_fifo.h"
  31. #include "Sensor_config.h"

  32. void delay_us(unsigned int n)
  33. {
  34.         n=n>>1;
  35.         while(n--);
  36. }

  37. /*
  38. -----------------------------------------------
  39.    功能: start命令,SCCB的起始信號
  40.    參數: 無
  41. 返回值: 無
  42. -----------------------------------------------
  43. */
  44. void startSCCB(void)
  45. {
  46.     SCCB_SID_H();     //數據線高電平
  47.     delay_us(50);

  48.     SCCB_SIC_H();     //在時鐘線高的時候數據線由高至低
  49.     delay_us(50);

  50.     SCCB_SID_L();
  51.     delay_us(50);

  52.     SCCB_SIC_L();     //數據線恢復低電平,單操作函數必要
  53.     delay_us(50);
  54. }


  55. /*
  56. -----------------------------------------------
  57.    功能: stop命令,SCCB的停止信號
  58.    參數: 無
  59. 返回值: 無
  60. -----------------------------------------------
  61. */
  62. void stopSCCB(void)
  63. {
  64.     SCCB_SID_L();
  65.     delay_us(50);

  66.     SCCB_SIC_H();        
  67.     delay_us(50);
  68.   

  69.     SCCB_SID_H();        
  70.     delay_us(50);
  71.    
  72. }

  73. /*
  74. -----------------------------------------------
  75.    功能: noAck,用于連續讀取中的最后一個結束周期
  76.    參數: 無
  77. 返回值: 無
  78. -----------------------------------------------
  79. */
  80. void noAck(void)
  81. {
  82.         
  83.         SCCB_SID_H();        
  84.         delay_us(50);
  85.         
  86.         SCCB_SIC_H();        
  87.         delay_us(50);
  88.         
  89.         SCCB_SIC_L();        
  90.         delay_us(50);
  91.         
  92.         SCCB_SID_L();        
  93.         delay_us(50);

  94. }

  95. /*
  96. -----------------------------------------------
  97.    功能: 寫入一個字節的數據到SCCB
  98.    參數: 寫入數據
  99. 返回值: 發送成功返回1,發送失敗返回0
  100. -----------------------------------------------
  101. */
  102. unsigned char SCCBwriteByte(unsigned char m_data)
  103. {
  104.   unsigned char j,tem;
  105.   
  106.   for(j=0;j<8;j++) //循環8次發送數據
  107.   {
  108.     if((m_data<<j)&0x80)
  109.     {
  110.        SCCB_SID_H();        
  111.     }
  112.     else
  113.     {
  114.        SCCB_SID_L();        
  115.     }
  116.     delay_us(50);
  117.     SCCB_SIC_H();        
  118.     delay_us(50);
  119.     SCCB_SIC_L();        
  120.     delay_us(20);
  121.   }
  122.   //delay_us(50);
  123.   SCCB_SID_IN;/*設置SDA為輸入*/
  124.   delay_us(10);
  125.   SCCB_SIC_H();        
  126.   delay_us(80);
  127.   
  128.   if(SCCB_SID_STATE){tem=0;}   //SDA=1發送失敗,返回0}
  129.   else {tem=1;}   //SDA=0發送成功,返回1
  130.   SCCB_SIC_L();        
  131.   delay_us(50);        
  132.   SCCB_SID_OUT;/*設置SDA為輸出*/
  133.   
  134.   return (tem);  
  135. }

  136. /*
  137. -----------------------------------------------
  138.    功能: 一個字節數據讀取并且返回
  139.    參數: 無
  140. 返回值: 讀取到的數據
  141. -----------------------------------------------
  142. */
  143. unsigned char SCCBreadByte(void)
  144. {
  145.         unsigned char read,j;
  146.         read=0x00;
  147.         
  148.         SCCB_SID_IN;/*設置SDA為輸入*/
  149.         delay_us(50);
  150.         for(j=8;j>0;j--) //循環8次接收數據
  151.         {                     
  152.                 //delay_us(100);
  153.                 SCCB_SIC_H();
  154.                 delay_us(50);
  155.                 read=read<<1;
  156.                 if(SCCB_SID_STATE)
  157.                 {
  158.                         read=read+1;
  159.                 }
  160.                 SCCB_SIC_L();
  161.                 delay_us(50);
  162.         }        
  163.     SCCB_SID_OUT;/*設置SDA為輸出*/
  164.         return(read);
  165. }

  166. //功能:寫OV7660寄存器
  167. //返回:1-成功        0-失敗
  168. unsigned char wr_Sensor_Reg(unsigned char regID, unsigned char regDat)
  169. {
  170.   startSCCB();//發送SCCB 總線開始傳輸命令
  171.   if(0==SCCBwriteByte(0x42))//寫地址
  172.   {
  173.     stopSCCB();//發送SCCB 總線停止傳輸命令
  174.     return(0);//錯誤返回
  175.   }
  176.   delay_us(20);
  177.   if(0==SCCBwriteByte(regID))//寄存器ID
  178.   {
  179.     stopSCCB();//發送SCCB 總線停止傳輸命令
  180.     return(0);//錯誤返回
  181.   }
  182.   delay_us(20);
  183.   if(0==SCCBwriteByte(regDat))//寫數據到積存器
  184.   {
  185.     stopSCCB();//發送SCCB 總線停止傳輸命令
  186.     return(0);//錯誤返回
  187.   }
  188.   stopSCCB();//發送SCCB 總線停止傳輸命令
  189.   
  190.   return(1);//成功返回
  191. }

  192. //功能:讀OV7660寄存器
  193. //返回:1-成功        0-失敗
  194. unsigned char rd_Sensor_Reg(unsigned char regID, unsigned char *regDat)
  195. {
  196.         //通過寫操作設置寄存器地址
  197.         startSCCB();
  198.         if(0==SCCBwriteByte(0x42))//寫地址
  199.         {
  200.                 stopSCCB();//發送SCCB 總線停止傳輸命令
  201.                 return(0);//錯誤返回
  202.         }
  203.         delay_us(20);
  204.           if(0==SCCBwriteByte(regID))//積存器ID
  205.         {
  206.                 stopSCCB();//發送SCCB 總線停止傳輸命令
  207.                 return(0);//錯誤返回
  208.         }
  209.         stopSCCB();//發送SCCB 總線停止傳輸命令
  210.         
  211.         delay_us(20);
  212.         
  213.         //設置寄存器地址后,才是讀
  214.         startSCCB();
  215.         if(0==SCCBwriteByte(0x43))//讀地址
  216.         {
  217.                 stopSCCB();//發送SCCB 總線停止傳輸命令
  218.                 return(0);//錯誤返回
  219.         }
  220.         delay_us(20);
  221.           *regDat=SCCBreadByte();//返回讀到的值
  222.           noAck();//發送NACK命令
  223.           stopSCCB();//發送SCCB 總線停止傳輸命令
  224.           return(1);//成功返回
  225. }

  226. /* Sensor_init() */
  227. //返回1成功,返回0失敗
  228. unsigned char Sensor_init(void)
  229. {
  230.   unsigned char temp;
  231.   unsigned int i=0;
  232.   
  233.   SCCB_SID_OUT;  //AL422+OV7670 控制引腳初始化
  234.   camera_DataIn; //攝像頭8位數據端口初始化
  235.   
  236.   temp=0x80;
  237.   
  238.   if(0==wr_Sensor_Reg(0x12, temp)) //Reset SCCB
  239.   {
  240.     return 0 ;//錯誤返回
  241.   }
  242.   
  243.   delay_us(20000);
  244.   
  245.   if(0==rd_Sensor_Reg(0x0b, &temp))//讀ID
  246.   {
  247.     return 0 ;//錯誤返回
  248.   }
  249.   
  250.   if(temp==0x73)//OV7670
  251.   {
  252.     for(i=0;i<OV7670_REG_NUM;i++)
  253.     {
  254.       if( 0==wr_Sensor_Reg(OV7670_reg[i][0],OV7670_reg[i][1]))
  255.       {
  256.         return 0;//錯誤返回
  257.       }
  258.     }
  259.   }
  260.   
  261.   else if(temp==0x21)//OV7725
  262.   {
  263.     for(i=0;i<OV7725_REG_NUM;i++)
  264.     {
  265.       if( 0==wr_Sensor_Reg(OV7725_reg[i][0],OV7725_reg[i][1]))
  266.       {
  267.         return 0;//錯誤返回
  268.       }
  269.     }
  270.   }
  271.   return temp; //ok
  272. }
復制代碼


所有資料51hei提供下載:
OV7670攝像頭.zip (78.69 KB, 下載次數: 99)


  
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:226478 發表于 2017-8-10 10:36 | 只看該作者
可見光定位,三個LED燈位置如何擺放
回復

使用道具 舉報

板凳
ID:487629 發表于 2019-3-11 10:47 | 只看該作者
樓主大神,我想請教下,你程序里面宏定義了一個#define SCCB_SID_IN       這個有什么意義,還有想問下你這個SCCB的通訊協議是從STM32那個移植過來的嗎?
回復

使用道具 舉報

地板
ID:138247 發表于 2019-5-2 15:29 | 只看該作者

謝謝樓主分享。。。
回復

使用道具 舉報

5#
ID:585455 發表于 2020-10-3 21:13 | 只看該作者
先謝謝你的程序,下周再來測試,希望順利。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品国产乱码久久久久久老虎 | a级网站| 欧美国产激情二区三区 | 青娱乐国产 | 一区二区视频在线观看 | 国产精品一区二区三区免费观看 | 欧美日韩久久精品 | 日韩精品四区 | 日本精品久久久久 | 永久www成人看片 | 国产精品视频在线观看 | 黄色av观看| 美女黄频| 欧美xxxx色视频在线观看免费 | 亚洲乱码一区二区三区在线观看 | 中文字幕二区 | 成年人的视频免费观看 | 精品亚洲一区二区 | 欧美精品一区二区三区四区 在线 | 日韩爱爱网站 | 免费在线观看av网站 | 免费看一区二区三区 | 欧美大片一区二区 | 亚洲国产第一页 | 国产乱码一区 | 韩日精品在线观看 | 青青草原精品99久久精品66 | 一区二区三区视频在线观看 | 久久机热 | 国产做a爱免费视频 | 瑟瑟视频在线看 | 国产探花在线观看视频 | 二区中文字幕 | 国产免费a视频 | 九九亚洲 | 欧美一区二区在线播放 | 性色视频在线观看 | 中文字幕亚洲视频 | 噜噜噜噜狠狠狠7777视频 | 国产精品成人在线播放 | 亚洲中午字幕 |