|
本帖最后由 dz20062008 于 2012-7-18 17:03 编辑
用DS18B20做了个数码管显示的温度计,12位精度,显示四位小数,有正负温度指示,也有DS18B20应答否报警。
DS18B20转换后不加延时也可以正常12位读数,不正常啊!!为什么啊!加延时反而转换的速度变慢了这货的转换速度到底多块啊~
还有就是显示最左边有最右边的残影,不知道怎么解决,是不是用累加器A加左移控制扫描这方法不行啊?怎么解决LED扫描显示与DS18B20的时序问题~
AT89S51 12M
DS_BUS BIT P3.6 ;温度传感器数据总线
BEEP_BUS BIT P3.5 ;蜂鸣器接口
DS_FLAG BIT 20H.0 ;温度传感器存在标志位
LED_DATA EQU P0
LED_DUAN EQU P1.0
LED_WEI EQU P1.1
TEMP_H EQU 33H ;存放温度整数位
TEMP_L EQU 32H ;存放温度小数位
TEMP_MSB EQU 31H ;存放MSB
TEMP_LSB EQU 30H ;存放LSB
TEMP_ZF EQU 17H ;温度正负标志位A为正B为负
ORG 0000H
SJMP START
ORG 0030H
START:MOV SP ,#07H
CLR DS_FLAG
MOV TEMP_H,#00H
MOV TEMP_L,#00H
MOV TEMP_MSB,#00H
MOV TEMP_LSB,#00H
MOV 10H,#00H ;计数缓存清零
MOV 11H,#00H
MOV 12H,#00H
MOV 13H,#00H
MOV 14H,#00H
MOV 15H,#00H
MOV 16H,#00H
MOV TEMP_ZF,#00H
MOV 18H,#0C0H ;显示缓存清零
MOV 19H,#0C0H
MOV 1AH,#0C0H
MOV 1BH,#0C0H
MOV 1CH,#0C0H
MOV 1DH,#0C0H
MOV 1EH,#0C0H
MOV 1FH,#0C0H
LCALL DS_RESET
JNB DS_FLAG,ERR
LCALL BEEP
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MAIN:LCALL DISPLAY
LCALL TEMP_COV1
LCALL TEMP_COV2
LCALL HEXtoBCD
LCALL XIAOSHUtoBCD
LCALL BCDtoLED
LCALL DISPLAY
LJMP MAIN
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
BEEP:SETB BEEP_BUS
NOP
CLR BEEP_BUS
LCALL DELAY500MS
SETB BEEP_BUS
RET
ERR:LCALL BEEP
LCALL DELAY500MS
LCALL BEEP
LCALL DELAY500MS
LCALL BEEP
LCALL DELAY500MS
LJMP START
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TEMP_COV1:LCALL DS_RESET
JNB DS_FLAG,ERR
MOV A,#0CCH
LCALL WR_BYTE
MOV A,#44H
LCALL WR_BYTE
LCALL DS_RESET
JNB DS_FLAG,ERR
MOV A,#0CCH
LCALL WR_BYTE
MOV A,#0BEH
LCALL WR_BYTE
LCALL RD_BYTE
MOV TEMP_LSB,A
LCALL RD_BYTE
MOV TEMP_MSB,A
LCALL DS_RESET
RET
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TEMP_COV2:PUSH TEMP_LSB
PUSH TEMP_MSB
MOV TEMP_ZF,#0AH
MOV A,TEMP_MSB
ANL A,#11111000B
CJNE A,#00000000B,TEMP_COV3
POP TEMP_MSB
POP TEMP_LSB
MOV R0,#31H
MOV A ,TEMP_LSB
XCHD A ,@R0
SWAP A
MOV TEMP_H,A
MOV TEMP_L,TEMP_MSB
RET
TEMP_COV3:POP TEMP_MSB
POP TEMP_LSB
MOV TEMP_ZF,#0BH
MOV A,TEMP_MSB
CPL A
MOV TEMP_MSB,A
MOV A,TEMP_LSB
CPL A
ADD A,#01H
MOV TEMP_LSB,A
MOV A,TEMP_MSB
ADDC A,#00H
MOV TEMP_MSB,A
MOV R0,#31H
MOV A,TEMP_LSB
XCHD A,@R0
SWAP A
MOV TEMP_H,A
MOV TEMP_L,TEMP_MSB
RET
DELAY500MS:MOV R7,#17H
DL1:MOV R6,#98H
DL0:MOV R5,#46H
DJNZ R5,$
DJNZ R6,DL0
DJNZ R7,DL1
RET
HEXtoBCD:PUSH ACC
PUSH B
MOV A,TEMP_H
MOV B,#100D
DIV AB
MOV 16H,A
MOV A,#10D
XCH A,B
DIV AB
MOV 15H,A
MOV 14H,B
POP B
POP ACC
RET
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
XIAOSHUtoBCD:
MOV A,TEMP_L
CJNE A,#00H,L100
MOV 10H,#00H
MOV 11H,#00H
MOV 12H,#00H
MOV 13H,#00H
RET
L100:CJNE A,#01H,L101
MOV 10H,#05H
MOV 11H,#02H
MOV 12H,#06H
MOV 13H,#00H
RET
L101:CJNE A,#02H,L102
MOV 10H,#00H
MOV 11H,#05H
MOV 12H,#02H
MOV 13H,#01H
RET
L102:CJNE A,#03H,L103
MOV 10H,#05H
MOV 11H,#07H
MOV 12H,#08H
MOV 13H,#01H
RET
L103:CJNE A,#04H,L104
MOV 10H,#00H
MOV 11H,#00H
MOV 12H,#05H
MOV 13H,#02H
RET
L104:CJNE A,#05H,L105
MOV 10H,#05H
MOV 11H,#02H
MOV 12H,#01H
MOV 13H,#03H
RET
L105:CJNE A,#06H,L106
MOV 10H,#00H
MOV 11H,#05H
MOV 12H,#07H
MOV 13H,#03H
RET
L106:CJNE A,#07H,L107
MOV 10H,#05H
MOV 11H,#07H
MOV 12H,#03H
MOV 13H,#04H
RET
L107:CJNE A,#08H,L108
MOV 10H,#00H
MOV 11H,#00H
MOV 12H,#00H
MOV 13H,#05H
RET
L108:CJNE A,#09H,L109
MOV 10H,#05H
MOV 11H,#02H
MOV 12H,#06H
MOV 13H,#05H
RET
L109:CJNE A,#0AH,L110
MOV 10H,#00H
MOV 11H,#05H
MOV 12H,#02H
MOV 13H,#06H
RET
L110:CJNE A,#0BH,L111
MOV 10H,#05H
MOV 11H,#07H
MOV 12H,#08H
MOV 13H,#06H
RET
L111:CJNE A,#0CH,L112
MOV 10H,#00H
MOV 11H,#00H
MOV 12H,#05H
MOV 13H,#07H
RET
L112:CJNE A,#0DH,L113
MOV 10H,#05H
MOV 11H,#02H
MOV 12H,#01H
MOV 13H,#08H
RET
L113:CJNE A,#0EH,L114
MOV 10H,#00H
MOV 11H,#05H
MOV 12H,#07H
MOV 13H,#08H
RET
L114:CJNE A,#0FH,L115
MOV 10H,#05H
MOV 11H,#07H
MOV 12H,#03H
MOV 13H,#09H
RET
L115:MOV 10H,#00H
MOV 11H,#00H
MOV 12H,#00H
MOV 13H,#00H
RET
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
BCDtoLED:PUSH ACC
PUSH DPL
PUSH DPH
MOV DPTR,#LED_TAB
MOV A,10H
MOVC A,@A+DPTR
MOV 18H,A
MOV DPTR,#LED_TAB
MOV A,11H
MOVC A,@A+DPTR
MOV 19H,A
MOV DPTR,#LED_TAB
MOV A,12H
MOVC A,@A+DPTR
MOV 1AH,A
MOV DPTR,#LED_TAB
MOV A,13H
MOVC A,@A+DPTR
MOV 1BH,A
MOV DPTR,#LED_TAB
MOV A,14H
MOVC A,@A+DPTR
ANL A,#7FH
MOV 1CH,A
MOV DPTR,#LED_TAB
MOV A,15H
MOVC A,@A+DPTR
MOV 1DH,A
MOV DPTR,#LED_TAB
MOV A,16H
MOVC A,@A+DPTR
MOV 1EH,A
MOV DPTR,#LED_TAB
MOV A,17H
MOVC A,@A+DPTR
MOV 1FH,A
POP DPH
POP DPL
POP ACC
RET
/*DS18B20初始化子程序,复位低电平维持500US,检测应答信号维持200US,等待总线释放维持300US*/
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DS_RESET:PUSH ACC
PUSH B
SETB DS_BUS
NOP
CLR DS_BUS
MOV R1,#47H
L1:MOV R0,#02H
DJNZ R0,$
DJNZ R1,L1
NOP
SETB DS_BUS
NOP
NOP
NOP
MOV R0,#48D
L2:JNB DS_BUS,L3
DJNZ R0,L2
SJMP L4
L3:SETB DS_FLAG
MOV R0,#150D
DJNZ R0,$
SETB DS_BUS
POP B
POP ACC
RET
L4:CLR DS_FLAG
MOV R0,#150D
DJNZ R0,$
SETB DS_BUS
POP B
POP ACC
RET
/*DS18B20写一字节子程序。写一BYTE入口为累加器A,写一BIT入口为C */
WR_BYTE:PUSH B
MOV B,#8D
L6:RRC A
ACALL WR_BIT
DJNZ B,L6
POP B
RET
WR_BIT:PUSH B
PUSH ACC
CLR DS_BUS
MOV B,#8D
DJNZ B,$
MOV DS_BUS,C
MOV B,#60D
DJNZ B,$
SETB DS_BUS
POP ACC
POP B
RET
/*DS18B20读一字节子程序,读一BYTE的出口为A累加器,读一BIT的出口参数为C寄存器 */
RD_BYTE:PUSH B
MOV B,#8D
L7:ACALL RD_BIT
RRC A
DJNZ B,L7
POP B
RET
RD_BIT:PUSH ACC
PUSH B
CLR CY
SETB DS_BUS
NOP
NOP
CLR DS_BUS
NOP
NOP
NOP
SETB DS_BUS
MOV B,#09D
DJNZ B,$
MOV C,DS_BUS
MOV B,#60D
DJNZ B,$
POP B
POP ACC
RET
;显示子程序
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DISPLAY:PUSH ACC
MOV R1,#18H ;逐位把显示缓存的LED代码显示出来
MOV R4,#00H ;清零刷新位数计数值
MOV A,#00000001B ;控制逐位显示刷新的刷新方向
LEDLOOP:MOV LED_DATA,@R1 ;LED段码送LED屏
SETB LED_DUAN ;送LED段码值到74HC373-A缓存
CLR LED_DUAN ;缓存LED段码
MOV LED_DATA,A ;LED位码送LED屏
SETB LED_WEI ;送LED位码值到74HC373-B缓存
CLR LED_WEI ;缓存LED位码
LCALL LED_DELAY ;位与位显示之间的显示延时
RL A ;更新LED位码值
INC R1 ;LED段码指针增一
INC R4 ;LED显示位数计数
CJNE R4,#8D,LEDLOOP ;显示完了吗?
POP ACC
RET ;显示完了,返回主程序
LED_DELAY:PUSH ACC
MOV R7,#04D ;装入显示延时循环的外圈值
D1:MOV R6,#100D ;装入显示延时循环的内圈值
D2:DJNZ R6,D2 ;内圈循环
DJNZ R7,D1 ;外圈循环
POP ACC
RET
LED_TAB: ;七段数码管十六进制显示码表
DB 0C0H,0F9H,0A4H,0B0H,99H ,92H
DB 82H ,0F8H,80H ,90H ,0FFH,0BFH
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
END
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|