0
问答首页 最新问题 热门问题 等待回答标签广场
我要提问

关于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
我有更好的答案
提 交
撰写答案
提 交
1 / 3
1 / 3