- UID
- 111482
- 帖子
- 5976
- 积分
- 19792
- 威望
- 13159
- 金币
- 4654721
- 贡献
- 6623
- 职业
- 单片机编程家电维修
- 注册时间
- 2007-9-21
- 最后登录
- 2012-1-7
|
1#
发表于 2009-4-19 12:05
| 只看该作者
发个我给大4学生做的18B20温度测温仪0~125度
本帖最后由 13013963877 于 2011-5-22 12:00 编辑
;********************************************
;本程序测量温度范围:0~125度, *
;4位数码管显示 *
;不得用于商业目的 *
;********************************************
;各单元定义----------------------------------------
DAT BIT P3.5 ;数据通信口
WDLSB DATA 34H ;读出的温度低节
WDMSB DATA 35H ;读出的温度高节
DTEMP1 EQU 30H
DTEMP2 EQU 31H
DTEMP3 EQU 32H
DTEMP4 EQU 33H ;显示数据单元
KEYST BIT P3.2 ;设定键
KEYUP BIT P3.3 ;加键
KEYDN BIT P3.4 ;减键
WD1 DATA 50H ;设定温度低字节
WD2 DATA 51H ;设定温度高字节
CON BIT P3.7 ;控制线
A138 BIT P3.0
B138 BIT P3.1
COUNT DATA 40H
XS DATA 52H
ZS DATA 53H
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0SEV
;***************************************************************
ORG 0030H
;主程序:
MAIN: MOV SP,#60H
MOV COUNT,#00H
MOV TMOD,#01H
MOV TH0,#3CH
MOV TL0,#0B0H
SETB EA
MOV 50H,#00H
MOV 51H,#00H
MOV 24H,#0
MOV 25H,#0
MOV 26H,#0
MOV 27H,#0 ;设定温度初始化
MOV R7,#50H
SETB CON
LOOP :
LCALL RST
JNB F0,ERROR ;如果没有应答调显示1820
MOV R0,#0CCH
LCALL SEND_BYTE ;发出读温度命令
MOV R0,#44H
LCALL SEND_BYTE ;发出读温度命令
DLOOP: LCALL KEY ;调用键盘
LCALL DISP0 ;显示温度
JNB DAT,DLOOP
LCALL RST
JNB F0,ERROR
MOV R0,#0CCH ;跳过ROM匹配
LCALL SEND_BYTE
MOV R0,#0BEH ;发出读温度命令
LCALL SEND_BYTE
LCALL READ_BYTE
MOV WDLSB,R0 ;读得二进制温度34H
LCALL READ_BYTE
MOV WDMSB,R0 ;35H
LCALL TRANS ;转换为十进制温度
LCALL CHK ;调用比较检测
MOV R7,#20H
XXX1: LCALL DISP0
LCALL KEY
DJNZ R7,XXX1
AJMP LOOP
ERROR : MOV R7,#30H
SETB TR0
SETB ET0
DDD: MOV 57H, #0DH
MOV 56H, #0AH
MOV 55H, #0CH
MOV 54H, #0CH
LCALL DISP1
DJNZ R7,DDD
MOV R7,#30H
;1820故障报警----------------------------------------------------------
EEE: MOV 54H, #0 ;送0
MOV 55H, #2 ;送2
MOV 56H, #8 ;送8
MOV 57H, #1 ;送1
LCALL DISP1
DJNZ R7,EEE
AJMP ERROR ;反复显示1820
T1MS: MOV R5,#00H ;延时子程序
TT: MOV R6,#9
DJNZ R6,$
DJNZ R5,TT
RET
;*****************************************************************
;温度转换程序:精确到:0.06
TRANS : MOV A,WDLSB
ANL A,#0F0H
MOV B,A
MOV A,WDMSB
ANL A,#0FH
ORL A,B
SWAP A
MOV B,#10
DIV AB
MOV DTEMP4,A
MOV DTEMP3,B
MOV DPTR,#TABB
MOV A,WDLSB
ANL A,#0FH
MOV B,#2
MUL AB
MOVC A,@A+DPTR
MOV DTEMP2,A
MOV A,WDLSB
ANL A,#0FH
MOV B,#2
MUL AB
INC A
MOVC A,@A+DPTR
MOV DTEMP1,A
RET
TABB: DB 0,0,0,6,1,2,1,8,2,5,3,1,3,7,4,3,5,0
DB 5,6,6,2,6,8,7,5,8,1,8,7,9,3
;BCD转换设定温度用:
TRANS1: MOV A,WD1
ANL A,#0F0H
MOV B,A
MOV A,WD2
ANL A,#0FH
ORL A,B
SWAP A
MOV B,#10
DIV AB
MOV 27H,A ;26H
MOV 26H,B ;27H
MOV DPTR,#TABB
MOV A,WD1
ANL A,#0FH
MOV B,#2
MUL AB
MOVC A,@A+DPTR
MOV 25H,A ;25H
MOV A,WD1
ANL A,#0FH
MOV B,#2
MUL AB
INC A
MOVC A,@A+DPTR
MOV 24H,A ;24H
RET
;******************************************************************
;发送一个字节程序
SEND_BYTE:
MOV A,R0
MOV R5,#8
SEN3: CLR C
RRC A
JC SEN1
LCALL WRITE_0
SJMP SEN2
SEN1: LCALL WRITE_1
SEN2: DJNZ R5,SEN3 ; 循环8次,写一个字节
RET
;*******************************************************************
;读一个字节程序
READ_BYTE:
MOV R5,#8
READ1: LCALL READ
RRC A
DJNZ R5,READ1 ; 循环8次,读一个字节
MOV R0,A
RET
;*******************************************************************
;复位程序,如果复位置位F0,没有就清F0
RST: CLR DAT
MOV R6,#250 ;主机发复位脉冲持续250*2US=500US
DJNZ R6,$
SETB DAT ;主机释放总线,口线改为输入
MOV R6,#40
DJNZ R6,$ ;等待80US
MOV C,DAT
JC RST0
SETB F0 ;检测到信号,置位F0
SJMP CHCK
RST0: CLR F0 ;未准备好F0复位
CHCK: MOV R6,#50
DJNZ R6,$ ;等待应答结束
RET
;*********************************************************************
;写一位数据
WRITE_0: ;写0
CLR DAT
MOV R6,#30
DJNZ R6,$
SETB DAT
RET
WRITE_1:CLR DAT ;写1
NOP
NOP
NOP
NOP
NOP
SETB DAT
MOV R6,#30
DJNZ R6,$
RET
;*********************************************************************
;读一位数据程序
READ:
CLR DAT
NOP
NOP
SETB DAT ;置位DAT准备接收数据
NOP
NOP
NOP
NOP
NOP
NOP
NOP
MOV C,DAT
MOV R6,#23
DJNZ R6,$
RET
;*************************************************************
;键盘子程序
KEY: JB KEYST,KEYRET ;是设定键?是1无键返回
JMP KEYSF
KEYRET: RET ;返回
KEYSF:
LCALL DISP2 ;是设定键调显示去抖
JNB KEYST,KEYSF ;为0等键释放是设定?
CLR EA
SETB CON
MOV A,WD1
ANL A,#0FH
MOV XS,A ;小数组装
KEYLOOP:
LCALL DISP2 ;调显示去抖
JB KEYDN,KEY1 ;为0是减1有键顺序,为1转查加1
DEC XS
MOV A,XS
ANL A,#0FH
ANL WD1,#0F0H ;保留WD1的整数部分
ORL WD1,A ;送小数
LCALL TRANS1 ;调BCD转换
KEY3: LCALL DISP2 ;调显示去抖
JNB KEYDN,KEY3 ;为0等减1键释放
KEY1: JB KEYUP,KEY2 ;是加1顺序不是查设定
INC XS
MOV A,XS
ANL A,#0FH
ANL WD1,#0F0H
ORL WD1,A
LCALL TRANS1 ;调BCD转换
KEY4: LCALL DISP2 ;调显示去抖
JNB KEYUP,KEY4 ;为0等加1键释放
KEY2: JB KEYST,KEYLOOP ;是设定键?不是转查加1减1键
KEYSF1: LCALL DISP2 ;调显示去抖
JNB KEYST,KEYSF1 ;等设定释放
MOV A,WD1
ANL A,#0F0H
SWAP A
MOV B,A
MOV A,WD2
ANL A,#0FH
SWAP A
ORL A,B
MOV ZS,A ;整数组装
KEYLOOP1:
LCALL DISP2 ;调显示去抖
JB KEYDN,KEY11 ;为0是减1顺序不是转查加1键
DEC ZS ;51H减1
MOV A,ZS
CJNE A,#0FFH,KEYX2
MOV ZS,#63H
KEYX2: MOV A,ZS
ANL A,#0F0H ;高四位
SWAP A
MOV WD2,A
MOV A,ZS
ANL A,#0FH ;低四位
SWAP A
ANL WD1,#0FH
ORL WD1,A
LCALL TRANS1 ;调BCD转换
KEY31: LCALL DISP2 ;调显示去抖
JNB KEYDN,KEY31 ;等减1键释放
KEY11: JB KEYUP,KEY21 ;为0是加1顺序不是转查设定键
INC ZS ;51H加1
MOV A,ZS
CJNE A,#64H,KEYX1
MOV ZS,#00H
KEYX1: MOV A,ZS
ANL A,#0F0H ;高四位
SWAP A
MOV WD2,A
MOV A,ZS
ANL A,#0FH ;低四位
SWAP A
ANL WD1,#0FH
ORL WD1,A
LCALL TRANS1 ;调BCD转换
KEY41: LCALL DISP2 ;调显示去抖
JNB KEYUP,KEY41 ;为0等加1键释放
KEY21: JB KEYST,KEYLOOP1 ;是设定键?不是转查加1减1键
JNB KEYST,$ ;等设定释放
SETB EA
RET
;显示子程序----------------------------------------------------------------------
DISP0:
MOV P1,#0FFH
MOV DPTR,#DISPTAB
MOV A,DTEMP1
MOVC A,@A+DPTR
MOV P1,A
CLR P3.0
CLR P3.1 ;个位
LCALL T1MS
MOV P1,#0FFH
MOV A,DTEMP2
MOVC A,@A+DPTR
MOV P1,A
SETB P3.0
CLR P3.1 ; 十位
LCALL T1MS
MOV P1,#0FFH
MOV A,DTEMP3
MOVC A,@A+DPTR
MOV P1,A
CLR P3.0
SETB P3.1 ; 百位
CLR P1.7
LCALL T1MS
MOV P1,#0FFH
MOV A,DTEMP4
MOVC A,@A+DPTR
MOV P1,A
SETB P3.0 ;千位
SETB P3.1
LCALL T1MS
MOV P1,#0FFH
RET
DISP1:
MOV P1,#0FFH
MOV A,54H
MOV DPTR,#DISPTAB1
MOVC A,@A+DPTR
MOV P1,A
CLR P3.0
CLR P3.1 ;个位
CALL T1MS
MOV P1,#0FFH
MOV A,55H
MOV DPTR,#DISPTAB1
MOVC A,@A+DPTR
MOV P1,A
SETB P3.0
CLR P3.1 ; 十位
CALL T1MS
MOV P1,#0FFH
MOV A,56H
MOV DPTR,#DISPTAB1
MOVC A,@A+DPTR
MOV P1,A
CLR P3.0
SETB P3.1 ; 百位
CALL T1MS
MOV P1,#0FFH
MOV A,57H
MOV DPTR,#DISPTAB1
MOVC A,@A+DPTR
MOV P1,A
SETB P3.1 ;千位
SETB P3.0
CALL T1MS
MOV P1,#0FFH
RET
DISPTAB1B 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0C6H,0C7H, 0BFH, 0F1H
; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,A(C),B(L),D(-),E(J)
DISPTABB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
DISP2:
MOV P1,#0FFH
MOV A,24H
MOV DPTR,#DISPTAB2
MOVC A,@A+DPTR
MOV P1,A
CLR P3.0
CLR P3.1 ;个位
CALL T1MS
MOV P1,#0FFH
MOV A,25H
MOV DPTR,#DISPTAB2
MOVC A,@A+DPTR
MOV P1,A
SETB P3.0
CLR P3.1 ; 十位
CALL T1MS
MOV P1,#0FFH
MOV A,26H
MOV DPTR,#DISPTAB2
MOVC A,@A+DPTR
MOV P1,A
CLR P3.0
SETB P3.1 ; 百位
CLR P1.7
CALL T1MS
MOV P1,#0FFH
MOV A,27H
MOV DPTR,#DISPTAB2
MOVC A,@A+DPTR
MOV P1,A
SETB P3.0 ;千位
SETB P3.1
CALL T1MS
MOV P1,#0FFH
RET
DISPTAB2B 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
;*********************************************************************
;温度比较子程序
CHK: MOV A,WD2
ANL A,#0FH
MOV WD2,A
MOV A,WDMSB
ANL A,#0FH
MOV WDMSB,A
CJNE A,WD2,CHK1 ;
SETB C ;等于或小于C=1
CHK1: JNC KAI ;大于开报警
CJNE A,WD2,CHK2 ;小于等于和51H再比较
CHK2: JC GUAN ;小于关报警
MOV A,WDLSB ;高位等于,低位比较
CJNE A,WD1,CHK3 ;和50H比较
CHK3: JNC KAI ;低位大于等于就开报警
GUAN: SETB CON ;否则关报警
CLR TR0
CLR ET0
MOV COUNT,#00H
RET
KAI: ;CLR CON
SETB TR0
SETB ET0
RET
;********************************声音报警程序****************************
T0SEV: PUSH A
INC COUNT
MOV A,COUNT
CJNE A,#10,T0RET
MOV COUNT,#00H
CPL CON
MOV TH0,#3CH
MOV TL0,#0B0H
T0RET: POP A
RETI
END
;希望大家踊跃发帖把单片机板块火起来 |
-
2
评分次数
-
|