找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5172|回復(fù): 2
收起左側(cè)

單片機(jī)主機(jī)通過DS18B20測溫,從機(jī)接收并且實(shí)時(shí)顯示溫度(匯編程序與仿真)

[復(fù)制鏈接]
ID:401743 發(fā)表于 2018-9-24 10:43 | 顯示全部樓層 |閱讀模式
單片機(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仿真工程文件可到本帖附件中下載)
0.png 0.png

單片機(jī)匯編語言源程序如下(主機(jī)):
  1.         ;采用11.0592MHZ晶振
  2.         ;++++++++++++執(zhí)行DJNZ需要兩個(gè)時(shí)間周期+++++++++++++
  3.         ;T0定時(shí)器 方式1 16位計(jì)數(shù)
  4.         ;1.init
  5.         ;2.skip        rom
  6.         ;3.convert-t
  7.         ;4.init
  8.         ;5.skip-rom
  9.         ;6.read
  10.         ;7.receive-data
  11.         ;8.cal
  12.         ;9.display

  13.         DAT        BIT        P3.7                        ;定義P3.7口為DQ線
  14.         WDLSB        DATA        30H                ;定義讀出溫度低字節(jié),將溫度低字節(jié)放在30H
  15.         WDMSB        DATA        31H                ;定義讀出溫度高字節(jié),將溫度高字節(jié)放在31H

  16.         ORG        0000H
  17.         LJMP        MAIN
  18.         ORG        0003H                                
  19.         LJMP        INT_EXT0                ;外部中斷0入口
  20.         ORG        0013H                                
  21.         LJMP        INT_EXT1                ;外部中斷1入口
  22.         ORG        0100H
  23. MAIN:
  24.         MOV        SP,#60H                                ;設(shè)置堆棧指針

  25.         SETB        EX0                                ;允許外部中斷0產(chǎn)生中斷
  26.         SETB        IT0                                ;外部中斷0為跳沿觸發(fā)方式
  27.         SETB        EX1                                ;允許外部中斷1產(chǎn)生中斷
  28.         SETB        IT1                                ;外部中斷1為跳沿觸發(fā)方式
  29.         SETB        EA                                ;總中斷打開
  30.         MOV        IP,#01H
  31.         ;---DS18B20測溫子程序---
  32.         LCALL        DS18B20_TP                ;調(diào)用DS18B20測溫子程序

  33. HERE:
  34.         LJMP        HERE
  35.         ;----外部中斷0子程序
  36. INT_EXT0:                                        ;外部中斷子程序
  37.         CLR        EA                                        ;CPU關(guān)中斷
  38.         PUSH        PSW                                ;現(xiàn)場保護(hù)
  39.         PUSH        ACC
  40.         SETB        EA                                ;總中斷允許位
  41.         MOV        TMOD,#20H                        ;選擇定時(shí)器T1,波特率是9600
  42.         MOV        TH1,#0FDH
  43.         MOV        TL1,#0FDH
  44.         SETB        TR1                                ;運(yùn)行定時(shí)器T1        
  45.         MOV        SCON,#0D8H                        ;設(shè)置串口通信為方式3,SM2=0,RE=1,TB8=1
  46.         MOV        PCON,#00H                        ;*****SMOD=0        
  47.         MOV        IE,#00H
  48. MT1:
  49.         MOV        SBUF,#01H                        ;發(fā)送1#從機(jī)地址,呼叫1#從機(jī)
  50.                
  51. LT1:        
  52.         JBC        TI,LT2                                ;判TI?TI=1,跳轉(zhuǎn)L2,并將TI=0;否則往下執(zhí)行
  53.         LJMP        LT1
  54. LT2:
  55.         
  56.         JBC        RI,ST1                                ;等待從機(jī)應(yīng)答,如果接收完成,RI=1,轉(zhuǎn)S1,RI=0;
  57.                                                         ;如果RI=0,往下執(zhí)行
  58.         LJMP        LT2                                ;未接收完成,跳轉(zhuǎn)L2繼續(xù)等待
  59. ST1:        
  60.         MOV        A,SBUF                                ;取出應(yīng)答地址
  61.         XRL        A,#01H                                ;判斷是否1#從機(jī)應(yīng)答
  62.         JZ        RIGHTT                                ;是從機(jī)1#應(yīng)答,轉(zhuǎn)發(fā)送數(shù)據(jù)
  63.         LJMP        MT1                                ;如果不是1#從機(jī)應(yīng)答,重新呼叫
  64. RIGHTT:
  65.         CLR        TB8                                        ;聯(lián)絡(luò)成功,清TB8,發(fā)送數(shù)據(jù)
  66.         ;---啟動(dòng)發(fā)送個(gè)位溫度數(shù)據(jù)
  67.         MOV        SBUF,43H                        ;啟動(dòng)發(fā)送個(gè)位溫度數(shù)據(jù)
  68. TRANS_L:
  69.         JBC        TI,OK                                ;TI=1,發(fā)送完成,并且清零TI,轉(zhuǎn)NEXT
  70.                                                         ;TI=0,轉(zhuǎn)WAIT繼續(xù)等待
  71.         LJMP        TRANS_L
  72.         ;---接收從機(jī)發(fā)送過來的確認(rèn)信息#0FFH
  73. OK:
  74.         JBC        RI,RECEIVE_OK                ;主機(jī)等待從機(jī)應(yīng)答,如果接受完畢,RI=1,并且轉(zhuǎn)RECEIVE_OK
  75.         LJMP        OK
  76. RECEIVE_OK:
  77.         MOV        A,SBUF
  78.         XRL        A,#0FFH
  79.         JZ        TRANS_H
  80.         LJMP        MT1        
  81.         ;---啟動(dòng)發(fā)送十位溫度數(shù)據(jù)        
  82. TRANS_H:
  83.         MOV        SBUF,42H                        ;---啟動(dòng)發(fā)送十位溫度數(shù)據(jù)
  84.         ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  85.         MOV        A,42H
  86.         MOV      DPTR,#TAB      ;翻譯子程序,將段碼表首地址放入DPTR
  87.         MOVC     A,@A+DPTR      ;查表后將鍵號對應(yīng)的段碼送入ACC
  88.         MOV      P2,A           ;將ACC值送入P2孔
  89.                
  90. WAIT_H:        
  91.         JBC        TI,NEXTT                        ;RI=1,發(fā)送完成,并且清零RI,轉(zhuǎn)NEXT
  92.                                                         ;RI=0,轉(zhuǎn)WAIT繼續(xù)等待
  93.         LJMP        WAIT_H                        ;啟動(dòng)發(fā)送十位溫度數(shù)據(jù)
  94. NEXTT:
  95.         CLR        EA                                        ;關(guān)中斷               
  96.         POP        ACC                                        ;現(xiàn)場恢復(fù)
  97.         POP        PSW
  98.         SETB        EA                                ;打開中斷
  99.         RETI
  100.         ;----外部中斷1子程序
  101. INT_EXT1:
  102.         CLR        EA                                        ;CPU關(guān)中斷
  103.         PUSH        PSW                                ;現(xiàn)場保護(hù)
  104.         PUSH        ACC
  105.         SETB        EA                                ;總中斷允許位        
  106.         MOV        TMOD,#20H                        ;選擇定時(shí)器T1,波特率是9600
  107.         MOV        TH1,#0FDH
  108.         MOV        TL1,#0FDH
  109.         SETB        TR1                                ;運(yùn)行定時(shí)器T1        
  110.         MOV        SCON,#0D8H                        ;設(shè)置串口通信為方式3,SM2=0,RE=1,TB8=1
  111.         MOV        PCON,#00H                        ;*****SMOD=0        
  112.         MOV        IE,#00H
  113. M1:
  114.         MOV        SBUF,#02H                        ;發(fā)送2#從機(jī)地址,呼叫2#從機(jī)
  115.                
  116. L1:
  117.         JBC        TI,L2                                ;判TI?TI=1,跳轉(zhuǎn)L2,并將TI=0;否則往下執(zhí)行
  118.         LJMP        L1
  119. L2:        
  120.         JBC        RI,S1                                ;等待從機(jī)應(yīng)答,如果接收完成,RI=1,轉(zhuǎn)S1,RI=0;
  121.                                                         ;如果RI=0,往下執(zhí)行
  122.         LJMP        L2                                ;未接收完成,跳轉(zhuǎn)L2繼續(xù)等待
  123. S1:        
  124.         MOV        A,SBUF                                ;取出應(yīng)答地址
  125.         XRL        A,#02H                                ;判斷是否1#從機(jī)應(yīng)答
  126.         JZ        RIGHT                                ;是從機(jī)1#應(yīng)答,轉(zhuǎn)發(fā)送數(shù)據(jù)
  127.         LJMP        M1                                ;如果不是1#從機(jī)應(yīng)答,重新呼叫
  128. RIGHT:
  129.         CLR        TB8                                        ;聯(lián)絡(luò)成功,清TB8,發(fā)送數(shù)據(jù)
  130.         ;---發(fā)送數(shù)據(jù)發(fā)送
  131.         MOV        SBUF,#02H                        ;啟動(dòng)發(fā)送數(shù)據(jù)發(fā)送
  132. WAIT:
  133.         JBC        TI,NEXT                                ;RI=1,發(fā)送完成,并且清零RI,轉(zhuǎn)NEXT
  134.                                                         ;RI=0,轉(zhuǎn)WAIT繼續(xù)等待
  135.         LJMP        WAIT
  136. NEXT:
  137.         CLR        EA                                        ;關(guān)中斷               
  138.         POP        ACC                                        ;現(xiàn)場恢復(fù)
  139.         POP        PSW
  140.         SETB        EA                                ;打開中斷
  141.         RETI

  142.         ;---DS18B20測溫程序---
  143. DS18B20_TP:
  144.         PUSH        PSW                                ;現(xiàn)場保護(hù)
  145.         PUSH        ACC               
  146.         ;---清兩個(gè)顯示緩沖單元41H
  147.         MOV        R2,#3                                ;清兩個(gè)顯示緩沖單元42H(保存溫度值的十位),43H(保存溫度值的個(gè)位)
  148.         MOV        R0,#41H
  149. OVER:
  150.         MOV        @R0,#00H
  151.         INC        R0                                        ;指針R0執(zhí)行42H
  152.         DJNZ        R2,OVER        
  153. LOOP:
  154.         ;---讀寫DS18B20子程序
  155.         LCALL        DSWD                        ;調(diào)用讀寫DS18B20子程序
  156.         LJMP        LOOP                        ;循環(huán)讀芯片的溫度
  157. DSWD:
  158.         ;關(guān)中斷
  159.         CLR        EA                                       
  160.         ;---復(fù)位子程序(初始化)
  161.         LCALL        RSTSNR                        ;調(diào)用復(fù)位子程序(INIT)
  162.         ;---寫跳過ROM命令
  163.         JNB        F0,KEND                                ;如果DS18B20沒有應(yīng)答,跳KEND
  164.         MOV        R0,#0CCH                        ;跳過ROM匹配命令
  165.         LCALL        SEND_BYTE                ;發(fā)送一字節(jié)的跳過ROM匹配命令
  166.         ;---溫度轉(zhuǎn)換命令
  167.         MOV        R0,#44H                                ;溫度轉(zhuǎn)換命令
  168.         LCALL        SEND_BYTE                ;發(fā)送一字節(jié)的溫度轉(zhuǎn)換命令
  169.         ;打開中斷
  170.         SETB        EA
  171.         MOV        48H,#1                                ;延時(shí)75ms以上準(zhǔn)備讀數(shù)據(jù)
  172. SS2:
  173.         MOV        49H,#255
  174. SS1:
  175.         MOV        4AH,#255
  176. SS0:
  177.         DJNZ        4AH,SS0
  178.         DJNZ        49H,SS1
  179.         DJNZ        48H,SS2
  180.         CLR        EA                                       
  181.         LCALL        RSTSNR                        ;復(fù)位程序(init)
  182.         JNB        F0,KEND
  183.         MOV        R0,#0CCH                        ;skip-rom指令
  184.         LCALL        SEND_BYTE                ;發(fā)送一字節(jié)的跳過ROM指令
  185.         MOV        R0,#0BEH                        ;讀DS18B20溫度指令
  186.         LCALL        SEND_BYTE                ;發(fā)送一字節(jié)的溫度轉(zhuǎn)化指令
  187.         LCALL        READ_BYTE                ;讀一個(gè)字節(jié)的溫度值
  188.         MOV        WDLSB,A                                ;讀一字節(jié)定位溫度值(低字節(jié))
  189.         LCALL        READ_BYTE                ;讀一個(gè)字節(jié)的溫度值
  190.         MOV        WDMSB,A                                ;讀一字節(jié)定位溫度值(高字節(jié))
  191.         LCALL        TRANS                        ;調(diào)用溫度轉(zhuǎn)換子程序,以便顯示溫度
  192. KEND:
  193.         SETB        EA                                ;打開中斷
  194.         RET
  195.         ;---主程序完成---**************************************


  196.         ;---復(fù)位子程序**************************************
  197. RSTSNR:
  198.         SETB        DAT                                ;拉高DQ總線↑
  199.         NOP
  200.         NOP
  201.         CLR        DAT                                        ;拉低DQ總線↓
  202.         ;---延時(shí)500μm
  203.         MOV        R6,#250
  204.         DJNZ        R6,[        DISCUZ_CODE_1        ]nbsp;                       ;250*2=500us        DJNZ需要兩個(gè)時(shí)間周期
  205.         SETB        DAT                                ;DQ=1↑ 釋放總線的控制權(quán),IO轉(zhuǎn)為輸入↑
  206.         ;---延時(shí)68μm
  207.         MOV        R6,#34                                ;延時(shí)68us
  208.         DJNZ        R6,[        DISCUZ_CODE_1        ]nbsp;                       
  209.         LCALL        CHCK                        ;調(diào)用應(yīng)答子程序,判斷DS18B20是否可獲得
  210.         ;---延時(shí)500μm
  211.         MOV        R6,#250
  212.         DJNZ        R6,[        DISCUZ_CODE_1        ]nbsp;                       ;延時(shí)500us
  213.         SETB        DAT                                ;DQ=1↑
  214.         RET                                                        

  215. CHCK:
  216.         MOV        C,DAT                                ;讀出DQ數(shù)據(jù)        
  217.         MOV        P1.7,C                        
  218.         JC        RST0                                ;如果DQ=0說明DS18B20可獲得,DQ=1,DS18B20不可獲得
  219.         SETB        F0                                ;標(biāo)志位F0=1,DS18B20存在
  220.         LJMP        CHCK0                        ;子程序返回
  221. RST0:        
  222.         CLR        F0                                        ;標(biāo)志位F0=1,DS18B20不存在
  223. CHCK0:
  224.         RET
  225.         ;---復(fù)位子程序完成**************************************


  226.         ;---發(fā)送一字節(jié)的跳過ROM匹配命令子程序**************************************
  227. SEND_BYTE:
  228.         MOV        A,R0                                ;發(fā)送一字節(jié)的子程序
  229.         MOV        R5,#8                                ;循環(huán)發(fā)送8次
  230. SEND:
  231.         CLR        C
  232.         RRC        A
  233.         JC        SEN1
  234.         LCALL        WRITE_0
  235.         LJMP        SEN2
  236. SEN1:
  237.         LCALL        WRITE_1
  238. SEN2:
  239.         DJNZ        R5,SEND
  240.         RET
  241.         ;---寫0子程序---
  242. WRITE_0:
  243.         CLR                DAT                                ;DQ=0↓
  244.         ;---延時(shí)68μm
  245.         MOV        R6,#34
  246.         DJNZ        R6,[        DISCUZ_CODE_1        ]nbsp;                       ;延時(shí)68us,34*2=68us
  247.         SETB        DAT                                ;釋放總線控制權(quán)
  248.         NOP
  249.         NOP
  250.         RET
  251.         ;---寫1子程序---
  252. WRITE_1:
  253.         CLR                DAT                                ;DQ=0↓
  254.         NOP
  255.         NOP
  256.         SETB        DAT                                ;DQ=1↑
  257.         ;---延時(shí)68μm
  258.         MOV        R6,#34
  259.         DJNZ        R6,[        DISCUZ_CODE_1        ]nbsp;                       ;延時(shí)68us
  260.         NOP
  261.         NOP        
  262.         RET
  263.         ;---發(fā)送一字節(jié)的跳過ROM匹配命令子程序完成**************************************

  264.         
  265.         ;---讀一個(gè)字節(jié)的溫度子程序--*******************************
  266. READ_BYTE:
  267.         MOV        R5,#8
  268. READ1:
  269.         LCALL        READ                        
  270.         RRC                A
  271.         DJNZ        R5,READ1
  272.         MOV        R0,A                                ;把溫度值保存在R0中
  273.         RET

  274. READ:
  275.         CLR        DAT                                        ;DQ=0↓
  276.         NOP
  277.         NOP
  278.         SETB        DAT                                ;DQ=1↑ 準(zhǔn)備接收數(shù)據(jù)
  279.         NOP
  280.         NOP
  281.         MOV        C,DAT                                ;單片機(jī)讀數(shù)據(jù)。C中保存DS18B20發(fā)送過來的數(shù)據(jù)
  282.         ;---延時(shí)68μm
  283.         MOV        R6,#34
  284.         DJNZ        R6,[        DISCUZ_CODE_1        ]nbsp;                       ;延時(shí)68um        
  285.         RET                                       
  286.         ;---讀一個(gè)字節(jié)的溫度子程序完成--*******************************


  287.         ;---溫度轉(zhuǎn)換子程序---*************************************
  288. TRANS:
  289.         MOV        A,30H                                ;溫度轉(zhuǎn)換程序(只取整數(shù)),30H=LSM,31H,MSB(加入收到溫度是125 A=0000 0111 1101 0000)
  290.         ANL        A,#0F0H                                ;保留低八位的整數(shù)位        A=1101 0000
  291.         MOV        3AH,A
  292.         MOV        A,31H
  293.         ANL        A,#0FH                                ;保留高八位的正數(shù)位 A=0000 0111
  294.         ORL        A,3AH                                   ;取出八位正整數(shù)
  295.         SWAP        A
  296.         MOV        B,#10
  297.         DIV        AB
  298.         MOV        43H,B                                ;41H保存著個(gè)位數(shù)
  299.         MOV        B,#10
  300.         DIV        AB               
  301.         MOV        42H,B                                ;42H保存著十位數(shù)
  302.         MOV        41H,A                            ;43H保存著百位數(shù)
  303.         RET
  304.         ;---溫度轉(zhuǎn)換子程序---*************************************
  305.         POP        ACC                                        ;現(xiàn)場恢復(fù)
  306.         POP        PSW
  307.         
  308.         RET
  309.         
  310. TAB:        DB        0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H   ;共陽極段碼表
  311.         ;---程序結(jié)束---
  312.         END
  313.         
復(fù)制代碼

所有資料51hei提供下載:
05主機(jī)測溫發(fā)送給從機(jī)顯示溫度(LCD版).rar (149.73 KB, 下載次數(shù): 40)


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:576088 發(fā)表于 2020-7-30 11:07 | 顯示全部樓層
你好,我想問下,這個(gè)仿真電路圖里 從機(jī)1的P1.0,P1.1,P1.2口我沒有找到連接了什么元件。主機(jī)的P1口也沒有接按鈕開關(guān),是INT1和INT0連接的按鈕開關(guān)呀。
回復(fù)

使用道具 舉報(bào)

ID:105782 發(fā)表于 2021-3-22 21:20 | 顯示全部樓層
樓上的,連上了,總線的
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表