找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2314|回復: 1
打印 上一主題 下一主題
收起左側(cè)

單片機從pcf8591讀到的都是FF,調(diào)試了很久,求解答

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:573822 發(fā)表于 2019-7-25 21:02 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
我從網(wǎng)上買了一個pcf8591模塊,然后想要試試如何使用,但是發(fā)現(xiàn)單片機讀到的都是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發(fā)送字節(jié)[命令]數(shù)據(jù)函數(shù)   
  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. ///主函數(shù)
  22. ///*************************************************************************
  23. void main()
  24. {
  25.         IIC_Init();//iic總線初始化

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

  33. ///*************************************************************************
  34. /// 七段顯像管控制函數(shù)
  35. ///*************************************************************************
  36. void DigDisplay()
  37. {
  38.         uint i;
  39.         //date();
  40.         for(i=0;i<4;i++)
  41.         {
  42.                 switch(i)         //位選,選擇點亮的數(shù)碼管,
  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];//發(fā)送段碼
  54.                 delay1(80); //間隔一段時間掃描        
  55.                 P0=0x00;//消隱
  56.         }
  57. }

  58. ///*************************************************************************
  59. ///延時函數(shù)
  60. ///*************************************************************************

  61. void delay(uint z)//延時函數(shù)
  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. ///數(shù)據(jù)處理函數(shù)
  73. ///*************************************************************************
  74. void date()
  75. {
  76. //        ulong a;
  77.         uchar a;
  78. //        uint a;
  79.         ADC_Send_Byte(0x90,0x43);//通道0 ADC轉(zhuǎn)換
  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);           //發(fā)送器件地址
  107.    IIC_Ack();
  108.    IIC_Write_Byte(com);             //發(fā)送數(shù)據(jù)
  109.    IIC_Ack();
  110.    IIC_Stop();              //結(jié)束總線
  111. }

  112. uint ADC_Receive_Byte(uint addr)
  113. {
  114.    uint c;
  115.    IIC_Start();          //啟動總線
  116.    IIC_Write_Byte(addr+1);      //發(fā)送器件地址,如果是讀則最低位為1即0x91
  117.    IIC_Ack();
  118.    c=IIC_Read_Byte();          //讀取數(shù)據(jù)
  119.    IIC_Ack();          //發(fā)送非就答位
  120.    IIC_Stop();           //結(jié)束總線
  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() //應(yīng)答信號
  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)//寫一個字節(jié)
  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()//讀一個字節(jié)
  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, 下載次數(shù): 4

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:573822 發(fā)表于 2019-7-26 21:04 | 只看該作者
調(diào)試完成,在普中科技板上完美實現(xiàn),但是仿真不行

pcf8591實例.zip

134.86 KB, 下載次數(shù): 30

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表