找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3197|回复: 13
打印 上一主题 下一主题
收起左侧

求助大佬关于PCF8591的问题 不能写入d/a的数据进行模拟输出

[复制链接]
跳转到指定楼层
楼主
我这个程序哪里有问题   一直不能写入d/a的数据进行模拟输出  
以及不能读取8591的数据

  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. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:351832 发表于 2018-9-3 19:04 | 只看该作者
求助大佬   可以帮看看我这个程序哪里有问题吗   iic接口的8591

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:351832 发表于 2018-9-3 20:22 | 只看该作者
我查找iic协议对照  按照顺序表    模拟的iic协议   
想要8591模拟输出电压   网上有要上拉电阻我加了  芯片还是没用反应
找了几遍没用找到问题所在  
希望有熟悉的人帮忙解答下 谢谢

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:351832 发表于 2018-9-3 20:27 | 只看该作者
单片机用的是stc 89c52
回复

使用道具 举报

5#
ID:111634 发表于 2018-9-3 21:47 | 只看该作者
本帖最后由 zl2168 于 2018-9-4 07:18 编辑

给你介绍一个正确有效看得懂的案例,自己对照查错吧!
实例85  PCF8591 I2C串行A-D(1602显示)

Proteus仿真一下,确认有效。
实例85 PCF8591 I2C串行A-D.rar (57.96 KB, 下载次数: 30)

以上摘自张志良编著《80C51单片机仿真设计实例教程——基于Keil CProteus》清华大学出版社ISBN 978-7-302-41682-1书中电路和程序设计有详细说明,程序语句条条有注解。
回复

使用道具 举报

6#
ID:384109 发表于 2018-9-3 23:00 | 只看该作者
在网上找个例程吧,调通了,再回头来看自己的程序错在哪,IIC要确定地址是否正确,另外粗看了一下,你的程序没有判断PCF8591的应答,IIC里主机要判断设备的应答的

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

7#
ID:351832 发表于 2018-9-3 23:01 | 只看该作者
zl2168 发表于 2018-9-3 21:47
给你介绍一个正确有效看得懂的案例,自己对照查错吧!

好的 谢谢   可以给个链接吗
回复

使用道具 举报

8#
ID:382067 发表于 2018-9-4 00:03 来自手机 | 只看该作者
/*------------------------------------------------                     启动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;    }   /*------------------------------------------------                    应答IIC总线 ------------------------------------------------*/    void Ack(void)    {     Sda=0;         _nop_();         Scl=1;         _nop_();         Scl=0;         _nop_();         }  /*------------------------------------------------               发送一个字节 ------------------------------------------------*/          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数模转换值 ------------------------------------------------*/           void DAC(unsigned char Data)           {                    Start();                    Send(AddWr); //写入芯片地址                    Ack();                    Send(0x40);  //写入控制位,使能DAC输出                    Ack();                    Send(Data);  //写数据                    Ack();                    Stop();                              }           void fmg(void)//fm关          {                 Fm=1;        //                关 fm          }                  void cmg(void)//数码管锁存函数                   关时钟DS1302         {         dula=1;         P0=0x00;         dula=0;         wela=1;         P0=0x00;         wela=0;         RST=0;                //                关时钟DS1302         } /*------------------------------------------------                    主程序 ------------------------------------------------*/         void main()         {          unsigned char num;                   //DA数模输出变量    Init_Timer1();          cmg();//数码管锁存          fmg();          while(1)            {         DAC(num);       //DA输出,可以用LED模拟电压变化                    num++;          //累加,到256后溢出变为0,往复循环。显示在LED上亮度逐渐变化                    mDelay(20);     //延时用于清晰看出变化            }         }
回复

使用道具 举报

9#
ID:111634 发表于 2018-9-4 07:19 | 只看该作者
rdsfds 发表于 2018-9-3 23:01
好的 谢谢   可以给个链接吗

《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1
实例85  PCF8591 I2C串行A-D(1602显示)
仿真电路和Hex文件能在清华出版社网站免费下载,程序源代码只能到书上看了。到图书馆借,或到新华书店翻阅,或到网上书店打折购买。
回复

使用道具 举报

10#
ID:351832 发表于 2018-9-4 12:33 | 只看该作者
人中狼 发表于 2018-9-3 23:00
在网上找个例程吧,调通了,再回头来看自己的程序错在哪,IIC要确定地址是否正确,另外粗看了一下,你的程 ...

respons()  这个应该是应答时序吧
回复

使用道具 举报

11#
ID:351832 发表于 2018-9-4 12:35 | 只看该作者
zl2168 发表于 2018-9-3 21:47
给你介绍一个正确有效看得懂的案例,自己对照查错吧!
实例85  PCF8591 I2C串行A-D(1602显示)

非常感谢
回复

使用道具 举报

12#
ID:351832 发表于 2018-9-4 13:11 | 只看该作者
yang阳 发表于 2018-9-4 00:03
/*------------------------------------------------                     启动IIC总线 ----------------- ...

iic 信号保持时间不是要4微秒以上吗    我的12M晶振一个空指令不是才1微妙吗   这样也可吗?
回复

使用道具 举报

13#
ID:351832 发表于 2018-9-4 17:54 | 只看该作者
大佬们  iic协议的应答和非应答是什么意思  没太理解
应答是主机发给从机数据结束后,从机发给主机的信号吗?还是不管是谁发送数据都是接收方给发送方   发送的信号

非应答是主机接收到数据后,给从机发送非应达信号吗?还是说数据未接收成功,接收方给发送方发送的信号?   

网上太多结果了不知道那个是正确,求解答
回复

使用道具 举报

14#
ID:135253 发表于 2018-9-15 08:07 | 只看该作者
rdsfds 发表于 2018-9-4 17:54
大佬们  iic协议的应答和非应答是什么意思  没太理解
应答是主机发给从机数据结束后,从机发给主机的信号 ...

请参阅http://www.51hei.com/bbs/dpj-132121-1.html
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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