利用AT89S2051采用DS18B20作為測溫傳感器,用AT89C2051作處理器,用數碼管顯示,并用LED燈作報警器。當測量溫度高于100℃或低于-20℃時,發出警報。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載):
0.png (29.93 KB, 下載次數: 70)
下載附件
2017-7-4 01:36 上傳
0.png (30.57 KB, 下載次數: 80)
下載附件
2017-7-4 01:33 上傳
0.png (53.39 KB, 下載次數: 71)
下載附件
2017-7-4 01:35 上傳
單片機源程序如下:
- ORG 0000H
- LJMP MAIN
- ORG 0030H
- MAIN:LCALL CSH0 ;DS18B20初始化
- MOV A,#0CCH ;單點測溫時執行跳過ROM命令節省訪問時間
- LCALL WRITE
- MOV A,#44H ;發開始溫度轉換命令
- LCALL WRITE
- LCALL CSH0 ;DS18B20初始化
- MOV A,#0CCH ;單點測溫時執行跳過ROM命令節省訪問時間
- LCALL WRITE
- MOV A,#0BEH ;讀存儲器命令(讀的字節暫存存儲器,此后讀操作)
- LCALL WRITE
- LCALL READ ;讀出已轉換的溫度值低字節
- MOV 2BH,A
- LCALL READ ;讀出已轉換的溫度值高字節
- MOV 2CH,A
- LCALL ERSH ;二進制轉化成十進制
- LCALL DISPL ;調用動態顯示的子程序
- LCALL MAXorMIN;***判斷是否超出上下限***
- LJMP MAIN
- ;******************第一個DS18B20初始化子程序*******************
- CSH0:CLR P3.0
- MOV R2,#250
- CSH1:DJNZ R2, CSH1 ;主機發置位脈沖持續2μs*240=480μs
- SETB P3.0 ;主機釋放總線控制P3.2口改為輸入
- MOV R2,#30
- CSH4:DJNZ R2, CSH4 ;DS18B20等待2μs*30=60μs
- JB P3.0,CSH0 ;DS18B20沒準備好,重來
- MOV R3,#120 ;DS18B20數據線變低
- CSH5:DJNZ R3,CSH5 ;DS18B20數據線低電平狀態可持續2μs*120=240us
- JB P3.0,CSH3 ;18B20數據線變高,初始化成功
- LJMP CSH0 ;初始化失敗,重來
- CSH3:MOV R2,#240
- CSH2:DJNZ R2, CSH2;18B20應答過程最少2μs*240=480μs
- RET
- ;******************寫DS18B20子程序**********************
- WRITE:MOV R3,#8
- WR1: SETB P3.0 ;保證連續寫2位間的間隙大于1μs
- MOV R4,#7
-
- CLR P3.0
- RRC A
- WR2: DJNZ R4,WR2 ;18B20數據線變低后2μs*7+1=15μs開始采樣數據
- MOV P3.0,C ;將命令字從低位按位依次送18B20
- MOV R4,#22
- WR3: DJNZ R4,WR3;保證整個寫過程持續2μs*22+1=45μS
- DJNZ R3,WR1;送完整個命令字
- SETB P3.0
- RET
- ;********************讀DS18B20子程序*********************
- READ:MOV R3,#8
- RE1: CLR P3.0
- MOV R4,#4
- NOP ;低電平持續2μs
- SETB P3.0 ;P3.0口設為輸入口
- RE2: DJNZ R4,RE2 ;等待2μs*4=8μs
- MOV C,P3.0 ;主機(從低位)按位讀入18B20數據
- RRC A ;數據逐位(先低位后高位)送入A
- MOV R4,#30
- RE3: DJNZ R4,RE3 ;保證讀數據過程持續2μs*30=60μs
- DJNZ R3,RE1 ;讀完整個轉換值(不含符號位)并存21H中
- RET
- ;************判斷是否為負、溫度精度轉換********************
- ERSH: MOV A,2CH ;把溫度的高字節給了A
- JB ACC.7,BB ;溫度為負轉變補(BB)程序段
- SETB F0 ;F0作為是否為負數的標志
- MOV R7,#0FFH ;溫度為正不點亮
- ZHCH: MOV A,2BH ;屏蔽溫度低字節的小數位
- ANL A,#0F0H
- SWAP A
- MOV 2DH,A
- MOV A,2CH ;屏蔽溫度高字節的符號位
- ANL A,#07H
- SWAP A
- ADD A,2DH
- CFZH: MOV B,#10
- DIV AB
- MOV 41H,B ;41H中為個位
- MOV B,#10
- DIV AB
- MOV 42H,B ;42H中存放十位
- MOV B,#10
- DIV AB
- MOV 43H,B ;43H中為百位
- ESHD: MOV A,2BH ;低精度二十進制轉換小數處理程序
- JB ACC.3,XS ;小數十分位為1,則跳轉到XS
- MOV 40H,#00H
- RET
- XS: MOV 40H,#05H ;43H中存放小數位
- RET
- BB: CLR F0
- MOV R7,#0BFH ;負數讓第1個數碼管顯示為"-"
- MOV A,2BH ;負數補碼求補
- CPL A
- ADD A,#1
- MOV 2BH,A ;負溫度低字節求補后送2BH
- MOV A,2CH
- CPL A
- ADDC A,#0
- MOV 2CH,A ;負溫度高字節求補后送2CH
- LJMP ZHCH ;負數求補后轉到ZHCH
- ;*************************顯示子程序**************************
- DISPL:MOV A,R7 ;取顯示的正負號
- MOV P1,A ;發送字段代碼
- CLR P3.5 ;Y5=0, K5=1
- ACALL DL2MS ;符號位
- SETB P3.5 ;138A腳置1,關閉所有位碼
- MOV DPTR,#CSTAB;字段碼表首址送DPTR
- MOV R1,#40H
- MOV A,@R1
- MOVC A,@A+DPTR
- MOV P1,A
- CLR P3.4
- CLR P3.7 ;Y2=0,K1=1
- ACALL DL2MS ;小數
- SETB P3.4
- SETB P3.7
- INC R1
- MOV A,@R1
- MOVC A,@A+DPTR
- ANL A,#7FH ;個位小數點亮 數碼管的Dp段點亮,其他段跟隨A中的值
- MOV P1,A
- CLR P3.7 ;Y3=0,K2=1
- ACALL DL2MS ;個位
- SETB P3.7
-
- INC R1
- MOV A,@R1
- MOVC A,@A+DPTR
- MOV P1,A
- CLR P3.4 ;Y3=0,K3=1
- CLR P3.5
- ACALL DL2MS ;十位
- SETB P3.4
- SETB P3.5
- INC R1
- MOV A,@R1
- MOVC A,@A+DPTR
- MOV P1,A
- CLR P3.4 ;Y6=0,K4=1
- ACALL DL2MS ;百位
- SETB P3.4
- RET
- ;*************************上下限判斷子程序**************************
- MAXorMIN: PUSH ACC
- JNB F0,MIN
- MAX: MOV A,43H ;正溫度時,判斷是否超過上限100℃
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
溫度上下限 (4).zip
(2.29 MB, 下載次數: 58)
2017-7-3 17:58 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|