用at89c51與ds18b20做數字溫度計proteus怎麼連線仿

2021-09-06 21:08:52 字數 5027 閱讀 9046

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...