16F877A和24C02通信汇编语言,pic单片机IIC通信读24C02程序例 16F877A 主频4M

#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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个使用PIC16F877A微控制器和C编程语言的示代码,用于通过I2C总线控制AT24C02 EEPROM芯片: ```c #include <xc.h> #include <stdint.h> // I2C配置 #define I2C_FREQ 100000 // I2C总线率,单位为Hz #define EEPROM_ADDR 0xA0 // AT24C02芯片的I2C地址 // 函数声明 void I2C_Init(); void I2C_Start(); void I2C_Stop(); void I2C_Write(uint8_t data); uint8_t I2C_Read(); void EEPROM_Write(uint8_t addr, uint8_t data); uint8_t EEPROM_Read(uint8_t addr); void I2C_Init() { SSPCON = 0x28; // 设置I2C模式,开启I2C总线 SSPADD = (_XTAL_FREQ / (4 * I2C_FREQ)) - 1; // 设置I2C时钟率 SSPSTAT = 0x00; // 清除标志位 } void I2C_Start() { SEN = 1; // 发送起始位 while (SEN); // 等待起始位发送完成 } void I2C_Stop() { PEN = 1; // 发送停止位 while (PEN); // 等待停止位发送完成 } void I2C_Write(uint8_t data) { SSPBUF = data; // 写数据到SSPBUF寄存器 while (!SSPIF); // 等待数据发送完成 SSPIF = 0; // 清除标志位 } uint8_t I2C_Read() { RCEN = 1; // 允许接收数据 while (!SSPIF); // 等待数据接收完成 SSPIF = 0; // 清除标志位 return SSPBUF; // 返回接收到的数据 } void EEPROM_Write(uint8_t addr, uint8_t data) { I2C_Start(); // 发送起始位 I2C_Write(EEPROM_ADDR); // 发送EEPROM的I2C地址 I2C_Write(addr); // 发送要写入的地址 I2C_Write(data); // 发送要写入的数据 I2C_Stop(); // 发送停止位 __delay_ms(5); // 等待写入完成 } uint8_t EEPROM_Read(uint8_t addr) { uint8_t data; I2C_Start(); // 发送起始位 I2C_Write(EEPROM_ADDR); // 发送EEPROM的I2C地址 I2C_Write(addr); // 发送要取的地址 I2C_Start(); // 发送重复起始位 I2C_Write(EEPROM_ADDR | 0x01); // 发送带位的EEPROM的I2C地址 data = I2C_Read(); // 取数据 I2C_Stop(); // 发送停止位 return data; // 返回取到的数据 } void main() { TRISC3 = 1; // 设置RC3为输入引脚(SDA) TRISC4 = 1; // 设置RC4为输入引脚(SCL) I2C_Init(); // 初始化I2C总线 // 写入数据到EEPROM EEPROM_Write(0x00, 0xAB); // 从EEPROM取数据 uint8_t data = EEPROM_Read(0x00); while (1) { // 此处可以添加其他功能代码 } } ``` 在这个示代码中,我们使用RC3和RC4引脚作为I2C总线的SDA和SCL线。你可以根据需要修改引脚定义和连接方式。 `I2C_Init`函数用于初始化I2C总线,并设置总线的率。 `I2C_Start`函数发送起始位。 `I2C_Stop`函数发送停止位。 `I2C_Write`函数用于向I2C总线写入数据。 `I2C_Read`函数用于从I2C总线取数据。 `EEPROM_Write`函数用于向AT24C02 EEPROM芯片写入数据。 `EEPROM_Read`函数用于从AT24C02 EEPROM芯片取数据。 在`main`函数中,我们首先将RC3和RC4引脚设置为输入模式,然后初始化I2C总线。接下来,我们使用`EEPROM_Write`函数将0xAB写入EEPROM的地址0x00。最后,我们使用`EEPROM_Read`函数从EEPROM的地址0x00取数据,并将取到的数据存储在变量`data`中。 请确保正确连接电路并配置开发环境以适配PIC16F877A微控制器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值