打印

这两个汇编的读写程序和这两个C的差别? (关于DS18B20)

[复制链接]
1610|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
3sainimu78|  楼主 | 2012-6-17 10:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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
汇编的不行:(

相关帖子

沙发
3sainimu78|  楼主 | 2012-6-17 19:58 | 只看该作者
程序很短也没人看啊...

使用特权

评论回复
板凳
wukunshan| | 2012-6-17 21:53 | 只看该作者
楼主,现在是单片机C年代,用汇编的人几乎没了。我也无能为力了。

使用特权

评论回复
地板
airwill| | 2012-6-18 08:32 | 只看该作者
估计是时序问题. 汇编的效率高于c, 所以对于C 正确的时序, 对于汇编就有问题了.

LOOP1:                   CLR DQ
                             RRC A                   ;最低位移到c里
                   MOV DQ,C              ;送出

           DQ=0;
                DQ=dat&0x01;

C 的执行时间略长, 多了个传递寄存器指令 MOV  A, R7

使用特权

评论回复
5
vrgood| | 2012-6-18 11:18 | 只看该作者
本帖最后由 vrgood 于 2012-6-18 11:21 编辑

看程序似乎是一致的。
时序问题,汇编CLR DQ后加几个NOP试试看。
另外50US的延时加长至60US。

使用特权

评论回复
6
3sainimu78|  楼主 | 2012-6-20 21:17 | 只看该作者
WR_DATA:
                   MOV R7,#8

WRITE:
                    CLR DQ
                    RRC A
                   ACALL DELAY8
                   MOV DQ,C
                   ACALL DELAY60
                   SETB DQ
                   DJNZ R7,WRITE
                   ACALL DELAY60
                   RET


READ_DATA:
                    MOV R7,#8

READ:
                    CLR DQ
                   SETB DQ
                   ACALL DELAY4
                   MOV C,DQ
                   RRC A
                   ACALL DELAY60
                   SETB DQ
                   DJNZ R7,READ
                   RET


谢谢大家 之前应该是延时不对的问题
现在我改好了 可以成功读到数据
然后发现 其实读1读0写1写0都不心分开来做的 代码如上

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

30

帖子

0

粉丝