『壹』 單片機課程設計 單片機溫度的檢測與顯示的設計
用18b20做很簡單啊。
溫度的子程序給你,,你重定義一下介面,主程序已經調用出溫度了,你送到顯示就行了。。
/* 延時t毫秒 */
void delay(uint t)
{
uint i;
while(t--)
{
/* 對於11.0592M時鍾,約延時1ms */
for (i=0;i<125;i++)
{}
}
}
/* 產生復位脈沖初始化DS18B20 */
void TxReset(void)
{
uint i;
DQ = 0;
/* 拉低約900us */
i = 100;
while (i>0) i--;
DQ = 1; // 產生上升沿
i = 4;
while (i>0) i--;
}
/* 等待應答脈沖 */
void RxWait(void)
{
uint i;
while(DQ);
while(~DQ); // 檢測到應答脈沖
i = 4;
while (i>0) i--;
}
/* 讀取數據的一位,滿足讀時隙要求 */
bit RdBit(void)
{
uint i;
bit b;
DQ = 0;
i++;
DQ = 1;
i++;i++; // 延時15us以上,讀時隙下降沿後15us,DS18B20輸出數據才有效
b = DQ;
i = 8;
while(i>0) i--;
return (b);
}
/* 讀取數據的一個位元組 */
uchar RdByte(void)
{
uchar i,j,b;
b = 0;
for (i=1;i<=8;i++)
{
j = RdBit();
b = (j<<7)|(b>>1);
}
return(b);
}
/* 寫數據的一個位元組,滿足寫1和寫0的時隙要求 */
void WrByte(uchar b)
{
uint i;
uchar j;
bit btmp;
for(j=1;j<=8;j++)
{
btmp = b&0x01;
b = b>>1; // 取下一位(由低位向高位)
if (btmp)
{
/* 寫1 */
DQ = 0;
i++;i++; // 延時,使得15us以內拉高
DQ = 1;
i = 8;
while(i>0) i--; // 整個寫1時隙不低於60us
}
else
{
/* 寫0 */
DQ = 0;
i = 8;
while(i>0) i--; // 保持低在60us到120us之間
DQ = 1;
i++;
i++;
}
}
}
/* 啟動溫度轉換 */
void convert(void)
{
TxReset(); // 產生復位脈沖,初始化DS18B20
RxWait(); // 等待DS18B20給出應答脈沖
delay(1); // 延時
WrByte(0xcc); // skip rom 命令
WrByte(0x44); // convert T 命令
}
/* 讀取溫度值 */
void RdTemp(void)
{
TxReset(); // 產生復位脈沖,初始化DS18B20
RxWait(); // 等待DS18B20給出應答脈沖
delay(1); // 延時
WrByte(0xcc); // skip rom 命令
WrByte(0xbe); // read scratchpad 命令
tplsb = RdByte(); // 溫度值低位位元組(其中低4位為二進制的「小數」部分)
tpmsb = RdByte(); // 高位值高位位元組(其中高5位為符號位)
}
void main(void)
{
do
{
delay(1); // 延時1ms
convert(); // 啟動溫度轉換,需要750ms
delay(1000); // 延時1s
RdTemp(); // 讀取溫度
}
while(1);
}
『貳』 單片機數字溫度計設計用C語言寫程序
#include <reg51.h>
#define uchar unsigned char
sbit BEEP=P3^7;
//接控制繼電器
sbit DQ = P3^6;
//接溫度感測器18B20
uchar t[2],number=0,*pt;
//溫度值
uchar TempBuffer1[4]={0,0,0,0};
uchar Tmax=50,Tmin=10;
uchar distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff,0xfe,0xf7};
uchar currtemp;
void t0isr() interrupt 1
{
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
P2=1<<number;
if(number==2)P0=distab[TempBuffer1[0]]&0x7f;
else P0=distab[TempBuffer1[0]];
number++;
if(number>3)number=0;
}
void delay_18B20(unsigned int i)
{
while(i--);
}
/**********ds18b20初始化函數**********************/
void Init_DS18B20(void)
{
bit x=0;
do{
DQ=1;
delay_18B20(8);
DQ = 0; //單片機將DQ拉低
delay_18B20(90); //精確延時 大於 480us
DQ = 1; //拉高匯流排
delay_18B20(14);
x=DQ; //稍做延時後 如果x=0則初始化成功 x=1則初始化失敗,繼續初始化
}while(x);
delay_18B20(20);
}
/***********ds18b20讀一個位元組**************/
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_18B20(4);
}
return(dat);
}
/*************ds18b20寫一個位元組****************/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay_18B20(5);
DQ = 1;
dat>>=1;
}
}
/**************讀取ds18b20當前溫度************/
unsigned char *ReadTemperature(unsigned char rs)
{
unsigned char tt[2];
delay_18B20(80);
Init_DS18B20();
WriteOneChar(0xCC); //跳過讀序號列號的操作
WriteOneChar(0x44);
//啟動溫度轉換
delay_18B20(80);
Init_DS18B20();
WriteOneChar(0xCC);
//跳過讀序號列號的操作
WriteOneChar(0xBE);
//讀取溫度寄存器等(共可讀9個寄存器)前兩個就是溫度
tt[0]=ReadOneChar(); //讀取溫度值低位
tt[1]=ReadOneChar(); //讀取溫度值高位
return(tt);
}
void covert1(void)
//將溫度轉換為LED顯示的數據
{
uchar x=0x00,y=0x00;
t[0]=*pt;
pt++;
t[1]=*pt;
if(t[1]&0x080) //判斷正負溫度
{
TempBuffer1[0]=0x0c;
//c代表負
t[1]=~t[1];
/*下面幾句把負數的補碼*/
t[0]=~t[0];
/*換算成絕對值*********/
x=t[0]+1;
t[0]=x;
if(x==0x00)t[1]++;
}
else TempBuffer1[0]=0x0a;
//A代表正
t[1]<<=4;
//將高位元組左移4位
t[1]=t[1]&0xf0;
x=t[0];
//將t[0]暫存到X,因為取小數部分還要用到它
x>>=4;
//右移4位
x=x&0x0f;
//和前面兩句就是取出t[0]的高四位
y=t[1]|x;
//將高低位元組的有效值的整數部分拼成一個位元組
TempBuffer1[1]=(y%100)/10;
TempBuffer1[2]=(y%100)%10;
t[0]=t[0]&0x0f;
//小數部分
TempBuffer1[3]=t[0]*10/16;
if(currtemp<Tmin || currtemp>Tmax)BEEP=1;
else BEEP=0;
}
void convert(char tmp)
{
uchar a;
if(tmp<0)
{
TempBuffer1[0]=0x0c;
a=~tmp+1;
}
else
{
TempBuffer1[0]=0x0a;
a=tmp;
}
TempBuffer1[1]=(a%100)/10;
TempBuffer1[2]=(a%100)%10;
}
main()
{
TMOD=0x01;
TH0=(65536-5000)/256;
TL0=(65536-5000)%256;
TR0=1;
ET0=1;
EA=1;
out=1;
flag=0;
ReadTemperature(0x3f);
delay_18B20(50000);
//延時等待18B20數據穩定
while(1)
{
pt=ReadTemperature(0x7f); //讀取溫度,溫度值存放在一個兩個位元組的數組中
if(dismod==0)covert1();
delay_18B20(30000);
}
}
『叄』 單片機數字溫度計設計
;調試成功,還能湊合用
;有什麼具體的設計要求請說明,現場改。protues電路圖,聯系[email protected]
DATA_BUS BIT P1.2
FLAG BIT 00H
NEG BIT 01H
TURN BIT 02H
TEMP_L EQU 30H
TEMP_H EQU 31H
TEMP_DP EQU 32H
TEMP_INT EQU 33H
TEMP_BAI EQU 34H
TEMP_SHI EQU 35H
TEMP_GE EQU 36H
T_UP EQU 37H
T_DOWN EQU 38H
MARK EQU 39H
DIS_DP EQU 3AH
DIS_ADD EQU 3BH
KEY_HUAN BIT P3.0
KEY_A BIT P3.1
KEY_D BIT P3.2
ORG 0000H
AJMP START
ORG 0040H
START:
MOV SP, #50H
MOV P2,#00H; 先關閉所有數碼管 共陰則 MOV P2, #0FFH
CLR FLAG
CLR NEG
CLR TURN ;按鍵轉換標志,只有轉換按鍵按過,再按其他的鍵才能調整溫度。
MOV T_UP,#60H ;初始化溫度上限
MOV T_DOWN,#30H ;初始化溫度下限
MOV MARK,#00H ;當前顯示數值的標志。0顯示當前溫度,1顯示並調節最高溫度,2顯示並調節最低溫度。
MOV TEMP_DP, #08H
MOV TEMP_BAI, #08H
MOV TEMP_SHI, #08H
MOV TEMP_GE, #08H
LCALL DISPLAY
MAIN:
LCALL READ_TEMP
LCALL PROCESS
LCALL KEYSCAN
LJMP MAIN
;讀溫度程序
READ_TEMP:
LCALL RESET_PULSE ;18B20初始化,對18B20的每一個讀寫操作都是從初始化開始的。
MOV A, #0CCH ;指令0CCH 跳過讀ROM,至於為什麼看看DS18B20的中文資料就知道了。
LCALL WRITE ;往18B20寫指令
MOV A, #44H ;指令44H 溫度變換。
LCALL WRITE
LCALL DISPLAY ;調用顯示
LCALL RESET_PULSE ;18B20初始化
MOV A, #0CCH
LCALL WRITE
MOV A, #0BEH ;0BEH 讀暫存存儲器
LCALL WRITE ;先寫「讀溫度」指令
LCALL READ ;再讀溫度值
RET
;復位脈沖程序
;/*--------------------------------------------------------------------------------------------------------------------
; 時序:初始化時序、讀時序、寫時序。
;
;初始化:檢測匯流排控制器發出的復位脈沖
;
;和ds18b20的任何通訊都要從初始化開始
;
;初始化序列包括一個由匯流排控制器發出的復位脈沖
;
;和跟在其後由從機發出的存在脈沖。
;
;始化:復位脈沖+存在脈沖
;
;具體操作:
;
;匯流排控制器發出(TX)一個復位脈沖 (一個最少保持480μs 的低電平信號),然後釋放匯流排,
;
;進入接收狀態(RX)。單線匯流排由5K 上拉電阻拉到高電平。探測到I/O 引腳上的上升沿後
;
;DS1820 等待15~60μs,然後發出存在脈沖(一個60~240μs 的低電平信號)。
;
;具體看" 18b20"文檔里的 " 單線復位脈沖時序和1-wire presence detect "的時序圖
;對著18B20的復位時序圖就看明白了
;--------------------------------------------------------------------------------------------------------------------*/
;
RESET_PULSE:
RESET: SETB DATA_BUS
NOP
NOP
CLR DATA_BUS
MOV R7, #255
DJNZ R7, $
SETB DATA_BUS
MOV R7, #30
DJNZ R7, $
JNB DATA_BUS, SETB_FLAG
CLR FLAG
AJMP NEXT
SETB_FLAG:
SETB FLAG
NEXT: MOV R7, #120
DJNZ R7, $
SETB DATA_BUS
JNB FLAG, RESET
RET
;寫命令 同樣對著寫時序圖看
WRITE: SETB DATA_BUS ;數據線置1
MOV R6, #8
CLR C
WRITING:
CLR DATA_BUS
MOV R7, #5
DJNZ R7, $
RRC A
MOV DATA_BUS, C
MOV R7, #30H
DJNZ R7, $
SETB DATA_BUS
NOP
DJNZ R6, WRITING
RET
;讀命令
READ: SETB DATA_BUS
MOV R0, #TEMP_L
MOV R6, #8
MOV R5, #2
CLR C
READING:
CLR DATA_BUS
NOP
NOP
SETB DATA_BUS
NOP
NOP
NOP
NOP
MOV C, DATA_BUS
RRC A
MOV R7, #30H
DJNZ R7, $
SETB DATA_BUS
DJNZ R6, READING
MOV @R0, A
INC R0
MOV R6, #8
SETB DATA_BUS
DJNZ R5, READING
RET
;循環顯示段位
DISPLAY:
MOV R4, #50
DIS_LOOP:
MOV P2,#00H
MOV A, TEMP_DP
MOV DPTR, #TABLE_DP ;真不知這TABLE_DP能幹什麼,不顯示負號時加上後還會顯示255.9.
MOVC A, @A+DPTR ;現在看來必須得加上他,否則添加了負號處理並顯示後會間歇性的顯示-01.8. 很奇怪這是為什麼
MOV DPTR, #TABLE_INTER
MOVC A, @A+DPTR
MOV P0, A
SETB P2.3
LCALL D1MS
CLR P2.3
MOV A, TEMP_GE
MOV DPTR, #TABLE_INTER
MOVC A, @A+DPTR
MOV P0, A
CLR P0.7
SETB P2.2
LCALL D1MS
CLR P2.2
MOV A, TEMP_SHI
MOV DPTR, #TABLE_INTER
MOVC A, @A+DPTR
MOV P0, A
SETB P2.1
LCALL D1MS
CLR P2.1
JNB NEG,BAI
MOV A,#0BFH
MOV P0,A
SETB P2.0
LCALL D1MS
CLR P2.0
;AJMP NEXTT
BAI: MOV A, TEMP_BAI
CJNE A, #0, SKIP
AJMP NEXTT
SKIP: MOV A, TEMP_BAI
MOV DPTR, #TABLE_INTER
MOVC A, @A+DPTR
MOV P0, A
SETB P2.0
LCALL D1MS
CLR P2.0
NEXTT: NOP
DJNZ R4, DIS_LOOP
RET
KEYSCAN:
JB KEY_HUAN,KEY2
LCALL D2MS
JB KEY_HUAN,KEY2
CPL TURN
INC MARK
MOV A,MARK
CJNE A,#03H,KEY2
MOV MARK,#00H
KEY2: JNB TURN, OVER
JB KEY_A,KEY3
LCALL D2MS
JB KEY_A,KEY3
MOV A,MARK
CJNE A,#01H,N1
INC T_UP
N1: MOV A,MARK
CJNE A,#02H,OVER
INC T_DOWN
KEY3: JB KEY_D,OVER
LCALL D2MS
JB KEY_D,OVER
MOV A,MARK
CJNE A,#01,N2
DEC T_UP
N2: MOV A,MARK
CJNE A,#2,OVER
DEC T_DOWN
OVER:
RET
/* ------------------------------------------------------------------------------------------
當溫度轉換命令發布後,經轉換所得的溫度值以二位元組補碼的形式存放在高速暫存存儲器的第0、1個位元組。
;單片機可通過單線介面讀到該數據,讀取時低位在前,高位在後。
;對應的溫度計算:當符號位S=0時,直接將二進制位轉換為十進制;當S=1時,先將補碼變為原碼,再計算十進制值。
;數據處理
--------------------------------------------------------------------------------------------*/
PROCESS:
MOV A,MARK
CJNE A,#01H,TP1
MOV A,T_UP
AJMP SEP
TP1:MOV A,MARK
CJNE A,#02H,TP2
MOV A,T_DOWN
AJMP SEP
TP2: MOV R7, TEMP_L ;取二進制溫度最低四位,即溫度的小數位。
MOV A, #0FH
ANL A, R7
MOV TEMP_DP,A ;小數位存到TEMP-DP中。
MOV R7, TEMP_L ;取二進制溫度整數部分低四位。
MOV A, #0F0H
ANL A, R7
SWAP A
MOV TEMP_L, A
MOV R7, TEMP_H ;取二進制溫度整數部分高四位
MOV A, #0FH
ANL A, R7
SWAP A
ORL A, TEMP_L ;溫度的整數位在A,
MOV TEMP_L,A ;暫存當前溫度值
;比較溫度是否超過報警溫度。
CJNE A,T_UP,NEQ1
NEQ1: JC NUP
CLR P3.3
AJMP TP
NUP:SETB P3.3
MOV A,TEMP_L
CJNE A,T_DOWN,NEQ2
NEQ2: JNC NDOWN
CLR P3.4
AJMP TP
NDOWN:SETB P3.4
TP: MOV A,TEMP_L
MOV R7, #80H ;判斷是否為負數。即溫度是否為零下
ANL A, R7
CJNE A, #00H,NG
CLR NEG
MOV A,TEMP_L
AJMP SEP
NG: SETB NEG
MOV A,TEMP_L
CPL A
INC A
SEP:
MOV B, #64H
DIV AB ;
MOV TEMP_BAI,A
MOV A, #0AH
XCH A, B
DIV AB
MOV TEMP_SHI,A
MOV TEMP_GE,B
RET
D1MS:
MOV R7,#250
DJNZ R7,$
RET
D2MS:
MOV R6, #3
LOOP3: MOV R5, #250
DJNZ R5, $
DJNZ R6, LOOP3
RET
TABLE_DP:
DB 00H,01H,01H,02H,03H,03H,04H,04H,05H,06H
DB 06H,07H,08H,08H,09H,09H
TABLE_INTER:
DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H
END
『肆』 基於單片機的數字溫度計設計
按你的要求設計了程序並且通過ProteUS模擬
無償提供原理圖,ProteUS模擬工程(可運行),供參考運行效果,及原理圖的設計。
推薦:01 基於單片機的數字報警溫度計( http://ishare.iask.sina.com.cn/f/11655563.html )
; 源程序為匯編
; 實時顯示溫度
; 高於高限,低於低限,進行聲光報警
; 溫度高低限可自由設定
; 上電顯示 543210
; 讀出溫度後實時顯示溫度
; 溫度高於上限溫度時,顯示"HH****", 並進行聲光報警
; 溫度低於下限溫度時,顯示"LL****", 並進行聲光報警
; 設定鍵 進行高低限設定 循環為 "實時溫度" 「L ***」 「H ***」
; 可用+ -鍵進行修改報警值
『伍』 單片機實時溫度顯示系統的設計
各晶元的驅動寫好後,直接在LCD1602顯示即可,要循環顯示程序。校準時用if語句,數據類型要static
『陸』 單片機模擬中既能測物體溫度又能測人體溫度怎麼設計
單片機的ad轉換
用單片機做溫度測試,可以用單片機的ad轉換。通過感溫頭的電阻和上啦電阻的分壓。到單片機的ad埠就可以讀取。
『柒』 基於單片機的溫度數據採集系統設計
單片機課程設計任務書
題目:基於單片機的溫度數據採集系統設計
一.設計要求
1.被測量溫度范圍:0~500℃,溫度解析度為0.5℃。
2.被測溫度點:4個,每2秒測量一次。
3.顯示器要求:通道號1位,溫度4位(精度到小數點後一位)。
顯示方式為定點顯示和輪流顯示。
4.鍵盤要求:
(1)定點顯示設定;(2)輪流顯示設定;(3)其他功能鍵。
二.設計內容
1.單片機及電源管理模塊設計。
單片機可選用AT89S51及其兼容系列,電源管理模塊要實
現高精密穩壓輸出,為單片機及A/D轉換器供電。
2.感測器及放大器設計。
感測器可以選用鎳鉻—鎳硅熱電偶(分度號K),放大器要實現熱電偶輸出的mV級信號到A/D輸入V級信號放大。
3.多路轉換開關及A/D轉換器設計。
多路開關可以選用CD4052,A/D可選用MC14433等。
4.顯示器設計。
可以選用LED顯示或LCD顯示。
5.鍵盤電路設計。
實現定點顯示按鍵;輪流顯示按鍵;其他功能鍵。
6.系統軟體設計。
系統初始化模塊,鍵盤掃描模塊,顯示模塊,數據採集模塊,標度變換模塊等。
引言:
在生產和日常生活中,溫度的測量及控制十分重要,實時溫度檢測系統在各個方面應用十分廣泛。消防電氣的非破壞性溫度檢測,大型電力、通訊設備過熱故障預知檢測,各類機械組件的過熱預警,醫療相關設備的溫度測試等等都離不開溫度數據採集控制系統。
隨著科學技術的發展,電子學技術也隨之迅猛發展,同時帶動了大批相關產業的發展,其應用范圍也越來越廣泛。近年來單片機發展也同樣十分迅速,單片機已經滲透到工業、農業、國防等各個領域,單片機以其體積小,可靠性高,造價低,開發周期短的特點被廣泛推廣與應用。傳統的溫度採集不僅耗時而且精度低,遠不能滿足各行業對溫度數據高精度,高可靠性的要求。溫度的控制及測量對保證產品質量、提高生產效率、節約能源、生產安全、促進國民經濟的發展起到重要作用。在單片機溫度測量系統中關鍵是測量溫度,控制溫度和保持溫度。溫度測量是工業對象的主要被控參數之一。本此題目的總體功能就是利用單片機和熱敏原件實現溫度的採集與讀數,利用五位LED顯示溫度讀數和所選通道號,實現熱電轉化,實現溫度的精確測量。本設計是以Atmel公司的AT89S51單片機為控制核心,通過MC14433模數轉換對所測的溫度進行數字量變化,且通過數碼管進行相應的溫度顯示。採用微機進行溫度檢測,數字顯示,信息存儲及實時控制,對於提高生產效率和產品質量、節約能源等都有重要作用。
目錄:
一、系統總體功能及技術指標的描述........................................ 5
二、各模塊電路原理描述............................................................. 5
2.1單片機及電源模塊設計...................................................... 5
2.2、AT89S51引腳說明.......................................................... 7
2.3、數據採集模塊設計........................................................ 11
2.4、多路開關......................................................................... 12
2.5、放大器............................................................................. 15
2.6、A/D轉換器..................................................................... 16
2.7、顯示器設計..................................................................... 21
2.8、鍵盤電路設計................................................................. 22
2.9、電路總體設計圖........................................................... 22
三、軟體流程圖 ...................................................................... 24
四、程序清單.............................................................................. 25
五、設計總結及體會.................................................................... 31
六、參考資料................................................................................ 32
一、系統總體功能及技術指標的描述
1. 系統的總體功能:
溫度數據採集系統,實現溫度的採集與讀書,利用五位LED顯示溫度讀數和所選通道號,實現熱電轉化的原理過程。
被測量溫度范圍:0~500℃,溫度解析度為0.5℃。被測溫度點4個,每2秒測量一次。顯示器要求:通道號1位,溫度4位(精度到小數點後一位)。顯示方式為定點顯示和輪流顯示,可以通過按鍵改變顯示方式。
2. 技術指標要求:
1.被測量溫度范圍:0~500℃,溫度解析度為0.5℃。
2.被測溫度點:4個,每2秒測量一次。
3.顯示器要求:通道號1位,溫度4位(精度到小數點後一位)。
顯示方式為定點顯示和輪流顯示。
4.鍵盤要求:
(1)定點顯示設定;(2)輪流顯示設定;(3)其他功能鍵。
二、各模塊電路原理描述
2.1單片機及電源模塊設計
如圖所示為AT89S51晶元的引腳圖。兼容標准MCS-51指令系統的AT89S51單片機是一個低功耗、高性能CHMOS的單片機,片內含4KB在線可編程Flash存儲器的單片機。它與通用80C51系列單片機的指令系統和引腳兼容。
AT89S51單片機片內的Flash可允許在線重新編程,也可用通用非易失性存儲編程器編程;片內數據存儲器內含128位元組的RAM;有40個引腳,32個外部雙向輸入/輸出(I/O)埠;具有兩個16位可編程定時器;中斷系統是具有6個中斷源、5個中斷矢量、2級中斷優先順序的中斷結構;震盪器頻率0到33MHZ,因此我們在此選用12MHZ的晶振是比較合理的;具有片內看門狗定時器;具有斷電標志POF等等。AT89S51具有PDIP、TQFP和PLCC三種封裝形式[8]。
圖5.1-1 AT89S51引腳圖
上圖就是PDIP封裝的引腳排列,下面介紹各引腳的功能。
2.2、AT89S51引腳說明
P0口:8位、開漏級、雙向I/O口。P0口可作為通用I/O口,但須外接上拉電阻;作為輸出口,每各引腳可吸收8各TTL的灌電流。作為輸入時,首先應將引腳置1。P0也可用做訪問外部程序存儲器和數據存儲器時的低8位地址/數據匯流排的復用線。在該模式下,P0口含有內部上拉電阻。在FLASH編程時,P0口接收代碼位元組數據;在編程效驗時,P0口輸出代碼位元組數據(需要外接上拉電阻)。
P1口:8位、雙向I/0口,內部含有上拉電阻。P1口可作普通I/O口。輸出緩沖器可驅動四個TTL負載;用作輸入時,先將引腳置1,由片內上拉電阻將其抬到高電平。P1口的引腳可由外部負載拉到低電平,通過上拉電阻提供電流。在FLASH並行編程和校驗時,P1口可輸入低位元組地址。在串列編程和效驗時,P1.5/MO-SI,P1.6/MISO和P1.7/SCK分別是串列數據輸入、輸出和移位脈沖引腳。
P2口:具有內部上拉電阻的8位雙向I/O口。P2口用做輸出口時,可驅動4各TTL負載;用做輸入口時,先將引腳置1,由內部上拉電阻將其提高到高電平。若負載為低電平,則通過內部上拉電阻向外部輸出電流。CPU訪問外部16位地址的存儲器時,P2口提供高8位地址。當CPU用8位地址定址外部存儲時,P2口為P2特殊功能寄存器的內容。在FLASH並行編程和校驗時,P2口可輸入高位元組地址和某些控制信號。
P3口:具有內部上拉電阻的8位雙向口。P3口用做輸出口時,輸出緩沖器可吸收4各TTL的灌電流;用做輸入口時,首先將引腳置1,由內部上拉電阻抬位高電平。若外部的負載是低電平,則通過內部上拉電阻向輸出電流。在與FLASH並行編程和校驗時,P3口可輸入某些控制信號。P3口除了通用I/O口功能外,還有替代功能,如表5.3-1所示。
表5.3-1 P3口的替代功能
引腳
符號
說明
P3.0
RXD
串列口輸入
P3.1
TXD
串列口輸出
P3.2
/INT0
外部中斷0
P3.3
/INT1
外部中斷1
P3.4
T0
T0定時器的外部的計數輸入
P3.5
T1
T1定時器的外部的計數輸入
P3.6
/WR
外部數據存儲器的寫選通
P3.7
/RD
外部數據存儲器的讀選通
RST:復位端。當振盪器工作時,此引腳上出現兩個機器周期的高電平將系統復位。
ALE/ :當訪問外部存儲器時,ALE(允許地址鎖存)是一個用於鎖存地址的低8位位元組的書粗脈沖。在Flash 編程期間,此引腳也可用於輸入編程脈沖()。在正常操作情況下,ALE以振盪器頻率的1/6的固定速率發出脈沖,它是用作對外輸出的時鍾,需要注意的是,每當訪問外部數據存儲器時,將跳過一個ALE脈沖。如果希望禁止ALE操作,可通過將特殊功能寄存器中位地址為8EH那位置的「0」來實現。該位置的「1」後。ALE僅在MOVE或MOVC指令期間激活,否則ALE引腳將被略微拉高。若微控制器在外部執行方式,ALE禁止位無效。
:外部程序存儲器讀選取通信號。當AT89S51在讀取外部程序時, 每個機器周期 將PSEN激活兩次。在此期間內,每當訪問外部數據存儲器時,將跳過兩個信號。
/Vpp:訪問外部程序存儲器允許端。為了能夠從外部程序存儲器的0000H至FFFFH單元中取指令,必須接地,然而要注意的是,若對加密位1進行編程,則在復位時,的狀態在內部被鎖存。
執行內部程序應接VCC。不當選擇12V編程電源時,在Flash編程期間,這個引腳可接12V編程電壓。
XTAL1:振盪器反向放大器輸入端和內部時鍾發生器的輸入端。
XTAL2:振盪器反相放大器輸出端[9]。
電源模塊設計
在影響單片機系統可靠性的諸多因素中,電源干擾可謂首屈一指,據統計,計算機應用系統的運行故障有90%以上是由電源雜訊引起的。為了提高系統供電可靠性,交流供電應採用交流穩壓器,防止電源的過壓和欠壓,直流電源抗干擾措施有採用高質量集成穩壓電路單獨供電,採用直流開關電源,採用DC-DC變換器。本次設計決定採用MAXim公司的高電壓低功耗線性變換器MAX 1616作為電壓變換,採用該器件將輸入的24V電壓變換為5V電壓,給外圍5V的器件供電。MAX1616具有如下特點:
1.4~28V電壓輸入范圍。
2.最大80uA的靜態工作電流。
3.3V/5V電壓可選輸出。
4.30mA輸出電流。
5.2%的電壓輸出精度。
電源管理模塊電路圖如下:
本電路採用該器件將輸入的24V電壓變成5V電壓,給外圍5V的器件供電,其中二極體D1是保護二極體,防止輸入電壓接反可能帶來的對電路的影響和破壞。
『捌』 基於單片機的溫度控制系統的設計
利用溫度感測器DS18B20檢測環境溫度並直接輸出數字溫度信號給單片機AT89C52進行處理。
在LCD液晶上顯示當前環境溫度值、預設溫度值、使用者設定的溫度差以及目前風扇所處的檔位。其中預設溫度值只能為整數形式,檢測到的當前環境溫度可精確到小數點後一位。
同時採用PWM脈寬調制方式來改變直流風扇電機的轉速。
並通過兩個按鍵改變預設溫度值,一個提高預設溫度,另一個降低預設溫度值。通過另一個按鍵控制溫度差的大小。
設有紅外熱釋感測器檢測環境范圍內是否有人,如果有人確定出風方向,如果無人,降低轉速或一定時間內自動關閉。
回答
正如你所說的,一共用了DS18B20模塊,LCD模塊,紅外感測模塊,按鍵,直流電機模塊,程序方面只有一個PWM。現在一一為你分析:
DS18B20模塊:
下圖是它的原理圖,採用單匯流排來進行開發,不像電賽的哪個溫度感測器需要AD轉換,它是可以直接傳出數字信號的。