#define ALLOCATE_EXTERN #include "HC89F0541.h" #define DEVICEADD 0xA0 //24C02器件地址 #define SCL P0_1 //I2C时钟控制位 #define SDA P0_0 //I2C数据传送位 unsigned char guc_Buf = 0; //用于存放读写数据 unsigned char guc_Buf1 = 0; //用于存放读写数据 unsigned char guc_Buf2 = 0; //用于存放读写数据 void Delay_ms(unsigned int fui_i); //延时函数 void IIC_Send_Byte(unsigned char fuc_Add,unsigned char fuc_Dat);//IIC发送一个字节的数据 unsigned char IIC_Read_Byte(unsigned char fuc_Add); //IIC读取一个字节的数据 /*************************************************************************************** * @实现效果 对24C02进行读写操作 ***************************************************************************************/ void main() { /************************************系统初始化****************************************/ CLKSWR = 0x51; //选择内部高频RC为系统时钟,内部高频RC 2分频,Fosc =16MHz CLKDIV = 0x01; //Fosc 1分频得到Fcpu,Fcpu=16MHz /**********************************IIC配置初始化***************************************/ P0M1 = 0xC2; //P01设置为推挽输出 P0M0 = 0xE6; //P03设置为带上拉开漏输出 SCL_MAP = 0x01; //SCL映射P01口 SDA_MAP = 0x00; //SDA映射P00口 IICCON = 0x40; //启动IIC模块 IIC_Send_Byte(0x00,0x66); //将fuc_Buf的数据写入地址0x00 Delay_ms(20); IIC_Send_Byte(0x01,0x88); //将fuc_Buf的数据写入地址0x00 Delay_ms(20); IIC_Send_Byte(0x02,0x13); //将fuc_Buf的数据写入地址0x00 Delay_ms(20); guc_Buf = IIC_Read_Byte(0x01); //读取地址0x00的数据并写入fuc_Buf guc_Buf1 = IIC_Read_Byte(0x02); //读取地址0x00的数据并写入fuc_Buf guc_Buf2 = IIC_Read_Byte(0x00); //读取地址0x00的数据并写入fuc_Buf while(1) { } } /*************************************************************************************** * @说明 IIC发送一个字节的数据 * @参数 fuc_Add:存储的地址 * fuc_Dat:存储的数据 * @返回值 无 * @注 无 ***************************************************************************************/ void IIC_Send_Byte(unsigned char fuc_Add,unsigned char fuc_Dat) { IICCON &=~ 0x08; //清除中断标志位 IICCON |= 0x20; //起始位发送起始信号 while((!(IICCON&0x08))&&(IICSTA!=0x08)); IICCON &=~ 0x20; //起始位停止起始信号 IICCON &=~ 0x08; //清除中断标志位 IICDAT = DEVICEADD; //写入器件地址 while(IICSTA!=0x18); IICCON &=~ 0x08; //清除中断标志位 IICDAT = fuc_Add; //写入地址 while(IICSTA!=0x28); IICCON &=~ 0x08; //清除中断标志位 IICDAT = fuc_Dat; //写入数据 while(IICSTA!=0x28); IICCON &=~ 0x08; //清除中断标志位 IICCON |= 0x10; //停止位发送停止信号 } /*************************************************************************************** * @说明 IIC读取一个字节的数据 * @参数 fuc_Add:存储的地址 * @返回值 存储地址里面的数据 * @注 无 ***************************************************************************************/ unsigned char IIC_Read_Byte(unsigned char fuc_Add) { unsigned char fuc_Dat; IICCON &=~ 0x08; //清除中断标志位 IICCON |= 0x20; //起始位发送起始信号 while((!(IICCON&0x08))&&(IICSTA!=0x08)); IICCON &=~ 0x20; //起始位停止起始信号 IICCON &=~ 0x08; //清除中断标志位 IICDAT = DEVICEADD; //写入器件地址 while(IICSTA!=0x18); IICCON &=~ 0x08; //清除中断标志位 IICDAT = fuc_Add; //写入读地址 while(IICSTA!=0x28); IICCON &=~ 0x08; //清除中断标志位 IICCON |= 0x20; //起始位发送起始信号 while((!(IICCON&0x08))&&(IICSTA!=0x08)); IICCON &=~ 0x20; //起始位停止起始信号 IICCON &=~ 0x08; //清除中断标志位 IICDAT = DEVICEADD|0x01;//写入读指令 while(IICSTA!=0x40); IICCON &=~ 0x08; //清除中断标志位 while(IICSTA!=0x58); fuc_Dat = IICDAT; //读入数据 IICCON &=~ 0x08; //清除中断标志位 IICCON |= 0x10; //停止位发送停止信号 return fuc_Dat; } /** * @说明 延时函数 * @参数 fui_i : 延时时间 * @返回值 无 * @注 Fcpu = 16MHz,fui_i = 1时,延时时间约为1Ms */ void Delay_ms(unsigned int fui_i) { unsigned int fui_j; for(;fui_i > 0;fui_i --) for(fui_j = 1596;fui_j > 0;fui_j --); }效果图: 工程: IIC-读写24C02.rar (46.36 KB, 下载次数: 25) 2020-7-13 15:47 上传 点击文件名下载附件
举报
wangshujun 发表于 2020-7-15 11:59 感觉硬件iic没有优势,也看不出来硬件iic的价值所在 1、软件模拟速度不是太大的问题,不会慢很多 2、使用硬 ...
比神乐 发表于 2020-7-15 14:22 我感觉硬件I2C还是要比模拟时序省不少代码的。
wangshujun 发表于 2020-7-15 15:04 就少了模拟时钟和数据的移位收发,还多了中断标志的判断和处理 感觉更复杂了 ...
比神乐 发表于 2020-7-15 16:40 有多也有少
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
人才类勋章
时间类勋章
等级类勋章
发帖类勋章
470
3535
7
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号