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

📄 main.c

📁 ov7620 飞思卡尔应用 主要可以通过摄像头获得图像灰度值
💻 C
字号:
#include <hidef.h>      /* common defines and macros */
#include <mc9s12dg128.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"

///////////////////////////////////////////////////////////////
//行同步中断输入捕捉1管脚.
//场同步中断IRQ
//Yn分别对应PORTMn

///////////////////////////////////////////////////////////////

#define SYNE_SETTING 4
#define REFDV_SEETTING 1     // PLLCLK =2*OSCCLK*(SYNR + 1)/(REFDV + 1) busclk=32M
#define delay {_asm nop;}
#define M 81
#define N 61
unsigned char buff[N][M];
byte Tclk_ready;
 
byte one_sample;
//int cnt=0x00;
//int cnt_HREF=0x1;
void delayms()
{
    byte i,j;
    for(i=0;i<255;i++)
        for(j=0;j<255;j++)
           delay;delay;delay;
        
}
void init_CRG(byte para1,byte para2)
  {
      SYNR=para1;
      REFDV=para2;
      while(!CRGFLG_LOCK);
      CLKSEL_PLLSEL=1;   
  }
  
  
void init_interupt()
  {
   //  HPRIO        = (unsigned char)(Virq & 0xff); //将IRQ优先级置为最高
	//   INTCR       |= INTCR_IRQE_MASK;		
     INTCR_IRQE=1;         //下降沿触发
     INTCR_IRQEN=1;        //场同步中断IRQ中断,初始化开启
       
     TIOS=0x00;          //行同步中断,外部输入捕捉0,1通道,初始化不开启
     TCTL4=0x01;         //通道0上升沿触发,通道1下降沿触发
     TSCR2=0X01;         //分频
    
     TSCR1=0x80;
     TIE=0X00;           //初始化定时器关闭 
  }
  
 void init_port()
  {
      DDRB=0XFF;
      PORTB=0Xff;
      
      
      DDRT_DDRT7=0; // 行信号
      DDRA_BIT7=0;   // 黑白信号  黑0  白1
      
      PORTB_BIT0=0;
      PORTB_BIT0=1;
      PORTB_BIT1=0;
      PORTB_BIT0=1;
      PORTB_BIT1=0;
      PORTB_BIT0=1;
      
      DDRA=0X00;
  //    PUCR=0x03;
    //  DDRT=0x00; //shu ru shezhi 
    DDRH=0XFF;   //输出设置
    PTH=0x00;
    PTH=0xff;
      
  }
  
  void init_sys(byte p1,byte p2)
  {
    init_CRG(p1,p2);
    init_interupt();
    init_port();
    
  }
  

/*-------串口初始化----------------------*/
void SciInit()
{
	SCI0BDL = (unsigned char)((80000000UL /* OSC freq */ / 2) / 19200 /* baud rate */ / 16 /*factor*/);
	SCI0CR1=0;					/*normal,no parity*/
	SCI0CR2=0X2C;       /*RIE=1,TE=1,RE=1*/
}


/*-------发射端程序-----单字节发送-----------------*/
void SciTx(unsigned char text)
{
	unsigned char temp;
	temp=SCI0SR1;      /*clear flag*/
	while (!(SCI0SR1&0x80));  /* wait for output buffer empty */
	SCI0DRH=0;
	SCI0DRL=text;
}


/*---------接受部分------------------------*/
char SciRx(void){
  char temp;
  char result;
  temp=SCI0SR1;      /*clear flag*/
  while(!(SCI0SR1&0x20));
  result=SCI0DRL;
  return  result;
}


void TestXianshi(void) {
 byte i,j;
 SciTx(0);
 for(i=1;i<61;i++)
 {
  for(j=1;j<81;j++) 
    {
      SciTx(j*3);
    }
   SciTx(0);
 }
   SciTx(0);
 //  SciTx(0);
   
}
void Send_piex(void)
 {
    
    byte i,j;
    SciTx(0);
    for(i=1;i<N;i++)        //N=61    
    {                       //传到上位机用GUI显示亮度,55 AA分别表示一个行的开始
  //   delayms();
   //  SciTx(0x55);                
     
   //  delayms();
     
     
      for(j=1;j<M;j++)       //M=71
      {
         /*  if (buff[i][j]<16) 
           {
            buff[i][j]=1;
           }
              
           else if (buff[i][j]>100)
           {
             buff[i][j]= 255; 
           }
              
            else
            {
                buff[i][j]=(255/84)*(buff[i][j]-16);
            }
           */
            if (buff[i][j]==128) 
          {
           buff[i][j]=250;
          }
            if (buff[i][j]==0) 
          {
           buff[i][j]=10;
          }
          
           SciTx(buff[i][j]);
       //    delayms();       
      }
        SciTx(0);

    }
        SciTx(0);

 }

 

void main(void) 
{
    DisableInterrupts;
    one_sample=1;

      init_sys(SYNE_SETTING,REFDV_SEETTING);
      SciInit();
      EnableInterrupts;

   
//    unsigned char aa[10]="123456789";
 //  SciTx('a');
 // TestXianshi(); 
      for(;;) 
      {    
        if(one_sample==2)
         {
            Send_piex();
            one_sample=3;
        } 
              
      }
}
 

 void interrupt 8 Port0_interrupt(void)
{
  unsigned char i;
  static int cnt=0x00;
  static byte cnt_HREF=0x1;
//  byte test;                                    
  TFLG1=0x01;                                      //清除行中断标志           
  TIE=0X00; 
  cnt++; 
  // DDRT=0x00; //   
  
    
  if(cnt>5)
  {
    cnt=1;
    cnt_HREF++;                                   //记录行中断次数,限定60行
  }       
  
    
     i=0; 
  
   if(cnt==5)
   {   

      while(PTT_PTT0)
    {
      buff[cnt_HREF][++i]=PORTA;//读全口 速度比读位快
      //  test=PTT_PTT1;
    //  i++; 
    // 	PTH=0X01;
    }
    //	PTH=0X00;
    
   }
   
    if(cnt_HREF>47)
    {
      cnt_HREF=0; 
      TIE=0X00; 
      one_sample=2;
      INTCR_IRQEN=1;
    }
    else
    {
       TIE=0X01;     
    }

    
 }
 
 
 
 /***************************场中断处理******************************************/         //场中断
  void interrupt 6 IRQ_interrupt(void)
 { 
   static byte m=0;
  if (m==0)
   {
        TIE=0X01;                                         //开行中断 /////
      // INTCR_IRQEN=0;   //关场中断使能
      	PORTB^=0XFF;
         m=1;                        
   } 
  else  TIE=0X00;
 }

                         

⌨️ 快捷键说明

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