求助:麻烦帮我解读一下ADC0832转换程序,谢谢
{uchar i=0;
uchar j;
uint dat=0;
uchar ndat=0;
if(channel==0)channel=2;
if(channel==1)channel=3;
ADDI=1; //DI为1
_nop_(); //延时两个指令周期
_nop_();
ADCS=0; //拉低cs,选通;确定数据输入开始
_nop_();
_nop_();
ADCLK=1; //时钟信号为高
_nop_();
_nop_();
ADCLK=0; //时钟信号为低,此处为第一个下降沿
_nop_();
_nop_();
ADCLK=1; //时钟信号为高
ADDI=channel&0x1; // 和0x01相位与,将channel的高七位变成0得到最低位
_nop_(); //如果是0,ADDI为0,如果是1,ADDI是1
_nop_();
ADCLK=0; //时钟信号为低,此处为第二个下降沿
_nop_();
_nop_();
ADCLK=1; //时钟信号为高
ADDI=(channel>>1)&0x1; //先右移一位,再与;如果是0,ADDI是1,如果是1,ADDI是1
_nop_();
_nop_();
ADCLK=0; //时钟信号为低,此处为第三个下降沿
ADDI=1; //DI为1
_nop_();
_nop_();
dat=0;
for(i=0;i<8;i++) 就是这下面的看不懂
{
dat|=ADDO;//收DO口数据
ADCLK=1;
_nop_();
_nop_();
ADCLK=0;//形成一次时钟脉冲
_nop_();
_nop_();
dat<<=1; //左移一位。如果是0,ADDO为0,如果是1,ADDO为2,如果是2,ADDO为4,
if(i==7) dat|=ADDO;
}
for(i=0;i<8;i++)
{
j=0;
j=j|ADDO;//收DO数据
ADCLK=1;
_nop_();
_nop_();
ADCLK=0;//形成一次时钟脉冲
_nop_();
_nop_();
j=j<<7;
ndat=ndat|j;
if(i<7)ndat>>=1;
}
ADCS=1;//拉高CS端
ADCLK=0;//拉低CLK端
ADDO=1;//拉高数据端回到初始状态
dat<<=8;
dat|=ndat;
return(dat); //return ad k
}
下面的就是串行接收数据,一次一位数据,8次是一个字节数据。
能把循环的过程简单的展示一下吗?
你好,看一下我的这个程序吧,很简单的,看下你就明白了,有哪里不懂的我们再讨论。
/********************************************************/
/*********************************包含头文件********************************/
#include <reg51.h>
/*********************************端口定义**********************************/
sbit CS = P3^4;
sbit Clk = P1^0;
sbit DIO = P1^1;
/*******************************定义全局变量********************************/
unsigned char adval; //AD值
/****************************************************************************
函数功能:AD转换子程序
入口参数:CH
出口参数:adval
****************************************************************************/
unsigned char A_D(bit CH)
{
unsigned char i;
CS = 0; //片选
Clk = 0; //时钟拉低
Clk = 1; //时钟拉高
DIO = 1; //启动信号
if ( CH == 0 ) //通道选择
{
Clk = 0;
Clk = 1;
DIO = 1; //通道0的第一位
Clk = 0;
Clk = 1;
DIO = 0; //通道0的第二位
}
else
{
Clk = 0;
Clk = 1;
DIO = 1; //通道1的第一位
Clk = 0;
Clk = 1;
DIO = 1; //通道1的第二位
}
Clk = 1;
Clk = 0;
for( i = 0;i < 8;i++ ) //读取八位AD值
{
Clk = 1;
Clk = 0;
if ( DIO )
adval = (adval>>1) | 0x80;
else
adval = (adval>>1) | 0x00;
}
CS = 1; //释放ADC0832
return(adval); //返回采样值
}
楼上的程序很专业,小编发的程序一看就是很业余的!
谢谢,确实你的程序思路非常清楚,也很好懂
你好!我用您的程序在proteus中仿真,无论选择哪个通道。显示的都是通道1的值。很晕啊。什么问题?
谢谢!
真的不错
最后面的那个if语句表示什么意思啊?
好像运行不合适啊。
学习一下
DIO = 1; //通道1的第二位
}
Clk = 1;
Clk = 0;
for( i = 0;i < 8;i++ ) //读取八位AD值
{
Clk = 1;
这部分运行有问题,望老师能解答
谢谢楼上分享和解答,但是怎么运行调用还是有点不懂,希望能分享一下主程序调用的例子
进来学习!