[求助][贴图]关于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);
}
发表时间:2009年4月5日13:39:22