历史上的今天
今天是:2024年11月19日(星期二)
2019年11月19日 | 基于AVR的8色带位图采集串口(实验)
2019-11-19 来源:51hei
#include #define uchar unsigned char #define uint unsigned int #define set_bit(a,b) a|=(1<#define clr_bit(a,b) a&=(1<#define get_bit(a,b) a&(1<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]));} } } }
上一篇:基于AVR的SCCB读写程序
下一篇:LCD12864液晶显示程序
史海拾趣
|
摘要:在所研制的新型无触点电力稳压器中,采用晶闸管作为开关器件。文中介绍该系统基本工作原理,详细分析晶闸管在使用过程中存在的一些问题及解决方法。目前流行的电力稳压器大多采用伺服电机带动炭刷移动调整电压。它具有整机效率高、输出波形好 ...… 查看全部问答> |
|
(求助)316驱动IGBT,总烧IGBT,包括400A的都烧掉了? (求助)316驱动IGBT,总烧IGBT,包括400A的都烧掉了(电流应该在400A以下),只是开和关,没用Pwm,另外每次烧掉的那次,IGBT都是关不断的。现在都不敢用了,有人知道为何吗?是不是316的保护特性不行,还是我的管子还是电流不够大(不会的 ...… 查看全部问答> |
|
用上位机发送 “a123456789012345678901234567890” (串口调试工具,ascii码) 下位机用串口中断响应 当接到“a”时,将后面的30个数据保存到d【30】数组里。 有很好的解决方案吗? 如果直接用d【i】= RXBUF0的话 波特率的误差会导致有时出错 ...… 查看全部问答> |
|
同步电路的速度是指同步时钟的速度。同步时钟愈快,电路处理数据的时间间隔越短,电路在单位时间处理的数据量就愈大。 我们先来看一看同步电路中数据传递的一个基本模型:如下图 图1(Tco是触发器时钟到数据输出的延时;Tdelay是组合逻辑的延时 ...… 查看全部问答> |
|
驱动开发中的多数据流有什么用,如fileobject->FileName得到的是:QebiesnrMkudrfcoIaamtykdDa:$DATA,望高手指点 在驱动中解析文件路径打时候,fileobject->filename是多数据流:Docf_SummaryInformation:$DATA,这个拿来有什么用啊,路径中没用到这个信息啊,fileobject->filename,fileobject->relatedfileobject->filename有什么区别啊,什么什么时候有区别啊, ...… 查看全部问答> |




