串行擴展應用:
利用 DS18B20 和 LED 數碼管實現單總線溫度測量系統。DS18B20的測量范圍是-5℃~128℃。由于只接有兩個 LED數碼管,所以顯示的數值只能在 00~~99 之間。
(2)軟件設計
#include
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
#define out P0
sbit smg1=out^4;
sbit smg2=out^5;
sbit DQ=P3^7;
void delay5(uchar);
void init_ds18b20(void);
uchar readbyte(void);
void writebyte(uchar);
uchar retemp(void); void main(){
uchar i,temp;
delay5(1000);
while(1){
temp=retemp();
for(i=0;i<10;i++){
out=(temp/10)&0x0f;
smg1=0;
smg2=1;
delay5(1000);
out=(temp%10)&0x0f;
smg1=1;
smg2=0;
delay5(1000);
}
}
} void delay5(uchar n){
do{
nop();
nop();
nop();
n–;
}while(n);
} void init_ds18b20(void){
uchar x=0;
DQ=0;
delay5(120);
DQ=1;
delay5(16);
delay5(80);
} uchar readbyte(void){
uchar i=0;
uchar date=0;
for(i=8;i>0;i–){
DQ=0;
delay5(1);
DQ=1;
date>>=1;
if(DQ)date|=0x80;
delay5(11);
}
return(date);
} void writebyte(uchar dat){
uchar i=0;
for(i=8;i>0;i–){
DQ=0;
DQ=dat&0x01;
delay5(12);
DQ=1;
dat>>=1;
delay5(5);
}
} uchar retemp(void){
uchar a,b,tt;
uint t;
init_ds18b20();
writebyte(0xcc);
writebyte(0x44);
init_ds18b20();
writebyte(0xcc);
writebyte(0xbe);
a=readbyte();
b=readbyte();
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
return(tt);
}
效果圖
????
上圖,仿真運行狀態①(未操作溫度)。
????
上圖,仿真運行狀態②(未操作溫度)。
????
上圖,仿真運行狀態③(ds18b20按鈕按下,溫度增加)。
????
上圖,仿真運行狀態④(ds18b20按鈕按下,溫度增加)。
實驗結論及分析
1.程序的核心思想
①DS18B20與傳統的熱敏電阻不同,DS18B20 可直接將被測溫度轉換為串行數字信號,供單片機處理。通過對 DS18B20 編程可以實現 9~12 位的溫度讀數,并可分別在 93.75ms 和 750ms 內完成 9 位和 12 位的數字量。其測溫范圍-55℃~+125℃,最大分辨率為 0.0625℃,在一10℃~+85℃范圍內其測溫準確度為±0.5℃。
②DS18B20也可以看作一個小的單片機系統,它將溫度信息采集到自己的內存中,然后通過一定的節拍將溫度信息一位一位地傳入at89c51單片機中進行二位數碼管的顯數。
2.實驗中遇到的問題
①lcd1602輸入信息時要記得初始化,否則不會顯數。
②注意DS18B20的溫度信息一位一位地傳入at89c51單片機中時嚴格把控節拍,節拍不正確將影響數據傳輸。 ③at89c51單片機的時鐘頻率要設置成11.0592mhz。
審核編輯:湯梓紅
-
Proteus
+關注
關注
79文章
1692瀏覽量
106404 -
測量系統
+關注
關注
2文章
534瀏覽量
41356 -
51單片機
+關注
關注
273文章
5699瀏覽量
123225
原文標題:51單片機溫度測量系統Proteus仿真
文章出處:【微信號:c-stm32,微信公眾號:STM32嵌入式開發】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論