做一个pic16f877a控制用iic控制at24c02的示例代码
时间: 2024-01-30 20:02:04 浏览: 27
好的,下面是一个使用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微控制器。