×
单片机 > 单片机程序设计 > 详情

pic单片机IIC通信读24C02程序例 16F877A 主频4M

发布时间:2020-05-16 发布时间:
|
文本名为 iic.h #ifndef _iic_h_
#define  _iic_h_//pic单片机IIC通信初始化函数声明
void iiccsh(void);  
//pic单片机IIC通信读外围设备函数声明
//功能:传送一个8位地址,返回一个8位数据
unsigned char iicread(unsigned char data);
//pic单片机IIC通信给外围器件发送函数声明
//功能:传送一个8位地址,传送一个8位数据或指令
void iicwrite(unsigned char diz,unsigned char data);
#endif          文本名为   iic.c#ifndef  _iic_h_      //立即写,立即读,在写读之间要有一定的延时(unsigned int sdf; sdf=400; while(sdf)--sdf;)
#define  _iic_h_
#include
//pic单片机IIC通信初始化函数
void iiccsh(void)   
{
 TRISC3=1;     
 TRISC4=1;     //PIC单片机(对16F877A单片机而言IIC通信是RC3和RC4引脚)IIC通信时时钟引脚和数据引脚要设置成输入
 SSPCON=0X28;  //SSPCON同步串口控制寄存器设置成IIC通信功能使能和单片机主控方式
 SSPCON2=0;    //SSPCON2同步串口控制寄存器置0
 SSPSTAT=0X80;  //SSPSTAT同步串口状态寄存器设置成采用标准S模式(100Kb/s)和输入电平满足IIC总线标准
 SSPADD=9;     //SSPADD  iic通信波特率寄存器 
}
//pic单片机IIC通信读外围设备函数
//功能:传送一个8位地址,返回一个8位数据
unsigned char iicread(unsigned char address)  //address位
{
 unsigned char data;
 SSPIF=0;
 SEN=1;  //在SDA和SCL线上建立和发送一个启动信号时序
 while(!SSPIF);  //判断是启动信号否发送完毕,SSPIF为1的时候是真 为0的时候是假 !SSPIF(1)为非真,为假退出语句
 SSPIF=0;  //软件清零 不会自动清零
 SSPBUF=0XA0;  //发送外设IIC器件地址和写信号
 while(!SSPIF);
 SSPIF=0;
 SSPBUF=address;  //发送要读外设IIC器件数据的地址
 while(!SSPIF);  //判断是否发送完毕
 SSPIF=0;
 RSEN=1;  //发送启动重启信号
 while(!SSPIF);
 SSPIF=0;
 SSPBUF=0XA1;  //发送外设IIC器件地址和读数据信号
 while(!SSPIF);  //每发送一个数据都要检测是否成功
 SSPIF=0;
 RCEN=1;  //设置读允许
    while(SSPIF==0);
 data=SSPBUF;
// while(SSPIF==0);
 SSPIF=0;
 ACKDT=0;  //写入应答信号
 ACKEN=1;   //发送应答信号
 while(!SSPIF);
 SSPIF=0;
 RCEN=0; 
 PEN=1;  //在SDA和SCL线上建立和发送一个停止信号时序
 while(!SSPIF); //如果收到停止信号同样会置位
 SSPIF=0;
 return(data);
 
}
//pic单片机IIC通信给外围器件发送函数声明
//功能:传送一个8位地址,传送一个8位数据或指令
void iicwrite(unsigned char diz,unsigned char data)
{
 SSPIF=0;
 SEN=1;  //在SDA和SCL线上建立和发送一个启动信号时序
 while(!SSPIF);  //判断是启动信号否发送完毕,SSPIF为1的时候是真 为0的时候是假 !SSPIF(1)为非真,为假退出语句
 SSPIF=0;   //软件清零 不会自动清零
 SSPBUF=0XA0;  //发送外设IIC器件地址和写信号
 while(!SSPIF);  //判断是否发送完毕
 SSPIF=0;
 SSPBUF=diz;  //发送要读外设IIC器件数据的地址
 while(!SSPIF);  //每发送一个数据都要检测是否成功
 SSPIF=0;
 SSPBUF=data;  //发送要读外设IIC器件要存储的数据或命令
 while(!SSPIF);  //每发送一个数据都要检测是否成功
 SSPIF=0;
 PEN=1;  //在SDA和SCL线上建立和发送一个停止信号时序
 while(!SSPIF);  //如果收到停止信号同样会置位
 SSPIF=0; 
}
#endif


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈msp430f5529入门(2)----时钟配置.例程分析