用7705测电压,开始读出来的数还可以,但过了几秒读出来的数就固定了(而且是错误的)。
网上说要复位,我就加了复位程序,但是过了几分钟芯片就没中断了。
不知道是哪有问题?请各位给我一个源程序比较。
这是我的程序。
#include<stc12.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
/******************ad7705 cmd*******************************************/
#define WR_REG 0x00
#define RD_REG 0x08
/******** reg adress*****************************/
#define CMD_REG 0x00
#define ST_REG 0x10
#define CLK_REG 0x20
#define DAT_REG 0x30
#define TS_REG 0x40
#define NO 0x50
#define OFFST_REG 0x60
#define GAIN_REG 0x70
//CLK P1.7 MISO P1.6 MOSI P1.5 CS P1.3
sbit CS=P1^3;
sbit DRDY=P1^4;
sbit RESET=P1^2;
uint rec_data=0x0000;
//sbit SCLK=P1^7;
//sbit DI=P1^5;
//sbit DO=P1^6;
uchar code seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void delay_ms(unsigned int x);
void ad7705_initial();
/*****************************************************************/
void SPI_WR_REG(uchar reg,uchar value )
{
uchar adr;
CS=1;
adr=(reg|WR_REG);
SPCTL=0xdf;
SPSTAT=0xc0;
CS=0;
SPDAT=reg;
while(!(SPSTAT&0x80));
CS=1;
SPCTL=0xdf;
SPSTAT=0xc0;
CS=0;
SPDAT=value;
while(!(SPSTAT&0x80));
CS=1;
SPCTL=0x9f;
}
/*******************************************************/
uint SPI_RD_DAT()
{
uint dat=0x00;
uchar dath,datl;
CS=1;
SPCTL=0xdf;
SPSTAT=0xc0;
CS=0;
SPDAT=0x38;
while(!(SPSTAT&0x80));
CS=1;
SPSTAT=0xc0;
CS=0;
_nop_();
SPDAT=0x00;
//SPCTL=0xdc;
while(!(SPSTAT&0x80));
//CS=1;
dath=SPDAT;
SPSTAT=0xc0;
SPDAT=0x00;
while(!(SPSTAT&0x80));
datl=SPDAT;
SPCTL=0x9f;
dat=((uint)dath)&0x00ff;
dat=dat<<8;
dat=dat|datl;
return(dat);
}
/**************************************************************/
void delay_ms(unsigned int x)
{
unsigned int i,j;
i=0;
for(i=0;i<x;i++)
{
j=108;
;
while(j--);
}
}
/************************************************/
void dis()
{
uchar temp;
//EA=0;
temp=rec_data/10000;
P0=seg[temp];
P2=0xef;
delay_ms(2);
temp=(rec_data%10000)/1000;
P0=seg[temp];
P2=0xf7;
delay_ms(2);
temp=(rec_data%1000)/100;
P0=seg[temp];
P2=0xfb;
delay_ms(2);
temp=(rec_data%100)/10;
P0=seg[temp];
P2=0xfd;
delay_ms(2);
temp=rec_data%10;
P0=seg[temp];
P2=0xfe;
delay_ms(2);
//EA=1;
}
/*********************************************************/
void ad7705_initial()
{
RESET=0;
delay_ms(200);
RESET=1;
delay_ms(200);
SPI_WR_REG(CLK_REG,0x0c);
SPI_WR_REG(ST_REG,0x40);
}
void main()
{
ad7705_initial();
while(1)
{
dis();
while(DRDY);
rec_data=SPI_RD_DAT();
}
} |