使用AD芯片PCF8591采样电压时出现的问题

2019-07-15 16:00发布

每次单片机刚上电时采样第一次总是采样到2.5V电压(VCC=5V),然后再次采样时才能采样到正确值。求教原因。源代码如下:

  1. void main()
  2. {
  3.                
  4.                 uchar vol_1,vol_2,vol_3;
  5.                 LCD_Init();
  6.                 delay(1000);
  7.                 while(1)
  8.                 {
  9.                         result=read_ad(CH3);
  10.                         P1=result;
  11.                         vol=result*196;
  12.                         if(vol%100>=50)        //四舍五入
  13.                                 vol=vol/100+1;
  14.                         else
  15.                                 vol=vol/100;
  16.                         vol_1=vol/100;
  17.                         vol_2=vol/10%10;
  18.                         vol_3=vol%100%10;
  19.                         LCD_Write_String(2,0,"VOL:");
  20.                         LCD_Write_Char(8,0,vol_1+48);
  21.                         LCD_Write_Char(9,0,'.');
  22.                         LCD_Write_Char(10,0,vol_2+48);
  23.                         LCD_Write_Char(11,0,vol_3+48);
  24.                         LCD_Write_Char(12,0,'V');
  25.                         while(P3==0XFF);
  26.                         delay(300);
  27.                         }

  28. //                  


  29. }
复制代码
一些函数如下:
  1. #include <mydec.h>
  2. #include <1602.h>
  3. #define CH0        0X00
  4. #define        CH1        0X01
  5. #define        CH2        0X02
  6. #define        CH3 0X03       

  7. sbit SCL=P2^1;
  8. sbit SDA=P2^0;
  9. sbit LED=P3^7;
  10. uchar result;  //AD读到的结果
  11. uint vol;
  12. bit flag_ad_err=0;
  13. void I2C_start(void)
  14. {
  15.         SCL=1;
  16.         SDA=1;
  17.         SDA=0;
  18.         SCL=0;

  19. }

  20. void I2C_stop(void)
  21. {
  22.         SCL=1;
  23.         SDA=0;
  24.         SDA=1;
  25.         SCL=0;

  26. }

  27. void I2C_write(uchar dat)
  28. {
  29.         uchar temp,i;
  30.         temp=dat;
  31.         for(i=0;i<8;i++)
  32.         {
  33.                 SCL=0;
  34.                 SDA=temp&0x80;
  35.                 temp<<=1;
  36.                 SCL=1;
  37.                        
  38.         }
  39.         SCL=0;
  40. }

  41. bit get_ack(void)
  42. {
  43.         bit ack;
  44.          SCL=0;
  45.          SCL=1;
  46.          ack=SDA;
  47.                  nop();
  48.         nop();
  49.          SCL=0;
  50.          return ack;

  51. }

  52. uchar I2C_read_data(void)
  53. {
  54.         uchar temp=0,i;
  55.         SCL=0;

  56.         for(i=0;i<8;i++)
  57.         {
  58.                 SCL=1;               
  59.                 temp<<=1;
  60.                 temp|=SDA;
  61.                 SCL=0;         
  62.                        
  63.         }
  64.         return        temp;
  65. }

  66. uchar read_ad(uchar ch)
  67. {
  68.         uchar value;
  69.         I2C_start();

  70.         I2C_write(0x90);
  71.         if(get_ack())
  72.         {
  73.                 flag_ad_err=1;
  74.                 I2C_stop();
  75.         }
  76.         I2C_write(ch);
  77.         if(get_ack())
  78.         {
  79.                 flag_ad_err=1;
  80.                 I2C_stop();
  81.         }
  82.         I2C_start();
  83.         I2C_write(0x91);
  84.         if(get_ack())
  85.         {
  86.                 flag_ad_err=1;
  87.                 I2C_stop();
  88.         }
  89.         value=I2C_read_data();
  90.         get_ack();
  91.         I2C_stop();
  92.         return value;
  93. }


  94. void write_data(uchar addr,uchar dat)
  95. {
  96.            I2C_start();

  97.         I2C_write(0x90);
  98.         if(get_ack())
  99.         {
  100.                 flag_ad_err=1;
  101.                 I2C_stop();
  102.         }
  103.         I2C_write(addr);
  104.         if(get_ack())
  105.         {
  106.                 flag_ad_err=1;
  107.                 I2C_stop();
  108.         }

  109.         I2C_write(dat);
  110.         if(get_ack())
  111.         {
  112.                 flag_ad_err=1;
  113.                 I2C_stop();
  114.         }

  115.         I2C_stop();


  116. }
复制代码



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
s394402107
1楼-- · 2019-07-15 16:42
代码写完啊
fang521
2楼-- · 2019-07-15 22:33
把P1放在最后
fang521
3楼-- · 2019-07-16 00:19
 精彩回答 2  元偷偷看……
chenzedong416
4楼-- · 2019-07-16 05:19
哦哦,不过为什么要连续读两次呢?
云YUN
5楼-- · 2019-07-16 10:52
你好,你解决了吗?我现在用PCF8591芯片做电压采集,采集到所有数据均为2.5v,不知道你知道原因吗?急求,谢谢
送你一把好柴刀
6楼-- · 2019-07-16 14:50
云YUN 发表于 2016-4-19 16:30
你好,你解决了吗?我现在用PCF8591芯片做电压采集,采集到所有数据均为2.5v,不知道你知道原因吗?急求,谢谢

5v/255=1/51v,ad转换出来的电压最小单位是1/51v,应该除以51,而不是100

一周热门 更多>