找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2834|回复: 0
打印 上一主题 下一主题
收起左侧

基于AVR的8色带位图采集串口(实验)

[复制链接]
跳转到指定楼层
楼主
ID:26188 发表于 2015-6-23 14:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<iom16v.h>
#define uchar unsigned char
#define uint unsigned int
#define set_bit(a,b)  a|=(1<<b)
#define clr_bit(a,b)  a&=(1<<b)
#define get_bit(a,b)  a&(1<<b)
uchar TXEND;
uchar send_tab0_pc=0;//发送TAB0数据标志位
uchar send_tab1_pc=0;//发送tab1数据标志位
uchar i,j;
uchar TAB0[128];
uchar TAB1[128];
unsigned long v;//一帧的数据量
#pragma interrupt_handler TX_end:14
void TX_end()
{
SREG=0X80;//开启全局中断
TXEND=0;//发送完毕标志
}
void USART_INT()//初始化串口
{
//UCSRA默认
UCSRB=0x48;//使能发送完毕中断,禁能数据寄存器空中断,使能发送模式,关闭接收,关闭接收中断
UCSRC=0x86;//禁止奇偶效验,数据位8,停止位1,工作在异步模式
UBRRH=0x00;//
UBRRL=51;//波特率9600,8MHZ,
SREG=0x80;//开启全局中断
}

void send_byte(uchar buffer)//向PC发送数据
{
   while(0==get_bit(UCSRA,5));//数据寄存器里的数据是不是为空如果是就写数据
  
    UDR=buffer;


while(TXEND);//是否发送完毕?
TXEND=1;//上一帧已经发送准备下一帧的发送
}
/*void ov7670_int()//7670初始化函数
{

}*/


////***********SCCB-----OX7670************************//////////
void delay1ms(uint z)
{
uint j,k;
    for(k=z;k;k--)
                       {                           
                      for(j=2666;j;j--) ;  //此处j不得小于27否则读不出数据
        }
               
}

void int_twi_sccb()
{
TWBR=50;/*设置SCL的时钟频率在19。230根据公式SCL FREQUENCY=CPU Clock frequency/16+2(TWBR)*4的TWPS次方
*/

}
//////以上是写寄存器程序/////////////////////////////////
/**************************************************/
//本函数为设置7670寄存器的最底层操作函数,
//无返回值
//ADD是要写的寄存器地址,DATE是向里面写入的数据
//
/*************************************************/
void write_ov7670_sccb_twi(uchar add,uchar date)//向add指定的地址内写入指定的数据
{
    //主发送模式程序/////////////////////////
    TWCR=0xa4;//插入开始新号使能总线,使能START
  delay1ms(1);
while(0==get_bit(TWCR,7));//检测起始信号是否发送?
while((TWSR&0xf8)!=0x08)
{
    while(1);    //出错
  
}
//START信号的正确响应码





TWDR=0x42;//写操作SCCB的器件地址0X42
TWCR=0x84;//重启启动数据的发送
delay1ms(1);
while(0==get_bit(TWCR,7));//检测数据信号是否发送?
while((TWSR&0XF8)!=0x18)
{

   while(1);    //出错
     }

//发送完毕有ACK应答响应码





TWDR=add;//写操作SCCB的寄存器子地址
TWCR=0x84;//重启启动数据的发送
delay1ms(1);
while(0==get_bit(TWCR,7));//检测数据信号是否发送?
while((TWSR&0XF8)!=0x28)
{
   while(1);    //出错
     }

//发送完毕有ACK应答响应码



TWDR=date;//写操作SCCB的寄存器数据
TWCR=0x84;//重启启动数据的发送
delay1ms(1);
while(0==get_bit(TWCR,7));//检测数据信号是否发送?
while((TWSR&0XF8)!=0x28)
{
   while(1);    //出错
     }

//发送完毕有ACK应答响应码

TWCR=0x94;//STOP信号



}
//////以上是写寄存器程序//////////////////////////////////////////////////////////////
init_OV7670_POWER_UP()//0V7670的初始化寄存器设置
{

delay1ms(5);//准备写入软件初始化
write_ov7670_sccb_twi(0x12,0x83);//RGB格式,初始化,彩条输出
delay1ms(5);//初始化完毕
write_ov7670_sccb_twi(0x0d,0x30);//1/4窗口,160*120
delay1ms(5);//初始化完毕
write_ov7670_sccb_twi(0x11,0x0f);//f(内部时钟)=12mhz/(15+1)=12000/16=750hz
delay1ms(5);//初始化完毕
write_ov7670_sccb_twi(0x15,0x20);//PCLK在行同步时没输出
delay1ms(5);//初始化完毕
write_ov7670_sccb_twi(0x3c,0x68);//默认
delay1ms(5);//初始化完毕
write_ov7670_sccb_twi(0x3e,0x00);//PCLK无分频
delay1ms(5);//初始化完毕
write_ov7670_sccb_twi(0x40,0xd0);//数据范围是00~ff。输出RGB565
delay1ms(5);//初始化完毕
write_ov7670_sccb_twi(0x42,0xc8);//1/4窗口,DSP彩色条输出允许
delay1ms(5);//初始化完毕
write_ov7670_sccb_twi(0x6b,0xc0);//PLL8分频
delay1ms(5);//初始化完毕
write_ov7670_sccb_twi(0x70,0x80);//八色图
delay1ms(5);//初始化完毕
write_ov7670_sccb_twi(0x71,0x00);//八色图
delay1ms(5);//设置完毕

}

void init_external_interrupt()//外部中断的初始化程序
{
     MCUCR=0x0f;//外部中断0和1都是低电平触发
  GICR=0x80;//使能外部中断1;
  SREG=0X80;//开启全局中断
  

}
//外部中断0作为PCLK像素时钟
#pragma interrupt_handler int0_isr:2
void int0_isr(void)//外部中断0的服务程序
{   
     if(38400==v)
  {
   SREG=0X80;
  }
  else
  v++;

     if(128!=i)
  {
     
    TAB0[i]=PINA;
         i++;
   j=0;
   }
else  
send_tab0_pc=1; //向PC发送数据标志
send_tab1_pc=0;//不向PC发送数据标志
  if(128!=j)
  {
  TAB1[j]=PINA;
        j++;
  }
  else
  i=0;
  send_tab1_pc=1;//向PC发送数据标志           
  send_tab0_pc=0;//不向PC发送数据标志
}
//外部中断1作为HREF行同步信号
#pragma interrupt_handler int1_isr:3
void int1_isr(void)//外部中断1的服务程序
{
     MCUCR=0x0f;//外部中断0和1都是上升沿触发
  GICR=0xc0;//使能外部中断1,0;
  SREG=0x80;//开启全局中断


}
void main()
{
uchar num;
delay1ms(20);//上电延时20ms
DDRA=0x00;
DDRD=0xff;
PORTD=0xff;
DDRC=0xff;//pc口设为输出
PORTC=0xff;//pc口初始化

USART_INT();//串口初始化
int_twi_sccb();//sccb初始化
init_OV7670_POWER_UP();//软件初始化
init_external_interrupt();//外部中断初始化
delay1ms(10);//无论读完还是写完都要等等
while(1)
{
if(send_tab0_pc)
{
       for(num=0;num<128;num++)
    {send_byte((TAB0[num]));}
}
if(send_tab1_pc)
{
       for(num=0;num<128;num++)
    {send_byte((TAB1[num]));}

}


}

}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表