|
楼主 |
发表于 2009-6-24 06:15:29
|
显示全部楼层
这是C51读写字节和初始化原代码:
//----------------------------------------------------------------------------------
char s_write_byte(unsigned char value)
//----------------------------------------------------------------------------------
// writes a byte on the Sensibus and checks the acknowledge
{
unsigned char i,error=0;
for (i=0x80;i>0;i/=2) //shift bit for masking
{ if (i & value) DATA=1; //masking value with i , write to SENSI-BUS
else DATA=0;
SCK=1; //clk for SENSI-BUS
_nop_();_nop_();_nop_(); //pulswith approx. 5 us
SCK=0;
}
DATA=1; //release DATA-line
SCK=1; //clk #9 for ack
error=DATA; //check ack (DATA will be pulled down by SHT11)
SCK=0;
return error; //error=1 in case of no acknowledge
}
//----------------------------------------------------------------------------------
char s_read_byte(unsigned char ack)
//----------------------------------------------------------------------------------
// reads a byte form the Sensibus and gives an acknowledge in case of "ack=1"
{
unsigned char i,val=0;
DATA=1; //release DATA-line
for (i=0x80;i>0;i/=2) //shift bit for masking
{ SCK=1; //clk for SENSI-BUS
if (DATA) val=(val | i); //read bit
SCK=0;
}
DATA=!ack; //in case of "ack==1" pull down DATA-Line
SCK=1; //clk #9 for ack
_nop_();_nop_();_nop_(); //pulswith approx. 5 us
SCK=0;
DATA=1; //release DATA-line
return val;
}
//----------------------------------------------------------------------------------
void s_transstart(void)
//----------------------------------------------------------------------------------
// generates a transmission start
// _____ ________
// DATA: |_______|
// ___ ___
// SCK : ___| |___| |______
{
DATA=1; SCK=0; //Initial state
_nop_();
SCK=1;
_nop_();
DATA=0;
_nop_();
SCK=0;
_nop_();_nop_();_nop_();
SCK=1;
_nop_();
DATA=1;
_nop_();
SCK=0;
}
//----------------------------------------------------------------------------------
void s_connectionreset(void)
//----------------------------------------------------------------------------------
// communication reset: DATA-line=1 and at least 9 SCK cycles followed by transstart
// _____________________________________________________ ________
// DATA: |_______|
// _ _ _ _ _ _ _ _ _ ___ ___
// SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______| |___| |______
{
unsigned char i;
DATA=1; SCK=0; //Initial state
for(i=0;i<9;i++) //9 SCK cycles
{ SCK=1;
SCK=0;
}
s_transstart(); //transmission start
}
下面是更改后的原代码:
char s_write_byte(unsigned char value)
//-------------------------------------------------------------------
// 写一个字节,检查应答信号
{
unsigned char i,error=0;
DDREbits.RE1=0;
for (i=0x80;i>0;i/=2)
{ if (i & value) DATA=1;
else DATA=0;
SCK=1;
Nop();Nop();Nop(); //时钟脉冲宽度 5 us
SCK=0;
}
DDREbits.RE1=1;
SCK=1; //9个CLK后应答
Nop();
error=DATA; //检查应答信号 (DATA 被拉低)
SCK=0;
DDREbits.RE1=0;
return error; // 如果没有应答则error=1
}//
//-------------------------------------------------------------------
char s_read_byte(unsigned char ack)
//-------------------------------------------------------------------
// 读一个字节,检查应答信号
{
unsigned char i,val=0;
DDREbits.RE1=1;
for (i=0x80;i>0;i/=2)
{ SCK=1;
if (DATA) val=(val | i);
SCK=0;
}
DDREbits.RE1=0;
DATA=!ack; //如果 "ack==1" ,拉低DATA
Nop();Nop();
SCK=1; //clk #9 for ack
Nop();Nop();Nop();Nop();;Nop();Nop(); //延时5微秒
SCK=0;
Nop();Nop(); //时钟脉冲宽度 5 us
DDREbits.RE1=0;
return val;
}
//-------------------------------------------------------------------
void s_transstart(void)
//-------------------------------------------------------------------
// generates a transmission start
// _____ ________
// DATA: |_______|
// ___ ___
// SCK : ___| |___| |______
{
DDREbits.RE1=0;
Nop();
DATA=1;
SCK=0; //初始状态
Nop();
SCK=1;
Nop();
DATA=0;
Nop();
SCK=0;
Nop();Nop();Nop();
SCK=1;
Nop();
DATA=1;
Nop();
SCK=0;
}
//-------------------------------------------------------------------
void s_connectionreset(void)
//-------------------------------------------------------------------
//通讯复位: 至少在9 SCK 周期后,DATA=1 传输开始
// _____________________________________________________
// DATA: //|_______|
// _ _ _ _ _ _ _ _ _ ___ ___
// SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______| |___|
{
unsigned char i;
DDREbits.RE1=0;
DATA=1; SCK=0; //初始状态
for(i=0;i<9;i++) //9 SCK周期
{
SCK=1;
SCK=0;
}
s_transstart(); //通讯开始
} |
|