我用12位的ADS7841进行模数转换,采用通道CH0进行采样,模拟输入电压我用数控电源直接输入,为了简单点我把BUSY端口直接接地,转换完后的二进制数据用1602进行显示,但我显示的数据全为1,这是为什么啊?想了很久了都解决不了,所以请大家帮帮忙,谢谢。
主程序如下:
#include"reg52.h"
#include<LCD1602.h>
#include<ADS7841.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uint temp1,temp2;
uint voltage;
sbit P04=P0^4;
main()
{
uchar i;
uchar j;
clear_LCD();
init_LCD();
P04=0;
i=0;
j=0;
while(1)
{
temp1=ReadADS(0x94);
if(j==0) //为了显示第一次采集回来的数据,第二次就暂时不理它了。
{
temp2=temp1;
}
voltage=temp2&&(0x8000>>i);
gotoxy(0,i); //1602中的函数,1602头文件我没给出
display_LCD_number(voltage);
i=i<15?i+1:0;
if(temp2!=0)
{
P04=1; //用来测试用的,如果转换后数据不为0则为1,否则反之
}
j=1;
}
AD转换头文件程序如下:
/*********************************************************************************************************
** 函数名称: ReadADS()
** 功能描述: 读取ADS7841的转换值
********************************************************************************************************/
#ifndef __ADS7841_H__
#define __ADS7841_H__
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DCLK =P0^0; //ADC0832 clock signal
sbit DIN =P0^1; //ADC0832 data in
sbit DOUT =P0^2; //ADC0832 data out
void delay(uchar i)
{
while(i--);
}
uchar i=0;
uchar j;
uint dat=0;
//采集并返回
unsigned int ReadADS(uchar control)
{
//写控制命令
for(i=0;i<8;i++)
{
DCLK=1;
delay(5);
DIN=(control<<i)&0x80;
DCLK=0;
delay(4);
}
delay(10);
for(i=0;i<12;i++)
{
if(i==0) //第一次不左移
dat=dat|DOUT;
else
dat=(dat<<1)|DOUT;//收数据
DCLK=1;
delay(5);
DCLK=0;
delay(4);
}
return(dat); //return ad data
}
#endif
} |