📄 pcf8591.lst
字号:
240 1 askflag = 0;
241 1 delayNOP();
C51 COMPILER V8.02 PCF8591 12/31/2009 10:21:57 PAGE 5
242 1 if(SDA == 1) // 若SDA=1表明非应答,置位非应答标志askflag
243 1 askflag = 1;
244 1 SCL = 0;
245 1 }
246 //-------------------------------------------------------------------
247 // 函数名称: IICSendByte
248 // 入口参数: ch
249 // 函数功能: 发送一个字节
250 //-------------------------------------------------------------------
251 void IICSendByte(uchar ch)
252
253 {
254 1 unsigned char idata n=8; // 向SDA上发送一位数据字节,共八位
255 1
256 1 while(n--)
257 1 {
258 2 if((ch&0x80) == 0x80) // 若要发送的数据最高位为1则发送位1
259 2 {
260 3 SDA = 1; // 传送位1
261 3 SCL = 1;
262 3 delayNOP();
263 3 // SDA = 0;
264 3 SCL = 0;
265 3 }
266 2 else
267 2 {
268 3 SDA = 0; // 否则传送位0
269 3 SCL = 1;
270 3 delayNOP();
271 3 SCL = 0;
272 3 }
273 2 ch = ch<<1; // 数据左移一位
274 2 }
275 1 }
276 //-------------------------------------------------------------------
277 // 函数名称: IICreceiveByte
278 // 返回接收的数据
279 // 函数功能: 接收一字节子程序
280 //-------------------------------------------------------------------
281 uchar IICreceiveByte(void)
282 {
283 1 uchar idata n=8; // 从SDA线上读取一上数据字节,共八位
284 1 uchar tdata=0;
285 1 while(n--)
286 1 {
287 2 SDA = 1;
288 2 SCL = 1;
289 2 tdata =tdata<<1; //左移一位
290 2 if(SDA == 1)
291 2 tdata = tdata|0x01; // 若接收到的位为1,则数据的最后一位置1
292 2 else
293 2 tdata = tdata&0xfe; // 否则数据的最后一位置0
294 2 SCL = 0;
295 2 }
296 1
297 1 return(tdata);
298 1 }
299 //-------------------------------------------------------------------
300 // 函数名称: DAC_PCF8591
301 // 入口参数: slave_add从机地址,n要发送的数据个数
302 // 函数功能: 发送n位数据子程序
303 //-------------------------------------------------------------------
C51 COMPILER V8.02 PCF8591 12/31/2009 10:21:57 PAGE 6
304 void DAC_PCF8591(uchar controlbyte,uchar w_data)
305 {
306 1
307 1 iic_start(); // 启动I2C
308 1 delayNOP();
309 1
310 1 IICSendByte(PCF8591_WRITE); // 发送地址位
311 1 check_ACK(); // 检查应答位
312 1 if(askflag == 1)
313 1 {
314 2 SystemError = 1;
315 2 return; // 若非应答,置错误标志位
316 2 }
317 1 IICSendByte(controlbyte&0x77); //Control byte
318 1 check_ACK(); //检查应答位
319 1 if(askflag == 1)
320 1 {
321 2 SystemError = 1;
322 2 return; // 若非应答,置错误标志位
323 2 }
324 1 IICSendByte(w_data); //data byte
325 1 check_ACK(); // 检查应答位
326 1 if(askflag == 1)
327 1 {
328 2 SystemError = 1;
329 2 return; // 若非应答表明器件错误或已坏,置错误标志位SystemError
330 2 }
331 1 iic_stop(); // 全部发完则停止
332 1 delayNOP();
333 1 delayNOP();
334 1 delayNOP();
335 1 delayNOP();
336 1 }
337 //-------------------------------------------------------------------
338 // 函数名称: ADC_PCF8591
339 // 入口参数: controlbyte控制字
340 // 函数功能: 连续读入4路通道的A/D转换结果到receivebuf
341 //-------------------------------------------------------------------
342 void ADC_PCF8591(uchar controlbyte)
343 {
344 1 uchar idata receive_da,i=0;
345 1
346 1 iic_start();
347 1
348 1 IICSendByte(PCF8591_WRITE); //控制字
349 1 check_ACK();
350 1 if(askflag == 1)
351 1 {
352 2 SystemError = 1;
353 2 return;
354 2 }
355 1
356 1 IICSendByte(controlbyte); //控制字
357 1 check_ACK();
358 1 if(askflag == 1)
359 1 {
360 2 SystemError = 1;
361 2 return;
362 2 }
363 1
364 1 iic_start(); //重新发送开始命令
365 1 IICSendByte(PCF8591_READ); //控制字
C51 COMPILER V8.02 PCF8591 12/31/2009 10:21:57 PAGE 7
366 1 check_ACK();
367 1 if(askflag == 1)
368 1 {
369 2 SystemError = 1;
370 2 return;
371 2 }
372 1
373 1 IICreceiveByte(); //空读一次,调整读顺序
374 1 slave_ACK(); //收到一个字节后发送一个应答位
375 1
376 1 while(i<4)
377 1 {
378 2 receive_da=IICreceiveByte();
379 2 receivebuf[i++]=receive_da;
380 2 slave_ACK(); //收到一个字节后发送一个应答位
381 2 }
382 1 slave_NOACK(); //收到最后一个字节后发送一个非应答位
383 1 iic_stop();
384 1 }
385 //-------------------------------------------------------------------
386 // 函数名称: main
387 // 函数功能: 主程序
388 //-------------------------------------------------------------------
389 main()
390 {
391 1 uchar i,l;
392 1 delay(10); //延时
393 1 lcd_init(); //初始化LCD
394 1
395 1 lcd_pos(0); //设置显示位置为第一行的第1个字符
396 1 i = 0;
397 1 while(dis4[i] != '\0')
398 1 { //显示字符
399 2 lcd_wdat(dis4[i]);
400 2 i++;
401 2 }
402 1
403 1 lcd_pos(0x40); //设置显示位置为第二行第1个字符
404 1 i = 0;
405 1 while(dis5[i] != '\0')
406 1 {
407 2 lcd_wdat(dis5[i]); //显示字符
408 2 i++;
409 2 }
410 1
411 1 while(1)
412 1 {
413 2 iicInit(); //I2C总线初始化
414 2 ADC_PCF8591(0x04);
415 2
416 2 if(SystemError == 1) //有错误,重新来
417 2 {
418 3 iicInit(); //I2C总线初始化
419 3 ADC_PCF8591(0x04);
420 3 }
421 2
422 2 for(l=0;l<4;l++)
423 2 {
424 3 show_value(receivebuf[0]); //显示通道0
425 3 lcd_pos(0x02);
426 3 lcd_wdat(dis[2]); //整数位显示
427 3 lcd_pos(0x04);
C51 COMPILER V8.02 PCF8591 12/31/2009 10:21:57 PAGE 8
428 3 lcd_wdat(dis[1]); //第一位小数显示
429 3 lcd_pos(0x05);
430 3 lcd_wdat(dis[0]); //第二位小数显示
431 3
432 3 show_value(receivebuf[1]); //显示通道1
433 3 lcd_pos(0x0b);
434 3 lcd_wdat(dis[2]); //整数位显示
435 3 lcd_pos(0x0d);
436 3 lcd_wdat(dis[1]); //第一位小数显示
437 3 lcd_pos(0x0e);
438 3 lcd_wdat(dis[0]); //第二位小数显示
439 3
440 3 show_value(receivebuf[2]); //显示通道2
441 3 lcd_pos(0x42);
442 3 lcd_wdat(dis[2]); //整数位显示
443 3 lcd_pos(0x44);
444 3 lcd_wdat(dis[1]); //第一位小数显示
445 3 lcd_pos(0x45);
446 3 lcd_wdat(dis[0]); //第二位小数显示
447 3
448 3 show_value(receivebuf[3]); //显示通道3
449 3 lcd_pos(0x4b);
450 3 lcd_wdat(dis[2]); //整数位显示
451 3 lcd_pos(0x4d);
452 3 lcd_wdat(dis[1]); //第一位小数显示
453 3 lcd_pos(0x4e);
454 3 lcd_wdat(dis[0]); //第二位小数显示
455 3
456 3 iicInit(); //I2C总线初始化
457 3 DAC_PCF8591(0x40,receivebuf[0]); //D/A输出
458 3
459 3 if(SystemError == 1) //有错误,重新来
460 3 {
461 4 iicInit(); //I2C总线初始化
462 4 DAC_PCF8591(0x40,receivebuf[0]); //D/A输出
463 4 }
464 3
465 3 //delay(50); //延时
466 3 }
467 2
468 2 }
469 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 861 ----
CONSTANT SIZE = 34 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 8 1
IDATA SIZE = 4 4
BIT SIZE = 2 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -