找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于adc0832更改部分单片机代码后无法工作的问题

[复制链接]
跳转到指定楼层
楼主
如图,原代码是0832完成数据采集后,前8位先用if判断DO是否为0然后将temp1分别与0和1做或运算(注释部分),我在想为什么不能直接将temp1直接与DO进行或运算,然后我就讲代码改了一下,然后0832就不工作了,请问逻辑都是一样的,keil编译也未报错,为什么到仿真中就不工作了

单片机源程序如下:
  1.   for( i = 0;i < 8;i++ )      //前读取8位的值
  2.   {
  3.     _nop_();
  4.     temp1 <<= 1;
  5.     Clk = 1;
  6.     _nop_();
  7.     Clk = 0;
  8.    /*if (DO)
  9.       temp1|=0x01;
  10.     else
  11.      temp1|=0x00
  12. */
  13.       temp1|=DO;  //更改部分
  14.   }
  15.   for (i = 0; i < 8; i++)      //后读取8位的值
  16.   {
  17.     temp2 >>= 1;
  18.     /*if (DO)
  19.       temp2|= 0x80;
  20.     else
  21.      temp2|=0x00
  22. */
  23.       temp2|= DO;  //更改部分
  24.     _nop_();
  25.     Clk = 1;
  26.     _nop_();
  27.     Clk = 0;
复制代码

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

使用道具 举报

沙发
ID:213173 发表于 2021-10-24 06:34 | 只看该作者
把读取0832的高8位更改为temp1|=DO;没有问题,但把读取低8位更改为temp2|=DO;不行。
因为读取DO的是位数据要放在temp2的最高位。如坚持这种写法就要把DO移到高位,
并且要把DO强制转换成char。如:temp2|=((char)DO<<7);,这就显得多此一举了。
函数解释:
  1. //请先了解ADC0832模数转换的串行协议,再来读本函数,主要是对应时序图来理解,
  2. //本函数是模拟0832的串行协议进行的
  3. unsigned char ad0832read(bit ch)
  4. {
  5.         uchar i,Data1=0,Data2=0;
  6.         CLK=0; //时钟置低平
  7.         DO =1; //开始信号为高电平
  8.         CS =0; //片选信号置低,启动AD转换芯片
  9.         CLK=1; //输入开始信号(构成一个正脉冲),时钟上升沿,输入开始信号
  10.         CLK=0; //时钟下降沿
  11.         //模拟信号输入模式选择(1:单模信号,0:双模差分信号)
  12.         DO =1;
  13.         CLK=1; //时钟上升沿,输入开始信号
  14.         CLK=0; //时钟下降沿
  15.         //模拟信号输入通道选择(1:通道CH1,0:通道CH0)
  16.         DO =ch; //选择通道0
  17.         CLK=1; //时钟上升沿,输入开始信号
  18.         CLK=0; //时钟下降沿
  19.         DO =1; //数据线置高,准备接收数据
  20.         for(i=0;i<8;i++) //从高位移入数据
  21.         {
  22.                 CLK=1;
  23.                 CLK=0; //时钟下降沿,AD0832输出数据,高位(MSB)先
  24.                 Data1=Data1<<1;
  25.                 if(DO==1)
  26.                         Data1=Data1|0x01; //数据左移位,补0 ,如果数据为“1”,移入1, 如果数据为“0”,移入0,
  27.         }
  28.         for(i=0;i<8;i++) //从低位移入数据
  29.         {
  30.                 Data2=Data2>>1;
  31.                 if(DO==1)
  32.                         Data2=Data2|0x80; //数据右移位,补0,如果数据为“1”,移入1如果数据为“0”,移入0,
  33.                 CLK=1;
  34.                 CLK=0; //时钟下降沿,AD0832输出数据,高位(MSB)先
  35.         }
  36.         //数据线置高,释放总线,完成一次转换
  37.         CLK=1;
  38.         DO =1;
  39.         CS =1;
  40.         return (Data1==Data2)?Data1:0; //   如果相等输出data1  or  0
  41. }
复制代码
回复

使用道具 举报

板凳
ID:577554 发表于 2021-10-25 17:43 | 只看该作者
wulin 发表于 2021-10-24 06:34
把读取0832的高8位更改为temp1|=DO;没有问题,但把读取低8位更改为temp2|=DO;不行。
因为读取DO的是位数据 ...

原来如此,感谢大佬解答
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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