STC89C52 读取AD7810数据错误

ninesuns02 2013-12-19 09:09:49
我用AD7810做个数据采集程序,按照数据手册和一些参考资料,编写了读取数据的程序,可是读出来不合适,请帮我看看是什么地方的原因。
单片机:STC89C52
晶振频率:11.0952M
打算用低功耗模式来采集
电路如下:

C程序如下:

//初始化
……
AD7810_CONVEST=0;
AD7810_CLK=0;
……

//AD转换
unsigned int GetAD7810()
{
unsigned int buf=0;
unsigned char i=0;
AD7810_CONVEST=1;
AD7810_CONVEST=0;
_nop_();
_nop_();
_nop_();
for(i=0;i<10;i++)
{
AD7810_CLK=1;
_nop_();
_nop_();
_nop_();
buf=(buf<<1)|AD7810_D0;
_nop_();
_nop_();
_nop_();
AD7810_CLK=0;
_nop_();
_nop_();
_nop_();
}
return buf;
}
...全文
157 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ninesuns02 2013-12-22
  • 打赏
  • 举报
回复
引用 7 楼 Binzo 的回复:
非常感谢你的参与!
Binzo 2013-12-21
  • 打赏
  • 举报
回复
引用 10 楼 ninesuns02 的回复:
好吧。我只是看看手册,给点建议。调通就行。
ninesuns02 2013-12-20
  • 打赏
  • 举报
回复
引用 7 楼 Binzo 的回复:
//AD转换
 unsigned int GetAD7810()
{
    unsigned int buf=0;
    unsigned char i=0; 
    AD7810_CLK=0; //一开始赋0 ------------初始化时已经赋0了,这里不再需要了,不过赋了也没错
    AD7810_CONVEST=1;
    _nop_();//删除这行
    _nop_();//删除这行
    _nop_(); //这里,需要延时,考虑延时更长一点------删除这行,这里不需要延时,这个时间不能长于下面置0的时间,
    AD7810_CONVEST=0;
    _nop_();
    _nop_();
    _nop_(); //考虑延时更长一点----------这个时间要不上面置1的时间长点,可以设置为1us。
    AD7810_CONVEST=1; //这里需抬电平-----------这个不需要了。
    _nop_();//删除这行
    _nop_();//删除这行
    _nop_(); //删除这行
    for(i=0;i<10;i++)
    {
        AD7810_CLK=1;
        _nop_();//时间可以长点
        _nop_();
        _nop_();
        buf=(buf<<1)|AD7810_D0;
        _nop_();
        _nop_();
        _nop_();
        AD7810_CLK=0;
        _nop_();//时间可以长点
        _nop_();
        _nop_();
    }
    return buf;
}
调试通过后的程序如下:

//采集数据
unsigned int GetAD7810()
{
	unsigned int buf=0;
	unsigned char i=0; 
	AD7810_CONVEST=1;
	AD7810_CONVEST=0;
	delay_1us();
	for(i=0;i<10;i++)
	{
		AD7810_CLK=1;
		delay_xns() ;
		buf=(buf<<1)|AD7810_D0;
		AD7810_CLK=0;
		delay_xns() ;
	}
	return buf;
}
ninesuns02 2013-12-20
  • 打赏
  • 举报
回复
AD7810_D0=1;
单片机工程师 2013-12-20
  • 打赏
  • 举报
回复
引用 5 楼 ninesuns02 的回复:
问题解决了,数据采集程序没有问题,是在初始化时,数据输入端没有初始化为1;需要加一条: AD7810_D01;
学习,学习
Binzo 2013-12-20
  • 打赏
  • 举报
回复
上面的有问题。
//AD转换
 unsigned int GetAD7810()
{
    unsigned int buf=0;
    unsigned char i=0; 
    AD7810_CLK=0; //一开始赋0
    AD7810_CONVEST=1;
    _nop_();
    _nop_();
    _nop_(); //这里,需要延时,考虑延时更长一点
    AD7810_CONVEST=0;
    _nop_();
    _nop_();
    _nop_(); //考虑延时更长一点
    AD7810_CONVEST=1; //这里需抬电平
    _nop_();
    _nop_();
    _nop_(); //考虑延时更长一点
    for(i=0;i<10;i++)
    {
        AD7810_CLK=1;
        _nop_();
        _nop_();
        _nop_();
        buf=(buf<<1)|AD7810_D0;
        _nop_();
        _nop_();
        _nop_();
        AD7810_CLK=0;
        _nop_();
        _nop_();
        _nop_();
    }
    return buf;
}
Binzo 2013-12-20
  • 打赏
  • 举报
回复
//AD转换
 unsigned int GetAD7810()
{
    unsigned int buf=0;
    unsigned char i=0; 
    AD7810_CLK=0; //一开始赋0
    AD7810_CONVEST=1;
    _nop_();
    _nop_();
    _nop_(); //这里,需要延时,考虑延时更长一点
    AD7810_CONVEST=0;
    _nop_();
    _nop_();
    _nop_(); //考虑延时更长一点
    for(i=0;i<10;i++)
    {
        AD7810_CLK=1;
        _nop_();
        _nop_();
        _nop_();
        buf=(buf<<1)|AD7810_D0;
        _nop_();
        _nop_();
        _nop_();
        AD7810_CLK=0;
        _nop_();
        _nop_();
        _nop_();
    }
    return buf;
}
ninesuns02 2013-12-20
  • 打赏
  • 举报
回复
问题解决了,数据采集程序没有问题,是在初始化时,数据输入端没有初始化为1;需要加一条: AD7810_D01;
ninesuns02 2013-12-19
  • 打赏
  • 举报
回复
没有这个设备
vc8fans 2013-12-19
  • 打赏
  • 举报
回复
用逻辑仪帮助就很大,
ninesuns02 2013-12-19
  • 打赏
  • 举报
回复
看过了,确实挺便宜的,但是我手头现在没有呀, 谁调过这个芯片,给点建议。
dceacho 2013-12-19
  • 打赏
  • 举报
回复
X宝盗版二十来块

27,377

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧