导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→[求助][贴图]关于AD1674转换和动态显示,POP2总线[cen761]

 *第36588篇: [求助][贴图]关于AD1674转换和动态显示,POP2总线复用的问题

  
楼 主:cen761 2009年4月5日13:39
 [求助][贴图]关于AD1674转换和动态显示,POP2总线复用的问题
求助各位前辈:我做一个AD1674转换器的实验,输入电压范围Vin是±5V,用POP2总线复用控制AD1674的转换与数据的读入,P0口还用于数码管的动态显示字型的输出口,P1用于字位的控制.
    但是我现在结果是AD1674上的13脚Vin即模拟电压输入无论是0V还是几伏,数码管都显示2048,请各位前辈帮看看是软件问题还是硬件问题?谢谢!
附原理图和C程序:

此主题相关图片如下:
按此在新窗口浏览图片

此主题相关图片如下:
按此在新窗口浏览图片

此主题相关图片如下:
按此在新窗口浏览图片
#include   <reg52.h>         // 引用标准库的头文件
#include   <absacc.h>   
#include   <stdio.h>  
#define uchar unsigned char 
#define uint unsigned int 
#define ADCOM XBYTE[0xbffc]           //A0=0,R/C=0,CS=0;
#define ADHI  XBYTE[0xbfff]             //A0=1,R/C=1,CS=0;
#define ADLO  XBYTE[0xbffe]             //A0=0,R/C=1,CS=0;
#define fosc 11.0592   // 晶振频率 
#define time0 4000   // 定时4000us
sbit adbusy=P3^2;
sbit  r=P3^6;
sbit  w=P3^7;
uchar code BitTab[4]={0xdf,0xef,0xf7,0xfb};   //4位选,p1.1,1.2,1.3,1.4
//共阳型数码管字型符
uchar code DispTab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80, 0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF};

uint idata time0_tmp;           // 临时变量,用于计算定时
uint data datatab[5];
uint data receave,count0=0,scan=0,dig=0;  

/* 显示函数 */
void display(uint result)
{
 uchar x;
    unsigned int  d;
    P1|=0xff;         //关显示
    if(result>  =2047)      //12位AD转换大于2047为正数
       {    
           d=(result-2047);               //200℃对应+5V
          switch (scan)
             {
         case 0:  x=d/1000;         break;      //千位  
         case 1:  x=(d/100)%10;     break;  //百位
            case 2:  x=(d/10)%10;     break;     //十位 
         case 3:  x=d%10;         break;  //个位   
         default:            break;
           }                            
     P0|=0xff;P1|=0xff;              //关显示
             if((scan==0)&&(x==0)){P0=0xff; P1=0xff;}                      //有效位前的零不显示
          else {P0= DispTab[x];                   // 送字型码
                    P1=BitTab[scan];              // 送字位码 
                   }                      
      scan++;
   if(scan>  3){scan=0;}   
     
     }
   else 
     { 
         d=(2047-result);    //小于2047为负    
             switch (scan)
             {
         case 0:  x=d/1000;         break;      //千位  
         case 1:  x=(d/100)%10;     break;  //百位
            case 2:  x=(d/10)%10;     break;     //十位 
         case 3:  x=d%10;         break;  //个位   
         default:            break;
           }                             
              P0|=0xff;P1|=0xff;
             if((scan==0)&&(x==0)){P0=0xbf;}                      //有效位前的零不显示,0xbf是负号
          else if ((scan==0)&&(x==1)){P0=0xb9; }                 // 否则-1 
               else P0= DispTab[x];                // 送字型码
              P1=BitTab[scan];    
         scan++;
   if(scan>  3){scan=0;} 
 }    
}
/*ad1674采样函数*/
uint ad1674(void)
{
 r=0;
 w=0;          //CE=0
    ADCOM=0;            //启动转换
    while(adbusy==1);
    return ((uint)(ADHI  <  <4)+(ADLO>  >  4));
 }

/* 定时器0中断服务子程序,定时动态扫描显示 */

void time0_int(void) interrupt 1
{
    TH0 = (time0_tmp/256);
 TL0 = (time0_tmp%256);
    count0++;
    if(count0==50)       //200ms转换一次
      {
    datatab[dig]=ad1674();//启动转换
       count0=0;
        dig++;
        if(dig>  4)
  { 
          receave=(datatab[0]+datatab[1]+datatab[2]+datatab[3]+datatab[4])/5;
       dig=0;
  }
   }
    
 display(receave);
   } 

/*主函数*/
void   main()
{    P0|=0XFF,
    P1|=0xff;           // 关闭显示
 TMOD = 0x01;        // T0工作方式1
 time0_tmp = 65536-time0*fosc/12; /* 2ms 定时设置 */
 TH0 = (time0_tmp/256);
 TL0 = (time0_tmp%256);
 TR0 = 1;
 ET0 = 1;
 EA = 1;

 while(1); 
   
}


  
2楼:tangdamei 2009年8月4日14:21
 [讨论][建议]
软件出问题了   好好查下

>>>>>>对该主题发表你的看法

本主题贴数2,分页: [第1页]


[上一篇主题]:[求助]模型中怎样用DS18B20测量温度

[下一篇主题]:提供8脚、12位AD采样IC