历史上的今天
返回首页

历史上的今天

今天是:2024年11月19日(星期二)

正在发生

2019年11月19日 | 基于AVR的SCCB读写程序

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<#pragma interrupt_handler TX_end:14

uchar TXEND;

void TX_end()

{


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)

{

  send_byte(0xf4);

     send_byte(0x21);

     send_byte(0xf4);//出错


}


send_byte(0xf4);

send_byte(0x11);

send_byte(0xf4);//START信号的正确响应码






TWDR=0x42;//写操作SCCB的器件地址0X42

TWCR=0x84;//重启启动数据的发送

delay1ms(1);

while(0==get_bit(TWCR,7));//检测数据信号是否发送?

while((TWSR&0XF8)!=0x18)

{


send_byte(0xf4);

send_byte(0x22);

send_byte(0xf4);


     }


send_byte(0xf4);

send_byte(0x12);

send_byte(0xf4);//发送完毕有ACK应答响应码






TWDR=add;//写操作SCCB的寄存器子地址

TWCR=0x84;//重启启动数据的发送

delay1ms(1);

while(0==get_bit(TWCR,7));//检测数据信号是否发送?

while((TWSR&0XF8)!=0x28)

{

send_byte(0xf4);

send_byte(0x23);//出错

send_byte(0xf4);

     }


send_byte(0xf4);

send_byte(0x13);

send_byte(0xf4);//发送完毕有ACK应答响应码




TWDR=date;//写操作SCCB的寄存器数据

TWCR=0x84;//重启启动数据的发送

delay1ms(1);

while(0==get_bit(TWCR,7));//检测数据信号是否发送?

while((TWSR&0XF8)!=0x28)

{

send_byte(0xf4);

send_byte(0x24);//出错

send_byte(0xf4);

     }


send_byte(0xf4);

send_byte(0x14);

send_byte(0xf4);//发送完毕有ACK应答响应码



TWCR=0x94;//STOP信号





}

/**************************************************/

//本函数为设置7670寄存器的最底层操作函数,

//返回值为8位的数据

//ADD是要读的寄存器地址,

//

/*************************************************/

uchar read_ov7670_sccb_twi(uchar add)//读取一个add中的一个字节个数据

{   

         uchar date;

//主发送模式程序/////////////////////////

      

   

     TWCR=0xa4;//插入开始新号使能总线,使能START

  delay1ms(1);

while(0==get_bit(TWCR,7));//检测起始信号是否发送?

while((TWSR&0xf8)!=0x08)

{

send_byte(0xf4);

     send_byte(0x01);

     send_byte(0xf4);//出错


}


send_byte(0xf4);

send_byte(0x10);

send_byte(0xf4);//START信号的正确响应码






TWDR=0x42;//写操作SCCB的器件写地址0X42

TWCR=0x84;//重启启动数据的发送

delay1ms(1);

while(0==get_bit(TWCR,7));//检测数据信号是否发送?

while((TWSR&0XF8)!=0x18)

{


send_byte(0xf4);

send_byte(0x02);

send_byte(0xf4);


     }


send_byte(0xf4);

send_byte(0x20);

send_byte(0xf4);//发送完毕有ACK应答响应码






TWDR=add;//写操作SCCB的寄存器子地址

TWCR=0x84;//重启启动数据的发送

delay1ms(1);

while(0==get_bit(TWCR,7));//检测数据信号是否发送?

while((TWSR&0XF8)!=0x28)

{

send_byte(0xf4);

send_byte(0x03);//出错

send_byte(0xf4);

     }


send_byte(0xf4);

send_byte(0x30);

send_byte(0xf4);//发送完毕有ACK应答响应码



TWCR=0x94;//STOP信号


delay1ms(10);////无论读完还是模式转换后都要等待


//主接收模式程序/////////////////////////////////////////// 

TWCR=0xa4;//插入开始新号使能总线,使能START

   delay1ms(1);

while(0==get_bit(TWCR,7));//检测起始信号是否发送?

while((TWSR&0XF8)!=0x08)

{send_byte(0xf4);

send_byte(0x04);//出错

send_byte(0xf4);

     }


send_byte(0xf4);

send_byte(0x40);

send_byte(0xf4);//START信号的正确响应码



TWDR=0x43;//写操作SCCB的器件读地址0X43

TWCR=0x84;//重启启动数据的发送

delay1ms(1);

while(0==get_bit(TWCR,7));//检测数据信号是否发送?

while((TWSR&0XF8)!=0x40)

{send_byte(0xf4);

send_byte(0x05);//出错

send_byte(0xf4);

     }


send_byte(0xf4);

send_byte(0x50);

send_byte(0xf4);//发送完毕有ACK应答响应码



TWCR=0x84;//启动数据的接收

delay1ms(1);

while(0==get_bit(TWCR,7));//检测数据信号是否发送?

date=TWDR;

while((TWSR&0XF8)!=0x58)

{send_byte(0xf4);

send_byte(0x06);

send_byte(0xf4);}//出错


send_byte(0xf4);

send_byte(0x60);

send_byte(0xf4);//发送完毕有NACK应答响应码



TWCR=0x94;//STOP信号



return(date);




}

void main()

{


uchar inceptdate;//读出的寄存器数据

DDRC=0xff;

PORTC=0xff;

USART_INT();

int_twi_sccb();


inceptdate=read_ov7670_sccb_twi(0x15);//读寄存器地址为15的数据


send_byte(0xf4);

send_byte(inceptdate);//数据显示

send_byte(0xf4);


delay1ms(10);//无论读完还是写完都要等等


write_ov7670_sccb_twi(0x15,0x20);//写寄存器15的数据位20

delay1ms(10);


inceptdate=read_ov7670_sccb_twi(0x15);//再次读15的数据


send_byte(0xf4);

send_byte(inceptdate);//送显示,已是校验写入钱与写入后的对比

send_byte(0xf4);

while(1);



}


推荐阅读

史海拾趣

CDE [ CORNELL DUBILIER ELECTRONICS ]公司的发展小趣事

在电子行业的早期,创始人William Dubilier凭借其敏锐的洞察力和创新精神,于1909年创立了CDE公司。Dubilier首次使用一种名为云母的玻璃状矿物,开发出一种新型电容器,这一创新为CDE公司的诞生奠定了基石。自那时起,CDE便以电容器为专业方向,不断追求技术突破和产品创新。

Dawning Precision Co Ltd公司的发展小趣事

Dawning Precision Co Ltd(以下简称“Dawning”)成立于本世纪初,当时正值电子行业的快速发展期。公司的创始人张先生是一位在电子行业摸爬滚打多年的资深人士,他看到了精密制造在电子行业中的巨大潜力。然而,初创时期,公司面临着资金短缺、技术瓶颈和市场认知度低等困难。张先生带领团队夜以继日地工作,不断研发新技术,优化产品性能,同时积极寻找投资者和合作伙伴。经过几年的不懈努力,Dawning逐渐在行业中树立了良好的口碑,开始获得客户的认可。

AUREL公司的发展小趣事

随着电子市场竞争的加剧,AUREL公司意识到单纯的技术创新已不足以维持竞争优势。于是,公司开始注重品质管理,引入了先进的生产流程和严格的质量控制体系。这一举措大大提高了产品的可靠性和稳定性,赢得了客户的信赖和好评。通过持续改进和优化,AUREL公司的产品质量逐渐在行业中树立了良好的口碑。

AMI [American Megatrends Inc]公司的发展小趣事

AUREL公司深知人才是企业发展的核心动力。因此,公司一直注重人才的引进和培养。通过与高校和研究机构的合作,公司吸引了大批优秀的研发人才和管理人才。同时,公司还建立了完善的人才激励机制和培训体系,为员工提供了广阔的职业发展空间。这些举措使得AUREL公司的人才队伍不断壮大,为公司的持续发展提供了有力保障。

Genisco Electronics公司的发展小趣事
根据电源检测装置的信息,控制ATSE进行电源的切换,并可能具备故障报警、记录等功能。
Excelitas公司的发展小趣事

在当今社会,绿色环保和可持续发展已成为企业发展的重要趋势。Excelitas公司积极响应这一趋势,致力于研发和生产绿色环保的产品。通过采用环保材料和生产工艺,公司成功降低了产品的能耗和排放。同时,公司还积极参与环保公益活动,倡导绿色生活方式。这些举措不仅提升了公司的品牌形象,还为社会的可持续发展做出了积极贡献。

请注意,以上故事仅为基于假设和一般行业趋势构建的框架性描述,并不代表Excelitas公司的实际发展历程。如有需要,建议您查阅相关官方资料或新闻报道以获取更准确的信息。

问答坊 | AI 解惑

很无助

我的问题很老套了,现在已经快大四了,专业是通信工程,也算是电子类,学校不是很好,但还过的去! 下学期就找工作了,自己也不晓得该怎么办,要说学了点什么东西,个人觉得51和C还算过的去,只是在学校的一次很不起眼比赛中用51做东西拿了个一等奖.考研是不 ...…

查看全部问答>

看高手谈电源制作经验!

漏感主要与哪些因数有关? 屏蔽绕组对变压器的工作影响? 反激电源的开关过程分析? 整流管RC吸收回路的设计? RC吸收电路设计? 反激变换器中RCD嵌位电路设计? 简易法测试传导辐射? 变压器技巧? 电源的电流模式和电压模式? 如何设计 ...…

查看全部问答>

嵌入式内存分配问题~

LDR1 0x00000000 {     ROM1 0x00000000  0x1000     {         2410init.o (Init, +First)     } } LDR2 0x30000000 {     RAM2 0x30000000 &nb ...…

查看全部问答>

串口写函数writefile是与实际过程同步的吗?

原以为串口写函数writefile是阻塞式的,串口实际发送数据完毕后,该函数才返回。现在用示波器测试发现不是如此,特别是 在多字节写的时候,没发送完就返回了。请问在串口驱动程序中,我怎么才能知道串口发送实际完成?…

查看全部问答>

ADS1.2 编译的问题

   我找到一个uc/os 工程文件,已生成了\"HEX\" 但加载到我的ADS 显示的是“The following access path in target  (有一个不认识的字)elease ? Can not be foung:(project)...\\...\\基础实验\\counter    当然 ...…

查看全部问答>

请教一下如何注册一个外部中断(如何描述中断向量表)

我想写一个中断服务程序(ISR),不知道该如何定义中断向量表!也就是说我如何去把中断服务程序的程序的函数跳转指令放置在系统定义的某一个空间中。还有一半中断向量表的位置是固定在CPU空间的某一段,还是通过寄存器可以注册修改。…

查看全部问答>

怎样利用Broadcom公版程式读取Chip

这是我在DOS下运行Broadcom公版程式WL.exe出现的命令,求助如何用这些命令去读取Chip的EEPROM authe_sta_list         Get authenticated sta mac address list autho_sta_list         ...…

查看全部问答>

硬件开发流程及规范---附录

    由于附录中多是文字和流程图的结合,所以不好上传到博客,有需要的朋友可以回复留下您的email,抽空给您发过去。给您带来不便还请谅解!…

查看全部问答>

JlinkV8 Firmware Update

之前参加论坛团购,买了一个JlinkV8。 【团购】J-link V-7(成品或PCB散件)、V8成品正在进行...... https://bbs.eeworld.com.cn/thread-89108-1-2.html   下了Setup_JLinkARM_V422f.exe,一开始firmware update老是error。 网上找了一个 ...…

查看全部问答>