以下代码的运行环境是33M的晶振,51单片机(4个机器周期为一个指令周期的高速结构),之后我换成了STC12c5A48S2单片机(是普通51的8~12倍速度),22.1184M晶振,直接将下面的代码引脚改动一下,运行后初始化虽然过去但是有问题(*注1),读到的AD码始终是很大值,而且不随传感器变化而变化,我该怎么调试才可以初始化成功并能读到正确AD码呢?
typedef union UCharIntLong{
unsigned char uc[4];
unsigned int ui[2];
unsigned long ul;
}UCIL;
sbit ADO=P3^3;
sbit ADI=P3^2;
sbit ADCLK=P3^4;
#define NOP _nop_();
/***********************************************************************
函 数 名:void InitAd(void)
***********************************************************************/
void InitAd(void)
{
uchar i;
UCIL temp;
ulong adconvtime=0;
ADCLK=0;
//延时50ms
delay_1ms(50);
for(i=0;i<15;i++)
{
write5532(0xff);
}
write5532(0xfe);
ADCLK=0;
temp.ul=0x22080000;
write5532(0X03);
for(i=0;i<4;i++)
{
write5532(temp.uc[i]);
}
ADCLK=0;
do{
delay_1ms(1);
write5532(0x0b);
temp.uc[0]=read5532();
if((++adconvtime)>=1000)
error();
}
while(!(temp.uc[0]&0x10)); //这里temp.uc[0] 始终是全1---*注1
ADCLK=0;
NOP;NOP;NOP;
temp.ul=0x00000000;
write5532(0x01);
for(i=0;i<4;i++)
{
write5532(temp.uc[i]);
}
ADCLK=0;
NOP;NOP;NOP;
temp.ul=0x01000000;
write5532(0x02);
for(i=0;i<4;i++)
{
write5532(temp.uc[i]);
}
ADCLK=0;
NOP;NOP;NOP;
temp.ul=0x02000000;
write5532(0X03);
for(i=0;i<4;i++)
{
write5532(temp.uc[i]);
}
ADCLK=0;
temp.ul=0x00400040;
write5532(05);
for(i=0;i<4;i++)
{
write5532(temp.uc[i]);
}
ADCLK=0;
NOP;NOP;NOP;
write5532(0xC0);
NOP;NOP;NOP;
ADCLK=0;
delay_1ms(20);
}
/***********************************************************************
函 数 名:uchar read5532(void)
***********************************************************************/
uchar read5532(void)
{
uchar i,indata=0;
for(i=0;i<8;i++)
{
indata<<=1;
if(ADO) indata|=0x01;
else indata&=0xff;
ADCLK=1;
NOP;
NOP;
NOP;
ADCLK=0;
NOP;
NOP;
}
return(indata);
}
/***********************************************************************
函 数 名:uchar read5532(void)
***********************************************************************/
void write5532(uchar outdata)
{
uchar i;
for(i=0;i<8;i++)
{
ADI=outdata&0x80;
NOP;
ADCLK=1; //上升沿写入
NOP;
outdata<<=1; //左移,高位在前
ADCLK=0; //CLOCK
NOP;
}
}
/***********************************************************************
函 数 名:uchar read5532(void)
***********************************************************************/
ulong ReadAd(void)
{
UCIL data adtemp;
write5532(0);
adtemp.uc[1]=read5532(); //最高字节
adtemp.uc[2]=read5532();
adtemp.uc[3]=read5532();
adtemp.uc[0]=read5532();
adtemp.uc[0]=0;
adtemp.ul>>=5; //19位ad读取
return(adtemp.ul);
} |