急!简单的单片机控制DS18B20温度计,proteus仿真不行,图和汇编程序如下;各位大哥帮忙看看吧!谢~~~~~

急!简单的单片机控制DS18B20温度计,proteus仿真不行,图和汇编程序如下;各位大哥帮忙看看吧!谢~~~~~,第1张

给你一个参考程序,还带有时钟芯片驱动的

SCL2 BIT P13; //SCL2定义为P1口的第3位脚,连接ADC0831SCL脚

SDA2 BIT P14; //SDA2定义为P1口的第4位脚,连接ADC0831SDA脚

CS2 BIT P16; //CS2定义为P1口的第4位脚,连接ADC0831CS脚

RST BIT P15;// DS1302片选,因这两芯片采用同一数据脚(SDA,SCL),所以我们要定义它,将DS1302片选关掉,否则发生冲突

L_DISPLAY EQU 30H

L_TMPDATE1 EQU 38H ;秒

L_TMPDATE2 EQU 39H ;分

L_TMPDATE3 EQU 3AH ;时

L_TMPDATE4 EQU 3BH ;星期

L_TMPDATE5 EQU 3CH ;日

L_TMPDATE6 EQU 3DH ;月

L_TMPDATE7 EQU 3EH ;年

ORG 0100H

write_rtc_address: DB 80H,82H,84H,86H,88H,8aH,8cH

read_rtc_address: DB 81H,83H,85H,87H,89H,8bH,8dH

L_TIMER: DB 00H,59H,18H,01H,01H,01H,01H

TABLE: DB 3fH,06H,5bH,4fH,66H,6dH,7dH,07H,7fH,6fH,40H

/共阴数码管 0-9 - 表/

ORG 0000H

LJMP MAIN

ORG 0200H

MAIN: MOV SP,#60H

CLR RST

LCALL SET_RTC ;先写入初值

M0: LCALL READ_RTC ;循环读取时间数据

MOV R0,#L_DISPLAY

MOV A,L_TMPDATE3 ;把时拆分为两个数据,个时和十时

MOV B,#16

DIV AB

MOV @R0,A ;十时

INC R0

MOV @R0,B ;个时

INC R0

MOV @R0,#10 ;加"-"

INC R0

MOV A,L_TMPDATE2 ;同上

MOV B,#16

DIV AB

MOV @R0,A

INC R0

MOV @R0,B

INC R0

MOV @R0,#10

INC R0

MOV A,L_TMPDATE1

MOV B,#16

DIV AB

MOV @R0,A

INC R0

MOV @R0,B

MOV R0,#L_DISPLAY

MOV R7,#8

LCALL DISPLAY

SJMP M0

DISPLAY:MOV DPTR,#TABLE /R0为地址,R7为个数/

MOV P2,#0

ANL P1,#0F8H

L2: MOV A,@R0

MOVC A,@A+DPTR

MOV P2,A

LCALL DELAY

MOV P2,#0

INC P1

INC R0

DJNZ R7,L2

RET

DELAY: MOV R5,#20

D1: DJNZ R5,D1

RET

SET_RTC:MOV R6,#7 ;转输7个数据:秒、分、时、星期、日、月、年

MOV DPTR,#L_TIMER ;初始的7个数据从ROM中转到我们定义的RAM中

MOV R0,#L_TMPDATE1

S0: CLR A

MOVC A,@A+DPTR

MOV @R0,A

INC R0

INC DPTR

DJNZ R6,S0

MOV R1,#8EH

MOV R2,#0

LCALL W1302 ;首先写入地址8EH为0,即解锁,否则写入不了数据

MOV R0,#L_TMPDATE1 ;数据保存的地址

MOV DPTR,#write_rtc_address ;所写数据的地址

MOV R6,#7 ;写入7个数据:秒、分、时、星期、日、月、年

S1: MOV A,@R0

MOV R2,A

CLR A

MOVC A,@A+DPTR

MOV R1,A

LCALL W1302

INC DPTR

INC R0

DJNZ R6,S1

MOV R1,#8EH

MOV R2,#80H

LCALL W1302 ;;最后写入地址8EH为80H,即加上锁,不让写入不了数据

RET

READ_RTC:MOV R6,#7 ;读出7个数据:秒、分、时、星期、日、月、年

MOV R0,#L_TMPDATE1 ;存入定义的RAM中

MOV DPTR,#read_rtc_address

RE0: CLR A

MOVC A,@A+DPTR

MOV R1,A

LCALL R1302

MOV @R0,A

INC DPTR

INC R0

DJNZ R6,RE0

RET

W1302B: MOV R7,#8 ;单字节写,R1参数为所写数据

MOV A,R1

W0: RRC A

MOV SDA2,C

NOP

SETB SCL2

NOP

CLR SCL2

DJNZ R7,W0

RET

W1302: CLR RST ;指定地址写入数据,R1:地址,R2:数据

NOP

CLR SCL2

NOP

SETB RST

NOP

LCALL W1302B

MOV A,R2

MOV R1,A

LCALL W1302B

CLR RST

NOP

RET

R1302: MOV R2,#0 ;指定地址读数据,R1:地址,A:返回的数据

CLR RST

NOP

CLR SCL2

NOP

SETB RST

NOP

LCALL W1302B

MOV R7,#8

CLR A

RR0: MOV C,SDA2 ;;单字节读,读出数据存入A传出

RRC A

SETB SCL2

NOP

CLR SCL2

DJNZ R7,RR0

CLR RST

NOP

CLR SCL2

NOP

SETB SCL2

NOP

CLR SDA2

NOP

SETB SDA2

NOP

RET

END

可以用一个参考物,比如一个精度高些的温度计,如果这个没有,你又想判断你的程序是否正常,你可以吹气,加热,看有没有变化,放冰箱看是否会上升,下降来判断你程序是不是好 的

如果程序是好的,那么如果温度不正常只是传感器的问题,换个温度传感器就好了

另一个问题校验你可以用个简单的校正方式,就是把数值全部加起来,取他们之和作 为校验位(校验位只有一位是的,只有一位,你就取最后一位,前面的都是溢出的,这么想,哈)

找传感器相关资料也可以上传感器商城,他们那资料也挺全的,

以上就是关于急!简单的单片机控制DS18B20温度计,proteus仿真不行,图和汇编程序如下;各位大哥帮忙看看吧!谢~~~~~全部的内容,包括:急!简单的单片机控制DS18B20温度计,proteus仿真不行,图和汇编程序如下;各位大哥帮忙看看吧!谢~~~~~、用汇编编写ds18b20的温度显示程序,如何判断是否正确,比如我显示的温度是27°,怎么知道是不是正确的、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9802685.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存