|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
誰有用51的18B20測溫和控制匯編程序?最近要用 |
| 作者:dyt88 欄目:單片機(jī) |
如題,不要C寫的,要匯編的,主要是想學(xué)習(xí)一下.謝了. |
| 2樓: | >>參與討論 |
| 作者: tissot 于 2005/1/6 13:28:00 發(fā)布:
c+asm #include <Reg51.h> #include <intrins.h> static unsigned CHAR bdata StateREG; //可位尋址的狀態(tài)寄存器 sbit DS1820ON = StateREG^0; //DS1820是否存在 #define TMPort P1_7 //DS1820 DataPort static unsigned CHAR bdata TLV _at_ 0x0029; //溫度變量高低位 static unsigned CHAR bdata THV _at_ 0x0028; static signed CHAR TMV; //轉(zhuǎn)換后的溫度值 void InitDS1820(void); //初始化DS1820 void ROMDS1820(void); //跳過ROM匹配 void TMVDS1820(void); //溫度轉(zhuǎn)換指令 void TMRDS1820(void); //讀出溫度指令 void TMWDS1820(void); //寫入溫度限制指令 void TMREDS1820(void); //COPY RAM to E2PRAM void TMERDS1820(void); //COPY E2PRAM to RAM void ReadDS1820(void); //讀出溫度值 void WriteDS1820(void); //寫入溫度限制值 void Delay_510(void); //延時(shí)510微秒 void Delay_110(void); //延時(shí)110微秒 void Delay_10ms(void); //延時(shí)10ms void InitDS1820(void) //初始化DS1820 { TMPort = 1; //拉高TMPort _nop_(); //保持一個(gè)周期 TMPort = 0; //拉低TMPort Delay_510(); //延時(shí) DS1820復(fù)位時(shí)間要500us的低電平 TMPort = 1; //拉高TMPort _nop_(); //保持 _nop_(); _nop_(); Delay_110(); //延時(shí)110us 等待DS1820回應(yīng) if (!TMPort) //回應(yīng)信號為低電平 DS1820ON = 1; else DS1820ON = 0; Delay_110(); //延時(shí) Delay_110(); TMPort = 1; //拉高TMPort } void ROMDS1820(void) //跳過ROM匹配 { #pragma asm MOV A,#0CCH MOV R2,#8 CLR C WR1: CLR P3_7 MOV R3,#6 DJNZ R3,$ RRC A MOV P3_7,C MOV R3,#23 DJNZ R3,$ SETB P3_7 NOP DJNZ R2,WR1 SETB P3_7 #pragma endasm } void TMVDS1820(void) //溫度轉(zhuǎn)換指令 { #pragma asm MOV A,#44H MOV R2,#8 CLR C WR2: CLR P3_7 MOV R3,#6 DJNZ R3,$ RRC A MOV P3_7,C MOV R3,#23 DJNZ R3,$ SETB P3_7 NOP DJNZ R2,WR2 SETB P3_7 #pragma endasm } void TMRDS1820(void) //讀出溫度指令 { #pragma asm MOV A,#0BEH MOV R2,#8 CLR C WR3: CLR P3_7 MOV R3,#6 DJNZ R3,$ RRC A MOV P3_7,C MOV R3,#23 DJNZ R3,$ SETB P3_7 NOP DJNZ R2,WR3 SETB P3_7 #pragma endasm } void TMWDS1820(void) //寫入溫度限制指令 { #pragma asm MOV A,#04EH MOV R2,#8 CLR C WR13: CLR P3_7 MOV R3,#6 DJNZ R3,$ RRC A MOV P3_7,C MOV R3,#23 DJNZ R3,$ SETB P3_7 NOP DJNZ R2,WR13 SETB P3_7 #pragma endasm } void TMREDS1820(void) //COPY RAM to E2PRAM { #pragma asm MOV A,#48H MOV R2,#8 CLR C WR33: CLR P3_7 MOV R3,#6 DJNZ R3,$ RRC A MOV P3_7,C MOV R3,#23 DJNZ R3,$ SETB P3_7 NOP &n |
|
| 3樓: | >>參與討論 |
| 作者: dreamflyme 于 2005/1/6 13:33:00 發(fā)布:
供您參考 以下程序轉(zhuǎn)載自恒堅(jiān)電器(http://shop.hejoin.com/) ; DS18B20 溫度傳感器讀數(shù)接口 ; 正確下載了程序以后,系統(tǒng)會(huì)利用數(shù)碼管的后3位顯示當(dāng)前的溫度值,最后一位是小數(shù)。 ; 如果要移植這個(gè)程序中讀取DS18B20的相關(guān)函數(shù),您需要修改以下幾個(gè)內(nèi)容 ; 根據(jù)您所選擇晶振和我們板子上的晶振6M的關(guān)系,重新計(jì)算 ; 初始化和讀取,寫入三個(gè)函數(shù)延時(shí)相關(guān)部分系數(shù),用*標(biāo)出 ; 這個(gè)溫度測試程序的溫度精度是0.5C。 beep equ p3.7 segdata equ p0 ;數(shù)據(jù) 輸出 sege equ p2.7 ;顯示 選中 segb equ p2.6 ;位 選 segd equ p2.5 ;段 選 tmp0 equ 40h tmp1 equ 41h tmp2 equ 42h tmp3 equ 43h tmp equ 44h buf equ 45h dstmp bit p3.2 ;DS18B20在外部中斷T0口,連器件的時(shí)候注意了 ;我們活動(dòng)式設(shè)計(jì),您只要把DS18B20三只腳分開,準(zhǔn)確識別三只腳的含義 ;(這在我們光盤中提供了說明文件),然后分別對應(yīng),插入面板下主芯片下 ;方的擴(kuò)展座對應(yīng)的引腳即可 ORG 0000H AJMP MAIN ORG 0030H MAIN: MOV SP,#30H clr beep LCALL GET_TEMP ;首先獲得溫度值 mov tmp,r7 ; R7是溫度的低位 clr c mov a,r6 ; R6是溫度的高位 rrc a mov r6,a mov a,r7 rrc a mov r7,a ;完成一次移位 mov a,r6 rrc a mov r6,a mov a,r7 rrc a mov r7,a ;完成2次移位 mov a,r6 rrc a mov r6,a mov a,r7 rrc a mov r7,a ;完成3次移位,這樣以后便與計(jì)算 mov a,r7 mov b,#2 div ab mov r0,a ;高位商 mov r1,b ;余數(shù) mov b,#10 div ab mov tmp1,b ;個(gè)位 mov b,#10 div ab mov tmp2,b ;十位 mov tmp3,a ;百位 clr c mov a,tmp rlc a mov tmp,a mov a,r1 rlc a mov r1,a ;小數(shù)操作 mov a,tmp rlc a mov tmp,a mov a,r1 rlc a mov r1,a ;小數(shù) mov a,tmp rlc a mov tmp,a mov a,r1 rlc a mov r1,a ;小數(shù)擴(kuò)大16倍 mov dptr,#ft movc a,@a+dptr mov tmp0,a mov a,tmp3 jz noe ;0消隱 mov b,#3 acall DISPLAY ;顯示百位 noe: mov a,tmp2 mov b,#2 acall DISPLAY ;在第二位顯示十位 mov a,tmp1 add a,#16 mov b,#1 ;第1位顯示個(gè)位,帶小數(shù)點(diǎn) acall DISPLAY mov a,tmp0 mov b,#0 ;顯示小 |
|
| 4樓: | >>參與討論 |
| 作者: dyt88 于 2005/1/8 12:05:00 發(fā)布:
謝了. 謝謝樓上兩位了.不知還有沒有人有程序?最好帶電路圖的.謝了. |
|
| 5樓: | >>參與討論 |
| 作者: lzq1980 于 2005/1/8 12:16:00 發(fā)布:
你說的是C51嗎? 請問C51是什么東西呀?我這里有uvision2 和C51。請問怎么使用? |
|
|
|
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |