把读取0832的高8位更改为temp1|=DO;没有问题,但把读取低8位更改为temp2|=DO;不行。
因为读取DO的是位数据要放在temp2的最高位。如坚持这种写法就要把DO移到高位,
并且要把DO强制转换成char。如:temp2|=((char)DO<<7);,这就显得多此一举了。
函数解释:
- //请先了解ADC0832模数转换的串行协议,再来读本函数,主要是对应时序图来理解,
- //本函数是模拟0832的串行协议进行的
- unsigned char ad0832read(bit ch)
- {
- uchar i,Data1=0,Data2=0;
- CLK=0; //时钟置低平
- DO =1; //开始信号为高电平
- CS =0; //片选信号置低,启动AD转换芯片
- CLK=1; //输入开始信号(构成一个正脉冲),时钟上升沿,输入开始信号
- CLK=0; //时钟下降沿
- //模拟信号输入模式选择(1:单模信号,0:双模差分信号)
- DO =1;
- CLK=1; //时钟上升沿,输入开始信号
- CLK=0; //时钟下降沿
- //模拟信号输入通道选择(1:通道CH1,0:通道CH0)
- DO =ch; //选择通道0
- CLK=1; //时钟上升沿,输入开始信号
- CLK=0; //时钟下降沿
- DO =1; //数据线置高,准备接收数据
- for(i=0;i<8;i++) //从高位移入数据
- {
- CLK=1;
- CLK=0; //时钟下降沿,AD0832输出数据,高位(MSB)先
- Data1=Data1<<1;
- if(DO==1)
- Data1=Data1|0x01; //数据左移位,补0 ,如果数据为“1”,移入1, 如果数据为“0”,移入0,
- }
- for(i=0;i<8;i++) //从低位移入数据
- {
- Data2=Data2>>1;
- if(DO==1)
- Data2=Data2|0x80; //数据右移位,补0,如果数据为“1”,移入1如果数据为“0”,移入0,
- CLK=1;
- CLK=0; //时钟下降沿,AD0832输出数据,高位(MSB)先
- }
- //数据线置高,释放总线,完成一次转换
- CLK=1;
- DO =1;
- CS =1;
- return (Data1==Data2)?Data1:0; // 如果相等输出data1 or 0
- }
复制代码 |