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

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

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型微控制器與ds18b20感測器和mq 2煙霧

1 節氣門位置感測器 作用 節氣門位置感測器是監測節氣門開啟角度的大小,確定怠速,全負荷及加減速工況,以實施與節氣門開度狀態 相對應的各種噴油量控制。失效影響 怠速忽高忽低,或造成飛車現象。2 進氣門壓力感測器 作用 進氣壓力感測器是提供發動機負荷資訊,即通 遇對進氣管的壓力測量,間接測量進入發動機...

用AT89C51微控制器實現直流電機PWM調速原理圖

摘要 abstract 1 概述1 1.1 直流調速系統國內外發展現狀及發展趨勢11.2 直流調速系統的可控直流電源2 1.3 課題研究的意義和目的3 1.4 主要設計技術指標要求4 2 單閉環直流調速系統5 2.1 單閉環直流調速系統5 2.2 閉環系統靜特性7 2.3 比例積分單閉環脈寬控制系統...

用AT89C51微控制器的定時器0以工作方式2計數,每計數100次,中斷方式將COUNT單元加

include define uchar unsigned charuchar count void t0isr interrupt 1main count equ 30h org 0000h sjmp start org 000bh inc count reti start mov tmod,06...