新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > pic單片機(jī)IIC通信讀24C02程序例 16F877A 主頻4M

pic單片機(jī)IIC通信讀24C02程序例 16F877A 主頻4M

作者: 時(shí)間:2016-11-29 來源:網(wǎng)絡(luò) 收藏
文本名為 iic.h #ifndef _iic_h_
#define  _iic_h_//pic單片機(jī)IIC通信初始化函數(shù)聲明void iiccsh(void);  //pic單片機(jī)IIC通信讀外圍設(shè)備函數(shù)聲明//功能:傳送一個(gè)8位地址,返回一個(gè)8位數(shù)據(jù)unsigned char iicread(unsigned char data);//pic單片機(jī)IIC通信給外圍器件發(fā)送函數(shù)聲明//功能:傳送一個(gè)8位地址,傳送一個(gè)8位數(shù)據(jù)或指令void iicwrite(unsigned char diz,unsigned char data);#endif          文本名為   iic.c#ifndef  _iic_h_      //立即寫,立即讀,在寫讀之間要有一定的延時(shí)(unsigned int sdf; sdf=400; while(sdf)--sdf;)#define  _iic_h_#include//pic單片機(jī)IIC通信初始化函數(shù)void iiccsh(void)   {TRISC3=1;     TRISC4=1;     //PIC單片機(jī)(對(duì)16F877A單片機(jī)而言IIC通信是RC3和RC4引腳)IIC通信時(shí)時(shí)鐘引腳和數(shù)據(jù)引腳要設(shè)置成輸入SSPCON=0X28;  //SSPCON同步串口控制寄存器設(shè)置成IIC通信功能使能和單片機(jī)主控方式SSPCON2=0;    //SSPCON2同步串口控制寄存器置0SSPSTAT=0X80;  //SSPSTAT同步串口狀態(tài)寄存器設(shè)置成采用標(biāo)準(zhǔn)S模式(100Kb/s)和輸入電平滿足IIC總線標(biāo)準(zhǔn)SSPADD=9;     //SSPADD  iic通信波特率寄存器 }//pic單片機(jī)IIC通信讀外圍設(shè)備函數(shù)//功能:傳送一個(gè)8位地址,返回一個(gè)8位數(shù)據(jù)unsigned char iicread(unsigned char address)  //address位{unsigned char data;SSPIF=0;SEN=1;  //在SDA和SCL線上建立和發(fā)送一個(gè)啟動(dòng)信號(hào)時(shí)序while(!SSPIF);  //判斷是啟動(dòng)信號(hào)否發(fā)送完畢,SSPIF為1的時(shí)候是真 為0的時(shí)候是假 !SSPIF(1)為非真,為假退出語句SSPIF=0;  //軟件清零 不會(huì)自動(dòng)清零SSPBUF=0XA0;  //發(fā)送外設(shè)IIC器件地址和寫信號(hào)while(!SSPIF);SSPIF=0;SSPBUF=address;  //發(fā)送要讀外設(shè)IIC器件數(shù)據(jù)的地址while(!SSPIF);  //判斷是否發(fā)送完畢SSPIF=0;RSEN=1;  //發(fā)送啟動(dòng)重啟信號(hào)while(!SSPIF);SSPIF=0;SSPBUF=0XA1;  //發(fā)送外設(shè)IIC器件地址和讀數(shù)據(jù)信號(hào)while(!SSPIF);  //每發(fā)送一個(gè)數(shù)據(jù)都要檢測是否成功SSPIF=0;RCEN=1;  //設(shè)置讀允許while(SSPIF==0);data=SSPBUF;// while(SSPIF==0);SSPIF=0;ACKDT=0;  //寫入應(yīng)答信號(hào)ACKEN=1;   //發(fā)送應(yīng)答信號(hào)while(!SSPIF);SSPIF=0;RCEN=0; PEN=1;  //在SDA和SCL線上建立和發(fā)送一個(gè)停止信號(hào)時(shí)序while(!SSPIF); //如果收到停止信號(hào)同樣會(huì)置位SSPIF=0;return(data);}//pic單片機(jī)IIC通信給外圍器件發(fā)送函數(shù)聲明//功能:傳送一個(gè)8位地址,傳送一個(gè)8位數(shù)據(jù)或指令void iicwrite(unsigned char diz,unsigned char data){SSPIF=0;SEN=1;  //在SDA和SCL線上建立和發(fā)送一個(gè)啟動(dòng)信號(hào)時(shí)序while(!SSPIF);  //判斷是啟動(dòng)信號(hào)否發(fā)送完畢,SSPIF為1的時(shí)候是真 為0的時(shí)候是假 !SSPIF(1)為非真,為假退出語句SSPIF=0;   //軟件清零 不會(huì)自動(dòng)清零SSPBUF=0XA0;  //發(fā)送外設(shè)IIC器件地址和寫信號(hào)while(!SSPIF);  //判斷是否發(fā)送完畢SSPIF=0;SSPBUF=diz;  //發(fā)送要讀外設(shè)IIC器件數(shù)據(jù)的地址while(!SSPIF);  //每發(fā)送一個(gè)數(shù)據(jù)都要檢測是否成功SSPIF=0;SSPBUF=data;  //發(fā)送要讀外設(shè)IIC器件要存儲(chǔ)的數(shù)據(jù)或命令while(!SSPIF);  //每發(fā)送一個(gè)數(shù)據(jù)都要檢測是否成功SSPIF=0;PEN=1;  //在SDA和SCL線上建立和發(fā)送一個(gè)停止信號(hào)時(shí)序while(!SSPIF);  //如果收到停止信號(hào)同樣會(huì)置位SSPIF=0; }#endif


評(píng)論


技術(shù)專區(qū)

關(guān)閉