#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;//發(fā)送完畢標(biāo)志 } void USART_INT()//初始化串口 { //UCSRA默認(rèn) UCSRB=0x48;//使能發(fā)送完畢中斷,禁能數(shù)據(jù)寄存器空中斷,使能發(fā)送模式,關(guān)閉接收,關(guān)閉接收中斷 UCSRC=0x86;//禁止奇偶效驗,數(shù)據(jù)位8,停止位1,工作在異步模式 UBRRH=0x00;// UBRRL=51;//波特率9600,8MHZ, SREG=0x80;//開啟全局中斷 } void send_byte(uchar buffer)//向PC發(fā)送數(shù)據(jù) { while(0==get_bit(UCSRA,5));//數(shù)據(jù)寄存器里的數(shù)據(jù)是不是為空如果是就寫數(shù)據(jù) UDR=buffer; while(TXEND);//是否發(fā)送完畢? TXEND=1;//上一幀已經(jīng)發(fā)送準(zhǔn)備下一幀的發(fā)送 } /*void ov7670_int()//7670初始化函數(shù) { }*/ ////***********SCCB-----OX7670************************////////// void delay1ms(uint z) { uint j,k; for(k=z;k;k--) { for(j=2666;j;j--) ; //此處j不得小于27否則讀不出數(shù)據(jù) } } void int_twi_sccb() { TWBR=50;/*設(shè)置SCL的時鐘頻率在19。230根據(jù)公式SCL FREQUENCY=CPU Clock frequency/16+2(TWBR)*4的TWPS次方 */ } /**************************************************/ //本函數(shù)為設(shè)置7670寄存器的最底層操作函數(shù), //無返回值 //ADD是要寫的寄存器地址,DATE是向里面寫入的數(shù)據(jù) // /*************************************************/ void write_ov7670_sccb_twi(uchar add,uchar date)//向add指定的地址內(nèi)寫入指定的數(shù)據(jù) { //主發(fā)送模式程序///////////////////////// TWCR=0xa4;//插入開始新號使能總線,使能START delay1ms(1); while(0==get_bit(TWCR,7));//檢測起始信號是否發(fā)送? while((TWSR&0xf8)!=0x08) { send_byte(0xf4); send_byte(0x21); send_byte(0xf4);//出錯 } send_byte(0xf4); send_byte(0x11); send_byte(0xf4);//START信號的正確響應(yīng)碼 TWDR=0x42;//寫操作SCCB的器件地址0X42 TWCR=0x84;//重啟啟動數(shù)據(jù)的發(fā)送 delay1ms(1); while(0==get_bit(TWCR,7));//檢測數(shù)據(jù)信號是否發(fā)送? while((TWSR&0XF8)!=0x18) { send_byte(0xf4); send_byte(0x22); send_byte(0xf4); } send_byte(0xf4); send_byte(0x12); send_byte(0xf4);//發(fā)送完畢有ACK應(yīng)答響應(yīng)碼 TWDR=add;//寫操作SCCB的寄存器子地址 TWCR=0x84;//重啟啟動數(shù)據(jù)的發(fā)送 delay1ms(1); while(0==get_bit(TWCR,7));//檢測數(shù)據(jù)信號是否發(fā)送? while((TWSR&0XF8)!=0x28) { send_byte(0xf4); send_byte(0x23);//出錯 send_byte(0xf4); } send_byte(0xf4); send_byte(0x13); send_byte(0xf4);//發(fā)送完畢有ACK應(yīng)答響應(yīng)碼 TWDR=date;//寫操作SCCB的寄存器數(shù)據(jù) TWCR=0x84;//重啟啟動數(shù)據(jù)的發(fā)送 delay1ms(1); while(0==get_bit(TWCR,7));//檢測數(shù)據(jù)信號是否發(fā)送? while((TWSR&0XF8)!=0x28) { send_byte(0xf4); send_byte(0x24);//出錯 send_byte(0xf4); } send_byte(0xf4); send_byte(0x14); send_byte(0xf4);//發(fā)送完畢有ACK應(yīng)答響應(yīng)碼 TWCR=0x94;//STOP信號 } /**************************************************/ //本函數(shù)為設(shè)置7670寄存器的最底層操作函數(shù), //返回值為8位的數(shù)據(jù) //ADD是要讀的寄存器地址, // /*************************************************/ uchar read_ov7670_sccb_twi(uchar add)//讀取一個add中的一個字節(jié)個數(shù)據(jù) { uchar date; //主發(fā)送模式程序///////////////////////// TWCR=0xa4;//插入開始新號使能總線,使能START delay1ms(1); while(0==get_bit(TWCR,7));//檢測起始信號是否發(fā)送? while((TWSR&0xf8)!=0x08) { send_byte(0xf4); send_byte(0x01); send_byte(0xf4);//出錯 } send_byte(0xf4); send_byte(0x10); send_byte(0xf4);//START信號的正確響應(yīng)碼 TWDR=0x42;//寫操作SCCB的器件寫地址0X42 TWCR=0x84;//重啟啟動數(shù)據(jù)的發(fā)送 delay1ms(1); while(0==get_bit(TWCR,7));//檢測數(shù)據(jù)信號是否發(fā)送? while((TWSR&0XF8)!=0x18) { send_byte(0xf4); send_byte(0x02); send_byte(0xf4); } send_byte(0xf4); send_byte(0x20); send_byte(0xf4);//發(fā)送完畢有ACK應(yīng)答響應(yīng)碼 TWDR=add;//寫操作SCCB的寄存器子地址 TWCR=0x84;//重啟啟動數(shù)據(jù)的發(fā)送 delay1ms(1); while(0==get_bit(TWCR,7));//檢測數(shù)據(jù)信號是否發(fā)送? while((TWSR&0XF8)!=0x28) { send_byte(0xf4); send_byte(0x03);//出錯 send_byte(0xf4); } send_byte(0xf4); send_byte(0x30); send_byte(0xf4);//發(fā)送完畢有ACK應(yīng)答響應(yīng)碼 TWCR=0x94;//STOP信號 delay1ms(10);////無論讀完還是模式轉(zhuǎn)換后都要等待 //主接收模式程序/////////////////////////////////////////// TWCR=0xa4;//插入開始新號使能總線,使能START delay1ms(1); while(0==get_bit(TWCR,7));//檢測起始信號是否發(fā)送? while((TWSR&0XF8)!=0x08) {send_byte(0xf4); send_byte(0x04);//出錯 send_byte(0xf4); } send_byte(0xf4); send_byte(0x40); send_byte(0xf4);//START信號的正確響應(yīng)碼 TWDR=0x43;//寫操作SCCB的器件讀地址0X43 TWCR=0x84;//重啟啟動數(shù)據(jù)的發(fā)送 delay1ms(1); while(0==get_bit(TWCR,7));//檢測數(shù)據(jù)信號是否發(fā)送? while((TWSR&0XF8)!=0x40) {send_byte(0xf4); send_byte(0x05);//出錯 send_byte(0xf4); } send_byte(0xf4); send_byte(0x50); send_byte(0xf4);//發(fā)送完畢有ACK應(yīng)答響應(yīng)碼 TWCR=0x84;//啟動數(shù)據(jù)的接收 delay1ms(1); while(0==get_bit(TWCR,7));//檢測數(shù)據(jù)信號是否發(fā)送? date=TWDR; while((TWSR&0XF8)!=0x58) {send_byte(0xf4); send_byte(0x06); send_byte(0xf4);}//出錯 send_byte(0xf4); send_byte(0x60); send_byte(0xf4);//發(fā)送完畢有NACK應(yīng)答響應(yīng)碼 TWCR=0x94;//STOP信號 return(date); } void main() { uchar inceptdate;//讀出的寄存器數(shù)據(jù) DDRC=0xff; PORTC=0xff; USART_INT(); int_twi_sccb(); inceptdate=read_ov7670_sccb_twi(0x15);//讀寄存器地址為15的數(shù)據(jù) send_byte(0xf4); send_byte(inceptdate);//數(shù)據(jù)顯示 send_byte(0xf4); delay1ms(10);//無論讀完還是寫完都要等等 write_ov7670_sccb_twi(0x15,0x20);//寫寄存器15的數(shù)據(jù)位20 delay1ms(10); inceptdate=read_ov7670_sccb_twi(0x15);//再次讀15的數(shù)據(jù) send_byte(0xf4); send_byte(inceptdate);//送顯示,已是校驗寫入錢與寫入后的對比 send_byte(0xf4); while(1); }
上一篇:avr單片機(jī)DS18B20溫度讀取程序-母親節(jié)的禮物
下一篇:基于AVR的8色帶位圖采集串口(實驗)
推薦閱讀
史海拾趣
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- 瓜分2000元新年開工紅包!貿(mào)澤電子邀你元宵猜燈謎
- 造個車,一起駛向詩和遠(yuǎn)方!學(xué)習(xí) TI 汽車參考設(shè)計,參加技能小測試贏好禮!
- 幸運十一月,器件購買e問e答!
- 學(xué)AM335X課程,贏超值BB-Black團(tuán)購資格,更有DIY大獎賽預(yù)熱中!
- 2020 STM32全國研討會火熱報名中,新技術(shù)新方案等你收獲,還有好禮拿!
- 下載《Altera SoC深度體驗》,打分評論贏好禮
- 艾睿電子& Silicon Labs 有獎直播 | 全新藍(lán)牙信道探測:從技術(shù)創(chuàng)新到實際應(yīng)用
- 預(yù)約有禮:2020年最新KEE課程
- 便攜式低功耗藍(lán)牙錄音設(shè)備將語音準(zhǔn)確轉(zhuǎn)換為文字
- 替換式照明市場已飽和,智慧化照明如何帶來新的增長?
- CCAA發(fā)布首個民用機(jī)場無人機(jī)監(jiān)測系統(tǒng)技術(shù)要求
- 全面分析工業(yè)機(jī)器人產(chǎn)業(yè)鏈的上中下三游
- QSFP-DD發(fā)布 通用管理接口規(guī)范4.0和硬件規(guī)范5.0
- 基帶、射頻,還有人不了解嗎?看這里
- 微軟全新Surface Book 3和Go 2即將面世
- 華為nova7 SE評測:6400萬高清影像系統(tǒng),一見傾心
- 臺積電去年生產(chǎn)10761種不同芯片,市占達(dá)52%
- TWS市場蘋果依舊領(lǐng)跑,印度出貨量同比增長700%