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