找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1795|回复: 1
收起左侧

单片机从pcf8591读到的都是FF,调试了很久,求解答

[复制链接]
ID:573822 发表于 2019-7-25 21:02 | 显示全部楼层 |阅读模式
我从网上买了一个pcf8591模块,然后想要试试如何使用,但是发现单片机读到的都是FF.求解答
  1. ///*************************************************************************
  2. ///pcf8591试验程序
  3. ///*************************************************************************
  4. #include<reg52.h>
  5. #include<iic.h>
  6. //#define  PCF8591 0x90

  7. void delay(uint z);
  8. void delay1(uint i);
  9. void date();
  10. void DigDisplay();
  11. void ADC_Send_Byte(uint addr,uint com);                         //ADC发送字节[命令]数据函数   
  12. uint ADC_Receive_Byte(uint addr);
  13. uint code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,
  14.                                                 0x7c,0x39,0x5e,0x79,0x71,0x3e};//显示0~F的值,16为U
  15. uint dianya[4]={0,0,0,0};
  16. uchar back_voltage1=0;

  17. sbit LSA = P2^2;
  18. sbit LSB = P2^3;
  19. sbit LSC = P2^4;

  20. ///*************************************************************************
  21. ///主函数
  22. ///*************************************************************************
  23. void main()
  24. {
  25.         IIC_Init();//iic总线初始化

  26.         while(1)
  27.         {        
  28.                 date();
  29.                 DigDisplay();                        
  30.         }                        
  31.         
  32. }

  33. ///*************************************************************************
  34. /// 七段显像管控制函数
  35. ///*************************************************************************
  36. void DigDisplay()
  37. {
  38.         uint i;
  39.         //date();
  40.         for(i=0;i<4;i++)
  41.         {
  42.                 switch(i)         //位选,选择点亮的数码管,
  43.                 {
  44.                         case(0):
  45.                                 LSA=0;LSB=0;LSC=0; break;//显示第0位
  46.                         case(1):
  47.                                 LSA=1;LSB=0;LSC=0; break;//显示第1位
  48.                         case(2):
  49.                                 LSA=0;LSB=1;LSC=0; break;//显示第2位
  50.                         case(3):
  51.                                 LSA=1;LSB=1;LSC=0; break;//显示第3位        
  52.                 }

  53.                 P0=dianya[i];//发送段码
  54.                 delay1(80); //间隔一段时间扫描        
  55.                 P0=0x00;//消隐
  56.         }
  57. }

  58. ///*************************************************************************
  59. ///延时函数
  60. ///*************************************************************************

  61. void delay(uint z)//延时函数
  62. {
  63.   unsigned char x,y;
  64.   for(x=z;x>0;x--)
  65.     for(y=110;y>0;y--);
  66. }

  67. void delay1(uint i)
  68. {
  69.         while(i--);
  70. }
  71. ///*************************************************************************
  72. ///数据处理函数
  73. ///*************************************************************************
  74. void date()
  75. {
  76. //        ulong a;
  77.         uchar a;
  78. //        uint a;
  79.         ADC_Send_Byte(0x90,0x43);//通道0 ADC转换
  80.         delay(100);
  81.         back_voltage1=ADC_Receive_Byte(0x90);
  82. //        a=back_voltage1*100*5/255;
  83.         a=back_voltage1;
  84.         if(a<=500)
  85.         {//a=111;
  86.                 dianya[3]=smgduan[a/100];
  87.                 dianya[2]=smgduan[a%100/10];        
  88.                 dianya[1]=smgduan[a%100%10];
  89.                 dianya[0]=smgduan[16];        
  90.         }
  91.         else
  92.         {
  93.                 dianya[3]=smgduan[0];
  94.                 dianya[2]=smgduan[0];        
  95.                 dianya[1]=smgduan[0];
  96.                 dianya[0]=smgduan[16];               
  97.         
  98.         }        

  99. }
  100. ///*************************************************************************
  101. ///pcf8591接收与处理
  102. ///*************************************************************************
  103. void ADC_Send_Byte(uint addr,uint com)
  104. {
  105.    IIC_Start();              //启动总线
  106.    IIC_Write_Byte(addr);           //发送器件地址
  107.    IIC_Ack();
  108.    IIC_Write_Byte(com);             //发送数据
  109.    IIC_Ack();
  110.    IIC_Stop();              //结束总线
  111. }

  112. uint ADC_Receive_Byte(uint addr)
  113. {
  114.    uint c;
  115.    IIC_Start();          //启动总线
  116.    IIC_Write_Byte(addr+1);      //发送器件地址,如果是读则最低位为1即0x91
  117.    IIC_Ack();
  118.    c=IIC_Read_Byte();          //读取数据
  119.    IIC_Ack();          //发送非就答位
  120.    IIC_Stop();           //结束总线
  121.    return(c);
  122. }

  123. #include<iic.h>

  124. sbit SCL=P2^0;
  125. sbit SDA=P2^1;

  126. void IIC_DELAY()
  127. {
  128.         _nop_();
  129.         _nop_();
  130.         _nop_();
  131.         _nop_();
  132.         _nop_();

  133. }
  134. void IIC_Init()//总线初始化
  135. {
  136.   SCL=1;
  137.   IIC_DELAY();
  138.   SDA=1;
  139.   IIC_DELAY();
  140. }
  141. void IIC_Start() //启动信号
  142. {
  143.   SDA=1;
  144.   SCL=1;
  145.   IIC_DELAY();
  146.   SDA=0;
  147.   IIC_DELAY();
  148.   SCL=0;
  149.   IIC_DELAY();
  150. }
  151. void IIC_Stop()        //停止信号
  152. {
  153.    SDA=0;
  154.    SCL=0;
  155.    IIC_DELAY();
  156.    SDA=1;
  157.    IIC_DELAY();
  158. }
  159. void IIC_Ack() //应答信号
  160. {
  161.    unsigned char i;
  162.    SCL=1;
  163.    IIC_DELAY();
  164.    while((SDA==1)&&(i<250))i++;
  165.    SCL=0;
  166.    IIC_DELAY();
  167. }
  168. void IIC_Write_Byte(uint date)//写一个字节
  169. {
  170.    uint i,temp;
  171.    temp=date;
  172.    for(i=0;i<8;i++)
  173.    {
  174.              temp=temp<<1;
  175.           SCL=0;
  176.           IIC_DELAY();
  177.           SDA=CY;//最高位将移入PSW寄存器的CY位中,然后将CY赋给SDA
  178.           IIC_DELAY();
  179.           SCL=1;
  180.           IIC_DELAY();
  181.    }
  182.    SCL=0;
  183.    IIC_DELAY();
  184.    SDA=1;
  185.    IIC_DELAY();
  186. }
  187. uint IIC_Read_Byte()//读一个字节
  188. {
  189.    uint i,temp;
  190.    for(i=0;i<8;i++)
  191.    {
  192.           SCL=0;
  193.           IIC_DELAY();
  194.           temp=(temp<<1)|SDA;
  195.           IIC_DELAY();
  196.           SCL=1;
  197.           IIC_DELAY();
  198.    }
  199.    SCL=0;
  200.    IIC_DELAY();
  201.    SDA=1;
  202.    IIC_DELAY();
  203.    return temp;
  204. }
复制代码


pcf8591练习.zip

134.7 KB, 下载次数: 4

回复

使用道具 举报

ID:573822 发表于 2019-7-26 21:04 | 显示全部楼层
调试完成,在普中科技板上完美实现,但是仿真不行

pcf8591实例.zip

134.86 KB, 下载次数: 30

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表