C51 COMPILER V9.56.0.0 I2C 04/28/2022 23:10:25 PAGE 1 C51 COMPILER V9.56.0.0, COMPILATION OF MODULE I2C OBJECT MODULE PLACED IN i2c.OBJ COMPILER INVOKED BY: D:\Keil_v5\C51\BIN\C51.EXE i2c.c OPTIMIZE(8,SPEED) BROWSE DEBUG OBJECTEXTEND TABS(2) line level source 1 #include"i2c.h" 2 3 /******************************************************************************* 4 * 函数名 : Delay10us() 5 * 函数功能 : 延时10us 6 * 输入 : 无 7 * 输出 : 无 8 *******************************************************************************/ 9 10 void Delay10us() 11 { 12 1 unsigned char a,b; 13 1 for(b=1;b>0;b--) 14 1 for(a=2;a>0;a--); 15 1 16 1 } 17 /******************************************************************************* 18 * 函数名 : I2cStart() 19 * 函数功能 : 起始信号:在SCL时钟信号在高电平期间SDA信号产生一个下降沿 20 * 输入 : 无 21 * 输出 : 无 22 * 备注 : 起始之后SDA和SCL都为0 23 *******************************************************************************/ 24 25 void I2cStart() 26 { 27 1 SDA=1; 28 1 Delay10us(); 29 1 SCL=1; 30 1 Delay10us();//建立时间是SDA保持时间>4.7us 31 1 SDA=0; 32 1 Delay10us();//保持时间是>4us 33 1 SCL=0; 34 1 Delay10us(); 35 1 } 36 /******************************************************************************* 37 * 函数名 : I2cStop() 38 * 函数功能 : 终止信号:在SCL时钟信号高电平期间SDA信号产生一个上升沿 39 * 输入 : 无 40 * 输出 : 无 41 * 备注 : 结束之后保持SDA和SCL都为1;表示总线空闲 42 *******************************************************************************/ 43 44 void I2cStop() 45 { 46 1 SDA=0; 47 1 Delay10us(); 48 1 SCL=1; 49 1 Delay10us();//建立时间大于4.7us 50 1 SDA=1; 51 1 Delay10us(); 52 1 } 53 /******************************************************************************* 54 * 函数名 : I2cSendByte(unsigned char dat) 55 * 函数功能 : 通过I2C发送一个字节。在SCL时钟信号高电平期间,保持发送信号SDA保持稳定 C51 COMPILER V9.56.0.0 I2C 04/28/2022 23:10:25 PAGE 2 56 * 输入 : num 57 * 输出 : 0或1。发送成功返回1,发送失败返回0 58 * 备注 : 发送完一个字节SCL=0,SDA=1 59 *******************************************************************************/ 60 61 unsigned char I2cSendByte(unsigned char dat) 62 { 63 1 unsigned char a=0,b=0;//最大255,一个机器周期为1us,最大延时255us。 64 1 for(a=0;a<8;a++)//要发送8位,从最高位开始 65 1 { 66 2 SDA=dat>>7; //起始信号之后SCL=0,所以可以直接改变SDA信号 67 2 dat=dat<<1; 68 2 Delay10us(); 69 2 SCL=1; 70 2 Delay10us();//建立时间>4.7us 71 2 SCL=0; 72 2 Delay10us();//时间大于4us 73 2 } 74 1 SDA=1; 75 1 Delay10us(); 76 1 SCL=1; 77 1 while(SDA)//等待应答,也就是等待从设备把SDA拉低 78 1 { 79 2 b++; 80 2 if(b>200) //如果超过2000us没有应答发送失败,或者为非应答,表示接收结束 81 2 { 82 3 SCL=0; 83 3 Delay10us(); 84 3 return 0; 85 3 } 86 2 } 87 1 SCL=0; 88 1 Delay10us(); 89 1 return 1; 90 1 } 91 /******************************************************************************* 92 * 函数名 : I2cReadByte() 93 * 函数功能 : 使用I2c读取一个字节 94 * 输入 : 无 95 * 输出 : dat 96 * 备注 : 接收完一个字节SCL=0,SDA=1. 97 *******************************************************************************/ 98 99 unsigned char I2cReadByte() 100 { 101 1 unsigned char a=0,dat=0; 102 1 SDA=1; //起始和发送一个字节之后SCL都是0 103 1 Delay10us(); 104 1 for(a=0;a<8;a++)//接收8个字节 105 1 { 106 2 SCL=1; 107 2 Delay10us(); 108 2 dat<<=1; 109 2 dat|=SDA; 110 2 Delay10us(); 111 2 SCL=0; 112 2 Delay10us(); 113 2 } 114 1 return dat; 115 1 } 116 117 C51 COMPILER V9.56.0.0 I2C 04/28/2022 23:10:25 PAGE 3 118 /******************************************************************************* 119 * 函数名 : void At24c02Write(unsigned char addr,unsigned char dat) 120 * 函数功能 : 往24c02的一个地址写入一个数据 121 * 输入 : 无 122 * 输出 : 无 123 *******************************************************************************/ 124 125 void At24c02Write(unsigned char addr,unsigned char dat) 126 { 127 1 I2cStart(); 128 1 I2cSendByte(0xa0);//发送写器件地址 129 1 I2cSendByte(addr);//发送要写入内存地址 130 1 I2cSendByte(dat); //发送数据 131 1 I2cStop(); 132 1 } 133 /******************************************************************************* 134 * 函数名 : unsigned char At24c02Read(unsigned char addr) 135 * 函数功能 : 读取24c02的一个地址的一个数据 136 * 输入 : 无 137 * 输出 : 无 138 *******************************************************************************/ 139 140 unsigned char At24c02Read(unsigned char addr) 141 { 142 1 unsigned char num; 143 1 I2cStart(); 144 1 I2cSendByte(0xa0); //发送写器件地址 145 1 I2cSendByte(addr); //发送要读取的地址 146 1 I2cStart(); 147 1 I2cSendByte(0xa1); //发送读器件地址 148 1 num=I2cReadByte(); //读取数据 149 1 I2cStop(); 150 1 return num; 151 1 } 152 MODULE INFORMATION: STATIC OVERLAYABLE CODE SIZE = 201 ---- CONSTANT SIZE = ---- ---- XDATA SIZE = ---- ---- PDATA SIZE = ---- ---- DATA SIZE = ---- ---- IDATA SIZE = ---- ---- BIT SIZE = ---- ---- END OF MODULE INFORMATION. C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)