给你一个参考程序,还带有时钟芯片驱动的
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°,怎么知道是不是正确的、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)