|
單片機(jī)系統(tǒng)設(shè)計(jì)實(shí)驗(yàn)報(bào)告
0 實(shí)驗(yàn)任務(wù)
所設(shè)計(jì)的主從式多級通信系統(tǒng)有一個(gè)主機(jī)和兩個(gè)從機(jī),其中1#從機(jī)的地址設(shè)為01H,2#從機(jī)的地址設(shè)為02H。
主機(jī)的RXD和從機(jī)的TXD相連,TXD和從機(jī)的主機(jī)的RXD相連,主機(jī)的P1口接2個(gè)按鈕開關(guān),一個(gè)代表1#從機(jī),另一個(gè)代表2#從機(jī),主機(jī)根據(jù)開關(guān)的狀態(tài),發(fā)送要訪問的從機(jī)的地址,地址相符的從機(jī)則點(diǎn)亮發(fā)光二極管以示和主機(jī)進(jìn)行通信,然后主機(jī)向從機(jī)發(fā)送數(shù)據(jù),從機(jī)將接收到的數(shù)據(jù)進(jìn)行顯示。當(dāng)按下從機(jī)1#的按鈕的時(shí)候,主機(jī)會將實(shí)時(shí)溫度發(fā)送給從機(jī),從機(jī)通過LCD 1602顯示溫度。P2.4引腳上的發(fā)光二極管指示和主機(jī)的通信狀態(tài)。
主機(jī)和從機(jī)串口都設(shè)置為方式3,波特率為9600。主機(jī)發(fā)送地址時(shí),TB8為1,主機(jī)發(fā)送數(shù)據(jù)時(shí),TB8為0。從機(jī)在監(jiān)聽狀態(tài)時(shí)SM2設(shè)置為1,接收到的地址若和本機(jī)地址相符,點(diǎn)亮P2.0引腳上的發(fā)光二極管以示和主機(jī)聯(lián)絡(luò)成功,并置SM2為0,準(zhǔn)備接收數(shù)據(jù),否則SM2仍維持為1不變,不接收數(shù)據(jù)。從機(jī)接收完數(shù)據(jù)后,將接收到的數(shù)據(jù)送顯示,然后從機(jī)將SM2設(shè)置為1,返回到監(jiān)聽狀態(tài)。主機(jī)根據(jù)按鈕開關(guān)的狀態(tài),和相應(yīng)的從機(jī)進(jìn)行通信。
1 系統(tǒng)方案
1.1 系統(tǒng)分析
根據(jù)系統(tǒng)功能要求,可將系統(tǒng)組成結(jié)構(gòu)分為四大部分。單片機(jī)控制中心、DS18B20測溫模塊、LCD 1602顯示模塊、中斷觸發(fā)模塊。
其中,單片機(jī)控制中心是核心。DS18B20測溫模塊是數(shù)據(jù)輸入的主要來源,可以實(shí)時(shí)測溫;LCD 1602顯示模塊是將溫度實(shí)時(shí)顯示,用于顯示測量地點(diǎn)的溫度;報(bào)警模塊是監(jiān)視測量地點(diǎn)的溫度有沒有超出可接受范圍,如果超出,報(bào)警模塊會以聲音方式報(bào)警。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機(jī)匯編語言源程序如下(主機(jī)):
- ;采用11.0592MHZ晶振
- ;++++++++++++執(zhí)行DJNZ需要兩個(gè)時(shí)間周期+++++++++++++
- ;T0定時(shí)器 方式1 16位計(jì)數(shù)
- ;1.init
- ;2.skip rom
- ;3.convert-t
- ;4.init
- ;5.skip-rom
- ;6.read
- ;7.receive-data
- ;8.cal
- ;9.display
- DAT BIT P3.7 ;定義P3.7口為DQ線
- WDLSB DATA 30H ;定義讀出溫度低字節(jié),將溫度低字節(jié)放在30H
- WDMSB DATA 31H ;定義讀出溫度高字節(jié),將溫度高字節(jié)放在31H
- ORG 0000H
- LJMP MAIN
- ORG 0003H
- LJMP INT_EXT0 ;外部中斷0入口
- ORG 0013H
- LJMP INT_EXT1 ;外部中斷1入口
- ORG 0100H
- MAIN:
- MOV SP,#60H ;設(shè)置堆棧指針
- SETB EX0 ;允許外部中斷0產(chǎn)生中斷
- SETB IT0 ;外部中斷0為跳沿觸發(fā)方式
- SETB EX1 ;允許外部中斷1產(chǎn)生中斷
- SETB IT1 ;外部中斷1為跳沿觸發(fā)方式
- SETB EA ;總中斷打開
- MOV IP,#01H
- ;---DS18B20測溫子程序---
- LCALL DS18B20_TP ;調(diào)用DS18B20測溫子程序
- HERE:
- LJMP HERE
- ;----外部中斷0子程序
- INT_EXT0: ;外部中斷子程序
- CLR EA ;CPU關(guān)中斷
- PUSH PSW ;現(xiàn)場保護(hù)
- PUSH ACC
- SETB EA ;總中斷允許位
- MOV TMOD,#20H ;選擇定時(shí)器T1,波特率是9600
- MOV TH1,#0FDH
- MOV TL1,#0FDH
- SETB TR1 ;運(yùn)行定時(shí)器T1
- MOV SCON,#0D8H ;設(shè)置串口通信為方式3,SM2=0,RE=1,TB8=1
- MOV PCON,#00H ;*****SMOD=0
- MOV IE,#00H
- MT1:
- MOV SBUF,#01H ;發(fā)送1#從機(jī)地址,呼叫1#從機(jī)
-
- LT1:
- JBC TI,LT2 ;判TI?TI=1,跳轉(zhuǎn)L2,并將TI=0;否則往下執(zhí)行
- LJMP LT1
- LT2:
-
- JBC RI,ST1 ;等待從機(jī)應(yīng)答,如果接收完成,RI=1,轉(zhuǎn)S1,RI=0;
- ;如果RI=0,往下執(zhí)行
- LJMP LT2 ;未接收完成,跳轉(zhuǎn)L2繼續(xù)等待
- ST1:
- MOV A,SBUF ;取出應(yīng)答地址
- XRL A,#01H ;判斷是否1#從機(jī)應(yīng)答
- JZ RIGHTT ;是從機(jī)1#應(yīng)答,轉(zhuǎn)發(fā)送數(shù)據(jù)
- LJMP MT1 ;如果不是1#從機(jī)應(yīng)答,重新呼叫
- RIGHTT:
- CLR TB8 ;聯(lián)絡(luò)成功,清TB8,發(fā)送數(shù)據(jù)
- ;---啟動(dòng)發(fā)送個(gè)位溫度數(shù)據(jù)
- MOV SBUF,43H ;啟動(dòng)發(fā)送個(gè)位溫度數(shù)據(jù)
- TRANS_L:
- JBC TI,OK ;TI=1,發(fā)送完成,并且清零TI,轉(zhuǎn)NEXT
- ;TI=0,轉(zhuǎn)WAIT繼續(xù)等待
- LJMP TRANS_L
- ;---接收從機(jī)發(fā)送過來的確認(rèn)信息#0FFH
- OK:
- JBC RI,RECEIVE_OK ;主機(jī)等待從機(jī)應(yīng)答,如果接受完畢,RI=1,并且轉(zhuǎn)RECEIVE_OK
- LJMP OK
- RECEIVE_OK:
- MOV A,SBUF
- XRL A,#0FFH
- JZ TRANS_H
- LJMP MT1
- ;---啟動(dòng)發(fā)送十位溫度數(shù)據(jù)
- TRANS_H:
- MOV SBUF,42H ;---啟動(dòng)發(fā)送十位溫度數(shù)據(jù)
- ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- MOV A,42H
- MOV DPTR,#TAB ;翻譯子程序,將段碼表首地址放入DPTR
- MOVC A,@A+DPTR ;查表后將鍵號對應(yīng)的段碼送入ACC
- MOV P2,A ;將ACC值送入P2孔
-
- WAIT_H:
- JBC TI,NEXTT ;RI=1,發(fā)送完成,并且清零RI,轉(zhuǎn)NEXT
- ;RI=0,轉(zhuǎn)WAIT繼續(xù)等待
- LJMP WAIT_H ;啟動(dòng)發(fā)送十位溫度數(shù)據(jù)
- NEXTT:
- CLR EA ;關(guān)中斷
- POP ACC ;現(xiàn)場恢復(fù)
- POP PSW
- SETB EA ;打開中斷
- RETI
- ;----外部中斷1子程序
- INT_EXT1:
- CLR EA ;CPU關(guān)中斷
- PUSH PSW ;現(xiàn)場保護(hù)
- PUSH ACC
- SETB EA ;總中斷允許位
- MOV TMOD,#20H ;選擇定時(shí)器T1,波特率是9600
- MOV TH1,#0FDH
- MOV TL1,#0FDH
- SETB TR1 ;運(yùn)行定時(shí)器T1
- MOV SCON,#0D8H ;設(shè)置串口通信為方式3,SM2=0,RE=1,TB8=1
- MOV PCON,#00H ;*****SMOD=0
- MOV IE,#00H
- M1:
- MOV SBUF,#02H ;發(fā)送2#從機(jī)地址,呼叫2#從機(jī)
-
- L1:
- JBC TI,L2 ;判TI?TI=1,跳轉(zhuǎn)L2,并將TI=0;否則往下執(zhí)行
- LJMP L1
- L2:
- JBC RI,S1 ;等待從機(jī)應(yīng)答,如果接收完成,RI=1,轉(zhuǎn)S1,RI=0;
- ;如果RI=0,往下執(zhí)行
- LJMP L2 ;未接收完成,跳轉(zhuǎn)L2繼續(xù)等待
- S1:
- MOV A,SBUF ;取出應(yīng)答地址
- XRL A,#02H ;判斷是否1#從機(jī)應(yīng)答
- JZ RIGHT ;是從機(jī)1#應(yīng)答,轉(zhuǎn)發(fā)送數(shù)據(jù)
- LJMP M1 ;如果不是1#從機(jī)應(yīng)答,重新呼叫
- RIGHT:
- CLR TB8 ;聯(lián)絡(luò)成功,清TB8,發(fā)送數(shù)據(jù)
- ;---發(fā)送數(shù)據(jù)發(fā)送
- MOV SBUF,#02H ;啟動(dòng)發(fā)送數(shù)據(jù)發(fā)送
- WAIT:
- JBC TI,NEXT ;RI=1,發(fā)送完成,并且清零RI,轉(zhuǎn)NEXT
- ;RI=0,轉(zhuǎn)WAIT繼續(xù)等待
- LJMP WAIT
- NEXT:
- CLR EA ;關(guān)中斷
- POP ACC ;現(xiàn)場恢復(fù)
- POP PSW
- SETB EA ;打開中斷
- RETI
- ;---DS18B20測溫程序---
- DS18B20_TP:
- PUSH PSW ;現(xiàn)場保護(hù)
- PUSH ACC
- ;---清兩個(gè)顯示緩沖單元41H
- MOV R2,#3 ;清兩個(gè)顯示緩沖單元42H(保存溫度值的十位),43H(保存溫度值的個(gè)位)
- MOV R0,#41H
- OVER:
- MOV @R0,#00H
- INC R0 ;指針R0執(zhí)行42H
- DJNZ R2,OVER
- LOOP:
- ;---讀寫DS18B20子程序
- LCALL DSWD ;調(diào)用讀寫DS18B20子程序
- LJMP LOOP ;循環(huán)讀芯片的溫度
- DSWD:
- ;關(guān)中斷
- CLR EA
- ;---復(fù)位子程序(初始化)
- LCALL RSTSNR ;調(diào)用復(fù)位子程序(INIT)
- ;---寫跳過ROM命令
- JNB F0,KEND ;如果DS18B20沒有應(yīng)答,跳KEND
- MOV R0,#0CCH ;跳過ROM匹配命令
- LCALL SEND_BYTE ;發(fā)送一字節(jié)的跳過ROM匹配命令
- ;---溫度轉(zhuǎn)換命令
- MOV R0,#44H ;溫度轉(zhuǎn)換命令
- LCALL SEND_BYTE ;發(fā)送一字節(jié)的溫度轉(zhuǎn)換命令
- ;打開中斷
- SETB EA
- MOV 48H,#1 ;延時(shí)75ms以上準(zhǔn)備讀數(shù)據(jù)
- SS2:
- MOV 49H,#255
- SS1:
- MOV 4AH,#255
- SS0:
- DJNZ 4AH,SS0
- DJNZ 49H,SS1
- DJNZ 48H,SS2
- CLR EA
- LCALL RSTSNR ;復(fù)位程序(init)
- JNB F0,KEND
- MOV R0,#0CCH ;skip-rom指令
- LCALL SEND_BYTE ;發(fā)送一字節(jié)的跳過ROM指令
- MOV R0,#0BEH ;讀DS18B20溫度指令
- LCALL SEND_BYTE ;發(fā)送一字節(jié)的溫度轉(zhuǎn)化指令
- LCALL READ_BYTE ;讀一個(gè)字節(jié)的溫度值
- MOV WDLSB,A ;讀一字節(jié)定位溫度值(低字節(jié))
- LCALL READ_BYTE ;讀一個(gè)字節(jié)的溫度值
- MOV WDMSB,A ;讀一字節(jié)定位溫度值(高字節(jié))
- LCALL TRANS ;調(diào)用溫度轉(zhuǎn)換子程序,以便顯示溫度
- KEND:
- SETB EA ;打開中斷
- RET
- ;---主程序完成---**************************************
- ;---復(fù)位子程序**************************************
- RSTSNR:
- SETB DAT ;拉高DQ總線↑
- NOP
- NOP
- CLR DAT ;拉低DQ總線↓
- ;---延時(shí)500μm
- MOV R6,#250
- DJNZ R6,[ DISCUZ_CODE_1 ]nbsp; ;250*2=500us DJNZ需要兩個(gè)時(shí)間周期
- SETB DAT ;DQ=1↑ 釋放總線的控制權(quán),IO轉(zhuǎn)為輸入↑
- ;---延時(shí)68μm
- MOV R6,#34 ;延時(shí)68us
- DJNZ R6,[ DISCUZ_CODE_1 ]nbsp;
- LCALL CHCK ;調(diào)用應(yīng)答子程序,判斷DS18B20是否可獲得
- ;---延時(shí)500μm
- MOV R6,#250
- DJNZ R6,[ DISCUZ_CODE_1 ]nbsp; ;延時(shí)500us
- SETB DAT ;DQ=1↑
- RET
- CHCK:
- MOV C,DAT ;讀出DQ數(shù)據(jù)
- MOV P1.7,C
- JC RST0 ;如果DQ=0說明DS18B20可獲得,DQ=1,DS18B20不可獲得
- SETB F0 ;標(biāo)志位F0=1,DS18B20存在
- LJMP CHCK0 ;子程序返回
- RST0:
- CLR F0 ;標(biāo)志位F0=1,DS18B20不存在
- CHCK0:
- RET
- ;---復(fù)位子程序完成**************************************
- ;---發(fā)送一字節(jié)的跳過ROM匹配命令子程序**************************************
- SEND_BYTE:
- MOV A,R0 ;發(fā)送一字節(jié)的子程序
- MOV R5,#8 ;循環(huán)發(fā)送8次
- SEND:
- CLR C
- RRC A
- JC SEN1
- LCALL WRITE_0
- LJMP SEN2
- SEN1:
- LCALL WRITE_1
- SEN2:
- DJNZ R5,SEND
- RET
- ;---寫0子程序---
- WRITE_0:
- CLR DAT ;DQ=0↓
- ;---延時(shí)68μm
- MOV R6,#34
- DJNZ R6,[ DISCUZ_CODE_1 ]nbsp; ;延時(shí)68us,34*2=68us
- SETB DAT ;釋放總線控制權(quán)
- NOP
- NOP
- RET
- ;---寫1子程序---
- WRITE_1:
- CLR DAT ;DQ=0↓
- NOP
- NOP
- SETB DAT ;DQ=1↑
- ;---延時(shí)68μm
- MOV R6,#34
- DJNZ R6,[ DISCUZ_CODE_1 ]nbsp; ;延時(shí)68us
- NOP
- NOP
- RET
- ;---發(fā)送一字節(jié)的跳過ROM匹配命令子程序完成**************************************
-
- ;---讀一個(gè)字節(jié)的溫度子程序--*******************************
- READ_BYTE:
- MOV R5,#8
- READ1:
- LCALL READ
- RRC A
- DJNZ R5,READ1
- MOV R0,A ;把溫度值保存在R0中
- RET
- READ:
- CLR DAT ;DQ=0↓
- NOP
- NOP
- SETB DAT ;DQ=1↑ 準(zhǔn)備接收數(shù)據(jù)
- NOP
- NOP
- MOV C,DAT ;單片機(jī)讀數(shù)據(jù)。C中保存DS18B20發(fā)送過來的數(shù)據(jù)
- ;---延時(shí)68μm
- MOV R6,#34
- DJNZ R6,[ DISCUZ_CODE_1 ]nbsp; ;延時(shí)68um
- RET
- ;---讀一個(gè)字節(jié)的溫度子程序完成--*******************************
- ;---溫度轉(zhuǎn)換子程序---*************************************
- TRANS:
- MOV A,30H ;溫度轉(zhuǎn)換程序(只取整數(shù)),30H=LSM,31H,MSB(加入收到溫度是125 A=0000 0111 1101 0000)
- ANL A,#0F0H ;保留低八位的整數(shù)位 A=1101 0000
- MOV 3AH,A
- MOV A,31H
- ANL A,#0FH ;保留高八位的正數(shù)位 A=0000 0111
- ORL A,3AH ;取出八位正整數(shù)
- SWAP A
- MOV B,#10
- DIV AB
- MOV 43H,B ;41H保存著個(gè)位數(shù)
- MOV B,#10
- DIV AB
- MOV 42H,B ;42H保存著十位數(shù)
- MOV 41H,A ;43H保存著百位數(shù)
- RET
- ;---溫度轉(zhuǎn)換子程序---*************************************
- POP ACC ;現(xiàn)場恢復(fù)
- POP PSW
-
- RET
-
- TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;共陽極段碼表
- ;---程序結(jié)束---
- END
-
復(fù)制代碼
所有資料51hei提供下載:
05主機(jī)測溫發(fā)送給從機(jī)顯示溫度(LCD版).rar
(149.73 KB, 下載次數(shù): 40)
2018-9-25 02:11 上傳
點(diǎn)擊文件名下載附件
|
評分
-
查看全部評分
|