求救:测试ds1820的序列号的程序 点击:948 | 回复:0



liary

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 0回
  • 年度积分:0
  • 历史总积分:53
  • 注册:2004年5月24日
发表于:2004-05-27 13:21:00
楼主
求救 下面是我边的测试ds1820的序列号的程序,用的是凌阳16位单片机 问题是:ds1820总是没有发出存在信号 请高手指点一二! 急用! .include hardware.inc .ram //切换到ram段用于存放无初始值的变量 .var Command,return //定义两个变量 Delay: .Macro TIM //宏定义,有一个宏参数 push r3 to [sp] //用于延时 r3=TIM delayloop#: r3-=1 jnz delayloop# pop r3 from [sp] .endm .code .public _main //序列号主程序 _main: int off //关中断 r1=0x5010 [P_IOB_Dir]=r1 //设置B口的方向向量 r1=0x7010 [P_IOB_Attrib]=r1 //设置B口的属性向量 r1=0x201c [P_IOB_Data]=r1 //设置B口的数据向量 r1=8 //设循环8次 r3=0x0020 //设存储起始地址 call _Init //调用初始化子程序 r2=0x0033 [Command]=r2 //把读ds1820ROM命令赋给变量 call _Write //送命令到ds1820 lp: call _Read //读出ds1820当前的序列号 r4=[return] //把返回值存入r4 [r3++]=r4 //把当前值存入存储地址单元 r1-=1 jnz lp //判断64位序列号读完了没有 r1=0x0001 [P_Watchdog_Clear]=r1 //清除Watchdog l_Mainloop: jmp l_Mainloop .Public _Init //ds1820的初始化子程序 _Init:.proc Int off push r1,r4 to [sp] loop: r1=[P_IOB_Dir] //设置B4口为输出口 r1|=0x0010 [P_IOB_Dir]=r1 r1=[P_IOB_Data] //使Tx=1 r1|=0x0010 [P_IOB_Data]=r1 r1=[P_IOB_Data] //使Tx=0 r1&=0xffef [P_IOB_Data]=r1 Delay 245 //宏调用,延时480us r1=[P_IOB_Dir] r1&=0xffef [P_IOB_Dir]=r1 //设置B4口为输入口 Delay 33 //延时70us r1=[P_IOB_Data] //读B4口电平 r1&=0x0010 //屏蔽其它位,只读B4位 jnz loop //电平为1,即ds1820不存在,则跳 Delay 239 //电平为0,即ds1820存在,延时480us r1=0x0001 [P_Watchdog_Clear]=r1 //清除Watchdog pop r1,r4 from [sp] RETF .ENDP .Public _Write //写ds1820子程序 _Write: .Proc push r1,r4 to [sp] r1=[P_IOB_Dir] //设置B4口为输出口 r1|=0x0010 [P_IOB_Dir]=r1 r4=8 r2=[Command] //要写的字存入r2 wr: r3=r2&0x0001 //取一位 r2=r2 LSR 1 r3=r3 LSL 4 r1=[P_IOB_Data] //Tx=1 r1|=0x0010 [P_IOB_Data]=r1 r1=[P_IOB_Data] //Tx=0 r1&=0xffef [P_IOB_Data]=r1 Delay 3 //延时 r1=[P_IOB_Data] cmp r3,0x0000 jnz wr0 r3&=0xffef jmp wr1 wr0: r1|=0x0010 wr1: [P_IOB_Data]=r1 //数据输出 Delay 25 //延时54us r4-=1 jnz wr r1=[P_IOB_Dir] //B4口为输入口,释放总线 r1&=0xffef [P_IOB_Dir]=r1 r1=0x0001 [P_Watchdog_Clear]=r1 //清除Watchdog pop r1,r4 from [sp] RETF .ENDP .public _Read //ds1820的读ROM子程序 _Read: .proc push r1,r4 to [sp] r1=[P_IOB_Dir] //设置B4口为输出口 r1|=0x0010 [P_IOB_Dir]=r1 r4=8 re: r1=[P_IOB_Data] //使Tx=1 r1|=0x0010 [P_IOB_Data]=r1 r1=[P_IOB_Data] //使Tx=0 r1&=0xffef [P_IOB_Data]=r1 r1=[P_IOB_Dir] //设置B4口为输入口,释放总线 r1&=0xffef [P_IOB_Dir]=r1 r2=[P_IOB_Data] //读出数据 Delay 30 //延时60us r2&=0x0010 //调整数据 r2=r2 LSR 4 r2=r2 LSR 4 r3=r3 ROR 1 r4-=1 //读一为r4减1 jnz re //判断是否读完8位,没有则继续 r3=r3 LSR 4 r3=r3 LSR 4 [return]=r3 //读得数据存入返回变量 r1=[P_IOB_Dir] //重新释放总线 r1&=0xffef [P_IOB_Dir]=r1 r1=0x0001 [P_Watchdog_Clear]=r1 //清除Watchdog pop r1,r4 from [sp] RETF .ENDP


热门招聘
相关主题

官方公众号

智造工程师