STC15系列单片机与 OV7670 SCCB通讯

以下是代码片段

/**************************************************************************************
*		              LEDÉÁ˸ʵÑé												  *
ʵÏÖÏÖÏó£ºÏÂÔسÌÐòºóD11ָʾµÆÉÁ˸
×¢ÒâÊÂÏÎÞ																				  
***************************************************************************************/

#include "reg52.h"	
#include<intrins.h> //´ËÎļþÖж¨ÒåÁ˵¥Æ¬»úµÄһЩÌØÊ⹦ÄܼĴæÆ÷
typedef unsigned int u16;	  //¶ÔÊý¾ÝÀàÐͽøÐÐÉùÃ÷¶¨Òå
typedef unsigned char u8;
#define FOSC 12000000L

sbit SCCB_SID=P1^2;		 //½«µ¥Æ¬»úµÄP0.0¶Ë¿Ú¶¨ÒåΪled
sbit SCCB_SIC=P1^3;	
sbit led_switch=P1^4;	
sbit led=P1^5;	
//P1M0 = 0x00; P1M1 = 0x00; 
     // P1M0 = 0xff; P1M1 = 0x00; 
 


/*******************************************************************************
* º¯ Êý Ãû         : delay
* º¯Êý¹¦ÄÜ		   : ÑÓʱº¯Êý£¬i=1ʱ£¬´óÔ¼ÑÓʱ10us
*******************************************************************************/
void Delay50us()		//@11.0592MHz
{
	unsigned char i;

	_nop_();
	_nop_();
	_nop_();
	i = 135;
	while (--i);
}

void Delay500ms()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	_nop_();
	_nop_();
	i = 11;
	j = 190;
	do
	{
		while (--j);
	} while (--i);
}



void SCCB_SID_H(void)
{
   SCCB_SID=1;
}

void SCCB_SID_L(void)
{
   SCCB_SID=0;
}

void SCCB_SIC_H(void)
{
   SCCB_SIC=1;
}

void SCCB_SIC_L(void)
{
   SCCB_SIC=0;
}




void startSCCB(void)
{
    SCCB_SID_H();     //
    Delay50us()	;

    SCCB_SIC_H();     //
    Delay50us()	;
 
    SCCB_SID_L();
     Delay50us()	;

    SCCB_SIC_L();     //
    Delay50us()	;
}


void stopSCCB(void)
{
    SCCB_SID_L();
     Delay50us()	;
 
    SCCB_SIC_H();	
    Delay50us()	;
  

    SCCB_SID_H();	
     Delay50us()	;
   
}

void noAck(void)
{
	
	SCCB_SID_H();	
	 Delay50us()	;
	
	SCCB_SIC_H();	
	 Delay50us()	;
	
	SCCB_SIC_L();	
	 Delay50us()	;
	
	SCCB_SID_L();	
	 Delay50us()	;
}

unsigned char SCCBwriteByte(unsigned char m_data)
{
  unsigned char j,tem;
  
  for(j=0;j<8;j++) //??8?????
  {
    if((m_data<<j)&0x80)
    {
       SCCB_SID_H();	
    }
    else
    {
       SCCB_SID_L();	
    }
    Delay50us()	;
    SCCB_SIC_H();	
    Delay50us()	;
    SCCB_SIC_L();	
    Delay50us()	;
  }
  //delay_us(50);
	Delay50us()	;
 // SCCB_SID_IN;/*??SDA???*/
	//SCCB_SID=0;
  Delay50us()	;
  SCCB_SIC_H();	
  Delay50us()	;
  
  if(SCCB_SID==1){tem=0;}   //SDA=1????,??0}
  else {tem=1;}   //SDA=0????,??1
  SCCB_SIC_L();	
  Delay50us()	;
  //SCCB_SID=1;/*??SDA???*/
  return (1);  
}

unsigned char SCCBreadByte(void)
{
	unsigned char read,j;
	read=0x00;
	
//	SCCB_SID_IN;/*??SDA???*/
	 Delay50us()	;
	for(j=8;j>0;j--) //??8?????
	{		     
		//delay_us(100);
		SCCB_SIC_H();
		 Delay50us()	;
		read=read<<1;
		if(SCCB_SID==1) 
		{
			read=read+1;
		}
		SCCB_SIC_L();
	 Delay50us()	;
	}	
    //SCCB_SID_OUT;/*??SDA???*/
	return(read);
}



unsigned char wr_Sensor_Reg(unsigned char regID, unsigned char regDat)
{
  startSCCB();//??SCCB ????????
  if(0==SCCBwriteByte(0x42))//???
  {
    stopSCCB();//??SCCB ????????
    return(0);//????
  }
 Delay50us()	;
  if(0==SCCBwriteByte(regID))//???ID
  {
    stopSCCB();//??SCCB ????????
    return(0);//????
  }
   Delay50us()	;
  if(0==SCCBwriteByte(regDat))//???????
  {
    stopSCCB();//??SCCB ????????
    return(0);//????
  }
  stopSCCB();//??SCCB ????????
  
  return(1);//????
}



unsigned char rd_Sensor_Reg(unsigned char regID, unsigned char *regDat)
{
	//????????????
	startSCCB();
	if(0==SCCBwriteByte(0x42))//???
	{
		stopSCCB();//??SCCB ????????
		return(0);//????
	}
	 Delay50us()	;
  	if(0==SCCBwriteByte(regID))//
	{
		stopSCCB();//
		return(0);//
	}
	stopSCCB();//
	
 Delay50us()	;
	
	//
	startSCCB();
	if(0==SCCBwriteByte(0x43))//???
	{
		stopSCCB();//
		return(0);//
	}
	 Delay50us()	;
  	*regDat=SCCBreadByte();//
  	noAck();//
  	stopSCCB();//
  	return(1);//
}


/*******************************************************************************
* º¯ Êý Ãû       : main
* º¯Êý¹¦ÄÜ		 : Ö÷º¯Êý
* Êä    Èë       : ÎÞ
* Êä    ³ö    	 : ÎÞ
*******************************************************************************/
void main()
{
	    
	 
	u16 s;
	unsigned char temp;
	temp=0x81;
	
	CLK_DIV=0x80;
	led_switch=0;
	led=0;
	
		
		Delay500ms();Delay500ms();Delay500ms();Delay500ms();Delay500ms();Delay500ms();Delay500ms();Delay500ms();Delay500ms();Delay500ms();Delay500ms();Delay500ms();Delay500ms();Delay500ms();Delay500ms();
	Delay500ms();Delay500ms();Delay500ms();Delay500ms();Delay500ms();Delay500ms();Delay500ms();Delay500ms();Delay500ms();Delay500ms();Delay500ms();Delay500ms();Delay500ms();Delay500ms();Delay500ms();	
		Delay500ms();Delay500ms();Delay500ms();
		 wr_Sensor_Reg(0x12, temp);
	while(1)
	{
		if (led_switch==1){led=1;}else{led=0;};
		
	
  
  
  
 Delay500ms();
		rd_Sensor_Reg(0x0a, &temp);
		
		rd_Sensor_Reg(0x0b, &temp);
		rd_Sensor_Reg(0x1c, &temp);
		rd_Sensor_Reg(0x1d, &temp);
	}		
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值