C51 COMPILER V9.60.7.0 IIC 03/10/2025 18:03:54 PAGE 1 C51 COMPILER V9.60.7.0, COMPILATION OF MODULE IIC OBJECT MODULE PLACED IN .\Objects\iic.obj COMPILER INVOKED BY: D:\Keil_v5\C51\BIN\C51.EXE ..\driver\iic.c OPTIMIZE(8,SPEED) BROWSE INCDIR(..\driver;..\user) DEBUG - OBJECTEXTEND PRINT(.\Listings\iic.lst) TABS(2) OBJECT(.\Objects\iic.obj) line level source 1 /* # I2C代码片段说明 2 1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考。 3 2. 4 参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运 -速度和试题 5 中对单片机时钟频率的要求,进行代码调试和修改。 6 */ 7 #include "iic.h" 8 9 #include "intrins.h" 10 #define DELAY_TIME 5 11 sbit scl = P2 ^ 0; 12 sbit sda = P2 ^ 1; 13 // 14 static void I2C_Delay(unsigned char n) { 15 1 do { 16 2 _nop_(); 17 2 _nop_(); 18 2 _nop_(); 19 2 _nop_(); 20 2 _nop_(); 21 2 _nop_(); 22 2 _nop_(); 23 2 _nop_(); 24 2 _nop_(); 25 2 _nop_(); 26 2 _nop_(); 27 2 _nop_(); 28 2 _nop_(); 29 2 _nop_(); 30 2 _nop_(); 31 2 } while (n--); 32 1 } 33 34 // 35 void I2CStart(void) { 36 1 sda = 1; 37 1 scl = 1; 38 1 I2C_Delay(DELAY_TIME); 39 1 sda = 0; 40 1 I2C_Delay(DELAY_TIME); 41 1 scl = 0; 42 1 } 43 44 // 45 void I2CStop(void) { 46 1 sda = 0; 47 1 scl = 1; 48 1 I2C_Delay(DELAY_TIME); 49 1 sda = 1; 50 1 I2C_Delay(DELAY_TIME); 51 1 } 52 53 // C51 COMPILER V9.60.7.0 IIC 03/10/2025 18:03:54 PAGE 2 54 void I2CSendByte(unsigned char byt) { 55 1 unsigned char i; 56 1 57 1 for (i = 0; i < 8; i++) { 58 2 scl = 0; 59 2 I2C_Delay(DELAY_TIME); 60 2 if (byt & 0x80) { 61 3 sda = 1; 62 3 } else { 63 3 sda = 0; 64 3 } 65 2 I2C_Delay(DELAY_TIME); 66 2 scl = 1; 67 2 byt <<= 1; 68 2 I2C_Delay(DELAY_TIME); 69 2 } 70 1 71 1 scl = 0; 72 1 } 73 74 // 75 unsigned char I2CReceiveByte(void) { 76 1 unsigned char da; 77 1 unsigned char i; 78 1 for (i = 0; i < 8; i++) { 79 2 scl = 1; 80 2 I2C_Delay(DELAY_TIME); 81 2 da <<= 1; 82 2 if (sda) da |= 0x01; 83 2 scl = 0; 84 2 I2C_Delay(DELAY_TIME); 85 2 } 86 1 return da; 87 1 } 88 89 // 90 unsigned char I2CWaitAck(void) { 91 1 unsigned char ackbit; 92 1 93 1 scl = 1; 94 1 I2C_Delay(DELAY_TIME); 95 1 ackbit = sda; 96 1 scl = 0; 97 1 I2C_Delay(DELAY_TIME); 98 1 99 1 return ackbit; 100 1 } 101 102 // 103 void I2CSendAck(unsigned char ackbit) { 104 1 scl = 0; 105 1 sda = ackbit; 106 1 I2C_Delay(DELAY_TIME); 107 1 scl = 1; 108 1 I2C_Delay(DELAY_TIME); 109 1 scl = 0; 110 1 sda = 1; 111 1 I2C_Delay(DELAY_TIME); 112 1 } 113 114 unsigned char Ad_Read(unsigned char addr) { 115 1 unsigned char temp; C51 COMPILER V9.60.7.0 IIC 03/10/2025 18:03:54 PAGE 3 116 1 // 选择芯片为PCF 117 1 I2CStart(); 118 1 I2CSendByte(0x90); 119 1 I2CWaitAck(); 120 1 I2CSendByte(addr); 121 1 I2CWaitAck(); 122 1 123 1 I2CStart(); 124 1 I2CSendByte(0x91); 125 1 I2CWaitAck(); 126 1 temp = I2CReceiveByte(); 127 1 I2CSendAck(1); 128 1 I2CStop(); 129 1 return temp; 130 1 } 131 // 数字电压255->5V 132 void Da_Write(unsigned char dat) { 133 1 // 选择芯片为PCF 134 1 I2CStart(); 135 1 I2CSendByte(0x90); 136 1 I2CWaitAck(); 137 1 I2CSendByte(0x41); 138 1 I2CWaitAck(); 139 1 I2CSendByte(dat); 140 1 I2CWaitAck(); 141 1 } 142 void EEPROM_Write(unsigned char *str, unsigned char addr, unsigned char num) { 143 1 I2CStart(); 144 1 I2CSendByte(0xa0); 145 1 I2CWaitAck(); 146 1 I2CSendByte(addr); 147 1 I2CWaitAck(); 148 1 149 1 while (num--) { 150 2 I2CSendByte(*str++); 151 2 I2CWaitAck(); 152 2 I2C_Delay(200); 153 2 } 154 1 I2CStop(); 155 1 I2C_Delay(255); 156 1 I2C_Delay(255); 157 1 I2C_Delay(255); 158 1 I2C_Delay(255); 159 1 } 160 void EEPROM_Read(unsigned char *str, unsigned char addr, unsigned char num) { 161 1 I2CStart(); 162 1 I2CSendByte(0xa0); 163 1 I2CWaitAck(); 164 1 I2CSendByte(addr); 165 1 I2CWaitAck(); 166 1 167 1 I2CStart(); 168 1 I2CSendByte(0xa1); 169 1 I2CWaitAck(); 170 1 while (num--) { 171 2 *str++ = I2CReceiveByte(); 172 2 if (num) 173 2 I2CSendAck(0); 174 2 else 175 2 I2CSendAck(1); 176 2 } 177 1 I2CStop(); C51 COMPILER V9.60.7.0 IIC 03/10/2025 18:03:54 PAGE 4 178 1 } MODULE INFORMATION: STATIC OVERLAYABLE CODE SIZE = 388 ---- CONSTANT SIZE = ---- ---- XDATA SIZE = ---- ---- PDATA SIZE = ---- ---- DATA SIZE = ---- 10 IDATA SIZE = ---- ---- BIT SIZE = ---- ---- END OF MODULE INFORMATION. C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)