1樓:匿名使用者
在proteus中有ds18b20這個元件庫,可以直接呼叫如圖所示。
上圖就是用led顯示檢測問題的的**圖,a表示正,溫度檢測的程式如下,
//飲水槽溫控系統控制程式
//版本號:v1.0;2015.6.19
//溫度感測器:ds18b20
//顯示方式:led
#include
#define uchar unsigned char
sbit keyup=p1^0;
sbit keydn=p1^1;
sbit keymd=p1^2;
sbit out=p3^7; //接控制繼電器
sbit dq = p3^4; //接溫度感測器18b20
uchar t[2],number=0,*pt; //溫度值
uchar tempbuffer1[4]=;
uchar tmax=18,tmin=8;
uchar distab=;
uchar dismod=0,xiaodou1=0,xiaodou2=0,currtemp;
bit flag;
void t0isr() interrupt 1
th0=(65536-5000)/256;
tl0=(65536-5000)%256;
switch(number)
case 0:
p2=0x08;
p0=distab[tempbuffer1[0]];
break;
case 1:
p2=0x04;
p0=distab[tempbuffer1[1]];
break;
case 2:
p2=0x02;
break;
case 3:
p2=0x01;
p0=distab[tempbuffer1[3]];
break;
default:
break;
number++;
if(number>3)number=0;
void delay_18b20(unsigned int i)
while(i--);
/**********ds18b20初始化函式**********************/
void init_ds18b20(void)
bit x=0;
dowhile(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;
//以下程式段消去隨機誤檢查造成的誤判,只有連續12次檢測到溫度超出限制才切換加熱裝置
if(currtemp>tmin)xiaodou1=0;
if(yxiaodou1++;
currtemp=y;
xiaodou2=0;
if(xiaodou1>12)
out=0;
flag=1;
xiaodou1=0;
if(currtempif(y>tmax)
xiaodou2++;
currtemp=y;
xiaodou1=0;
if(xiaodou2>12)
out=1;
flag=0;
xiaodou2=0;
out=flag;
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;
void keyscan( )
uchar keyin;
keyin=p1&0x07;
if(keyin==0x07)return;
else if(keymd==0)
dismod++;
dismod%=3;
while(keymd==0);
switch(dismod)
case 1:
convert(tmax);
tempbuffer1[3]=0x11;
break;
case 2:
convert(tmin);
tempbuffer1[3]=0x12;
break;
default:
break;
else if((keyup==0)&&(dismod==1))
tmax++;
convert(tmax);
while(keyup==0);
else if((keydn==0)&&(dismod==1))
tmax--;
convert(tmax);
while(keydn==0);
else if((keyup==0)&&(dismod==2))
tmin++;
convert(tmin);
while(keyup==0);
else if((keydn==0)&&(dismod==2))
tmin--;
convert(tmin);
while(keydn==0);
xiaodou1=0;
xiaodou2=0;
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();
keyscan();
delay_18b20(30000);
2樓:高店村四組
ds18b20有3個腳,vcc接電源,gnd接地,dq接資料口,是at89c51的一個引腳就可以了,硬體電路非常簡單,這也是ds18b20的巨大優點。重點是c語言程式設計,這個程式你可以網上搜,肯定有的。
怎樣用紅外探測儀做電路,利用AT89C51控制的,就是有人時燈亮,無人時燈滅
紅外探測器 infrared detector 是將入射的紅外輻射訊號轉變成電訊號輸出的器件。你需要根據紅外探測儀輸出的訊號利用at89c51進行控制 也就是微控制器啦 首先,要明確你所選用的紅外探測儀的型別,檢視其說明書的輸出訊號型別和範圍 我是見過輸出電壓訊號的紅外探測儀 根據其訊號輸出範圍要考...
要求用AT89C51微控制器的P1口點亮發光二極體分為兩組
真的是很簡單的,用點心學幾天就可以寫,看到沒人回,幫忙 12m include void timer0 init void main void timer0 isovf interrupt 1 程式如下 絕對沒有錯 led燈的一端接p1口的各各引腳,另一端接地。同時在p1口的每個管腳上加1k的上拉電...
AT89C51微控制器和8051微控制器引腳是否相同?還有哪些相同點
相同,只不過at上多了一些第二功能 理論上是可以的,它包含了8051了。都是51系列的 我現在還用8031的原理相簿呢 肯定是可以的,沒有問題 at89c51微控制器和8051微控制器一樣嗎 mcs 51微控制器是指bai美國intel公司生產的一系列du微控制器的總稱。zhi這一系列包dao含80...