关于ad 转换
现在我在编写AD转换的程序时候。发现的如下问题。
, 用的是protues +keil 仿真的
1,我用的定时器 定时,采集一个0-5v的交流50hz ,采样的点数 是16,用0.02s/16=1250us
用65536-1250 初始化定时 这块有没有错的
2 在protues里,一个交流电压-5到5v之间,如何把他设置在0-5v
现在采集的电压 不对,看看我哪里出错了。谢谢
/*****************************************判断通信用的定时器 这里用定时器0*和函数*********************************************/
void start_T0()
{
TMOD=0x02;//用定时器2;
TH0=0x83; //定时0.2s
TL0=0x83;
TR0=1;//启动定时器0
EA=1; //打开中断
ET0=1; //打开定时器0中断
}
uint idata ck;
uchar idata a; //收集P0口接收到的数据
uchar idata ad[16] ;
//uchar idata u,flag=0;
/***************************延时程序*******************************************/
/*void Delay(unsigned int tc) //显示延时程序
{
while( tc != 0 )
{
unsigned int i;
for(i=0; i<100; i++);
tc--;
}
}
*/
/***********************************************************AD0804测试******************************************************************************/
void AD_init0804() //AD 采样
{
adcs=0;
adwr=0;
adcs=1;
adwr=1;
adcs=0;
adrd=0;
a=P0;
adcs=1;
adrd=1;
}
void adshuzhi() //AD 显示的数值
{
unsigned long jieguo[16]=0;
uchar i;
unsigned long jieguo1=0,jieguo2=0;
uint m,n,k,l,e,d,u;
for(u=0;u<16;u++)
{
jieguo[u]=ad[u]*ad[u];
}
for(i=0;i<16;i++)
{
jieguo1+=jieguo[i];
}
jieguo2=jieguo1/16;
jieguo2=sqrt(jieguo2);
//jieguo2=jieguo2;
m=jieguo2/100;
n=jieguo2%100;
k=n/10;
l=n%10;
v_char(shuzi+m*16,1,0,0x40,0xbe) ;
v_char(shuzi+k*16,1,0,0x48,0xbe) ;
// v_char(dian,1,0,0x50,0xbe) ;
v_char(shuzi+l*16,1,0,0x50,0xbe) ;
//v_char(dian+1*16,1,0,0x60,0xbe) ;
// v_char(dian,1,0,0x58,0xbe) ;
// v_char(shuzi+d*16,1,0,0x58,0xbc) ;
//for(n=0;n<40000;n++); */
}
uchar idata m,n,p,l,k,flag;
/****************************************************************/
void ck_t0() interrupt 1
{
//TH0=0xfb; //定时0.2s ,定时中断一次为200微妙,须将判断标志位为1000次。放置标志位flagck。
// TL0=0x1e;
// TH0=0xfe; //定时0.2s ,定时中断一次为200微妙,须将判断标志位为1000次。放置标志位flagck。
// TL0=0xc8;
uchar df;
df++;
if(df==10)
{ df=0;
AD_init0804();
ad[ck]=(a-128);
ck++;
}
if(ck==16)
{
flag=1;
ck=0;
// adshuzhi();
}
}
提问者:jiecai5388
地点:-
浏览次数:2388
提问时间:02-27 14:40
我有更好的答案