📄 i2c.lst
字号:
C51 COMPILER V8.05a I2C 02/14/2009 15:35:01 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN i2c.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE i2c.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include<reg52.h>
2 #define uchar unsigned char
3 #define uint unsigned int
4 #include<LCD_1602.h>
5 sbit sda=P3^5;
6 sbit sck=P3^4;
7
8 void sda_0() {sda=0;;;;;;}
9 void sda_1() {sda=1;;;;;;}
10 void sck_0() {sck=0;;;;;;}
11 void sck_1() {sck=1;;;;;;}
12 void delay(uint z) //延时子程序
13 {
14 1 uint x,y;
15 1 for(x=z;x>0;x--)
16 1 for(y=110;y>0;y--);
17 1 }
18
19 void initial() //初始化子程序
20 {
21 1 sda_1();
22 1 sck_1();
23 1 }
24
25 void start() //开始子程序
26 {
27 1 sda_1();
28 1 sck_1();
29 1 sda_0();
30 1 sck_0(); //钳住I2C总线准备发送数据
31 1 }
32
33 void stop() //停止子程序
34 {
35 1 sda_0();
36 1 sck_1();
37 1 sda_1();
38 1 }
39
40 void response() //判断是否收到对方的响应信号,
41 { //没有收到则在规定时间内默认对方收到数据
42 1 uchar i=0;
43 1 sck_1();
44 1 while((sda==1)&&(i<250))i++;
45 1 sck_0(); //钳住I2C总线
46 1 }
47
48 void ack(bit byte)
49 {
50 1 if(byte==0) sda_0();
51 1 else sda_1();
52 1 sck_1(); //使数据有效
53 1 sck_0(); //钳住I2C总线
54 1
55 1 }
C51 COMPILER V8.05a I2C 02/14/2009 15:35:01 PAGE 2
56
57 void send_byte(uchar data1) //写数据子程序
58 {
59 1 uchar i;
60 1 for(i=0;i<8;i++)
61 1 {
62 2 data1=data1<<1;
63 2 sck_0(); //时钟线为低电平时,数据线才能改变
64 2 sda=CY; {;;;;;;;;;;} //注意不同晶振频率的延时长短
65 2 sck_1(); //时钟线为高电平时,数据必须稳定
66 2 }
67 1 sck_0();
68 1 sda_1(); //释放数据线
69 1 response();//等待对方响应
70 1 }
71
72 uchar read_byte() //读数据子程序
73 {
74 1 uchar i,temp=0;
75 1 sck_0();
76 1 sda_1(); //使数据线为输入方式
77 1 for(i=0;i<8;i++)
78 1 {
79 2 sck_1(); //使时钟线为高电平,数据有效
80 2 temp=(temp<<1)|sda; {;;;;;} //注意不同晶振频率的延时长短
81 2 sck_0(); //钳住I2C总线
82 2 }
83 1 return temp;
84 1 }
85
86 void write_address(uchar sla,uchar data1)
87 {
88 1 start();
89 1 send_byte(sla); //i2c地址
90 1 send_byte(data1); //数据
91 1 stop();
92 1 }
93
94 void sendstring(uchar sla,uchar suad,uchar *p,uchar num)
95 {
96 1 uchar i;
97 1 start();
98 1 send_byte(sla); //器件地址
99 1 send_byte(suad); //器件子地址
100 1 for(i=0;i<num;i++,p++)
101 1 {
102 2 send_byte(*p); //发送数据
103 2 delay(1);
104 2 }
105 1 stop();
106 1 }
107
108 uchar read_address(uchar sla)
109 { //向24C02任意地址读任意数据子程序
110 1 uchar data1;
111 1 start();
112 1 send_byte(sla); //先发送地址+写方向
113 1 start(); //接着又开始
114 1 send_byte(sla+1); //改变方向
115 1 data1=read_byte();
116 1 ack(1); //发送非应答信号
117 1 stop(); //结束
C51 COMPILER V8.05a I2C 02/14/2009 15:35:01 PAGE 3
118 1 return data1;
119 1 }
120
121 void readstring(uchar sla,uchar suad,uchar *s,uchar num)
122 {
123 1 uchar i,table[32];
124 1 table[0]=*s;
125 1 start();
126 1 send_byte(sla); //先发送地址+写方向
127 1 send_byte(suad); //读24C02哪一地址的数据
128 1 start(); //接着又开始
129 1 send_byte(sla+1); //改变方向
130 1 for(i=0;i<num-1;i++)
131 1 {
132 2 // *s=read_byte(); //为什么指针最多加12就自动结束?
133 2 table[i]=read_byte();
134 2 ack(0); //发送应答信号
135 2 // s++;
136 2 delay(1);
137 2 }
138 1 *s=read_byte();
139 1 ack(1); //发送应非答信号
140 1 stop(); //结束
141 1 }
142
143 void main()
144 {
145 1 uchar temp,sla,suad,i,num,data1,*p;
146 1 uchar code team[32]={0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70,
147 1 0x80,0x90,0xa0,0xb0,0xc0,0xd0,0xe0,0xf0,
148 1 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
149 1 0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f};
150 1 initial();
151 1 initial_1602();
152 1
153 1 sla=0x40;data1=0x64;
154 1 write_address(sla,data1); //向无子地址器件发送数据
155 1
156 1 delay(100); //需要延时一段时间
157 1 sla=0x40;
158 1 temp=read_address(sla); //向无子地址器件读取数据
159 1 display_1602(1,2,0,temp);
160 1
161 1 delay(100); //需要延时一段时间
162 1 sla=0xa0;suad=0x00;p=team; num=32;
163 1 sendstring(sla,suad,p,num); //向有子地址器件发送多字节数据
164 1
165 1 delay(100); //需要延时一段时间
166 1 sla=0xa0;suad=0x90;p=&temp;num=32;
167 1 readstring(sla,suad,p,num); //向有子地址器件读取多字节数据
168 1 p=&temp;
169 1 display_1602(0,1,9,'H');
170 1 for(i=0;i<32;i++,p++)
171 1 {
172 2 display_HEX1602(1,1,7,*p); //显示16进制数
173 2 delay(500);
174 2 }
175 1 while(1);
176 1 }
177
178
C51 COMPILER V8.05a I2C 02/14/2009 15:35:01 PAGE 4
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 795 ----
CONSTANT SIZE = 32 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 58
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -