求助:c51单片机 ADC0804转换问题!
请高手帮忙,我写的ad转换,在rd=0到rd=1的时间感觉有些长了,我是根据pdf资料查的时间,才200ns,时间竟然到了100ms,。也就是下到单片机之后改的时间短了,...
请高手帮忙,我写的ad转换,在rd=0到rd=1的时间感觉有些长了,我是根据pdf资料查的时间,才200ns,时间竟然到了100ms,。也就是下到单片机之后改的时间短了,调整电位器,输出发光二级管不变化,而改的时间很长的时候,调整电位器,感觉输出的反应时间(调整结束后到发光二级管稳定)很长。请高手帮忙看看是哪里出了毛病?
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit adcs=P2^2;
sbit rd=P3^7;
sbit wr=P3^6;
uint a;
void delay(uint z);
void main()
{
adcs=0;
while(1)
{
wr=1;
wr=0;
wr=1;
rd=1;
rd=0;
delay(100);
rd=1;
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
} 展开
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit adcs=P2^2;
sbit rd=P3^7;
sbit wr=P3^6;
uint a;
void delay(uint z);
void main()
{
adcs=0;
while(1)
{
wr=1;
wr=0;
wr=1;
rd=1;
rd=0;
delay(100);
rd=1;
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
} 展开
4个回答
展开全部
首先确认0804 CS脚为低电平,
第二建议你在 WR=1;=0;=1之间各加一点延时,1MS即可。
第三,RD不是你控制的信号,应该是你读取判断的信号,如果采用读取判断那应该增加 whil(rd == 1);即读取RD为高时不动作,一直等到为低才继续。或者采用延时读取的方式,开始转换后即 WR 由低-高后,延时足够长时间后,直接读取数据(D0-D7)。
所有的AD转换的速度是由你给予他的时钟信号速度决定的,不能单纯看PDF,要针对自己的时钟计算出转换时间。
最后没看到你程序里有控制灯的语句。
第二建议你在 WR=1;=0;=1之间各加一点延时,1MS即可。
第三,RD不是你控制的信号,应该是你读取判断的信号,如果采用读取判断那应该增加 whil(rd == 1);即读取RD为高时不动作,一直等到为低才继续。或者采用延时读取的方式,开始转换后即 WR 由低-高后,延时足够长时间后,直接读取数据(D0-D7)。
所有的AD转换的速度是由你给予他的时钟信号速度决定的,不能单纯看PDF,要针对自己的时钟计算出转换时间。
最后没看到你程序里有控制灯的语句。
追问
while(1)
{
wr=1;
delay(1);
wr=0;
delay(1);
wr=1;
delay(1);
rd=1;
delay(1);
rd=0;
delay(20);
while(rd==1);
delay(50);
rd=1;
}
是这样吗?我试了,发光二级管只保持,复位后才变化。但是把50改成80就好了。但是消耗的时间太长了浪费。
我这个开发板是把ad的输出接到流水灯上。
PDF资料中的0804是9引脚和4引脚接在一起,串联一个150pF电容接地。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
delay(100);就延时了100毫秒啊!!!
提示你:使用定时器去定时扫描(如100毫秒AD模块),主程序只做显示!!!!
提示你:使用定时器去定时扫描(如100毫秒AD模块),主程序只做显示!!!!
更多追问追答
追问
那样岂不很麻烦,加重了单片机负载(如果程序很长的话)
追答
怎么会了,节拍法知道吗!!就是多任务调度,它只是定时去转换AD吗?定时100毫秒的基准时间,先是去启动装换,推出定时器中断服务,第二次中断服务,去读数据就OK
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
当你写while(rd); 可以把前后两个的延时去掉;
更多追问追答
追问
试了,当while(rd) 还是while(rd==1)发光二级管光度不强,并且调节电位器,发光二极管没有反应。
追答
刚看了芯片手册,上说发现上次给你说错了;
CS:片选信号输入端,低电平有效,一旦CS有效,表明A/D转换器被选中,可启动工作。
WR:写信号输入,接受微机系统或其它数字系统控制芯片的启动输入端,低电平有效,当CS、 WR同时为低电平时,启动转换。
RD:读信号输入,低电平有效,当CS、RD同时为低电平时,可读取转换输出数据。
INTR:转换结束输出信号,低电平有效。输出低电平表示本次转换已完成。该信号常作为向微机系统发出的中断请求信号。
在这里可以判断INTR是否为0,为0读取数据,否则等待;while(!INTR);你的原理图上INTR引脚悬空,你只有判断时间,这个芯片转换时间在100US,
ARM9(2440) AVR 51单片机讨论群54134552
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询