⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ov9121.c

📁 CMOS 9121 的设置程序
💻 C
字号:
//#pragma  ot(6,SIZE)
/*
ID_Address          是OV9121的地址在这里是写是0X60,读是0X61
sub_Address         是OV9121内部寄存器的地址,也就是要写的寄存器址
hex                 所送的数值,用16进制表示
*/
#include <intrins.h>
#include <AT892051.H>
#include <OV9121_1.h>
#include <OV9121_screen.h>
#define LAMP P1_6
#define  ERRORCOUNT 1
sbit SCCB_D=P1^1;
sbit SCCB_C=P1^0;
sbit SCCB_E=P3^7;
//sbit EXPSTB=P1^4;
//sbit FREX=P1^3;
void main(void)
{
bit SCCB(unsigned char ID_Address,unsigned int sub_Address,unsigned char *hex);
//void Delay_2(unsigned char DelayCount);
unsigned char/*p,i,*/a=0x08,b=0x23,c=0xa0,d=0x53,e=0x4a,f=0x83,g=/*0x5b*/0x20,h=0xf6,value,sum;
unsigned int ID_Address=0x61,sub_address=0x0000,mm=0x0050;
P1=P3=0xff;	
//BEEP=0;
//if(KEY==0)
//{
//LAMP=(!LAMP);Delay_2(100000);LAMP=1;Delay_2(100000);
//SCCB(0x60,0x37,&a);                       //单屏和多屏
//SCCB(0x60,0x15,&c);                     //水平场信号变换
SCCB(0x60,0x18,&d);SCCB(0x60,0x17,&b);    //水平窗口变成一行象素384个
//SCCB(0x60,0x1A,&e);                 
SCCB(0x60,0x10,&f);                       //暴光时间控制
SCCB(0x60,0x19,&g);                       ////垂直窗口调整288个行象素;; 
SCCB(0x60,0x13,&h);                       //自动和手动暴光      
while(1)
{
SCCB(ID_Address,sub_address,&value); 
sum=value;
RWXX(&sum,0x01,mm,0xa0,M2464);
sub_address++;mm++;//i++;                
if(sub_address>0x38) break;
}
while(1){                        
//EXPSTB=0;Delay_2(5);FREX=0;
screen();
}
}
//}

/**********************************************************************/
//LAMP=(!LAMP);Delay_2(100);LAMP=0;
//LAMP=(!LAMP);Delay_2(500);LAMP=0;
bit  SCCB(unsigned char ID_Address,unsigned int sub_Address,unsigned char *hex)
{
void SCCBstart(void);
void SCCBstop(void);
unsigned char SCCBreceiveByte(void);
void SCCBsendByte(unsigned char sendbyte);
/*bit */void SCCBRecAck(void);
void SCCBNoAck(void);
void SCCBAck(void);
void Delay_1(unsigned long DelayCount);
unsigned char data j=1,i=ERRORCOUNT;
bit      errorflag=1;
while(i--)
{
SCCBstart();
SCCBsendByte(ID_Address&0xfe);                   //送控制字0XC2
       SCCBRecAck();
     if(CY) continue;

SCCBsendByte((unsigned char)sub_Address);              //送寄存器地址
	   SCCBRecAck();
	  if(CY) continue;

if(!(ID_Address&0x01))                            //如果是写
      {
	  j=1;
      errorflag=0;
   while(j--)

     {
		SCCBsendByte(*hex);                        //送操作数
	      SCCBRecAck();                     //应答继续
       if(!CY) continue;

		 errorflag=1;
        break;
        }
      if(errorflag==1)
        continue;
      break;
      }
else                                              //如果是读
     {
     SCCBstart();                                 //重新启动总线
     SCCBsendByte(ID_Address);                    //送控制字也就是ID地址
     SCCBRecAck();                        //应答
     if(CY) continue;
/*while(--j)                  //循环一次
       {
     *hex++=SCCBreceiveByte();                 //送数
       SCCBAck();                                   //应答
       }*/
    *hex=SCCBreceiveByte();                     //read last byte data
     SCCBNoAck();                               //应答
    LAMP=(!LAMP);Delay_1(500);LAMP=1;                 //程序调式用
	 errorflag=0;
     break;
     }
}


SCCBstop();                                    //总线停止
if(!(ID_Address&0x01))                         //如果是写
 {
 Delay_1(255);                                  //延时
 Delay_1(255);
 Delay_1(255);
 Delay_1(255);
}
Delay_1(255);
Delay_1(255);
Delay_1(255);
Delay_1(255);
return(errorflag);                 //返回errorflag
}

/*****************以下是对SCCB总线的操作子程序***/
/*****************启动总线**********************/
void SCCBstart(void)
{
SCCB_E=1;
SCCB_D=1;
SCCB_C=1;
_nop_();
_nop_();
_nop_();
SCCB_E=0;
_nop_();
_nop_();
_nop_();
///////////////////////////////////////////////////////
SCCB_C=1;
SCCB_D=0;
_nop_();                            //0.25us
SCCB_D=1;
SCCB_C=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCCB_D=0;
_nop_();
_nop_();
_nop_();
_nop_();
SCCB_C=0;
_nop_();
_nop_();
_nop_();
//SCCB_D=1; //SCCB_E从1到0表示BUS启动
}
/*******************SCCB总线停止*********************/
void SCCBStop(void)
{
SCCB_C=0;
SCCB_D=0;
SCCB_E=0;
_nop_();
SCCB_C=1;
_nop_();
_nop_();
_nop_();
SCCB_D=1;
_nop_();
_nop_();
SCCB_E=1;
_nop_();
_nop_();
_nop_();
_nop_();
SCCB_D=0;
SCCB_C=0;
}                     //SCCB_E从1到0表示BUS IDLE
/**************检查应答位*******************/
/*bit*/void SCCBRecAck(void)
{
SCCB_C=0;
SCCB_D=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCCB_C=1;
CY=SCCB_D;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCCB_C=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();//因为返回值总是放在CY中的
//return(CY);
}

/***************对SCCB总线产生应答*******************/
void SCCBAck(void)
{

SCCB_D=0;
SCCB_C=1;
_nop_();
_nop_();
_nop_();
_nop_();

SCCB_C=0;
_nop_();


SCCB_D=1;
}

/*****************不对SCCB总线产生应答***************/
void SCCBNoAck(void)
{
SCCB_D=1;
SCCB_C=1;
_nop_();
_nop_();
_nop_();
_nop_();

SCCB_C=0;
}
/*******************向SCCB总线写数据*********************/
void SCCBsendByte(unsigned char sendbyte)
{
unsigned char data j=8;
for(;j>0;j--)
   {
   SCCB_C=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
   sendbyte<<=1;        //无论C51怎样实现这个操作,始终会使CY=sendbyte^7;
   SCCB_D=CY;
   SCCB_C=1;
_nop_();
_nop_();
_nop_();
}
//SCCB_C=0;
}

/**********************从SCCB总线上读数据子程序**********/
unsigned char SCCBreceiveByte(void)
{
register receivebyte,i=8;
SCCB_C=0;
while(i--)
   {
   SCCB_C=1;
_nop_();
_nop_();
_nop_();
receivebyte=(receivebyte<<1)|SCCB_D;
SCCB_C=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
return(receivebyte);
}

/***************一个简单延时程序************************/
void Delay_1(unsigned long DelayCount)
{
while(DelayCount--);
}
////////////////////////////////////////////////////////////////////
/*void Delay_2(unsigned char DelayCount)
{
	unsigned char i=0;
	//unsigned char j=200000;
	while(i<DelayCount)
	{i++;}
}
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -