視頻教程:https://www.bilibili.com/video/BV1bf4y1U7ff
傳感器基本概念
1、按傳感器的物理量分類:可分為位移、溫度、速度、流量、力、氣體成份等傳感器。 2、按傳感器工作原理分類:可分為電阻、電感、光柵、電壓、電容、霍爾、光電、熱電偶等傳感器。 3、按傳感器輸出信號的性質(zhì)分類:可分為:輸出為開關(guān)量“1”和"0”或“開”和“關(guān)”的開關(guān)型傳感器;輸出為模擬型傳感器;輸出為脈沖或代碼的數(shù)字型傳感器。


#include "reg52.h" //此文件中定義了單片機的一些特殊功能寄存器
#define uchar unsigned char
#define uint unsigned int
typedef unsigned int u16; //對數(shù)據(jù)類型進行聲明定義
typedef unsigned char u8;
#define uchar unsigned char
#define uint unsigned int
#define SEG P0
sbit SCAN1 = P2^0;
sbit SCAN2 = P2^1;
sbit SCAN3 = P2^2;
sbit SCAN4 = P2^3;
uchar number;
uchar distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int display=0;//數(shù)碼管刷新
void delay_ms(uint j) //1ms
{
uchar i=250;
for(;j>0;j--)
{
while(--i);
i=249;
while(--i);
i=250;
}
}
sbit DQ=P3^7; //數(shù)據(jù)傳輸線接單片機的相應(yīng)的引腳
unsigned char tempL=0; //設(shè)全局變量
unsigned char tempH=0;
unsigned int sdata; //測量到的溫度的整數(shù)部分
unsigned char xiaoshu1; //小數(shù)第一位
unsigned char xiaoshu2; //小數(shù)第二位
unsigned char xiaoshu; //兩位小數(shù)
bit fg=1; //溫度正負(fù)標(biāo)志
uint T_H;
void delay(unsigned char i)
{
for(i;i>0;i--);
}
void Init_DS18B20(void)
{
unsigned char x=0;
DQ=1; //DQ先置高
delay(8); //稍延時
DQ=0; //發(fā)送復(fù)位脈沖
delay(80); //延時(>480us)
DQ=1; //拉高數(shù)據(jù)線
delay(5); //等待(15~60us)
x=DQ; //用X的值來判斷初始化有沒有成功,18B20存在的話X=0,否則X=1
delay(20);
}
//讀一個字節(jié)
ReadOneChar(void) //主機數(shù)據(jù)線先從高拉至低電平1us以上,再使數(shù)據(jù)線升為高電平,從而產(chǎn)生讀信號
{
unsigned char i=0; //每個讀周期最短的持續(xù)時間為60us,各個讀周期之間必須有1us以上的高電平恢復(fù)期
unsigned char dat=0;
for (i=8;i>0;i--) //一個字節(jié)有8位
{
DQ=1;
delay(1);
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
//寫一個字節(jié)
void WriteOneChar(unsigned char dat)
{
unsigned char i=0; //數(shù)據(jù)線從高電平拉至低電平,產(chǎn)生寫起始信號。15us之內(nèi)將所需寫的位送到數(shù)據(jù)線上,
for(i=8;i>0;i--) //在15~60us之間對數(shù)據(jù)線進行采樣,如果是高電平就寫1,低寫0發(fā)生。
{
DQ=0; //在開始另一個寫周期前必須有1us以上的高電平恢復(fù)期。
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
delay(4);
}
//讀溫度值(低位放tempL;高位放tempH;)
void ReadTemperature(void)
{
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳過讀序列號的操作
WriteOneChar(0x44); //啟動溫度轉(zhuǎn)換
delay(125); //轉(zhuǎn)換需要一點時間,延時
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳過讀序列號的操作
WriteOneChar(0xbe); //讀溫度寄存器(頭兩個值分別為溫度的低位和高位)
tempL=ReadOneChar(); //讀出溫度的低位LSB
tempH=ReadOneChar(); //讀出溫度的高位MSB
if(tempH>0x7f) //最高位為1時溫度是負(fù)
{
tempL=~tempL; //補碼轉(zhuǎn)換,取反加一
tempH=~tempH+1;
fg=0; //讀取溫度為負(fù)時fg=0
}
sdata = tempL/16+tempH*16; //整數(shù)部分
xiaoshu1 = (tempL&0x0f)*10/16; //小數(shù)第一位
xiaoshu2 = (tempL&0x0f)*100/16%10; //小數(shù)第二位
xiaoshu=xiaoshu1*10+xiaoshu2; //小數(shù)兩位
/*
if(fg==0)
{
sdata=sdata-15;
xiaoshu1=xiaoshu1-9;
}
*/
}
void main()
{
TMOD |= 0x01; //開啟定時器0 0x10時使用定時器1 0x11時啟動兩個
TH0=0XFC; //給定時器賦初值,定時1ms TH1
TL0=0X18; //TL1
EA=1; //總中斷打開
ET0=1; //定時器0中斷打開 ET1
TR0=1; //定時器0開關(guān)打開 TR1
while(1)
{
ReadTemperature();
delay_ms(500);
}
}
void Timer0() interrupt 1 //參考上圖 定時器1時為3
{
static uint i; //定義一個自變形變量
TH0=0XFC; //給定時器賦初值,定時1ms TH1
TL0=0X18; //TL1
i++;
if(i==4)
{
i=0;
SEG = 0XFF;
switch(number)
{
case 0:SCAN4=1;SCAN3=0;SCAN2=0;SCAN1=0;SEG=distab[sdata%10];break;
case 1:SCAN4=0;SCAN3=1;SCAN2=0;SCAN1=0;;SEG=distab[sdata/10];break;
case 2:SCAN4=0;SCAN3=0;SCAN2=1;SCAN1=0;SEG=distab[0];break;
case 3:SCAN4=0;SCAN3=0;SCAN2=0;SCAN1=1;;SEG=distab[0];break;
default:break;
}
number++;
if(number>3)number=0;
}
}
審核編輯:湯梓紅
-
傳感器
+關(guān)注
關(guān)注
2561文章
52198瀏覽量
761711 -
溫度測量
+關(guān)注
關(guān)注
0文章
203瀏覽量
28580 -
Proteus
+關(guān)注
關(guān)注
79文章
1692瀏覽量
107902 -
DS18B20
+關(guān)注
關(guān)注
10文章
782瀏覽量
81787
發(fā)布評論請先 登錄
相關(guān)推薦
基于DS18B20和LabVIEW的多點溫度測量系統(tǒng)
DS18B20 數(shù)字溫度計特點

數(shù)字溫度傳感器DS18B20的設(shè)計及應(yīng)用

DS18B20完成溫度檢測的技巧

ds18b20—設(shè)置溫度限制
基于8051的Proteus仿真-1602LCD與DS18B20
基于8051的Proteus仿真-數(shù)碼管與DS18B20設(shè)計溫度
智能溫度傳感器DS18B20的原理與應(yīng)用
Verilog實現(xiàn)DS18B20測量溫度以及LCD屏幕的顯示程序和工程文件

使用proteus實現(xiàn)溫度傳感器DS18B20的仿真資料免費下載

ds18b20的特性_ds18b20溫度傳感器應(yīng)用

評論