📄 24c16.lst
字号:
C51 COMPILER V8.06 24C16 03/15/2008 14:51:26 PAGE 1
C51 COMPILER V8.06, COMPILATION OF MODULE 24C16
OBJECT MODULE PLACED IN 24c16.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 24c16.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <main.h>
2 #include <REG52.H>
3
4
5 //通道0 温度 TEMPERATURE
6 //记录存储标志存储在第0页第一个字节 无记录时为0xAA 有记录时为0x55
7 //数据存储在第0页 低位第二字节为温度下限 高位第三字节为温度上限
8
9
10 //通道1 压力 PREASURE
11 //记录存储标志存储在第1页 第一个字节 无记录时为0xAA 有记录时为0x55
12 //数据存储在第1页 低位第二字节为压力下限 高位第三字节为压力上限
13
14
15
16 //通道2 流量 FLUX
17 //记录存储标志存储在第2页 第一个字节 无记录时为0xAA 有记录时为0x55
18 //数据存储在第2页 低位第二字节为流量下限 高位第三字节为流量上限
19
20
21 //8页×256字节=16k bit
22
23 #define WRITE 0xA0 //定义24c16的器件地址和方向位W
24 #define READ 0xA1 //定义24c16的器件地址和方向位R
25
26 //单片机与AT24c16之间的引脚定义
27
28 sbit WP=P2^1;
29 sbit SCL=P2^2;
30 sbit SDA=P2^3;
31
32 //延时子程序 延时14us
33
34 void d14us()
35 {
36 1 uchar i;
37 1 for(i=0;i<5;i++);
38 1
39 1 }
40
41
42 //开始位
43
44 void start_bit(void)
45 {
46 1 SCL=1;d14us();
47 1 SDA=1;d14us();
48 1 SDA=0;d14us();
49 1 SCL=0;d14us();
50 1 }
51
52 //停止位
53
54 void stop_bit(void)
55 {
C51 COMPILER V8.06 24C16 03/15/2008 14:51:26 PAGE 2
56 1 SDA=0;d14us();
57 1 SCL=1;d14us();
58 1 SDA=1;d14us();
59 1 }
60
61 //主答函数 在接收数据时用
62
63 void mast_ack(void)
64 {
65 1 SCL=0;d14us();
66 1 SDA=0;d14us();
67 1 SCL=1;d14us();
68 1 SCL=0;d14us();
69 1 SDA=1;d14us();
70 1 }
71
72 //从应答函数 在发送数据时用
73
74 void ack(void)
75 {
76 1 SDA=1; //输出口置1 等待SDA上 24c16发出的应答信号
77 1 SCL=0;d14us();
78 1 SCL=1;d14us();
79 1 while(SDA){;}
80 1 SCL=0;d14us();
81 1 }
82
83 //无需应答位,在读程序中用到 (最后一个数据时)
84 //主器件(即cpu)在接收到最后一个字节后不发应答信号
85 void no_ack(void)
86 {
87 1 SDA=1;d14us();
88 1 SCL=1;d14us();
89 1 SCL=0;d14us();
90 1 }
91
92 //写一个字节(8位)数据 把一次写拆分成多次8位数据发送
93
94 write_8bit(uchar ch)
95 {
96 1 uchar i=8;
97 1 SCL=0;d14us();
98 1 while(i--)
99 1 {
100 2 SDA=(bit)(ch&0x01);d14us(); //强制类型转换
101 2 ch<<=1;
102 2 SCL=1;d14us();
103 2 SCL=0;d14us();
104 2 }
105 1 }
106
107 //读24c16指定地址数据(任意地址的字节读)
108 //参数:address 长整型 11位二进制
109 #pragma disable //避免与串口通讯等中断冲突
110 uchar read24c16(uint address) //长整型 11位二进制
111 {
112 1 uchar data rdata; //读数据存储单元
113 1 uchar data SlvAdrHigh,SlvAdrLow; //地址的高八位 低八位单元
114 1 uchar i=8;
115 1
116 1
117 1 SlvAdrHigh=((address&0x0700)>>7)|WRITE;
C51 COMPILER V8.06 24C16 03/15/2008 14:51:26 PAGE 3
118 1 SlvAdrLow=(address&0xFF);
119 1 start_bit();
120 1 write_8bit(SlvAdrHigh);
121 1 ack();
122 1 write_8bit(SlvAdrLow);
123 1 ack();//伪写
124 1 start_bit();
125 1 write_8bit(SlvAdrHigh|0x01);
126 1 ack();
127 1 while(i--)
128 1 {
129 2 rdata<<=1;
130 2 SCL=0;d14us(); SCL=1;
131 2 if(SDA) rdata|=0x01;
132 2 }
133 1 no_ack();
134 1 stop_bit();
135 1
136 1 return rdata;
137 1 }
138
139 //写数据到24c16的指定地址(字节写)
140 //源数据:ddata 目的地址: address
141 #pragma disable //避免与串口通讯等中断冲突
142 void write24c16(uint address,uchar ddata)
143 {
144 1
145 1 uchar data SlvAdrHigh,SlvAdrLow; //地址的高八位 低八位单元
146 1
147 1 SlvAdrHigh=((address&0x0700)>>7)|WRITE;
148 1 SlvAdrLow=(address&0xFF);
149 1 start_bit();
150 1 write_8bit(SlvAdrHigh);
151 1 ack();
152 1 write_8bit(SlvAdrLow);
153 1 ack();
154 1 write_8bit(ddata);
155 1 ack();
156 1 stop_bit();
157 1
158 1 }
159
160 //页面写函数,firstw_ad为需写入数据存储单元的首地址(11位),
161 // firstr_ad为被写入数据所在首地址
162 // counter为写入数据字节数 <=16个字节
163
164 void page_wr(uint firstw_ad,uint counter,uchar firstr_ad)
165 {
166 1
167 1 uchar data *ufirstr_ad;
168 1 uchar data SlvAdrHigh,SlvAdrLow; //地址的高八位 低八位单元
169 1
170 1 SlvAdrHigh=((firstw_ad&0x0700)>>7)|WRITE;
171 1 SlvAdrLow=(firstw_ad&0xFF);
172 1
173 1 ufirstr_ad=firstr_ad; //把cpu中地址赋给指针
*** WARNING C289 IN LINE 173 OF 24C16.C: '=': converting non-pointer to pointer
174 1 start_bit();
175 1 write_8bit(SlvAdrHigh); //1010 0010
176 1 ack();
177 1 write_8bit(SlvAdrLow);
178 1 ack();
C51 COMPILER V8.06 24C16 03/15/2008 14:51:26 PAGE 4
179 1 while(counter--)
180 1 {
181 2 write_8bit(*ufirstr_ad);
182 2 ufirstr_ad++;
183 2 ack();
184 2 }
185 1 stop_bit();
186 1 }
187
188 //页面读函数,firstrd_ad为所读字节首地址,count为读字节数
189 // *ufirstwr_ad为读出数据存储首地址指针 firstwr_ad为被读出数据单元所在首地址
190
191 void page_rd(uint firstrd_ad,uint count,uchar *firstwr_ad)
192 {
193 1 uchar j=8;
194 1 uchar data *ufirstwr_ad;
195 1 uchar data SlvAdrHigh,SlvAdrLow; //地址的高八位 低八位单元
196 1
197 1 SlvAdrHigh=((firstrd_ad&0x0700)>>7)|WRITE;
198 1 SlvAdrLow=(firstrd_ad&0xFF);
199 1
200 1 ufirstwr_ad=firstwr_ad;
201 1 start_bit();
202 1 write_8bit(SlvAdrHigh);
203 1 ack();
204 1 write_8bit(SlvAdrLow);
205 1 ack();
206 1 start_bit();
207 1 write_8bit(SlvAdrHigh|0x01);
208 1 ack();
209 1 while(count--)
210 1 {
211 2 uchar i=8;
212 2 while(i--)
213 2 {
214 3 (*ufirstwr_ad)<<=1;
215 3 SCL=0;d14us();d14us();SCL=1;
216 3 if(SDA) (*ufirstwr_ad)|=0x01;
217 3 }
218 2 ufirstwr_ad++;
219 2 mast_ack();
220 2 }
221 1 while(j--) //不需要应答的最后一位数据
222 1 {
223 2 (*ufirstwr_ad)<<=1;
224 2 SCL=0;d14us();d14us();SCL=1;
225 2 if(SDA) (*ufirstwr_ad)|=0x01;
226 2 }
227 1 no_ack();
228 1 stop_bit();
229 1 }
230
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 530 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 13
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
C51 COMPILER V8.06 24C16 03/15/2008 14:51:26 PAGE 5
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -