❶ 用51單片機實現溫度報警器的程序,要正確的
/*使用舉例:數碼管
scan()
{
char k;
for(k=0;k<4;k++) //4位LED掃描控制
{
discan=0x00;
Disdata=dis_7[_1820display[k]]; //數據顯示
if (k==1){DIN=0;} //小數點顯示
discan=scan_con[k]; //位選
_18B20_delay(100);
}
}
main()
_18B20_init();//18B20初始化
while(1)
{
EA=0;//在利用18B20測試溫度時,要嚴格遵循時序,禁止一切中斷
_18B20_work(_18B20_read()); //處理溫度數據
EA=1;//測試完畢,恢復系統中斷
scan(); //顯示溫度值
}
*/
#include "intrins.h" //_nop_();延時函數用
//*****************//
//以下是DS18B20驅動程序
//*****************//
/**************************************************
** 功能描述: DS18B20驅動程序,使用12M晶體
** DQ佔用引腳資源P1^7
****************************************************/sbit DQ=P1^7; //溫度輸入口unsigned char data temp_data[2]={0x00,0x00}; //讀出溫度暫放
unsigned char data _1820display[5]={0x00,0x00,0x00,0x00,0x00}; //顯示單元數據,共4個數據和一個運算暫用
unsigned int temp;
//**************溫度小數部分用查表法***********//
unsigned char code ditab[16]=
{
0x00,0x01,0x01,0x02,
0x03,0x03,0x04,0x04,
0x05,0x06,0x06,0x07,
0x08,0x08,0x09,0x09
};/*****************11us延時函數*************************/
//
void _18B20_delay(unsigned int t)
{
for (;t>0;t--);
}/****************DS18B20復位函數************************/
_18B20_reset(void)
{
char presence=1;
while(presence)
{
while(presence)
{
DQ=1;
_nop_();_nop_();//從高拉倒低
DQ=0;
_18B20_delay(50); //550 us
DQ=1;
_18B20_delay(6); //66 us
presence=DQ; //presence=0 復位成功,繼續下一步
}
_18B20_delay(45); //延時500 us
presence=~DQ;
}
DQ=1; //拉高電平
}/****************DS18B20寫命令函數************************/
//向1-WIRE 匯流排上寫1個位元組
void _18B20_write(unsigned char val)
{
unsigned char i;
for(i=8;i>0;i--)
{
DQ=1;
_nop_();_nop_(); //從高拉倒低
DQ=0;
_nop_();_nop_();_nop_();_nop_(); //5 us
DQ=val&0x01; //最低位移出
_18B20_delay(6); //66 us
val=val/2; //右移1位
}
DQ=1;
_18B20_delay(1);
}/****************DS18B20讀1位元組函數************************/
//從匯流排上取1個位元組
unsigned char _18B20read_byte(void)
{
unsigned char i;
unsigned char value=0;
for(i=8;i>0;i--)
{
DQ=1;
_nop_();_nop_(); //從高拉倒低
value>>=1;
DQ=0;
_nop_();_nop_();_nop_();_nop_(); //4 us
DQ=1;
_nop_();_nop_();_nop_();_nop_(); //4 us
if(DQ)value|=0x80;
_18B20_delay(6); //66 us
}
DQ=1;
return(value);
}
_18B20_read() //讀出溫度函數
{
_18B20_reset(); //匯流排復位
_18B20_delay(200);
_18B20_write(0xcc); //發命令
_18B20_write(0x44); //發轉換命令
_18B20_reset();
_18B20_delay(1);
_18B20_write(0xcc); //發命令
_18B20_write(0xbe);
temp_data[0]=_18B20read_byte(); //讀溫度值的低位元組
temp_data[1]=_18B20read_byte(); //讀溫度值的高位元組
temp=temp_data[1];
temp<<=8;
temp=temp|temp_data[0]; // 兩位元組合成一個整型變數。
return temp; //返回溫度值
}/****************溫度數據處理函數************************///二進制高位元組的低半位元組和低位元組的高半位元組組成一位元組,這個
//位元組的二進制轉換為十進制後,就是溫度值的百、十、個位值,而剩
//下的低位元組的低半位元組轉化成十進制後,就是溫度值的小數部分/********************************************************/
_18B20_work(unsigned int tem)
{
unsigned char n=0;
if(tem>6348) // 溫度值正負判斷
{
tem=65536-tem;
n=1;
} // 負溫度求補碼,標志位置1
_1820display[4]=tem&0x0f; // 取小數部分的值
_1820display[0]=ditab[_1820display[4]]; // 存入小數部分顯示值
_1820display[4]=tem>>4; // 取中間八位,即整數部分的值
_1820display[3]=_1820display[4]/100; // 取百位數據暫存
_1820display[1]=_1820display[4]%100; // 取後兩位數據暫存
_1820display[2]=_1820display[1]/10; // 取十位數據暫存
_1820display[1]=_1820display[1]%10;
/******************數碼管符號位顯示判斷**************************/
if(!_1820display[3])
{
_1820display[3]=0x0a; //最高位為0時不顯示
if(!_1820display[2])
_1820display[2]=0x0a; //次高位為0時不顯示
}
if(n)
_1820display[3]=0x0b; //負溫度時最高位顯示"-"
}
/******************1602液晶符號位顯示判斷**************************/
if(!_1820display[3])
{
_1820display[3]=' '-'0'; //最高位為0時不顯示
if(!_1820display[2])
_1820display[2]=' '-'0'; //次高位為0時不顯示
}
if(n)
_1820display[3]='-'-'0'; //負溫度時最高位顯示"-"
} _18B20_init()//18B20初始化
{
_18B20_reset(); //開機先轉換一次
_18B20_write(0xcc); //Skip ROM
_18B20_write(0x44); //發轉換命令
}
❷ 51單片機學習板關於溫度檢測的程序求
一、DS18B20.c文件(用LCD1602顯示的 I_N為DS18B20數據IO)
/*
模塊名稱:溫度模塊(DS18B20)
模塊功能:DS18B20的功能子函數
*/
/********************************************預處理命令*******************************************/
#include"ds18b20.h"
/*
函數名:DS_WriBteAndRead(bit x,unit8 val)
函數功能:向DS18B20內部寄存器寫入或讀取數據
輸入: x,val
輸出:DS_WriteAndRead
*/
unit8 DS_WriteAndRead(bit x,unit8 val)
{
unit8 i=0,Red=0;
for(i=8;i>0;i--)
{
if(x) //讀數據
{
I_N=0;
I_N=1;
Red>>=1;
if(I_N)Red|=0x80;
}
else //寫數據
{
I_N=1;
I_N=0;
I_N=val&0x01;
val>>=1;
}
delay_us(4);
}
if(x)
return(Red);//返回數據
else
return 0;
}
/*
函數名:DS_Reset()
函數功能:DS18B20初始化設置
輸入:無
輸出:無
*/
void DS_Reset()
{
I_N=1;
I_N=0;
delay_us(50);
I_N=1;
delay_us(30);
DS_WriteAndRead(0,0xcc);//跳過搜索
}
/*
函數名: DS_Data_Handle()
函數功能:數據處理
輸入:無
輸出:無
*/
void DS_Data_Handle()
{
unit_16 Ra=0,Rb=0,Temp=0;
DS_Reset(); //復位
DS_WriteAndRead(0,0x44); //啟動溫度轉換
DS_Reset(); //復位
delay_us(100);
DS_WriteAndRead(0,0xbe);//讀暫存器中的數據
Ra=DS_WriteAndRead(1,0xbe);
Rb=DS_WriteAndRead(1,0xbe);
Temp=Rb;
Temp<<=8;
Temp|=Ra;
Temp=Temp*0.625+0.5;//數值轉換
LCD_Write_Data(0,0xc5);
LCD_Write_Data(1,(Temp/100)+48);
LCD_Write_Data(1,(Temp/10%10)+48);
LCD_Write_Data(1,46);
LCD_Write_Data(1,(Temp%10)+48);
}
❸ 51單片機c語言編程的溫濕度檢測控製程序
/********************************************************************
*
文件名
:
溫度採集DS18B20.c
*
描述
:
該文件實現了用溫度感測器件DS18B20對溫度的採集,並在數碼管上顯示出來。
*
創建人
:
東流,2009年4月10日
*
版本號
:
2.0
***********************************************************************/
#include<reg52.h>
#define
uchar
unsigned
char
#define
uint
unsigned
int
#define
jump_ROM
0xCC
#define
start
0x44
#define
read_EEROM
0xBE
sbit
DQ
=
P2^3;
//DS18B20數據口
unsigned
char
TMPH,TMPL;
uchar
code
table[10]
=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/********************************************************************
*
名稱
:
delay()
*
功能
:
延時,延時時間大概為140US。
*
輸入
:
無
*
輸出
:
無
***********************************************************************/
void
delay_1()
{
int
i,j;
for(i=0;
i<=10;
i++)
for(j=0;
j<=2;
j++)
;
}
/********************************************************************
*
名稱
:
delay()
*
功能
:
延時函數
*
輸入
:
無
*
輸出
:
無
***********************************************************************/
void
delay(uint
N)
{
int
i;
for(i=0;
i<N;
i++)
;
}
/********************************************************************
*
名稱
:
Delay_1ms()
*
功能
:
延時子程序,延時時間為
1ms
*
x
*
輸入
:
x
(延時一毫秒的個數)
*
輸出
:
無
***********************************************************************/
void
Delay_1ms(uint
i)//1ms延時
{
uchar
x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}
/********************************************************************
*
名稱
:
Reset()
*
功能
:
復位DS18B20
*
輸入
:
無
*
輸出
:
無
***********************************************************************/
uchar
Reset(void)
{
uchar
deceive_ready;
DQ
=
0;
delay(29);
DQ
=
1;
delay(3);
deceive_ready
=
DQ;
delay(25);
return(deceive_ready);
}
/********************************************************************
*
名稱
:
read_bit()
*
功能
:
從DS18B20讀一個位值
*
輸入
:
無
*
輸出
:
從DS18B20讀出的一個位值
***********************************************************************/
uchar
read_bit(void)
{
uchar
i;
DQ
=
0;
DQ
=
1;
for(i=0;
i<3;
i++);
return(DQ);
}
/********************************************************************
*
名稱
:
write_bit()
*
功能
:
向DS18B20寫一位
*
輸入
:
bitval(要對DS18B20寫入的位值)
*
輸出
:
無
***********************************************************************/
void
write_bit(uchar
bitval)
{
DQ=0;if(bitval==1)
DQ=1;
delay(5);
DQ=1;
}
/********************************************************************
*
名稱
:
read_byte()
*
功能
:
從DS18B20讀一個位元組
*
輸入
:
無
*
輸出
:
從DS18B20讀到的值
***********************************************************************/
uchar
read_byte(void)
{
uchar
i,m,receive_data;
m
=
1;
receive_data
=
0;
for(i=0;
i<8;
i++)
{
if(read_bit())
{
receive_data
=
receive_data
+
(m
<<
i);
}
delay(6);
}
return(receive_data);
}
/********************************************************************
*
名稱
:
write_byte()
*
功能
:
向DS18B20寫一個位元組
*
輸入
:
val(要對DS18B20寫入的命令值)
*
輸出
:
無
***********************************************************************/
void
write_byte(uchar
val)
{
uchar
i,temp;
for(i=0;
i<8;
i++)
{
temp
=
val
>>
i;
temp
=
temp
&
0x01;
write_bit(temp);
delay(5);
}
}
/********************************************************************
*
名稱
:
Main()
*
功能
:
主函數
*
輸入
:
無
*
輸出
:
無
***********************************************************************/
void
main()
{
float
tt;
uint
temp;
P2
=
0x00;
while(1)
{
Reset();
write_byte(jump_ROM);
write_byte(start);
Reset();
write_byte(jump_ROM);
write_byte(read_EEROM);
TMPL
=
read_byte();
TMPH
=
read_byte();
temp
=
TMPL
/
16
+
TMPH
*
16;
P0
=
table[temp/10%10];
P2
=
6;
Delay_1ms(5);
P0
=
table[temp%10];
P2
=
7;
Delay_1ms(5);
}
}
❹ 51單片機製作溫度計的簡單程序
;這是關於DS18B20的讀寫程序,數據腳P2.2,晶振12MHZ
;溫度感測器18B20匯編程序,採用器件默認的12位轉化,最大轉化時間750微秒
;可以將檢測到的溫度直接顯示到AT89C51開發實驗板的兩個數碼管上
;顯示溫度00到99度,很准確哦~~無需校正!
ORG 0000H ;單片機內存分配申明!
TEMPER_L EQU 29H;用於保存讀出溫度的低8位
TEMPER_H EQU 28H;用於保存讀出溫度的高8位
FLAG1 EQU 38H;是否檢測到DS18B20標志位
a_bit equ 20h ;數碼管個位數存放內存位置
b_bit equ 21h ;數碼管十位數存放內存位置
TEMP_TH EQU
MAIN:
LCALL GET_TEMPER;調用讀溫度子程序 ,顯示範圍00到99度,顯示精度為1度
;因為12位轉化時每一位的精度為0.0625度,我們不要求顯示小數所以可以拋棄29H的低4位
;將28H中的低4位移入29H中的高4位,這樣獲得一個新位元組,這個位元組就是實際測量獲得的溫度
MOV A,29H
MOV C,40H;將28H中的最低位移入C
RRC A
MOV C,41H
RRC A
MOV C,42H
RRC A
MOV C,43H
RRC A
MOV 29H,A
LCALL DISPLAY ;調用數碼管顯示子程序
CPL P1.0
AJMP MAIN
; 這是DS18B20復位初始化子程序
INIT_1820:
SETB P3.5
NOP
CLR P3.5 ;主機發出延時537微秒的復位低脈沖
MOV R1,#3
TSR1:MOV R0,#107
DJNZ R0,$
DJNZ R1,TSR1
SETB P3.5 ;然後拉高數據線
NOP
NOP
NOP
MOV R0,#25H
TSR2:
JNB P3.5,TSR3 ;等待DS18B20回應
DJNZ R0,TSR2
LJMP TSR4 ; 延時
TSR3:
SETB FLAG1 ; 置標志位,表示DS1820存在
CLR P1.7 ;檢查到DS18B20就點亮P1.7LED
LJMP TSR5
TSR4:
CLR FLAG1 ; 清標志位,表示DS1820不存在
CLR P1.1 ;點亮P1。1腳LED表示溫度感測器通信失敗
LJMP TSR7
TSR5:
MOV R0,#117
TSR6:
DJNZ R0,TSR6 ; 時序要求延時一段時間
TSR7:
SETB P3.5
RET
; 讀出轉換後的溫度值
GET_TEMPER:
SETB P3.5
LCALL INIT_1820 ;先復位DS18B20
JB FLAG1,TSS2
CLR P1.2
RET ; 判斷DS1820是否存在?若DS18B20不存在則返回
TSS2:
CLR P1.3 ;DS18B20已經被檢測到!!!!!!!!!!!!!!!!!!
MOV A,#0CCH
LCALL WRITE_1820
MOV A,#44H ;發出溫度轉換命令
LCALL WRITE_1820
;這里通過調用顯示子程序實現延時一段時間,等待AD轉換結束,12位的話750微秒
LCALL DISPLAY
LCALL INIT_1820 ;准備讀溫度前先復位
MOV A,#0CCH ; 跳過ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ; 發出讀溫度命令
LCALL WRITE_1820
LCALL READ_18200; 將讀出的溫度數據保存到35H/36H
CLR P1.4
RET
;寫DS18B20的子程序(有具體的時序要求)
WRITE_1820:
MOV R2,#8;一共8位數據
CLR C
WR1:
CLR P3.5
MOV R3,#6
DJNZ R3,$
RRC A
MOV P3.5,C
MOV R3,#23
DJNZ R3,$
SETB P3.5
NOP
DJNZ R2,WR1
SETB P3.5
RET
; 讀DS18B20的程序,從DS18B20中讀出兩個位元組的溫度數據
READ_18200:
MOV R4,#2 ; 將溫度高位和低位從DS18B20中讀出
MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
RE00:
MOV R2,#8;數據一共有8位
RE01:
CLR C
SETB P3.5
NOP
NOP
CLR P3.5
NOP
NOP
NOP
SETB P3.5
MOV R3,#9
RE10:
DJNZ R3,RE10
MOV C,P3.5
MOV R3,#23
RE20:
DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
;顯示子程序
display: mov a,29H;將29H中的十六進制數轉換成10進制
mov b,#10 ;10進制/10=10進制
div ab
mov b_bit,a ;十位在a
mov a_bit,b ;個位在b
mov dptr,#numtab ;指定查表啟始地址
mov r0,#4
dpl1: mov r1,#250 ;顯示1000次
dplop: mov a,a_bit ;取個位數
MOVC A,@A+DPTR ;查個位數的7段代碼
mov p1,a ;送出個位的7段代碼
setb p2.0 ;開個位顯示
acall d1ms ;顯示1ms
clr p2.0
mov a,b_bit ;取十位數
MOVC A,@A+DPTR ;查十位數的7段代碼
mov p1,a ;送出十位的7段代碼
setb p2.1 ;開十位顯示
acall d1ms ;顯示1ms
clr p2.1
djnz r1,dplop ;100次沒完循環
djnz r0,dpl1 ;4個100次沒完循環
ret
;1MS延時(按12MHZ算)
D1MS: MOV R7,#80
DJNZ R7,$
RET
numtab: ;數碼管共陽極0~9代碼
DB 0C0H,0F9H,0A4H,0B0H,99H, 92H,82H,0F8H,80H,90H
end
❺ 求助編一個51單片機自動溫度檢測報警系統的程序
;********************************************************************
;DS18B20溫度計 *
;採用4位LED共陽顯示器顯示測溫值,顯示精度0.1℃,測溫范圍-55~+125*
;用AT89C2051單片機,12MHZ晶振 *
;********************************************************************
;***************常數定義********************
TIMEL EQU 0E0H ;20ms,定時器0時間常數
TIMEH EQU 0B1H
TEMPHEAD EQU 36H
;********************工作內存定義**********************
BITST DATA 20H
TIME1S0K BIT BITST.1
TEMPONEOK BIT BITST.2
TEMPL DATA 26H
TEMPH DATA 27H
TEMPHC DATA 28H
TEMPLC DATA 29H
SCANLED DATA 2AH
;*****************引腳定義*****************************
TEMPDIN BIT P3.7
;*****************中斷向量區***************************
ORG 0000H
LJMP START
ORG 000BH
LJMP T01T
;***************系統初始化****************************
ORG 0030H
START: MOV SP,#60H
CLSMEM: MOV R0,#20H
MOV R1,#60H
CLSMEM1: MOV @R0,#00H
INC R0
DJNZ R1,CLSMEM1
MOV TMOD,#00100001B ;定時器0工作方式1(16位)
MOV TH0,#HIGH(65536-5000)
MOV TL0,#LOW(65536-5000) ;5ms
SJMP INIT
ERROR: NOP
LJMP START
NOP
INIT: NOP
SETB ET0
SETB TR0
SETB EA
MOV PSW,#00H
CLR TEMPONEOK
MOV 50H,#10
MOV 51H,#10
MOV 52H,#10
MOV 53H,#10
LJMP MAIN
;*******************************************************************
;定時器0中斷服務程序
;*******************************************************************
T01T: CLR TR0
MOV TH0,#HIGH(65536-5000)
MOV TL0,#LOW(65536-5000) ;5ms
SETB TR0
LEDDIS:
MOV DPTR,#TAB
MOV R1,#50H
MOV A,SCANLED
ADD A,R1
MOV R1,A
MOV A,SCANLED
JNZ LEDDIS1
MOV P3,#08H
SJMP LEDDIS4
LEDDIS1:
DEC A
JNZ LEDDIS2
MOV P3,#04H
SJMP LEDDIS4
LEDDIS2:
DEC A
JNZ LEDDIS3
MOV P3,#02H
SJMP LEDDIS4
LEDDIS3:
MOV P3,#01H
LEDDIS4:
MOV A,@R1
MOVC A,@A+DPTR
MOV P1,A
INC SCANLED
MOV A,SCANLED
CJNE A,#4,T0CNT
MOV SCANLED,#0
T0CNT:
INC R7
CJNE R7,#200,T0IT1
MOV R7,#00H
SETB TIME1S0K ;1s定時到標志
T0IT1: RETI
;********************************************************************
; 主程序
;********************************************************************
MAIN:
JNB TIME1S0K,MAIN
CLR TIME1S0K ;測溫每1s一次
LCALL READTEMP ;讀出溫度值子程序
LCALL CONVTEMP ;溫度BCD碼計算處理子程序
LCALL DISPBCD ;顯示區BCD碼溫度值刷新子程序
LJMP MAIN
;********************************************************************
; 子程序區
;********************************************************************
;***************復位DS18B20*****************************************
INITDS1820: SETB TEMPDIN
NOP
CLR TEMPDIN
MOV R6,#251 ;延時>480μs
DJNZ R6,$
SETB TEMPDIN
MOV R6,#37 ;
LOOP1820: MOV C,TEMPDIN
JC INITDS1820OUT
DJNZ R6,LOOP1820
SJMP INITDS1820
RET
INITDS1820OUT:
MOV R6,#06BH ;延時200μs
DJNZ R6,$
SETB TEMPDIN
RET
;*******讀DS18B20的程序,從DS18B20中讀出1位元組的數據*****
READDS1820: MOV R7,#08H
READDS1820LOOP: CLR TEMPDIN
NOP
NOP
SETB TEMPDIN
MOV R6,#07 ;延時15μs
DJNZ R6,$
MOV C,TEMPDIN
RRC A
MOV R6,#25
DJNZ R6,$
DJNZ R7,READDS1820LOOP
RET
;******寫DS18B20的程序,從DS18B20中寫1位元組數據*****
WRITEDS1820: MOV R7,#08H
WRITEDS1820LOP: CLR TEMPDIN
MOV R6,#07H ;延時15μs
DJNZ R6,$
RRC A
MOV TEMPDIN,C
MOV R6,#30 ;延時104μs
DJNZ R6,$
SETB TEMPDIN
NOP
DJNZ R7,WRITEDS1820LOP
SETB TEMPDIN
RET
;******************讀TEMP******************88
READTEMP: LCALL INITDS1820
MOV A,#0CCH
LCALL WRITEDS1820 ;Skip ROM
MOV A, #44H
LCALL WRITEDS1820 ;開始轉換
MOV R6,#250 ;延時
DJNZ R6,$
READTEMP1: LCALL INITDS1820
MOV A,#0CCH
LCALL WRITEDS1820 ;Skip ROM
MOV A,#0BEH
LCALL WRITEDS1820 ;中間結果寄存器
MOV R6,#34H ;延時104μs
DJNZ R6,$
READTEMP2: LCALL READDS1820
MOV TEMPL,A
LCALL READDS1820
MOV TEMPH,A
READTEMPOUT: RET
;**************處理溫度BCD碼子程序***********
CONVTEMP: MOV A,TEMPH
ANL A,#80H
JZ TEMPC1
CLR C
MOV A,TEMPL
CPL A
ADD A,#01H
MOV TEMPL,A
MOV A,TEMPH ;"-"
CPL A
ADDC A,#00H
MOV TEMPH,A ;TEMPHC HI=符號位
MOV TEMPHC,#0BH
SJMP TEMPC11
TEMPC1: MOV TEMPHC,#0AH ;"+"
TEMPC11:
MOV R6,#4H
TEMPC12:
MOV A,TEMPH
RRC A
MOV TEMPH,A
MOV A,TEMPL
RRC A
MOV TEMPL,A
DJNZ R6,TEMPC12
RET
;*****************小數部分碼表*********
TEMPDOTTAB: DB 00H,01H,01H,02H,03H,03H,04H,04H,05H,06H
DB 06H,07H,08H,08H,09H,09H
;************顯示區BCD碼溫度值刷新子程序********
DISPBCD: MOV 53H,TEMPHC
MOV A,TEMPL
MOV B,#10
DIV AB
MOV 50H,B
MOV B,#10
DIV AB
MOV 51H,B
JZ DISPBCD2
MOV 52H,A
RET
DISPBCD2: MOV 52H,#10
RET
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH
;共陽段碼表 "0","1","2","3","4","5","6","7","8","9","不亮","-"
END
❻ 51單片機測溫度,速度通過串口發送【求方法】
方法:
第一:搭建單片機最小系統及供電電源系統;
第二:選擇溫度感測器及設計溫度測試電路,比如DS18B20還是NTC還是PT100,無論哪種,網路上關於這些感測器的帖子及程序不少!
第三:設計速度檢測辦法,是選擇旋轉編碼器還是什麼方式來實現,但是無論哪種,基本輸出的都是PWM波形進入單片機外部中斷口(INT0或者INT1),然後通過定時1秒范圍內,檢測到了多少脈沖,這樣每一圈發送多少個脈沖,這樣就可以知道具體一秒轉了多少圈,也就可以計算出來速度了。
第四:關於串口,通過單片機+MAX232通信晶元+DB9介面(也可以使用串口轉USB的方式,現在電腦基本沒有物理串口了。通過USB來轉成串口);設置好通信波特率、數據位、通信格式及停止位後,藉助電腦的《串口助手軟體》配合來實現即可。
❼ 51單片機溫度測量
可以用IN4148,再加三運放電路,單片機AD,顯示等,就可以了。
❽ 如何用一個51單片機實現溫濕度測量和時間的顯示
可以的,使用SHT10之類的溫濕度一體感測器,時間可以用內部RTC或外置的,很方便的,有4K的容量基本就ok了