視頻教程:https://www.bilibili.com/video/BV1bf4y1U7ff
傳感器基本概念
1、按傳感器的物理量分類(lèi):可分為位移、溫度、速度、流量、力、氣體成份等傳感器。 2、按傳感器工作原理分類(lèi):可分為電阻、電感、光柵、電壓、電容、霍爾、光電、熱電偶等傳感器。 3、按傳感器輸出信號(hào)的性質(zhì)分類(lèi):可分為:輸出為開(kāi)關(guān)量“1”和"0”或“開(kāi)”和“關(guān)”的開(kāi)關(guān)型傳感器;輸出為模擬型傳感器;輸出為脈沖或代碼的數(shù)字型傳感器。
#include "reg52.h" //此文件中定義了單片機(jī)的一些特殊功能寄存器
#define uchar unsigned char
#define uint unsigned int
typedef unsigned int u16; //對(duì)數(shù)據(jù)類(lèi)型進(jìn)行聲明定義
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ù)傳輸線(xiàn)接單片機(jī)的相應(yīng)的引腳
unsigned char tempL=0; //設(shè)全局變量
unsigned char tempH=0;
unsigned int sdata; //測(cè)量到的溫度的整數(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); //稍延時(shí)
DQ=0; //發(fā)送復(fù)位脈沖
delay(80); //延時(shí)(>480us)
DQ=1; //拉高數(shù)據(jù)線(xiàn)
delay(5); //等待(15~60us)
x=DQ; //用X的值來(lái)判斷初始化有沒(méi)有成功,18B20存在的話(huà)X=0,否則X=1
delay(20);
}
//讀一個(gè)字節(jié)
ReadOneChar(void) //主機(jī)數(shù)據(jù)線(xiàn)先從高拉至低電平1us以上,再使數(shù)據(jù)線(xiàn)升為高電平,從而產(chǎn)生讀信號(hào)
{
unsigned char i=0; //每個(gè)讀周期最短的持續(xù)時(shí)間為60us,各個(gè)讀周期之間必須有1us以上的高電平恢復(fù)期
unsigned char dat=0;
for (i=8;i>0;i--) //一個(gè)字節(jié)有8位
{
DQ=1;
delay(1);
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
//寫(xiě)一個(gè)字節(jié)
void WriteOneChar(unsigned char dat)
{
unsigned char i=0; //數(shù)據(jù)線(xiàn)從高電平拉至低電平,產(chǎn)生寫(xiě)起始信號(hào)。15us之內(nèi)將所需寫(xiě)的位送到數(shù)據(jù)線(xiàn)上,
for(i=8;i>0;i--) //在15~60us之間對(duì)數(shù)據(jù)線(xiàn)進(jìn)行采樣,如果是高電平就寫(xiě)1,低寫(xiě)0發(fā)生。
{
DQ=0; //在開(kāi)始另一個(gè)寫(xiě)周期前必須有1us以上的高電平恢復(fù)期。
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
delay(4);
}
//讀溫度值(低位放tempL;高位放tempH;)
void ReadTemperature(void)
{
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳過(guò)讀序列號(hào)的操作
WriteOneChar(0x44); //啟動(dòng)溫度轉(zhuǎn)換
delay(125); //轉(zhuǎn)換需要一點(diǎn)時(shí)間,延時(shí)
Init_DS18B20(); //初始化
WriteOneChar(0xcc); //跳過(guò)讀序列號(hào)的操作
WriteOneChar(0xbe); //讀溫度寄存器(頭兩個(gè)值分別為溫度的低位和高位)
tempL=ReadOneChar(); //讀出溫度的低位LSB
tempH=ReadOneChar(); //讀出溫度的高位MSB
if(tempH>0x7f) //最高位為1時(shí)溫度是負(fù)
{
tempL=~tempL; //補(bǔ)碼轉(zhuǎn)換,取反加一
tempH=~tempH+1;
fg=0; //讀取溫度為負(fù)時(shí)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; //開(kāi)啟定時(shí)器0 0x10時(shí)使用定時(shí)器1 0x11時(shí)啟動(dòng)兩個(gè)
TH0=0XFC; //給定時(shí)器賦初值,定時(shí)1ms TH1
TL0=0X18; //TL1
EA=1; //總中斷打開(kāi)
ET0=1; //定時(shí)器0中斷打開(kāi) ET1
TR0=1; //定時(shí)器0開(kāi)關(guān)打開(kāi) TR1
while(1)
{
ReadTemperature();
delay_ms(500);
}
}
void Timer0() interrupt 1 //參考上圖 定時(shí)器1時(shí)為3
{
static uint i; //定義一個(gè)自變形變量
TH0=0XFC; //給定時(shí)器賦初值,定時(shí)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)注
2551文章
51097瀏覽量
753527 -
溫度測(cè)量
+關(guān)注
關(guān)注
0文章
199瀏覽量
28248 -
Proteus
+關(guān)注
關(guān)注
79文章
1692瀏覽量
106575 -
DS18B20
+關(guān)注
關(guān)注
10文章
779瀏覽量
80858
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論