📄 51
字号:
159 1 SDA = 0; //SDA的下降沿被认为是开始信号
160 1 _nop_(); //等待一个机器周期
161 1 _nop_(); //等待一个机器周期
162 1 _nop_(); //等待一个机器周期
163 1 _nop_(); //等待一个机器周期
164 1 SCL = 0; //SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)
165 1 }
166 /***************************************************
167 函数功能:结束数据传送
168 ***************************************************/
169 void stop()
170 // 停止位
171 {
172 1 SDA = 0; //SDA初始化为低电平“0”
173 1 _nop_(); //等待一个机器周期
174 1 _nop_(); //等待一个机器周期
175 1 SCL = 1; //结束数据传送时,要求SCL为高电平“1”
176 1 _nop_(); //等待一个机器周期
177 1 _nop_(); //等待一个机器周期
178 1 _nop_(); //等待一个机器周期
179 1 _nop_(); //等待一个机器周期
C51 COMPILER V8.09 EX86 07/12/2010 14:45:07 PAGE 4
180 1 SDA = 1; //SDA的上升沿被认为是结束信号
181 1 }
182 /***************************************************
183 函数功能:从AT24Cxx读取数据
184 出口参数:x
185 ***************************************************/
186 unsigned char ReadData()
187 // 从AT24Cxx移入数据到MCU
188 {
189 1 unsigned char i;
190 1 unsigned char x; //储存从AT24Cxx中读出的数据
191 1 for(i = 0; i < 8; i++)
192 1 {
193 2 SCL = 1; //SCL置为高电平
194 2 x<<=1; //将x中的各二进位向左移一位
195 2 x|=(unsigned char)SDA; //将SDA上的数据通过按位“或“运算存入x中
196 2 SCL = 0; //在SCL的下降沿读出数据
197 2 }
198 1 return(x); //将读取的数据返回
199 1 }
200 /***************************************************
201 函数功能:向AT24Cxx的当前地址写入数据
202 入口参数:y (储存待写入的数据)
203 ***************************************************/
204 //在调用此数据写入函数前需首先调用开始函数start(),所以SCL=0
205 bit WriteCurrent(unsigned char y)
206 {
207 1 unsigned char i;
208 1 bit ack_bit; //储存应答位
209 1 for(i = 0; i < 8; i++) // 循环移入8个位
210 1 {
211 2 SDA = (bit)(y&0x80); //通过按位“与”运算将最高位数据送到S
212 2 //因为传送时高位在前,低位在后
213 2 _nop_(); //等待一个机器周期
214 2 SCL = 1; //在SCL的上升沿将数据写入AT24Cxx
215 2 _nop_(); //等待一个机器周期
216 2 _nop_(); //等待一个机器周期
217 2
218 2 SCL = 0; //将SCL重新置为低电平,以在SCL线形成传送数据所需的8个脉冲
219 2 y <<= 1; //将y中的各二进位向左移一位
220 2 }
221 1 SDA = 1; // 发送设备(主机)应在时钟脉冲的高电平期间(SCL=1)释放SDA线,
222 1 //以让SDA线转由接收设备(AT24Cxx)控制
223 1 _nop_(); //等待一个机器周期
224 1 _nop_(); //等待一个机器周期
225 1 SCL = 1; //根据上述规定,SCL应为高电平
226 1 _nop_(); //等待一个机器周期
227 1 _nop_(); //等待一个机器周期
228 1 _nop_(); //等待一个机器周期
229 1 _nop_(); //等待一个机器周期
230 1 ack_bit = SDA; //接受设备(AT24Cxx)向SDA送低电平,表示已经接收到一个字节
231 1 //若送高电平,表示没有接收到,传送异常
232 1 SCL = 0; //SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)
233 1 return ack_bit; // 返回AT24Cxx应答位
234 1 }
235 /***************************************************
236 函数功能:向AT24Cxx中的指定地址写入数据
237 入口参数:add (储存指定的地址);dat(储存待写入的数据)
238 ***************************************************/
239 void WriteSet(unsigned char add, unsigned char dat)
240 // 在指定地址addr处写入数据WriteCurrent
241 {
C51 COMPILER V8.09 EX86 07/12/2010 14:45:07 PAGE 5
242 1 start(); //开始数据传递
243 1 WriteCurrent(OP_WRITE); //选择要操作的AT24Cxx芯片,并告知要对其写入数据
244 1 WriteCurrent(add); //写入指定地址
245 1 WriteCurrent(dat); //向当前地址(上面指定的地址)写入数据
246 1 stop(); //停止数据传递
247 1 delaynms(4); //1个字节的写入周期为1ms, 最好延时1ms以上
248 1 }
249 /***************************************************
250 函数功能:从AT24Cxx中的当前地址读取数据
251 出口参数:x (储存读出的数据)
252 ***************************************************/
253 unsigned char ReadCurrent()
254 {
255 1 unsigned char x;
256 1 start(); //开始数据传递
257 1 WriteCurrent(OP_READ); //选择要操作的AT24Cxx芯片,并告知要读其数据
258 1 x=ReadData(); //将读取的数据存入x
259 1 stop(); //停止数据传递
260 1 return x; //返回读取的数据
261 1 }
262 /***************************************************
263 函数功能:从AT24Cxx中的指定地址读取数据
264 入口参数:set_add
265 出口参数:x
266 ***************************************************/
267 unsigned char ReadSet(unsigned char set_add)
268 // 在指定地址读取
269 {
270 1 start(); //开始数据传递
271 1 WriteCurrent(OP_WRITE); //选择要操作的AT24Cxx芯片,并告知要对其写入数据
272 1 WriteCurrent(set_add); //写入指定地址
273 1 return(ReadCurrent()); //从指定地址读出数据并返回
274 1 }
275 /*********************************************************************
276 函数功能:主函数
277 ***********************************************************************/
278 void main(void)
279 {
280 1 unsigned char sum; //储存计数值
281 1 unsigned char x; //储存从AT24C08读出的值
282 1 unsigned char i;
283 1 LcdInitiate(); //调用LCD初始化函数
284 1 sum=0; //将计数值初始化为0
285 1 WriteAddress(0x01); //写地址,从第1行第4列开始显示
286 1 i=0; //从字符数组的第1个元素开始显示
287 1 while(string[i]!='\0') //只要没有显示到字符串的结束标志'\0',就继续
288 1 {
289 2 WriteData(string[i]); //将第i个字符数组元素写入LCD
290 2 i++; //指向下一个数组元素
291 2 }
292 1 while(1) //无限循环
293 1 {
294 2 if(K5==0) //如果该键被按下
295 2 {
296 3 delaynms(80); //软件消抖,延时80ms
297 3 if(K5==0) //确实该键被按下
298 3 sum++; //计件值加1
299 3 while(!K5); //等待按键释放
300 3 if(sum==99) //如果计满99
301 3 sum=0; //清0,重新开始计数
302 3 }
303 2 WriteSet(0x10,sum); //将计件值写入AT24C02中的指定地址"0x10"
C51 COMPILER V8.09 EX86 07/12/2010 14:45:07 PAGE 6
304 2 x=ReadSet(0x10); //从AT24C02中读出计件值
305 2 Display(x); //将计件值用1602LCD显示
306 2 }
307 1 }
308
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 422 ----
CONSTANT SIZE = 25 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
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 + -