210 lines
6.6 KiB
Plaintext
210 lines
6.6 KiB
Plaintext
|
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 参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运<E38081>
|
|||
|
-<2D><>速度和试题
|
|||
|
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)
|