|
設(shè)計仿真圖
以前做了一個設(shè)計,抽到的題目是智能溫度控制器,要求是匯編語言實現(xiàn),
并且要在開發(fā)板上進行實物驗證。
(本代碼已在實驗室驗證,一定可行)
具體程序代碼、內(nèi)容、要求等都在word里面。
該系統(tǒng)在超過設(shè)定的溫度上限或者低于其下限的時候會亮燈報警。
此設(shè)計為原創(chuàng)設(shè)計。
仿真圖如圖所示。
希望大家多多鼓勵。謝謝。
設(shè)計任務(wù): 采用DS18B20溫度傳感器和AT89S52單片機及顯示電路完成環(huán)境溫度的實時顯示。
⒈ 數(shù)字溫度計的總體方案設(shè)計
⑴系統(tǒng)總體結(jié)構(gòu)
數(shù)字溫度計的系統(tǒng)框圖。
⑵芯片選擇
⑶DS18B20主要性能指標(biāo)
⒉硬件電路設(shè)計
⑴AT89S52單片機最小系統(tǒng)
⑵DS18B20與AT89S52單片機接口電路設(shè)計
⑶顯示電路與AT89S52單片機接口電路設(shè)計
⒊軟件設(shè)計
⑴主程序框圖
⑵DS18B20溫度采集程序框圖
⑶顯示程序框圖
⒋調(diào)試與測試結(jié)果分析
⑴實驗系統(tǒng)連線圖
⑵程序調(diào)試
⑶實驗結(jié)果分析
⒌程序清單和系統(tǒng)原理圖
附錄:單片機程序及設(shè)計電路(有比較詳細的中文注釋)
DQ BIT P1.0 ;DS18B20數(shù)據(jù)位
FLAG1 BIT 00H ;DS18B20是否存在的標(biāo)志位
SIGN BIT 01H ;符號位
MSB EQU 30H ;轉(zhuǎn)換數(shù)據(jù)高位字節(jié)
LSB EQU 31H ;轉(zhuǎn)換數(shù)據(jù)低位字節(jié)
INTEG EQU 32H ;轉(zhuǎn)換數(shù)據(jù)整數(shù)部分
DECIM EQU 33H ;轉(zhuǎn)換數(shù)據(jù)小數(shù)部分
SEG_S EQU 34H ;符號位段碼
SEG_I3 EQU 35H ;整數(shù)部分的百位段碼
SEG_I2 EQU 36H ;整數(shù)部分的十位段碼
SEG_I1 EQU 37H ;整數(shù)部分的個位段碼
SEG_D1 EQU 38H ;小數(shù)部分的段碼
ORG 0000H
MAIN: CLR P1.1 ;正常運行指示燈亮
LCALL INIT_1820 ;DS18B20初始化
LCALL GET_TEMPER ;讀取轉(zhuǎn)換數(shù)據(jù)
LCALL COMPARE ;判斷是否超出設(shè)定溫度范圍
LCALL DATA_PROC ;數(shù)據(jù)處理
LCALL SEG_GEN ;生成顯示碼
LCALL DISPLAY ;數(shù)碼顯示
SJMP MAIN
;DS18B20復(fù)位初始化子程序(單總線)
INIT_1820: SETB DQ
NOP
CLR DQ ;主機發(fā)出延時復(fù)位低脈沖
MOV R1,#3
TSR1: MOV R0,#107
DJNZ R0,$
DJNZ R1,TSR1 ;延時651微秒
SETB DQ ;拉高數(shù)據(jù)線
NOP
NOP
NOP ;延時3微秒
MOV R0,#25H
TSR2: JNB DQ,TSR3 ;等待DS18B20回應(yīng)
DJNZ R0,TSR2 ;延時并檢測應(yīng)答信號,148微秒
LJMP TSR4
TSR3: SETB FLAG1 ;置標(biāo)志位,表示DS1820存在
LJMP TSR5
TSR4: CLR FLAG1 ;清標(biāo)志位,表示DS1820不存在
LJMP TSR6
TSR5: MOV R0,#117
DJNZ R0,$ ;時序要求延時一段時間,234微秒
TSR6: SETB DQ
RET
;讀出轉(zhuǎn)換后的溫度值
GET_TEMPER:
SETB DQ
LCALL INIT_1820 ;先復(fù)位DS18B20
JB FLAG1,TSS2
RET ;判斷DS1820是否存在
TSS2: MOV A,#0CCH ;跳過ROM匹配
LCALL WRITE_1820
MOV A,#44H ;發(fā)出溫度轉(zhuǎn)換命令
LCALL WRITE_1820
LCALL DELAY ;等待AD轉(zhuǎn)換結(jié)束,12位轉(zhuǎn)換需750微秒
LCALL INIT_1820 ;準(zhǔn)備讀溫度前先復(fù)位
MOV A,#0CCH ;跳過ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ;發(fā)出讀溫度命令
LCALL WRITE_1820
LCALL READ_18200 ;將讀出的溫度數(shù)據(jù)保存到35H/36H
RET
;寫DS18B20的子程序(有具體的時序要求)
WRITE_1820:MOV R2,#8 ;一共8位數(shù)據(jù)
CLR C
WR1: CLR DQ
MOV R3,#6
DJNZ R3,$
RRC A
MOV DQ,C
MOV R3,#23
DJNZ R3,$
SETB DQ
NOP ;兩個寫周期至少需要1微秒的恢復(fù)時間
DJNZ R2,WR1
SETB DQ
RET
; 讀DS18B20的程序,從DS18B20中讀出兩個字節(jié)的溫度數(shù)據(jù)
READ_18200:MOV R4,#2 ;將溫度高位和低位從DS18B20中讀出
MOV R1,#31H ;低位存入31H,高位存入30H
RE00: MOV R2,#8 ;數(shù)據(jù)一共有8位
RE01: CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#9
RE10: DJNZ R3,RE10
MOV C,DQ
MOV R3,#23
DJNZ R3,$
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
;數(shù)據(jù)處理子程序,判斷正負,并分離轉(zhuǎn)換值的整數(shù)和小數(shù)部分
;符號位為SIGN,0為正,1為負
;整數(shù)部分存放在INTEG(32H)中,小數(shù)部分存放在DECIM(33H)中
;先判斷轉(zhuǎn)換數(shù)據(jù)的正負
DATA_PROC: CLR C ;清零進位位
CLR SIGN ;清零符號位
MOV A,MSB ;將DS18B20轉(zhuǎn)換數(shù)據(jù)的高位字節(jié)給8位累加器
RLC A ;將累加器A帶進位的左移,把MSB的最高位給C
JC NEG ;判斷符號位,C=1說明為負數(shù),跳轉(zhuǎn)到NEG
LJMP PROC ;C=0說明為正數(shù),跳轉(zhuǎn)到PROC
;下面對負數(shù)進行取補碼
NEG: CLR C ;清零進位位
SETB SIGN ;將符號位置1,表示負數(shù)
MOV A,LSB ;將DS18B20轉(zhuǎn)換數(shù)據(jù)的低位字節(jié)給8位累加器
CPL A ;累加器A的8位取反
ADD A,#1 ;取反后加1
MOV LSB,A ;再將取反后的補碼給LSB
MOV A,MSB ;同理將MSB進行取補碼
CPL A
ADDC A,#0 ;此處應(yīng)注意LSB是否向MSB進位
MOV MSB,A
;下面分離轉(zhuǎn)換值的整數(shù)和小數(shù)部分
;DS18B20為轉(zhuǎn)換數(shù)據(jù)為16位,其中,高字節(jié)的高5位為溫度符號位,
;高字節(jié)的低3位+低字節(jié)的高4位為溫度的整數(shù)部分,低字節(jié)的低4位為溫度的小數(shù)部分
PROC: MOV A,LSB
ANL A,#0FH ;保留低字節(jié)的低4位
MOV DECIM,A ;將小數(shù)部分存儲在DECIM
MOV A,MSB
SWAP A ;累加器A中高低4位互換
ANL A,#0F0H ;保留高字節(jié)的低4位
MOV INTEG,A
MOV A,LSB
SWAP A
ANL A,#0FH ;保留低字節(jié)的高4位
MOV R0,INTEG
ORL A,R0 ;高字節(jié)的低4位加上低字節(jié)的高4位
MOV INTEG,A ;得到的整數(shù)部分存儲在INTEG
RET
;下面對設(shè)置溫度上限與下限,超過范圍將點亮報警燈
COMPARE: PUSH ACC
CLR C
MOV A, #28 ;設(shè)置溫度上限
SUBB A,INTEG ;溫度上限減去整數(shù)部分
JC Z1 ;若超過溫度上限,則跳轉(zhuǎn)到Z1
MOV A,#26 ;設(shè)置溫度下限
SUBB A,INTEG ;溫度下限減去整數(shù)部分
JNC Z1 ;若低于溫度下限,則跳轉(zhuǎn)到Z1
CLR C
SETB P1.2 ;若在上下限之間,則不點亮報警燈
POP ACC
RET
Z1: CLR C
CLR P1.2 ;點亮報警燈
POP ACC
RET
;生成顯示碼子程序
;符號位段碼存放在SEG_S中,整數(shù)段碼存放在SEG_I3到SEG_I1中
;小數(shù)部分段碼存放在SEG_D1中
SEG_GEN: MOV DPTR,#TABLE ;將0到9的數(shù)碼段的段首地址給DPTR
JB SIGN,S_NEG ;判斷符號位,若為負數(shù),跳轉(zhuǎn)至S_NEG
MOV SEG_S,#0FFH ;若為正數(shù),則符號位數(shù)碼段都不亮
SJMP S_INT
S_NEG: MOV SEG_S,#0BFH ;若為負數(shù),則符號位數(shù)碼段顯示“-”
S_INT: MOV A,INTEG
MOV B,#100
DIV AB ;A除以B,商放在A中,商即為整數(shù)部分的百位數(shù)
MOVC A,@A+DPTR ;將百位數(shù)的段碼給A
MOV SEG_I3,A ;得到百位數(shù)段碼,存儲在SEG_I3
;下面同理得到十位數(shù)的段碼
MOV A,B
MOV B,#10
DIV AB
MOVC A,@A+DPTR
MOV SEG_I2,A
MOV A,B
MOVC A,@A+DPTR
ANL A,#7FH ;加上小數(shù)點
MOV SEG_I1,A ;得到十位數(shù)的段碼
;下面通過散轉(zhuǎn)程序得到小數(shù)的段碼
MOV DPTR,#SWITCH
MOV A,DECIM
MOV B,DECIM
ADD A,B ;AJMP指令占用2個字節(jié)
JMP @A+DPTR ;間接轉(zhuǎn)移指令,根據(jù)小數(shù)值查表,求段碼
SWITCH: AJMP K0
AJMP K1
AJMP K2
AJMP K3
AJMP K4
AJMP K5
AJMP K6
AJMP K7
AJMP K8
AJMP K9
AJMP K10
AJMP K11
AJMP K12
AJMP K13
AJMP K14
AJMP K15
K0: MOV SEG_D1,#0C0H
AJMP RETURN
K1: MOV SEG_D1,#0F9H
AJMP RETURN
K2: MOV SEG_D1,#0F9H
AJMP RETURN
K3: MOV SEG_D1,#0A4H
AJMP RETURN
K4: MOV SEG_D1,#0B0H
AJMP RETURN
K5: MOV SEG_D1,#0B0H
AJMP RETURN
K6: MOV SEG_D1,#99H
AJMP RETURN
K7: MOV SEG_D1,#99H
AJMP RETURN
K8: MOV SEG_D1,#92H
AJMP RETURN
K9: MOV SEG_D1,#82H
AJMP RETURN
K10: MOV SEG_D1,#82H
AJMP RETURN
K11: MOV SEG_D1,#0F8H
AJMP RETURN
K12: MOV SEG_D1,#80H
AJMP RETURN
K13: MOV SEG_D1,#80H
AJMP RETURN
K14: MOV SEG_D1,#90H
AJMP RETURN
K15: MOV SEG_D1,#90H
AJMP RETURN
RETURN: JNB SIGN,RETURN1 ;若為正數(shù)則跳轉(zhuǎn)至RETURN1
MOV SEG_I3,#0BFH ;若為負數(shù),則百位數(shù)將顯示“-”
RETURN1: RET
;顯示子程序,首位為符號位,三位整數(shù),1位小數(shù)
DISPLAY: MOV SP,#80H
MOV P2,#0FFH
MOV DPTR,#0FF23H ;指向8255的控制字寄存器
MOV A,#81H ;設(shè)置8255的PA、PB為輸出,PC為輸入
MOVX @DPTR,A ;寫8255控制字寄存器
XS1: MOV DPTR,#0FF21H ;指向8255的PB口(七段碼)
MOV A,SEG_I3 ;百位的七段碼
MOVX @DPTR,A ;通過8255的PB口送出七段碼
MOV DPTR,#0FF20H ;位選地址(PA)
MOV A,#0DFH ;左邊第1個數(shù)碼管的位選
MOVX @DPTR,A ;點亮選擇左邊第一個數(shù)碼管
CALL DELAY ;調(diào)用延時子程序
;下面相同原理進行位選數(shù)碼管
XS2: MOV DPTR,#0FF21H
MOV A,SEG_I2 ;十位的七段碼
MOVX @DPTR,A
MOV DPTR,#0FF20H
MOV A,#0EFH ;左邊第2個數(shù)碼管的位選
MOVX @DPTR,A
CALL DELAY
XS3: MOV DPTR,#0FF21H
MOV A,SEG_I1 ;個位的七段碼
MOVX @DPTR,A
MOV DPTR,#0FF20H
MOV A,#0F7H ;左邊第3個數(shù)碼管的位選
MOVX @DPTR,A
CALL DELAY
XS4: MOV DPTR,#0FF21H
MOV A,SEG_D1 ;小數(shù)的七段碼
MOVX @DPTR,A
MOV DPTR,#0FF20H
MOV A,#0FBH ;左邊第4個數(shù)碼管的位選
MOVX @DPTR,A
CALL DELAY
XS5: MOV DPTR,#0FF21H
MOV A,#9CH ;"℃"的小圓圈的七段碼
MOVX @DPTR,A
MOV DPTR,#0FF20H
MOV A,#0FDH ;左邊第5個數(shù)碼管的位選
MOVX @DPTR,A
CALL DELAY
XS6: MOV DPTR,#0FF21H
MOV A,#0C6H ;"℃"的“C“的七段碼
MOVX @DPTR,A
MOV DPTR,#0FF20H
MOV A,#0FEH ;左邊第6個數(shù)碼管的位選
MOVX @DPTR,A
CALL DELAY
;延時子程序
DELAY:
MOV R1,#5
D2: MOV R2,#120
DJNZ R2,$
DJNZ R1,D2
RET
;0到9數(shù)字的數(shù)碼段段碼
TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H
DB 92H,82H,0F8H,80H,90H
END
完整的Word格式文檔51黑下載地址:
課設(shè)報告.doc
(68.5 KB, 下載次數(shù): 117)
2019-9-13 14:30 上傳
點擊文件名下載附件
|
評分
-
查看全部評分
|