找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4092|回復(fù): 13
打印 上一主題 下一主題
收起左側(cè)

求助大佬關(guān)于PCF8591的問題 不能寫入d/a的數(shù)據(jù)進(jìn)行模擬輸出

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
我這個(gè)程序哪里有問題   一直不能寫入d/a的數(shù)據(jù)進(jìn)行模擬輸出  
以及不能讀取8591的數(shù)據(jù)

  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit scl=P0^1;
  6. sbit sda=P0^0;
  7. void delay()
  8. {_nop_();_nop_();_nop_();_nop_();_nop_();}
  9. void init()
  10. {
  11. scl=1;
  12. delay();
  13. sda=1;
  14. delay();
  15. }
  16. void start()
  17. {
  18. sda=1;
  19. delay();
  20. scl=1;
  21. delay();
  22. sda=0;
  23. delay();
  24. }
  25. void respons()
  26. {
  27. uchar i=0;
  28. scl=0;
  29. delay();
  30. while((sda==1)&&i<255)
  31.   i++;
  32.   scl=0;
  33.   delay();
  34. }
  35. void stop()
  36. {
  37. sda=0;
  38. delay();
  39. scl=1;
  40. delay();
  41. sda=1;
  42. delay();
  43. }
  44. void writebyte(uchar byte)
  45. {
  46. uchar i;
  47. for(i=0;i<8;i++)
  48. {
  49.   byte=byte<<1;
  50.   scl=0;
  51.   delay();
  52.   sda=CY;
  53.   delay();
  54.   scl=1;
  55.   delay();
  56. }
  57. scl=0;
  58. delay();
  59. sda=1;
  60. delay();
  61. }
  62. uchar readbyte()
  63. {
  64. uchar i,k=0;
  65. scl=0;
  66. delay();
  67. sda=1;
  68. for(i=0;i<8;i++)
  69. {
  70.   scl=1;
  71.   delay();
  72.   k=(k<<1)|sda;
  73.   delay();
  74.   scl=0;
  75.   delay();
  76. }
  77. sda=0;
  78. delay();
  79. return k;
  80. }
  81. uchar read(uchar address,uchar date) //¶ÁadµØÖ·¿ØÖÆÊý¾Ý
  82. {
  83. uchar k;
  84. start();
  85. writebyte(address);
  86. respons();
  87. writebyte(date);
  88. respons();
  89. start();
  90. writebyte(address+1);
  91. respons();
  92. k=readbyte();
  93. respons();
  94. stop();
  95. return k;
  96. }
  97. void write(uchar address,uchar date,uchar dig)//дdaµØÖ·¿ØÖÆÊý¾Ý
  98. {
  99. start();
  100. writebyte(address);
  101. respons();
  102. writebyte(date);
  103. respons();
  104. writebyte(dig);
  105. respons();
  106. stop();
  107. }
  108. void main()
  109. {
  110. init();
  111.   write(0x90,0x40,0x80);
  112. }
復(fù)制代碼



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

使用道具 舉報(bào)

沙發(fā)
ID:351832 發(fā)表于 2018-9-3 19:04 | 只看該作者
求助大佬   可以幫看看我這個(gè)程序哪里有問題嗎   iic接口的8591

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報(bào)

板凳
ID:351832 發(fā)表于 2018-9-3 20:22 | 只看該作者
我查找iic協(xié)議對照  按照順序表    模擬的iic協(xié)議   
想要8591模擬輸出電壓   網(wǎng)上有要上拉電阻我加了  芯片還是沒用反應(yīng)
找了幾遍沒用找到問題所在  
希望有熟悉的人幫忙解答下 謝謝

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報(bào)

地板
ID:351832 發(fā)表于 2018-9-3 20:27 | 只看該作者
單片機(jī)用的是stc 89c52
回復(fù)

使用道具 舉報(bào)

5#
ID:111634 發(fā)表于 2018-9-3 21:47 | 只看該作者
本帖最后由 zl2168 于 2018-9-4 07:18 編輯

給你介紹一個(gè)正確有效看得懂的案例,自己對照查錯吧!
實(shí)例85  PCF8591 I2C串行A-D(1602顯示)

Proteus仿真一下,確認(rèn)有效。
實(shí)例85 PCF8591 I2C串行A-D.rar (57.96 KB, 下載次數(shù): 30)

以上摘自張志良編著《80C51單片機(jī)仿真設(shè)計(jì)實(shí)例教程——基于Keil CProteus》清華大學(xué)出版社ISBN 978-7-302-41682-1書中電路和程序設(shè)計(jì)有詳細(xì)說明,程序語句條條有注解。
回復(fù)

使用道具 舉報(bào)

6#
ID:384109 發(fā)表于 2018-9-3 23:00 | 只看該作者
在網(wǎng)上找個(gè)例程吧,調(diào)通了,再回頭來看自己的程序錯在哪,IIC要確定地址是否正確,另外粗看了一下,你的程序沒有判斷PCF8591的應(yīng)答,IIC里主機(jī)要判斷設(shè)備的應(yīng)答的

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報(bào)

7#
ID:351832 發(fā)表于 2018-9-3 23:01 | 只看該作者
zl2168 發(fā)表于 2018-9-3 21:47
給你介紹一個(gè)正確有效看得懂的案例,自己對照查錯吧!

好的 謝謝   可以給個(gè)鏈接嗎
回復(fù)

使用道具 舉報(bào)

8#
ID:382067 發(fā)表于 2018-9-4 00:03 來自手機(jī) | 只看該作者
/*------------------------------------------------                     啟動IIC總線 ------------------------------------------------*/   void Start(void)   {    Sda=1;    _nop_();    Scl=1;    _nop_();    Sda=0;    _nop_();    Scl=0;   }   /*------------------------------------------------                     停止IIC總線 ------------------------------------------------*/   void Stop(void)   {    Sda=0;    _nop_();    Scl=1;    _nop_();    Sda=1;    _nop_();    Scl=0;    }   /*------------------------------------------------                    應(yīng)答IIC總線 ------------------------------------------------*/    void Ack(void)    {     Sda=0;         _nop_();         Scl=1;         _nop_();         Scl=0;         _nop_();         }  /*------------------------------------------------               發(fā)送一個(gè)字節(jié) ------------------------------------------------*/          void Send(unsigned char Data)          {            unsigned char BitCounter=8;           unsigned char temp;            do             {                  temp=Data;                  Scl=0;                  _nop_();                  if((temp&0x80)==0x80)                     Sda=1;                  else                     Sda=0;                          Scl=1;                         temp=Data<<1;                         Data=temp;                         BitCounter--;                   }           while(BitCounter);               Scl=0;           }  /*------------------------------------------------                     寫入DA數(shù)模轉(zhuǎn)換值 ------------------------------------------------*/           void DAC(unsigned char Data)           {                    Start();                    Send(AddWr); //寫入芯片地址                    Ack();                    Send(0x40);  //寫入控制位,使能DAC輸出                    Ack();                    Send(Data);  //寫數(shù)據(jù)                    Ack();                    Stop();                              }           void fmg(void)//fm關(guān)          {                 Fm=1;        //                關(guān) fm          }                  void cmg(void)//數(shù)碼管鎖存函數(shù)                   關(guān)時(shí)鐘DS1302         {         dula=1;         P0=0x00;         dula=0;         wela=1;         P0=0x00;         wela=0;         RST=0;                //                關(guān)時(shí)鐘DS1302         } /*------------------------------------------------                    主程序 ------------------------------------------------*/         void main()         {          unsigned char num;                   //DA數(shù)模輸出變量    Init_Timer1();          cmg();//數(shù)碼管鎖存          fmg();          while(1)            {         DAC(num);       //DA輸出,可以用LED模擬電壓變化                    num++;          //累加,到256后溢出變?yōu)?,往復(fù)循環(huán)。顯示在LED上亮度逐漸變化                    mDelay(20);     //延時(shí)用于清晰看出變化            }         }
回復(fù)

使用道具 舉報(bào)

9#
ID:111634 發(fā)表于 2018-9-4 07:19 | 只看該作者
rdsfds 發(fā)表于 2018-9-3 23:01
好的 謝謝   可以給個(gè)鏈接嗎

《80C51單片機(jī)仿真設(shè)計(jì)實(shí)例教程——基于Keil C和Proteus》清華大學(xué)出版社ISBN 978-7-302-41682-1
實(shí)例85  PCF8591 I2C串行A-D(1602顯示)
仿真電路和Hex文件能在清華出版社網(wǎng)站免費(fèi)下載,程序源代碼只能到書上看了。到圖書館借,或到新華書店翻閱,或到網(wǎng)上書店打折購買。
回復(fù)

使用道具 舉報(bào)

10#
ID:351832 發(fā)表于 2018-9-4 12:33 | 只看該作者
人中狼 發(fā)表于 2018-9-3 23:00
在網(wǎng)上找個(gè)例程吧,調(diào)通了,再回頭來看自己的程序錯在哪,IIC要確定地址是否正確,另外粗看了一下,你的程 ...

respons()  這個(gè)應(yīng)該是應(yīng)答時(shí)序吧
回復(fù)

使用道具 舉報(bào)

11#
ID:351832 發(fā)表于 2018-9-4 12:35 | 只看該作者
zl2168 發(fā)表于 2018-9-3 21:47
給你介紹一個(gè)正確有效看得懂的案例,自己對照查錯吧!
實(shí)例85  PCF8591 I2C串行A-D(1602顯示)

非常感謝
回復(fù)

使用道具 舉報(bào)

12#
ID:351832 發(fā)表于 2018-9-4 13:11 | 只看該作者
yang陽 發(fā)表于 2018-9-4 00:03
/*------------------------------------------------                     啟動IIC總線 ----------------- ...

iic 信號保持時(shí)間不是要4微秒以上嗎    我的12M晶振一個(gè)空指令不是才1微妙嗎   這樣也可嗎?
回復(fù)

使用道具 舉報(bào)

13#
ID:351832 發(fā)表于 2018-9-4 17:54 | 只看該作者
大佬們  iic協(xié)議的應(yīng)答和非應(yīng)答是什么意思  沒太理解
應(yīng)答是主機(jī)發(fā)給從機(jī)數(shù)據(jù)結(jié)束后,從機(jī)發(fā)給主機(jī)的信號嗎?還是不管是誰發(fā)送數(shù)據(jù)都是接收方給發(fā)送方   發(fā)送的信號

非應(yīng)答是主機(jī)接收到數(shù)據(jù)后,給從機(jī)發(fā)送非應(yīng)達(dá)信號嗎?還是說數(shù)據(jù)未接收成功,接收方給發(fā)送方發(fā)送的信號?   

網(wǎng)上太多結(jié)果了不知道那個(gè)是正確,求解答
回復(fù)

使用道具 舉報(bào)

14#
ID:135253 發(fā)表于 2018-9-15 08:07 | 只看該作者
rdsfds 發(fā)表于 2018-9-4 17:54
大佬們  iic協(xié)議的應(yīng)答和非應(yīng)答是什么意思  沒太理解
應(yīng)答是主機(jī)發(fā)給從機(jī)數(shù)據(jù)結(jié)束后,從機(jī)發(fā)給主機(jī)的信號 ...

請參閱http://www.torrancerestoration.com/bbs/dpj-132121-1.html
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表