Ⅰ 我是機電專業的學生,快要畢業了,我的畢業論文題目是基於51單片機的溫度控制系統設計
第1章 硬體電路分析
第1.1節 硬體電路概述該測溫系統由五部分組成:電源模塊、偵測模塊、顯示模塊、控制模塊、通訊模塊。電源模塊完成將200V,50Hz市電轉換為穩定的直流+5V電源的任務,包含變壓、整流、濾波和穩壓四部分,其中穩壓部分採用LM7805集成塊。串口通信模塊的任務是實現單片機與計算機的通信,通過軟體將程序下載至單片機中進行運行調試
以上內容來自5173論文網 http://www.lw5173.com/article/html/4627.html 點擊參考更多
Ⅱ 基於51單片機和熱敏電阻的溫度控制系統
給你個網站
你可以去看一下
http://www.sinochip.net/TechSheet/67.htm
本程序工作過程如下:
;1、開機後首先進行初始化,初始化後顯示「P」1秒,提示系統進入測試工作狀態,顯
; 示完成後,進行溫度測試。
;2、溫度測試的過程是這樣的:
; * T0置為計數方式,對T0腳(即P3.5)的脈沖計數,工作方式2,初值為255
; * 將T1置為定時方式,工作方式2,初值為0
; * 從P3.4口送單穩觸發脈沖,使555輸出單穩脈沖(正脈沖),該脈沖寬度隨熱敏
; 電阻阻值而變化。
; * 開T0、T1中斷,啟動T0、T1。此時T1自動對內部機器周期計數,當TL1溢
; 出時,產生T1中斷。在T1中斷處理程序中,將RAM 21H單元加1(即21H單
; 元存放脈沖寬計數值高位)後返回主程序。
; * 當來自P3.5的單穩脈沖結束(即下降沿到來)時,TL0計數器加1並溢出,產
; 生T0中斷。在T0中斷處理程序中,關T0、T1中斷,並將TL1中的的內容讀
; 到RAM 20H單元(20H單元存放脈寬計數值的低位)。
; * 查表求溫度值
; NTTAB是脈寬計數值與溫度的對照表,按低溫到高溫的次序存放,即第一、第
; 二單元存放-100C時的脈寬計數值,依此類推,第121和122單元則存放+500C
; 時的脈寬計數值。
; 將20H、21H中的計數值與NTTAB中的計數值依次進行比較,直至20H、21H
; 中的值小於NTTAB中的計數值為止。而比較的次數就對應溫度的整數值,二計
; 數值之差與對照表相鄰兩計數值的商即為小數位。
;3、程序中除了對-100C到+500C進行測試外,還有開路(計數值過大)、短路檢測(計
; 數值過小)、負超溫檢測、正超溫檢測,並有相應的顯示。
;4、將檢測值(溫度值或其他結果)顯示1秒,然後再重復溫度檢測。
;需要說明的是:本程序雖包括了測溫的全過程,但未考慮軟硬體的自檢,軟體濾波等部
;分。
;電容C4、熱敏電阻RT的參數決定單穩脈沖的寬度,而最終的計數值除了與單穩
; 脈沖的寬度有關外,還與晶振頻率有關,因而在RT的型號確定後要根據系統對精
; 度和解析度等的要求選擇C4的值。本程序中NTTAB脈寬計數值與溫度對照表是在
; 熱敏電阻為MF53-1型負溫熱敏電阻加12K精密電阻與之並聯,C4為1μ,晶振為
; 4MHz的條件下得到的。數據不十分准,僅做參考。你可以在元件參數定了後,可在
; 調試程序時用可變電阻箱代替熱敏電阻,在程序測出計數值處設斷點,讀出每個標
; 准阻值所對應的計數值(即20H、21H中的內容),自己將NTTAB建立起來。
; * * * * * * * * * * * * * * * * * * * * * * * * * *
; * 用89C2051控制的數字測溫儀 *
; * 源程序清單 *
; * * * * * * * * * * * * * * * * * * * * * * * * * *
ORG 0000H
AJMP MAIN ;轉主程序
ORG 000BH
AJMP WT0 ;T0中斷入口
ORG 001BH
AJMP WT1 ;T1中斷入口
;主程序
ORG 030H
MAIN: MOV IE,#00H ;關中斷
MOV SP,#40H ;設堆棧指針SP為40H
SETB P3.5 ;將P3.5口置」1」
MOV 30H,#0CH ;「P3 」送顯示緩沖區30H~33H
MOV 31H,#0EH
MOV 32H,#0EH
MOV 33H,#0EH
MAIN0: ACALL D1S ;調顯示1秒子程序
MOV P1,#0FFH ;關顯示
CLR 20H ;清脈寬計數值存放區20H~21H
CLR 21H
CLR 22H ;清單穩脈沖結束標志22H
MOV TH0,#0FFH ;置T0計數初值255
MOV TL0,#0FFH
MOV TH1,#00H ;置T1的計數初值0
MOV TL1,#00H
MOV TMOD,#26H ;置T0為計數方式,方式2;T1為定時方式。方式2
SETB EA ;允許T0、T1中斷
SETB ET0
SETB ET1
SETB TR0 ;開T0中斷
CLR P3.5 ;送單穩觸發脈沖
NOP
NOP
NOP
NOP
SETB P3.5
SETB TR1 ;開T1中斷
MAIN1: CJNE 22H,#01H,MAIN2 ;單穩脈沖未結束,轉檢查是否超時
AJMP MAIN3 ;單穩脈沖結束,轉取脈寬計數值
MAIN2: CJINE 21H,#08H,MAIN1 ;未超時,轉等待單穩脈沖結束
CLR EA
CLR ET0
CLR ET1
CLR TR0
CLR TR1
MOV 30H,#0DH ;開路提示「E1」送顯示緩沖區,轉顯示
MOV 31H,#01H
MOV 32H,#0EH
MOV 33H,#0EH
AJMP MAIN0
MAIN3: CJNE 21H,#00H,MAIN4 ;單穩脈沖結束,先判斷是否短路。不是,轉查表程序。
MOV 30H,#0DH ;短路,短路提示「E2」送顯示緩沖區,轉顯示
MOV 31H,#02H
MOV 32H,#0EH
MOV 33H,#0EH
AJMP MAIN0
MAIN4: ACALL NTTR ;調查表子程序
AJMP MAIN0
;查表求溫度值子程序
NTTR: MOV R2,#00H ;清計數與溫度對照表偏移量寄存器R2
MOV DPTR,NTTAB ;DPTR指向計數與溫度對照表首址
NTTR1: CLR C ;20H、21H中的內容與NTTRB相減,並將差值存23H、24H
MOV R3,#02H
MOV R0,#20H
MOV R1,#23H
NTTR2: MOV A,R2
MOVC A,@A+DPTR
SUBB A,@R0
MOV @R1,A
INC R0
INC R1
INC R2
CJNE R2,#122,NTTR3 ;若未到NTAB表尾,繼續比較
POVER:JC NTTR30 ;到表尾,查到對應溫度,轉求溫度值
MOV 30,#0EH ;到表尾,查到對應溫度,正超溫提示「UUU」送顯緩區
MOV 31H,#0BH
MOV 32H,#0BH
MOV 33H,#0BH
RET ;返回主程序
NTTR3: DJNZ R3,NTTR2
JNC NTTR1 ;未查到對應溫度值,繼續查表
NTTR30:MOV A,R2 ;已查到對應溫度,由偏移量求出整數部分,暫存R4
CLR C
SUBB A,#02H
RR A
MOV R4,A
MOV R1,#23H ;求溫度值的小數部分:+X/2送B
MOV A,@R1
CPL A
INC A
RR A
MOV B,A
NTTR4: DEC R2 ;Ni+1送20H、21H
MOV R0,#21H
MOV A,R2
MOVC A,@A+DPTR
MOV @R0, A
DEC R0
DEC R2
MOV A, R2
MOVC A,@A+DPTR
MOV @R0, A
DEC R2 ;求+i/2從A
DEC R2
MOV R3,#02H
CLR C
NTTR5: MOV A,R2
MOVC A,@A+DPTR
SUBB A,@R0
JNC NTTR50
CLP A
INC A
NTTR50:RR A
MOV R5,A
MOV A,B ;+x/2*10/+i得到溫度值的小數部分
JZ NTTR6
MOV B, #05H
MUL AB
MOV B,R5
DIV AB
MOV 20H,A ;小數部分送20H
AJMP NTTR7
NTTR6: MOV 20H,#00H
NTTR7: MOV A,#0AH ;判整數部分為正還是負
CLR C
SUBB A,R4
JC PTEMP
NTEMP:CJNE A,#0AH,NTEMP1 ;為負
MOV 30H,#0EH ;「-X」送顯示緩沖區高三位
MOV 31H,#0AH
MOV 32H,A
AJMP NTEMP2
NTEMP1:MOV 30H,#0AH ;「-10」 送顯示緩沖區高三位
MOV 31H,#01H
MOV 32H,#00H
NTEMP2:MOV A,#0AH ;修正小數部分後,將小數部分送顯緩低三位
CLR C
SUBB A,20H
MOV 33H,A
RET ;返回主程序
PTEMP: MOV 30H,#0EH ;為正。「 」送顯緩最高位
MOV A,R4 ;溫度值整數部分送顯緩中間兩位
MOV B,#0AH
DIV AB
JNZ PTEMP1
] MOV 31H,#0EH
JMP PTEMP2
PTEMP1:MOV 31H,A
PTEMP2:MOV 32H,B
MOV 33H,20H ;小數部分送顯緩最低位
RET ;返回主程序
;顯示子程序(將顯緩區的內容循環顯示一遍,每位顯示1ms後,關顯示返回主程序)
DSP: MOV R2,#01H
MOV R0,#30H
MOV DPTR,#TAB
DSP1: MOV A,@R0
MOVC A,@A+DPTR
MOV P1,A
ORL P3,R2
ACALL D1MS
MOV A,R2
RL A
MOV R2,A
CJNE R2,#10H,DSP2
ANL P3,#0F0H
RET
DSP2: INC R0
AJMP DSP1
;延時1ms子程序
D1MS: MOV R7,#166
D1MS1: DJNZ R7,D1MS1
RET
;顯示1秒子程序
D1S: MOV R6,#04H
D1S1: MOV R5,#250
D1S2: ACALL DSP
DJNZ R5,D1S2
DJNZ R6,D1S1
RET
;段碼表
TAB: DB 40H,79H,24H,30H,19H :0.,1.,2.,3.,4.
DB 12H,02H,78H,00H,10H :5.,6.,7.,8.,9.
DB 3FH,41H,0CH,06H,0FFH :-.,U.,P.,E.,滅
;T0中斷處理程序
WT0: MOV A,TL1 ;將T1計數值送20H
MOV 20H,A
CLR EA ;關中斷
CLR TR0 ;T0停止計數
CLR TR1 ;T1停止計數
MOV 22H,#01H ;置單穩脈沖結束標志
RETI ;返回主程序
;T1中斷處理程序
WT1: INC 21H ;脈寬計數值高位加1
RETI ;返回主程序
;脈寬計數與溫度對照表
NTTBL: DB 0D0H,05H,0B2H,05H,96H,05H,72H,05H
DB 52H,05H,35H,05H,15H,05H,0F6H,04H
DB 0D8H,04H,0B9H,04H,9CH,04H,81H,04H
DB 65H,04H,4AH,04H,30H,04H,14H,04H
DB 0FAH,03H,0E0H,03H,0C6H,03H,0ADH,03H
DB 95H,03H,7CH,03H,64H,03H,4CH,03H
Ⅲ 求一個51單片機的多路溫度控制系統的C語言程序。
#include<reg52.h> #include<math.h>
#include<INTRINS.H>
#define uchar unsigned char
#define uint unsigned int;
/******************************************************************/
/* 定義埠 */
/******************************************************************/
sbit seg1=P2^0;
sbit seg2=P2^1;
sbit seg3=P2^2;
sbit DQ=P1^7;//ds18b20 埠
sfr dataled=0x80;//前數顯示數據埠
/******************************************************************/
/* 全局變數 */
/******************************************************************/
uint temp;
uchar flag_get,count,num,minute,second;
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//7段數碼管段碼表共陽
uchar str[6];
/******************************************************************/
/* 函數聲明 */
/******************************************************************/
void delay1(uchar MS);
unsigned int ReadTemperature(void);
void Init_DS18B20(void);
unsigned char ReadOneChar(void);
void WriteOneChar(unsigned char dat);
void delay(unsigned int i);
/******************************************************************/
/* 主函數 */
/******************************************************************/
main()
{
unsigned char TempH,TempL;
TMOD|=0x01;//定時器設置游碼
TH0=0xef;
TL0=0xf0;
IE=0x82;
TR0=1;
P2=0x00;
count=0;
while(1)
{
str[5]=0x39; //顯示C符號
str[1]=tab[TempH/100]; //十位溫度
str[2]=tab[(TempH%100)/10]; //十位溫度
str[3]=tab[(TempH%100)%10]|0x80; //個位溫度,帶小數點
str[4]=tab[TempL];
if(flag_get==1) //神悔哪定時讀取當前溫度
{
temp=ReadTemperature();
if(temp&0x8000)
{
str[0]=0x40;//負號標志
temp=~temp; // 取反加1
temp +=1;
}
else
str[0]=0;
TempH=temp>>4;
TempL=temp&0x0F;
TempL=TempL*6/10;//小數近似處理
flag_get=0;
}
}
}
/******************************************************************/
/* 定時器中斷 */
/******************************************************************/
void tim(void) interrupt 1 using 1//中斷,用於數碼管掃描和溫度檢測間隔
{
TH0=0xef;//定時器重裝值
TL0=0xf0;
num++;
if (num==50)
{num=0;
flag_get=1;//標志位有效
second++;
if(second>=60)
{second=0;
minute++;
}
}
count++;
if(count==1)
{P2=0;
dataled=str[0];}//數碼管掃描
if(count==2)
{P2=1;
dataled=str[1];}
if(count==3)
{ P2=2;
dataled=str[2];
}
if(count==4)
{ P2=3;
dataled=str[3];
}
if(count==5)
{ P2=4;
dataled=str[4];
}
if(count==6)
{ P2=5;
dataled=str[5];
count=0;}
}
/******************************************************************/
/* 延時函數 */
/******************************************************************/
void delay(unsigned int i)//延時函數
{
while(i--);
}
/******************************************************************/
/* 初始化 */
/******************************************************************/
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ復位
delay(8); //稍做延時
DQ = 0; //單片機將DQ拉低
delay(80); //精確延時 大於 480us
DQ = 1; //拉高匯流排
delay(10);
x=DQ; //稍做延時後 如果x=0則初始化成功 x=1則初始化失敗
delay(5);
}
/******************************************************************/
/* 讀一個位元組 */
/******************************************************************/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 給脈沖信號
dat>>=1;
DQ = 1; // 給脈沖信號
if(DQ)
dat|=0x80;
delay(5);
}
return(dat);
}
/******************************************************************/
/* 寫一個位元組 */
/******************************************************************/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay(5);
DQ = 1;
dat>>=1;
}
delay(5);
}
/******************************************************************/
/* 讀取溫度 */
/******************************************************************/
unsigned int ReadTemperature(void)
{
unsigned char a=0;
unsigned int b=0;
unsigned int t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳過讀序號列號的操作
WriteOneChar(0x44); // 啟動溫度轉換
delay(200);
Init_DS18B20();
WriteOneChar(0xCC); //跳過讀序號列號的操作
WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
a=ReadOneChar(); //低位
b=ReadOneChar(); //高位
b<<=8;
t=a+b;
return(t);
}
//LZ,這是測溫並且用數碼管顯示程序,報警可以自己另行添加!主要程序就是這些!
()
Ⅳ 求助!51單片機+ds18b20+lcd1602+按鍵設置功能的溫度控制系統,ds18b20的溫度值總無法在lcd上顯示。。。
正好我做過這方便的東西,你先把1602調出來,要能把一個浮點數顯示出來。然後再調18B20,注意18B20的幾個關鍵時序的延時,一定要按照器件手冊調到最佳時序寬度,最好用示波器監控著調,很容易就調好了。最後再把溫度顯示出來。
Ⅳ 基於MCS-51單片機的精密溫度控制系統的設計與實現
上傳內容
僅供學習與參考
摘要
本檢測系統硬體設計以AT89C51單片機為核心,用溫度感測器DS18B20實現溫度控制,用數碼管顯示實際溫度和預設溫度,製作數字溫度計,並可以實現溫度預警控制。
單片機系統的軟體編程採用單片機匯編進行編程。應用軟體採用KEIL和PROTEUS模擬軟體模擬實現控制過程。
溫度控制系統是基於單片機的計算機檢測技術的軟硬體開發和面向對象的高級可視化程序開發的有機結合。對溫度控制的發展有很大的好處。如果投入生產,不僅會創造良好的經濟效益,還可提高溫控的簡單化。
關鍵詞 單片機;DS18B20;調節;溫度
Abstract
This examination system hardware design take at89C51 monolithic integrated circuit as a core, realizes the temperature control with temperature sensor DS18B20, Demonstrates the actual temperature and the preinstall temperature with the nixie tube,manufactures the simple intelligence temperature control system - - digit thermometer,And may realize the temperature early warning control.
. The monolithic integrated circuit system's software programming uses the monolithic integrated circuit assembly to carry on the programming. The superior machine application software uses KEIL and the PROTEUS simulation software simulation realizes the controlled process.
This article develops the intelligence temperature control system is based on monolithic integrated circuit's computer examination technology software and hardware development and face the object high-level visualization procere development organic synthesis. Has the very big advantage to temperature control's development. If place in operation, not only will create the good economic efficiency, but may also propose the simplification which the high temperature will control.
Keywords microcontroller;DS18B20;measure;temperture
目錄
摘要 I
Abstract II
第1章 緒論 4
1.1 溫度感測器發展概述 4
1.2 單片機技術簡介 4
1.3 溫度檢測技術的發展 5
第2章 溫度感測器的選擇 8
2.1 測溫方法 8
2.2 DS18B20簡介 9
第3章 軟硬體設計 10
3.1 單片機的選擇 10
3.2 溫度感測器的選擇 10
3.3 模擬軟體的選擇 11
3.4 編譯軟體的選擇 11
3.5 PROTEUS 模擬電路圖 12
第4章 匯編語言程序 13
4.1 主程序和溫度值轉換成顯示值子程序的流程圖 13
4.2 DS18B20溫度子程序和顯示子程序的流程圖 14
4.3 匯編語言源程序 14
第1章 緒論
1.1 溫度感測器發展概述(略)
1.2 單片機技術簡介(略)
1.3 溫度檢測技術的發展(略)
第2章 溫度感測器的選擇
2.1 測溫方法
溫度是一個很重要的物理參數,鋼鐵的冶煉、石油的分餾、塑料的合成以
及農作物的生長等等都必須在一定的溫度范圍內進行,各種構件、材料的體積、電阻、強度以及抗腐蝕等物理化學性質,一般也都會隨溫度而變化。人們利用各種能源為人類服務,也往往是使某些介質通過一定的溫度變化來實現的。所以在生產和化學試驗中,人們經常會碰到溫度測量的問題。
溫度感測器是檢測溫度的器件,其種類最多,應用最廣,『發展最快。眾所周知,日常使用的材料及電子元件大部分都隨溫度而變化,資料【5】中介紹了作為實用感測器必須滿足的一些條件:
(1)在使用溫度范圍內溫度特性曲線要求達到的精度能符合要求:為了能
在較寬的溫度范圍內進行檢測,溫度系數不宜過大,過大了就難以使用,但對
於狹窄的溫度范圍或僅僅定點的檢測,其溫度系數越大,檢測電路也能越簡單。
(2)為了將它用於電子線路的檢測裝置,要具有檢測便捷和易於處理的特
性。隨著半導體器件和信號處理技術的進步,對溫度感測器所要求的輸出特性
應能滿足要求。
(3)特性的偏移和蠕變越小越好,互換性要好。
(4)對於溫度以外的物理量不敏感。
(5)體積小,安裝方便:為了能正確地測量溫度,感測器的溫度必須與被
測物體的溫度相等。感測器體積越小,這個條件越能滿足。
(6)要有較好的機械、化學及熱性能。這對於使用在振動和有害氣體的環
境中特別重要。
(7)無毒、安全以及價廉、維修、更換方便等。
溫度測量的方法很多,根據溫度感測器的使用方式,通常分為接觸式測溫
法與非接觸式測溫法兩類。
(1)接觸式測溫法
由熱平衡原理可知,兩個物體接觸後,經過足夠長時間的熱交換達到熱平
衡,則它們的溫度必然相等。如果其中之一為溫度計,就可以用它對另一個物體實現溫度測量,這種測溫方式稱為接觸式測溫法。接觸式測溫的優點顯而易
見,它簡單,可靠,測量精度高,但同時也存在不足:溫度計要與被測物體有
良好的熱接觸,並充分換熱,從而產生了測溫滯後現象;測溫組件可能與被測
物體發生化學反應;由於受到耐高溫材料的限制,接觸式測溫儀表不可能應用
於很高溫度的測量。
(2)非接觸式測溫法
由於測量組件與被測物體不接觸,利用物體的熱輻射能隨溫度變化的原理
測定物體溫度。因而測量范圍原則上不受限制,測溫速度較快,還可以在運動
中測量。這種測溫方式稱為非接觸式測溫法。它的特點是:不與被測物體接觸,也不改變被測物體的溫度分布,熱慣性小。從原理上看,用這種方法測溫無上限。通常用來測定1000℃以上的移動、旋轉或反應迅速的高溫物體的溫度或表面溫度。
2.2 DS18B20簡介
2.2.1技術性能描述
單線介面方式,DS18B20在與微處理器連接時僅需要一條口線即可實現微處理器與DS18B20的雙向通訊。測溫范圍 -55℃~+125℃,固有測溫解析度0.5℃。支持多點組網功能,多個DS18B20可以並聯在唯一的三線上,實現多點測溫。工作電源: 3~5V直流電源。
在使用中不需要任何外圍元件,測量結果以9~12位數字量方式串列傳送。適用於DN15~25, DN40~DN250各種介質工業管道和狹小空間設備測溫。
2.2.2應用范圍
該產品適用於冷凍庫,糧倉,儲罐,電訊機房,電力機房,電纜線槽等測溫和控制領域,軸瓦,缸體,紡機,空調,等狹小空間工業設備測溫和控制。
2.2.3接線說明
特點有一線介面,只需要一條口線通信 多點能力,簡化了分布式溫度感測應用 無需外部元件 可用數據匯流排供電,電壓范圍為3.0 V至5.5 V 無需備用電源 測量溫度范圍為-55 ° C至+125 ℃ 。華氏相當於是-67 ° F到257華氏度 -10 ° C至+85 ° C范圍內精度為±0.5 ° C。
溫度感測器可編程的解析度為9~12位 溫度轉換為12位數字格式最大值為750毫秒 用戶可定義的非易失性溫度報警設置 應用范圍包括恆溫控制,工業系統,消費電子產品溫度計,或任何熱敏感系統描述該DS18B20的數字溫度計提供9至12位(可編程設備溫度讀數。信息被發送到/從DS18B20 通過1線介面,所以中央微處理器與DS18B20隻有一個一條口線連接。為讀寫以及溫度轉換可以從數據線本身獲得能量,不需要外接電源。 因為每一個DS18B20的包含一個獨特的序號,多個DS18B20可以同時存在於一條匯流排。這使得溫度感測器放置在許多不同的地方。它的用途很多,包括空調環境控制,感測建築物內溫設備或機器,並進行過程監測和控制。【6】
第3章 軟硬體設計
3.1 單片機的選擇
單片機系統由單片機AT89C51、74HC245等晶元構成,完成數據採集、處理、通訊以及所有的功能,是整個系統的核心模塊。
單片機是整個系統的核心,對系統起監督、管理、控製作用,並進行復雜的信號處理,產生測試信號及控制整個檢測過程。所以在選擇單片機時,參考了以下標准。
(1)運行速度。單片機運行速度一般和系統匹配即可。
(2)存儲空間。單片機內部存儲器容量,外部可以擴展的存儲器(包括1/0口)空間。
(3)單片機內部資源。單片機內部存儲資源越多,系統外接的部件就越少,這可提高系統的許多技術指標。
(4)可用性。指單片機是否能很容易地開發和利用,具體包括是否有合適的開發工具,是否適合於大批量生產:、性能價格比,是否有充足的資源,是否有現成的技術資源等。
(5)特殊功能。一般指可靠性、功耗、掉電保護、故障監視等。
從硬體角度來看,與MCS-51指令完全兼容的新一一代AT89CXX系列機,比在片外加EPROM才能相當的8031-2單片機抗干擾性能強,與87C51-2單片機性能相當,但功耗小。程序修改直接用+5伏或+12伏電源擦除,更顯方便、而且其工作電壓放寬至2.7伏一6伏,因而受電壓波動的影響更小,而且4K的程序存儲器完全能滿足單片機系統的軟體要求。故AT89C51單片機是構造本檢測系統的更理想的選擇。本系統選用ATMEL生產的AT89C51單片機,其特性如下:
(1) 4K位元組可編程閃速程序存儲器;1000次循環寫/擦
(2)全靜態工作:OHz-24MHz
(3)三級程序存儲器鎖定
(4) 128 X 8位內部數據存儲器,32條可編程1/0線
(5)兩個十六位定時器/計數器,六個中斷源
(6)可編程串列通道,低功耗閑置和掉電模式
該器件採用了ATMEL的高密度非易失性的存儲器工藝,並且可以與工業標準的MCS-51指令集和輸出管腳兼容。由於將多功能8位CPU與閃速式存儲器組合在單個晶元中,AT89C51是一種高效的微控制器,為很多嵌入式系統提供了高靈活性且價廉的方案。
3.2 溫度感測器的選擇
DS18B20是美國達拉斯半導體公司的產品,與其他產品相比較它的性能有如下特點:①採用單匯流排專用技術,既可通過串列口線,也可通過其它I/O口線與微機介面,無須經過其它變換電路,直接輸出被測溫度值(9位二進制數,含符號位),②測溫范圍為-55℃-+125℃,測量解析度為0.0625℃,③內含64位經過激光修正的只讀存儲器ROM,④適配各種單片機或系統機,⑤用戶可分別設定各路溫度的上、下限,⑥內含寄生電源。所以在本設計中,我採用了DS18B20作為溫度感測器。【8】
3.3 模擬軟體的選擇
Proteus 是英國Labcenter公司開發的電路分析與實物模擬軟體。它運行於Windows操作系統上,可以模擬、分析(SPICE)各種模擬器件和集成電路,該軟體的特點是:
①實現了單片機模擬和SPICE電路模擬相結合。具有模擬電路模擬、數字電路模擬、單片機及其外圍電路組成的系統的模擬、RS232動態模擬、I2C調試器、SPI調試器、鍵盤和LCD系統模擬的功能;有各種虛擬儀器,如示波器、邏輯分析儀、信號發生器等。
②支持主流單片機系統的模擬。目前支持的單片機類型有:ARM7(LPC21xx)、 8051/52系列、AVR系列、PIC10/12/16/18系列、HC11系列以及多種外圍晶元。
③提供軟體調試功能。在硬體模擬系統中具有全速、單步、設置斷點等調試功能,同時可以觀察各個變數、寄存器等的當前狀態,因此在該軟體模擬系統中,也必須具有這些功能;同時支持第三方的軟體編譯和調試環境,如Keil C uVision2、MPLAB等軟體。【9】
3.4 編譯軟體的選擇
KEIL C51標准C編譯器為8051微控制器的軟體開發提供了C語言環境,同時保留了匯編代碼高效,快速的特點。C51編譯器的功能不斷增強,使你可以更加貼近CPU本身,及其它的衍生產品。C51已被完全集成到uVision2的集成開發環境中,這個集成開發環境包含:編譯器,匯編 器,實時操作系統,項目管理器,調試器。uVision2 IDE可為它們提供單一而靈活的開發環境。
C51 V7版本是目前最高效、靈活的8051開發平台。它可以支持所有8051的衍生產品,也可以支持所有兼容的模擬器,同時支持其它第三 方開發工具。因此,C51 V7版本無疑是8051開發用戶的最佳選擇。
uVision2集成開發環境具有如下功能:
一、項目管理
工程(project)是由源文件、開發工具選項以及編程說明三部分組成的。
一個單一的uVision2工程能夠產生一個或多個目標程序。產生目標程序的源文件構成「組」。開發工具選項可以對應目標,組或單個文件。
uVision2包含一個器件資料庫(device database),可以自動設置匯編器、編譯器、連接定位器及調試器選項,來滿足用戶充分利用特定 微控制器的要求。此資料庫包含:片上存儲器和外圍設備的信息,擴展數據指針(extra data pointer)或者加速器(math accelerator)的特 性。
uVision2可以為片外存儲器產生必要的連接選項:確定起始地址和規模。
二、集成功能
uVision2的強大功能有助於用戶按期完工。
1.集成源極瀏覽器利用符號資料庫使用戶可以快速瀏覽源文件。用詳細的符號信息來優化用戶變數存儲器。
2.文件尋找功能:在特定文件中執行全局文件搜索。
3.工具菜單:允許在V2集成開發環境下啟動用戶功能。
4.可配置SVCS介面:提供對版本控制系統的入口。
5.PC-LINT介面:對應用程序代碼進行深層語法分析。
6.Infineon的EasyCase介面:集成塊集代碼產生。【10】
3.5 PROTEUS 模擬電路圖
圖1是基於單片機的智能溫度檢測系統電路原理圖。控制加熱熱水器電源電路用LED燈模擬代替,取消無水報警電路。裝上水後接通電源,下方LED數碼管顯示當前水溫。上方LED數碼管顯示預設水溫。操作「個位」鍵和「十位」鍵可預設水溫(如99℃)控制點。該電路具有如下功能:
(1) 測量水溫,精度為1℃,范圍為0~99℃;
(2) 三位數碼管實時顯示水溫;
(3) 可預設水溫(如99℃)控制點,當水加熱到該水溫時自動斷電,當水溫低於該水溫時自動上電加熱;
(4) 無水自動斷電和報警功能(略)。
圖1 基於單片機的智能溫度檢測系統電路原理圖
第4章 匯編語言程序
4.1 主程序和溫度值轉換成顯示值子程序的流程圖
4.2 DS18B20溫度子程序和顯示子程序的流程圖
4.3 匯編語言源程序
ORG 0
LJMP MAIN1
ORG 0003H
LJMP ZINT0
ORG 13H
LJMP ZINT1
TMPH: EQU 28H
FLAG1: EQU 38H
DATAIN: BIT P3.7
MAIN1: SETB IT0
SETB EA
SETB EX0
SETB IT1
SETB EX1
SETB P3.6
SETB P3.2
MOV 74H,#0
MOV 75H,#0
MOV 76H,#0
MOV 77H,#0
MAIN: LCALL GET_TEMPER
LCALL CVTTMP
LCALL DISP1
AJMP MAIN
INIT_1820:
SETB DATAIN
NOP
CLR DATAIN
MOV R1,#3
TSR1: MOV R0,#107 ;保持642ms
DJNZ R0,$
DJNZ R1,TSR1
SETB DATAIN ;釋放DS18B20匯流排
NOP
NOP
NOP
MOV R0,#25H
TSR2: JNB DATAIN,TSR3
DJNZ RO,TSR2
CLR FLAG1
SJMP TSR2
TSR3: SETB FLAG1 ;標志位置1,證明DS18b20存在
CLR P1.7
MOV R0,#117
TSR6: DJNZ R0,$
TSR7: SETB DATAIN
RET ;延時254us
GET_TEMPER:
SETB DATAIN
LCALL INIT_1820
JB FLAG1,TSS2
NOP
RET ;DS18B20檢測程序
TSS2: MOV A,#0CCH ;跳過ROM,使用存儲器
LCALL WRITE_1820
MOV A,#44H ;對RAM操作,開始溫度轉換
LCALL WRITE_1820
ACALL DISP1
LCALL INIT_1820
MOV A,#0CCH
LCALL WRITE_1820
MOV A,#0BEH
LCALL WRITE_1820
LCALL READ_1820;讀暫存器中的溫度數值
RET
WRITE_1820:
MOV R2,#8
CLR C
WR1: CLR DATAIN
MOV R3,#6
DJNZ R3,$
RRC A
MOV DATAIN,C
MOV R3,#23
DJNZ R3,$
SETB DATAIN
NOP
DJNZ R2,WR1
SETB DATAIN
RET
READ_1820:
MOV R4,#2
MOV R1,#29H
RE00: MOV R2,#8
RE01: CLR C
SETB DATAIN
NOP
NOP
CLR DATAIN
NOP
NOP
NOP
SETB DATAIN
MOV R3,#9
RE10: DJNZ R3,RE10
MOV C,DATAIN
MOV R3,#23
RE20: DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
CVTTMP: MOV A,TMPH
ANL A,#80H ;判斷溫度正負,正不變,負則取反加1
JZ TMPC1
CLR C
MOV A,TMP1
CPL A
ADD A,#1
MOV TMP1,A
MOV A,TMPH
CPL A
ADDC A,#0
MOV TMPH,A
MOV 73H,#0BH
SJMP TMPC11
TMPC1: MOV 73H,#0AH
TMPC11: MOV A,TMP1
ANL A,#0FH
MOV DPTR,#TMPTAB
MOVC A,@A+DPTR
MOV 70H,A
MOV A,TMP1
ANL A,#0FH
SWAP A
ORL A,TMPL
B2BCD: MOV B,#100
DIV AB
JZ B2BCD1
MOV 73H,A
B2BCD: MOV A,#10
XCH A,B
DIV AB
MOV 72H,A
MOV 71H,B
TMPC12: NOP
DISBCD: MOV A,73H
ANL A,#0FH
CJNE A,#1,DISBCD0
SJMP DISBCD1
DISBCD0: MOV A,72H
ANL A,#0FH
JNZ DISBCD1
MOV A,73H
MOV 72H,A
MOV 73H,#0AH
DISBCD1: RET
TMPTAB: DB 0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9
DISP1: MOV R1,#70H
MOV R0,#74H
MOV R5,#0FEH ;顯示實際溫度
PLAY: MOV P1,#0FFH
MOV A,R5
MOV P2,A
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P1,A
MOV P1,A
MOV A,@R0
MOVC A,@A+DPTR
MOV P0,A
MOV A,R5
JB ACC.1,LOOP1
JB P1.7
CLR P1.7
CLR P0.7 ;顯示小數點
LOOP1: LCALL DL1MS
INC R1
INC R0
MOV A,R5
JNB ACC.3,ENDOUT
RL A
MOV R5,A
MOV A,73H
CJNE A,#1,DD2
SJMP LEDH
DD2: MOV A,72H
CJNE A,72H,DDH
SJMP DD1
DDH: JNE PLAY1
LEDH: CLR P3.6
SJMP PLAY
PLAY1: SETB P3.6
SJMP PLAY
ENDOUT: MOV P1,#0FFH
MOV P2,#0FFH
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H
DB 92H,82H,0F8H,80H,90H,0FFH,0BFH
DL1MS: MOV R6,#14H
DL1: MOV R7,#100
DJNZ R7,$
DJNZ R6,DL1
RET
ZINT0: PUSH A
INC 75H
MOV A,,75H
CJNE A,#10,ZINT01
MOV 75H,#0
ZINT01: POP A
RETI
ZINTT1: PUSH A
INC 76H
MOV A,76H
CJNE A,#10,ZINT11
MOV 76H,#0
ZINT11: POP A
RETI
Ⅵ 基於51單片機的溫度控制器
圖片為溫度控制電路圖。溫度到達上限時led燈亮,並停止對RT的加熱,溫度達到下限時led燈滅並開始對RT進行加熱。A1和A2為uA741運算放大器。引腳號在圖上已經標出。再給你一個單片機採集DS18B20溫度的程序,用四位數碼管顯示的。你把DS18B20接在RT附近就可以測試出RT的溫度,調節圖中的滑動變阻器可改變溫度的上下限。這樣就能做到溫度控制了。
//安裝目錄下的EXE文件打開後可在電腦上顯示當前溫度值
#include<reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
sbitDS=P1^0;//defineinterface
uinttemp;//variableoftemperature
ucharflag1;//
//sbitla=P2^6;
//sbitwela=P2^7;
//unsignedcharcodetable2[]={0x3f,0x30,0x5b,0x4f,0x66,0x6d,0x7d,
//0x07,0x7f,0x67/*,0x77,0x7c,0x39,0x5e,0x79,0x71*/};
//unsignedcharcodetable1[]={0xbf,0xb0,0xdb,0xcf,0xe6,0xed,0xfd,
//0x87,0xff,0xe7};
//unsignedcharcodetable2[]={0x40,0x5e,0x24,0x21,0x13,0x09,0x08,
//0x63,0x00,0x03/*,0x77,0x7c,0x39,0x5e,0x79,0x71*/};
//unsignedcharcodetable1[]={0xc0,0xde,0xa4,0xa1,0x93,0x89,0x88,
//0xe7,0x8f,0x87};
unsignedcharcodetable5[]={0x77,0x22,0x6d,0x5d,0x1e,0x5b,0x7b,
0x15,0x7f,0x1f};
unsignedcharcodetable6[]={0xf7,0xa2,0xed,0xdd,0x9e,0xdb,0xfb,
0x95,0xff,0x9f};
voiddelay(uintcount)//delay
{
uinti;
while(count)
{
i=200;
while(i>0)
i--;
count--;
}
}
///////功能:串口初始化,波特率9600,方式1///////
voidInit_Com(void)
{
TMOD=0x20;
PCON=0x00;
SCON=0x50;
TH1=0xFd;
TL1=0xFd;
TR1=1;
}
voiddsreset(void)//復位,初始化函數
{
uinti;
DS=0;
i=103;
while(i>0)i--;
DS=1;
i=4;
while(i>0)i--;
}
bittmpreadbit(void)//readabit讀1位數據函數
{
uinti;
bitdat;
DS=0;i++;//i++fordelay
DS=1;i++;i++;
dat=DS;
i=8;while(i>0)i--;
return(dat);
}
uchartmpread(void)//readabytedate讀1位元組函數
{
uchari,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1);//讀出的數據最低位在最前面,這樣剛好一個位元組在DAT里
}
return(dat);
}
voidtmpwritebyte(uchardat)//writeabytetods18b20向1820寫一個位元組數據函數
{
uinti;
ucharj;
bittestb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)//write1
{
DS=0;
i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0;//write0
i=8;while(i>0)i--;
DS=1;
i++;i++;
}
}
}
voidtmpchange(void)//DS18B20beginchange開始獲取數據並轉換
{
dsreset();
delay(1);
tmpwritebyte(0xcc);//addressalldriversonbus寫跳過讀ROM指令
tmpwritebyte(0x44);//寫溫度轉換指令
}
uinttmp()//getthetemperature讀取寄存器中存儲的溫度數據
{
floattt;
uchara,b;
dsreset();
delay(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe);
a=tmpread();//讀低8位
b=tmpread();//讀高8位
temp=b;
temp<<=8;//twobytecomposeaintvariable兩個位元組組合為1個字
temp=temp|a;
tt=temp*0.0625;//溫度在寄存器中是12位,解析度是0.0625
temp=tt*10+0.5;//乘10表示小數點後只取1位,加0.5是四折五入
returntemp;
}
voidreadrom()//readtheserial
{
ucharsn1,sn2;
dsreset();
delay(1);
tmpwritebyte(0x33);
sn1=tmpread();
sn2=tmpread();
}
voiddelay10ms()//delay
{
uchara,b;
for(a=10;a>0;a--)
for(b=60;b>0;b--);
}
voiddisplay(uinttemp) //顯示程序
{
ucharA1,A2,A2t,A3,ser;
ser=temp/10;
SBUF=ser;
A1=temp/100;
A2t=temp%100;
A2=A2t/10;
A3=A2t%10;
//la=0;
d4=0;
P0=table5[A1];
delay(1);
d4=1; //顯示百位
//la=1;
//la=0;
/*wela=0;
P0=0x7e;
wela=1;
wela=0; */
//la=0;
d3=0;
P0=table6[A2];
delay(1);
d3=1; //顯示十位
//la=1;
//la=0;
/*wela=0;
P0=0x7d;
wela=1;
wela=0; */
d2=0;
P0=table5[A3];
delay(1);
d2=1; //顯示個位
//la=1;
//la=0;
/*P0=0x7b;
wela=1;
wela=0; */
}
voidmain()
{
uchara;
Init_Com();
do
{
tmpchange();
//delay(200);
for(a=1;a>0;a--)
{display(tmp());
}
}while(1);
}
Ⅶ 急求:基於MCS-51單片機的溫度控制器匯編語言軟體設計和硬體電路圖
第2章 硬體電路詳細設計
DS18B20的性能特點:1、採用單匯流排專用技術,既可通過串列口線,也可通過其它I/O口線與微機介面,無須經過其它變換電路,直接輸出被測溫度值(9位二進制數,含符號位),2、測溫范圍為-55℃-+125℃,測量解析度為0.0625℃,3、內含64位經過激光修正的只讀存儲器ROM,4、適配各種單片機或系統機,5、用戶可分別設定各路溫度的上、下限,6、內含寄生電源。溫度感測器DS18B20連接方式:在寄生電源供電方式下,DS18B20從單線信號線上汲取能量,在信號線DQ處於高電平期間把能量儲存在內部電容里,在信號線處於低電平期間消耗電容上的電能工作,直到高電平到來再給寄生電源(電容)充電。如圖2.3所示。
2.4 復位電路的設計
本設計採用人工復位,將一個按扭開關並聯於上電自動復位電路按一下開關就在RST端出現一段時間的高電平,即器件復位。
2.5 晶振電路的設計
2.6 DS18B20溫度感測器與單片機的介面電路
DS18B20可以採用兩種方式供電,一種是採用電源供電方式,此時DS18B20的1腳接地,2腳作為信號線,3腳接電源。另一種是寄生電源供電方式,如所示單片機埠接單線匯流排,為保證在有效的DS18B20時鍾周期內提供足夠的電流,可用一個MOSFET管來完成對匯流排的上拉。
當DS18B20處於寫存儲器操作和溫度A/D轉換操作時,匯流排上必須有強的上拉,上拉開啟時間最大為10us。採用寄生電源供電方式時VDD端接地。由於單線制只有一根線,因此發送介面必須是三態的。
2.7 溫度測量系統整體硬體電路
Wei1 BIT P3.0 ;;數碼管第1位
Wei2 BIT P3.1 ;;數碼管第2位
Wei3 BIT P3.2 ;;數碼管第3位
Wei4 BIT P3.3 ;;數碼管第4位
Dian EQU 20H ;;小數點狀態狀態保存位元組
DisData1 EQU 30H ;;第1位顯示數據
DisData2 EQU 31H ;;第2位顯示數據
DisData3 EQU 32H ;;第3位顯示數據
DisData4 EQU 33H ;;第4位顯示數據
DisTime EQU 34H ;;設置顯示幾次後讀取溫度值
;;溫度數據存儲單元標號定義
TempL EQU 35H ;;溫度高位
TempH EQU 36H ;;溫度低位
;;與DS18B20通迅部分存儲單元及標號定義
DS18B20 BIT P1.0 ;;與DS18B20通迅的位地址
RFail BIT 21H.0 ;;復位失敗標記
Var EQU 22H ;;變數位元組,溫度數據處理時用到
Var2 EQU 3FH ;;變數位元組
主程序部分:
ORG 00H
LJMP START
ORG 100H
START: ;;-----初始化
MOV SP,#60H ;;初始化堆棧指針
Set18B20:;;-----DS18B20初始化
;;DS18B20復位
ACALL Reset
JB RFail,LOOP ;;復位失敗則直接跳至顯示部分
;;對DS18B20發出Skip ROM命令
MOV A,#0CCH
ACALL Write
;;對DS18B20發出溫度轉換命令
MOV A,#44H
ACALL Write
SetDisT:MOV DisTime,#3 ;;設置下一個循環體的循環8次
LOOP:
ACALL Display ;;顯示
JB RFail,Set18B20 ;;DS18B20復位失敗時,在顯示完一次後重新復位
DJNZ DisTime,LOOP
JNB DS18B20,$ ;;判斷DS18B20是否已完成溫度轉換
ACALL GetTemp ;;從DS18B20讀出溫度值
ACALL DealTemp ;;溫度值處理
ACALL SendDisDT ;;根據當前系統狀態設置顯示內容
SJMP SetDisT ;;;;;;;
;;根據當前狀態給顯示模塊設置顯示參數
SendDisDT:
MOV Dian,#7FH ;;最高位為0代表顯示小數點
;;傳送溫度值
MOV A,TempH ;;送高位數據
MOV VAR,TempL ;;送低位數據
ACALL TransData
RET
;;A中保存高位值,Var中保存低位值
TransData:
;;取個位值
MOV B,#10
DIV AB
MOV DisData2,B
;;取十位值
JZ HavNot1 ;;判斷商是否為0
MOV B,#10
DIV AB
MOV DisData3,B
JZ HavNot2 ;;判斷商是否為0
MOV DisData4,A
SJMP XiaoShu ;;跳至百位符號處理部分
HavNot1:MOV DisData3,#10 ;;十位開始沒有數字
HavNot2:MOV DisData4,#10 ;;百位開始沒有數字
SignJudge:;;符號處理部分
JNB VAR.7,XiaoShu ;;當為負數顯示符號
MOV A,#10
CJNE A,DisData3,BWSign
MOV DisData3,#11 ;;負號在十位
SJMP XiaoShu
BWSign:MOV DisData4,#11 ;;負號在百位
XiaoShu:;;小數處理部分,用查表法獲取小數值,精確到小數點後1位
MOV A,VAR
ANL A,#0FH
MOV DPTR,#XSTab
MOVC A,@A+DPTR
MOV DisData1,A
RTransTemp:
RET
XSTab: DB 0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9
DS18B20通迅模塊組
-------復位模塊
Reset: ;;3微秒高電平
SETB DS18B20
MOV R7,#250
CLR RFail ;;清0復位失敗標記
CLR DS18B20
;;延遲501uS
DJNZ R7,$
SETB DS18B20 ;;釋放匯流排(拉高數據線)
;;等待DS18B20作出復位成功反應,最大等待時間為69uS
MOV R7,#17
Wait:
JNB DS18B20,RReset ;;若DS18B20在作出復位成功反應,不再等待
DJNZ R7,Wait
SETB RFail ;;70uS內DS18B20作出復位成功反應,置1復位失敗標記
RReset:
;;延遲350Us
MOV R7,#174
DJNZ R7,$
SETB DS18B20
RET
/
;;-------向DS18B20寫一個字的模塊,要寫的內容提前裝入ACC中
Write:
MOV R6,#8 ;寫8位
WriteBit:
;;2微秒高電平
SETB DS18B20
MOV R7,#3
;;7微秒低電平
CLR DS18B20
DJNZ R7,$
;;ACC低位送至DS18B20
RRC A
MOV DS18B20,C
;;延遲60Us
MOV R7,#28
DJNZ R7,$
;;是否已寫完8位
DJNZ R6,WriteBit
RWrite:
SETB DS18B20
RET
; /
;;-------從DS18B20讀回一個位元組的內容,讀回的內容裝入ACC中
Read:
MOV R6,#8 ;;讀回8位
MOV A,#0 ;;讀回的內容裝入ACC中
ReadBit:
;;2微秒高電平
SETB DS18B20
MOV R7,#7
;;2微秒低電平
CLR DS18B20
NOP
;;16微秒高電平
SETB DS18B20
DJNZ R7,$
;;讀回一位數據放入ACC中
MOV C,DS18B20
RRC A
;;延遲66Us
MOV R7,#33
DJNZ R7,$
;;是否已讀完8位
DJNZ R6,ReadBit
RRead:
SETB DS18B20
RET
/
;;-------與DS18B20通迅,讀回兩位元組溫度值,並裝入ACC中TempL和TempH中
GetTemp:
ACALL Reset ;;復位
JB RFail,RGetTemp ;;判斷復位是否成功
;;復位成功
;;對DS18B20發出Skip ROM命令
MOV A,#0CCH
ACALL Write
;;對DS18B20發出讀命令
MOV A,#0BEH
ACALL Write
;;從DS18B20讀回低8位溫度值
ACALL Read
MOV TempL,A
;;從DS18B20讀回高8位溫度值
ACALL Read
MOV TempH,A
ACALL Reset ;;復位
JB RFail,RGetTemp ;;判斷復位是否成功
;;對DS18B20發出Skip ROM命令
MOV A,#0CCH
ACALL Write
;;對DS18B20發出溫度轉換命令
MOV A,#44H
ACALL Write
RGetTemp:
RET
溫度數據處理模塊
DealTemp:
;;將整數的二進制數部分移到一個位元組,符號位和小數部分移到一個位元組
MOV R1,#Var
MOV Var,TempH
MOV A,TempL
XCHD A,@R1 ;;符號位、小數部分至VAR(@R1),整數部分至ACC
SWAP A
;;整數部分處理
JNB Var.7,NotNeg ;;判斷是否為負數
CPL A ;;為負數,取反後加1得其絕對值
;;小數部分取反
XRL Var,#1FH ;;
INC Var
NotNeg:
MOV TempH,A
MOV TempL,Var
RET
顯示模塊
-------顯示DisData(30H)從開始的三個位元組保存顯示信息
Display:
MOV DPTR,#Tab
;;**顯示小數部分
MOV A,DisData1
MOVC A,@A+DPTR
MOV P2,A
CLR Wei1
ACALL Delay
SETB Wei1
;;**顯示個位
MOV A,DisData2
MOVC A,@A+DPTR
;;小數點處理
ANL A,Dian
MOV P2,A
CLR Wei2
ACALL Delay
SETB Wei2
;;**顯示十位
MOV A,DisData3
MOVC A,@A+DPTR
MOV P2,A
CLR Wei3
ACALL Delay
SETB Wei3
;;**顯示百位
MOV A,DisData4
MOVC A,@A+DPTR
MOV P2,A
CLR Wei4
ACALL Delay
SETB Wei4
RET
Tab: ;;0~9、空白、負號的編碼
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH
;;延遲
Delay:
MOV R6,#6
DD1:MOV R5,#250
DJNZ R5,$
DJNZ R6,DD1
RET
END
這裡面插不了圖,我有這個的整套課程設計報告,想要找我,[email protected]