发表于: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