📄 2402.lst
字号:
C51 COMPILER V7.50 2402 05/22/2007 00:53:54 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE 2402
OBJECT MODULE PLACED IN 2402.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 2402.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /************************************************************************************/
2 /* 程序名:AT24C02的读取操作 */
3 /* */
4 /* 晶振:12.0 M CPU型号:AT89S52 */
5 /* */
6 /* */
7 /* 功能描述: 对单个AT24C02进行读和写的操作 */
8 /* */
9 /* http://www.mculover.net */
10 /* http://www.mculover.net/bbs */
11 /* */
12 /* */
13 /* 湘灵电子工作室 版权所有 */
14 /* 2006-02-20 */
15 /************************************************************************************/
16
17 #include<reg51.h>
18
19 sbit Key_in = P1 ^ 0; //按键存入数据
20 sbit Key_out = P1 ^ 1;//按键将数据读出
21
22 sbit SCL = P1 ^ 2;
23 sbit SDA = P1 ^ 3;
24
25 sbit P2_7 = P2 ^ 7;//数码管位选
26
27 #define TRUE 1
28 #define FALSE 0
29 #define Delay1_TIME 60 /*经实验,不要小于50!否则可能造成时序混乱*/
30
31 unsigned char SEG_TAB[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};//0-9数字
32
33 /********** Function Definition 函数定义 ************/
34 void Delay1(unsigned int t) /*延时函数*/
35 {
36 1 while(t!=0)
37 1 t--;
38 1 }
39
40 void I2C_Start(void)
41 {
42 1 /*启动I2C总线的函数,当SCL为高电平时使SDA产生一个负跳变*/
43 1 SDA=1;
44 1 SCL=1;
45 1 Delay1(Delay1_TIME);
46 1 SDA=0;
47 1 Delay1(Delay1_TIME);
48 1 SCL=0;
49 1 Delay1(Delay1_TIME);
50 1 }
51
52 void I2C_Stop(void)
53 {
54 1 /*终止I2C总线,当SCL为高电平时使SDA产生一个正跳变*/
55 1 SDA=0;
C51 COMPILER V7.50 2402 05/22/2007 00:53:54 PAGE 2
56 1 SCL=1;
57 1 Delay1(Delay1_TIME);
58 1 SDA=1;
59 1 Delay1(Delay1_TIME);
60 1 SCL=0;
61 1 Delay1(Delay1_TIME);
62 1 }
63
64 void SEND_0(void) /* SEND ACK */
65 {
66 1 /*发送0,在SCL为高电平时使SDA信号为低*/
67 1 SDA=0;
68 1 SCL=1;
69 1 Delay1(Delay1_TIME);
70 1 SCL=0;
71 1 Delay1(Delay1_TIME);
72 1 }
73
74 void SEND_1(void)
75 {
76 1 /*发送1,在SCL为高电平时使SDA信号为高*/
77 1 SDA=1;
78 1 SCL=1;
79 1 Delay1(Delay1_TIME);
80 1 SCL=0;
81 1 Delay1(Delay1_TIME);
82 1 }
83
84 bit Check_Acknowledge(void)
85 {
86 1 /*发送完一个字节后检验设备的应答信号*/
87 1 SDA=1;
88 1 SCL=1;
89 1 Delay1(Delay1_TIME/2);
90 1 F0=SDA;
91 1 Delay1(Delay1_TIME/2);
92 1 SCL=0;
93 1 Delay1(Delay1_TIME);
94 1 if(F0==1)
95 1 return FALSE;
96 1 return TRUE;
97 1 }
98
99 void WriteI2CByte(unsigned char b)reentrant
100 {
101 1 /*向I2C总线写一个字节*/
102 1 unsigned char i;
103 1 for(i=0;i<8;i++)
104 1 if((b<<i)&0x80)
105 1 SEND_1();
106 1 else
107 1 SEND_0();
108 1 }
109
110 unsigned char ReadI2CByte(void)reentrant
111 {
112 1 /*从I2C总线读一个字节*/
113 1 unsigned char b=0,i;
114 1 for(i=0;i<8;i++)
115 1 {
116 2 SDA=1; /*释放总线*/
117 2 SCL=1; /*接受数据*/
C51 COMPILER V7.50 2402 05/22/2007 00:53:54 PAGE 3
118 2 Delay1(10);
119 2 F0=SDA;
120 2 Delay1(10);
121 2 SCL=0;
122 2 if(F0==1)
123 2 {
124 3 b=b<<1;
125 3 b=b|0x01;
126 3 }
127 2 else
128 2 b=b<<1;
129 2 }
130 1 return b;
131 1 }
132
133 /**********以下为读写24c02的函数******************************/
134 void Write_One_Byte(unsigned char addr,unsigned char thedata)
135 {
136 1 bit acktemp=1;
137 1 /*write a byte to mem*/
138 1 I2C_Start();
139 1 WriteI2CByte(0xa0);
140 1 acktemp=Check_Acknowledge();
141 1 WriteI2CByte(addr); /*address*/
142 1 acktemp=Check_Acknowledge();
143 1 WriteI2CByte(thedata); /*thedata*/
144 1 acktemp=Check_Acknowledge();
145 1 I2C_Stop();
146 1 }
147
148 /************************************************************/
149 char Read_One_Byte(unsigned char addr)
150 {
151 1 bit acktemp=1;
152 1 unsigned char mydata;
153 1 /*read a byte from mem*/
154 1 I2C_Start();
155 1 WriteI2CByte(0xa0);
156 1 acktemp=Check_Acknowledge();
157 1 WriteI2CByte(addr);/*address*/
158 1 acktemp=Check_Acknowledge();
159 1 I2C_Start();
160 1 WriteI2CByte(0xa1);
161 1 acktemp=Check_Acknowledge();
162 1 mydata=ReadI2CByte();
163 1 acktemp=Check_Acknowledge();
164 1 return mydata;
165 1 I2C_Stop();
166 1 }
167
168 //调用方式如下:
169 //Write_One_Byte(0x10,0x04);
170 //k=Read_One_Byte(0x10);
171 /******************************************************************************/
172 void main(void)
173 {
174 1 unsigned char tmp;
175 1
176 1 P2_7 = 0;//选择数码管的第一位显示
177 1
178 1 while(1)
179 1 {
C51 COMPILER V7.50 2402 05/22/2007 00:53:54 PAGE 4
180 2 if(Key_in == 0)//判断Key_in是否被按下
181 2 {
182 3 Delay1(500);//延时消抖
183 3 if(Key_in == 0)
184 3 {
185 4 Write_One_Byte(0x04,0x07);//往2402的0X04地址写如数值0X07
186 4 }
187 3 }
188 2
189 2 if(Key_out == 0)
190 2 {
191 3 Delay1(500);
192 3 if(Key_out == 0)
193 3 {
194 4 tmp = Read_One_Byte(0x04);//将读出来的数值给tmp
195 4 P0 = SEG_TAB[tmp];
196 4 }
197 3 }
198 2 }
199 1 }
200
201
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 393 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 10 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- 2
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -