本帖最后由 3sainimu78 于 2012-6-17 11:04 编辑
我自虐得差不多了 折腾了一天 真的找不出这两段汇编的错误
DQ是单总线 , 在P3.7 , 虽然这是单片机的读信号端 不过这应该不要紧吧
大家帮我看看吧 , 这两段汇编执行的动作是不是和那两段C的一样 , 不然差在哪里?
这是写的程序比较
WRITE_BYTE: MOV R7,#8;写8次
LOOP1: CLR DQ
RRC A ;最低位移到c里
MOV DQ,C ;送出
ACALL DELAY50 ;keil仿真,延迟50us左右
SETB DQ
DJNZ R7,LOOP1
ACALL DELAY50 ;keil仿真,延迟50us左右
RET
void write_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01;
delay(4); //keil仿真 , 延时50us左右
DQ=1;
dat>>=1;
}
delay(4); //keil仿真 , 延时50us左右
}
这是读的程序比较
READ_BYTE: MOV R7,#8 ;读8次
LOOP2: CLR DQ
NOP
SETB DQ
JNB DQ,READ_0 ;判断读到的是1还是0
SETB C
RRC A
ACALL DELAY50 ;keil仿真,延迟50us左右
DJNZ R7,LOOP2
RET
READ_0: CLR C
RRC A
ACALL DELAY50 ;keil仿真,延迟50us左右
DJNZ R7,LOOP2
RET
uchar read_byte(void)
{
uchar i,value;
for(i=0;i<8;i++)
{
DQ=0;
value>>=1;
DQ=1;
if(DQ)
{
value|=0x80;
}
delay(4); //keil仿真 , 延时50us左右
}
return value;
}
C程序可以成功读写DS18B20
汇编的不行:( |