18b20温度计报警C语言,制作DS18B20数字温度计我还想具有报警功能
DS18B20引腳定義:
(1)DQ為數字信號輸入/輸出端;(需要加個上拉電阻加到電源上)
(2)GND為電源地;
(3)VDD為外接供電電源輸入端(在寄生電源接線方式時接地)。
本人做過它的課程設計。
以下是程序,你要是有DS18B20的資料最好,沒有的話我可以傳給你。
2個數碼管顯示。精確到1°C。程序沒加報警功能,你可以在最后一段中,比較一下TEMPER_L和TEMPER_H中的數值??與你要報警的數值。自己試一下吧!!!!!!
ORG?0000H
;單片機內存分配申明!
TEMPER_L?EQU?29H;用于保存讀出溫度的低8位
TEMPER_H?EQU?28H;用于保存讀出溫度的高8位
FLAG1?EQU?38H;是否檢測到DS18B20標志位
a_bit?EQU?20H;數碼管個位數存放內存位置
b_bit?EQU?21H?;數碼管十位數存放內存位置
DQ?EQU?P1.2
CHECK?EQU?P1.0
CHECK1?EQU?P1.3
NEGTIVE?EQU?P1.4
MAIN:??LCALL?GET_TEMPER;調用讀溫度子程序
;進行溫度顯示,用兩位數碼管來顯示
;顯示范圍-55到99度,顯示精度為1度
LCALL?DISPLAY;調用數碼管顯示子程序
AJMP?MAIN
;?DS18B20復位初始化子程序
INIT_1820:
SETB?DQ
NOP
CLR?DQ
;主機發出延時637微秒的復位低脈沖
MOV?R1,#3H
TSR1:?MOV?R0,#6BH
DJNZ?R0,?R1,TSR1
SETB?DQ;然后拉高數據線
NOP
NOP
NOP
MOV?R0,#25H
TSR2:?JNB?DQ,TSR3;等待DS18B20回應
DJNZ?R0,TSR2
LJMP?TSR4
TSR3:?SETB?FLAG1?;?置標志位,表示DS1820存在
CLR?CHECK1;檢查到DS18B20就點亮LED
LJMP?TSR5
TSR4:?CLR?FLAG1?;?清標志位,表示DS1820不存在
LJMP?TSR7
TSR5:?MOV?R0,#117
TSR6:?DJNZ?R0,TSR6?;?時序要求延時一段時間
TSR7:?SETB?DQ
RET
;?讀出轉換后的溫度值
GET_TEMPER:
SETB?DQ
BCD:?LCALL?INIT_1820;先復位DS18B20
JB?FLAG1,TSS2
LJMP?BCD?;?判斷DS1820是否存在?若DS18B20不存在則返回
TSS2:;?MOV?R3,#23
;?DJNZ?R3,??CHECK?;DS18B20已經被檢測到!!!!!!!!!!!!!!!!!!
MOV?A,#0CCH?;?跳過ROM匹配
LCALL?WRITE_1820
MOV?A,#44H?;?發出溫度轉換命令
LCALL?WRITE_1820
LCALL?DELAY;延時750微秒
LCALL?INIT_1820;準備讀溫度前先復位
MOV?A,#0CCH?;?跳過ROM匹配
LCALL?WRITE_1820
MOV?A,#0BEH?;?發出讀溫度命令
LCALL?WRITE_1820
LCALL?READ_1820;?將讀出的溫度數據保存
RET
;延時程序
DELAY:?MOV?R2,#4H
DELAYA:?MOV?R3,#0FFH
DELAYB:?MOV?R4,#0FFH
DELAYC:?DJNZ?R4,DELAYC
DJNZ?R3,DELAYB
DJNZ?R2,DELAYA
RET
;寫DS18B20的子程序(有具體的時序要求)
WRITE_1820:
MOV?R2,#8;一共8位數據
CLR?C
SETB?DQ
NOP
NOP
WR1:?CLR?DQ
MOV?R3,#6
DJNZ?R3,?A
MOV?DQ,C
MOV?R3,#23
DJNZ?R3,?DQ
NOP
DJNZ?R2,WR1
SETB?DQ
RET
;?讀DS18B20的程序,從DS18B20中讀出兩個字節的溫度數據
READ_1820:
MOV?R4,#2?;?將溫度高位和低位從DS18B20中讀出
MOV?R1,#TEMPER_L?;?低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
RE00:?MOV?R2,#8;數據一共有8位
RE01:?CLR?C
SETB?DQ
NOP
NOP
CLR?DQ
NOP
NOP
NOP
SETB?DQ
MOV?R3,#8?;16us
RE10:??DJNZ?R3,RE10
MOV?C,DQ
MOV?R3,#23?;70us
RE20:??DJNZ?R3,RE20
RRC?A
DJNZ?R2,RE01
MOV?,A
DEC?R1
DJNZ?R4,RE00
RET
;顯示子程序
;根據TEMPER_H高5位是1來判斷溫度是否為負,若為負,則取反再+1
DISPLAY:
MOV?A,TEMPER_H
JNB?ACC.1,POSI
CLR?NEGTIVE
CPL?A
MOV?TEMPER_H,A
MOV?A,TEMPER_L
CPL?A
CLR?C
INC?A
MOV?TEMPER_L,A
MOV?A,TEMPER_H
ADDC?A,#0H
MOV?TEMPER_H,A
;TEMPER_H高4位為0,根據溫度計算方法,TEMPER_H,TEMPER_L的數值除16就是實際溫度
;右移4位即實際溫度,把TEMPER_L高4位和TEMPER_H低4位合并再對換,后轉換為10進制即得實際溫度數據
POSI:?MOV?A,TEMPER_L
ANL?A,#0F0H
MOV?a_bit,A
MOV?A,TEMPER_H
ADD?A,a_bit
SWAP?A
CLR?C
DA?A
MOV?b_bit,A
ANL?A,#0FH
MOV?DPTR,#ZIXING
MOVC?A,+DPTR
MOV?P3,A
MOV?A,b_bit
SWAP?A
ANL?A,#0FH
MOV?DPTR,#ZIXING
MOVC?A,+DPTR
MOV?P2,A
RET
ZIXING:DB?0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
END
總結
以上是生活随笔為你收集整理的18b20温度计报警C语言,制作DS18B20数字温度计我还想具有报警功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 栈的重要应用---四则运算
- 下一篇: 时序约束优先级_VIVADO之时序约束