找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2790|回复: 9
收起左侧

ADC0832调试问题求解,单片机读取不到数据

[复制链接]
ID:946216 发表于 2021-10-31 01:01 | 显示全部楼层 |阅读模式
做了一个读取ph值,光照强度,土壤湿度的单片机
需要用到2个0832,第一个没问题,可以正常用,第二个死活读取不到数据。。
0832确认没有问题,放在其他单片机上可以正常跑。
电路反复确认了好多次,应该也没有接错(焊工非常渣,见谅。)

实在找不到原因了,发帖求助一下。。希望各位大佬可以帮忙找找原因T.T


2.png
回复

使用道具 举报

ID:973695 发表于 2021-10-31 09:19 | 显示全部楼层
你现在有两个同样的ADC0832,调试起来就简单了,可以用替换法,交换两个ADC0832看看什么情况。

还有,这种单片机系统的问题有可能出现在硬件连接或程序代码,最好同时发代码,电路连接,硬件照片,方便大家帮你排查问题。
回复

使用道具 举报

ID:213173 发表于 2021-10-31 12:17 | 显示全部楼层
既然电路反复确认了好多次没有问题那只能是代码问题。
回复

使用道具 举报

ID:624769 发表于 2021-10-31 14:49 | 显示全部楼层
你说,你要用到2块, 但是,看你CH却只接了一个,实在不明白,为什么不只用一块?

另外,你说读不到数据,实际上是不可能的,这种串型数据传输方案,你给了时钟然后读,要么读到0,要么读到1,不存在读不到这个情况。所以,描述问题要客观,不要主观,凭自己的猜想描述,如果你能主观的分析出问题,也就不用上来问了。

如果你确认几次都找不到问题,那么你先不要把DI,DO连一起,虽然两个口是异步工作,但是不排除会产生干扰。不然和DS1302一样,做成一个IO就完了,为什么要做成两个呢?
回复

使用道具 举报

ID:946216 发表于 2021-10-31 19:01 | 显示全部楼层
本帖最后由 cfxiaobai 于 2021-10-31 19:09 编辑

T.T还没有编辑好,本来以为发的是草稿的。
首先两个0832互换,第一个可以正常用,第二个不能用,排除0832硬件问题
用到两个0832是因为需要3个采集模块,第一个0832的ch已经接满了,而且是可以正常读取到值的。。

第二个0832,cs接的单片机P0^3口,clk是P0^4,DI DO确实是连在一起的,接在了P0^5口(晚点我试试分开接有没有效果)
程序方面,用的是和第一个0832一样的程序,修改了声明的io口,改成了对应io口,电路用万用表测量,没有短路,没有虚焊,可以正常和单片机通讯。

最后,感谢各位大佬的耐心解答!
回复

使用道具 举报

ID:946216 发表于 2021-10-31 19:06 | 显示全部楼层
然后还有一个奇怪的问题,换一个不同的0832,有的读出来的是254,有的读出来的是0,采集模块确实会给CH0返回不同的电压,但是0832读出来的数是一直不变的。。(只有1个0832读出来是254,其他的0832读出来的都是0)
回复

使用道具 举报

ID:946216 发表于 2021-10-31 19:09 | 显示全部楼层
另外附上0832的代码io我确认没有接错,0832也的vcc与gnd和ch0也都接上了
adc0832这个子程序对应的是第一个0832可以正常读取ch0和ch1的数据
adc0832_这个对应的是第二个0832反复尝试都读取不到数据T.T
  1. //ad的控 制口
  2. sbit  cs   = P3 ^ 5;         //片选
  3. sbit  date = P3 ^ 4;         //数据口
  4. sbit  clk  = P3 ^ 3;         //数据口

  5. sbit  cs_   = P0 ^ 3;         //片选
  6. sbit  date_ = P0 ^ 5;         //数据口
  7. sbit  clk_  = P0 ^ 4;         //数据口
  8. //////////==========ad转换  返回ad的采样数值=========////////////
  9. uchar adc0832(bit channel)
  10. {
  11.     uchar i, temp;

  12.     clk = 0;

  13.     cs = 0;                 //选中ad芯片

  14.     clk = 0;
  15.     date = 1; //发送bit 1 规定启动信号
  16. //DIN=1;
  17.     clk = 1; //第一个一个上升沿 规定启动信号

  18.     clk = 0;
  19.     date = 1; //单通道入 俩个控制位  10 为 通道  0  11为通道1      多通道差分出入  00为 0+ 1-          01 为0- 1+          这里选择10 只有通道0输入
  20. //DIN=1;

  21.     clk = 1; //第二一个上升沿 设置为通道

  22.     clk = 0;
  23. //        DIN=0;
  24.     date = channel; //0;//
  25.     clk = 1; //第三一个上升沿 设置通道0

  26.     clk = 0;                         //第一个下降沿数据没有输出
  27.     date = 1;                         //置一端口,设置51的io口为输入
  28.     clk = 1;
  29. //数据从头到尾输出
  30.     for(i = 8; i > 0; i--)
  31.     {

  32.         clk = 1;                         //        准备数据输出

  33.         clk = 0;                //下降沿出数据
  34. //稳定一下在读取数据
  35.         //           temp|=date;
  36.         if(date)
  37.             temp++;
  38.         temp <<= 1;
  39.     }
  40. //数据从尾到头输出
  41. //        for(i=8;i>0;i--){

  42. //                   clk =1;                         //        准备数据输出
  43. //                   clk =0;                 //下降沿出数据
  44. //        }
  45.     cs = 1;                 //释放芯片
  46.     return temp;  //返回读回来的数值
  47. }



  48. uchar adc0832_(bit channel)
  49. {
  50.     uchar i, temp;

  51.     clk_ = 0;

  52.     cs_ = 0;                 //选中ad芯片

  53.     clk_ = 0;
  54.     date_ = 1; //发送bit 1 规定启动信号
  55. //DIN=1;
  56.     clk_ = 1; //第一个一个上升沿 规定启动信号

  57.     clk_ = 0;
  58.     date_ = 1; //单通道入 俩个控制位  10 为 通道  0  11为通道1      多通道差分出入  00为 0+ 1-          01 为0- 1+          这里选择10 只有通道0输入
  59. //DIN=1;

  60.     clk_ = 1; //第二一个上升沿 设置为通道

  61.     clk_ = 0;
  62. //        DIN=0;
  63.     date_ = channel; //0;//
  64.     clk_ = 1; //第三一个上升沿 设置通道0

  65.     clk_ = 0;                         //第一个下降沿数据没有输出
  66.     date_ = 1;                         //置一端口,设置51的io口为输入
  67.     clk_ = 1;
  68. //数据从头到尾输出
  69.     for(i = 8; i > 0; i--)
  70.     {

  71.         clk_ = 1;                         //        准备数据输出

  72.         clk_ = 0;                //下降沿出数据
  73. //稳定一下在读取数据
  74.         //           temp|=date_;
  75.         if(date_)
  76.             temp++;
  77.         temp <<= 1;
  78.     }
  79. //数据从尾到头输出
  80. //        for(i=8;i>0;i--){

  81. //                   clk_ =1;                         //        准备数据输出
  82. //                   clk_ =0;                 //下降沿出数据
  83. //        }
  84.     cs_ = 1;                 //释放芯片
  85.     return temp;  //返回读回来的数值
  86. }
复制代码



回复

使用道具 举报

ID:946216 发表于 2021-10-31 19:48 | 显示全部楼层
好像回复的太快了。。被吞了好多我的回复T.T
DI,DO口分开,解决了某些0832会读出来254的问题。。读数已经全变成0了。。

然后,拿了另一块使用了0832的板子,用跳线飞过去,可以正常使用,确认 硬件以及传感器的电路部分正常使用。

问题应该出在单片机引脚 或者 程序上面了。
引脚方面,0832对单片机的引脚有要求吗。。(连的是P0^3、P0^4、P0^5这三个引脚)

程序方面,3个0832使用的是同一套程序,修改了程序中定义的引脚,应该不会出现问题T.T
晚一些我尝试一下更换到其他引脚(目前尝试过P0^0 — P0^7都不行T.T)
回复

使用道具 举报

ID:946216 发表于 2021-10-31 20:11 | 显示全部楼层
本帖最后由 cfxiaobai 于 2021-10-31 20:13 编辑

确定了是io口的问题T.T
没想到研究了好几天最后发现是因为这个

对于P0来说,输出需要接上拉电阻才能正常输出。


感谢楼上各位大佬的回答,再次感谢!

回复

使用道具 举报

ID:946216 发表于 2021-10-31 20:15 | 显示全部楼层
emmm编辑回复好像会造成回复被吞掉(也有可能是还在审核...)
最后找到了原因是因为0832接到了P0口的原因(T.T)
对于P0来说,输出需要接上拉电阻才能正常输出。


感谢楼上各位大佬的回复,再次感谢!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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