新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 自己寫的AT89C2051電子溫度計

自己寫的AT89C2051電子溫度計

作者: 時間:2016-11-29 來源:網(wǎng)絡(luò) 收藏
筆者用AT89C2051單片機和DS18B20寫了一個3位的電子溫度計,顯示范圍0-125度,不容易啊,學(xué)習(xí)了近一個月終于會自己寫點程序了!現(xiàn)在寫寫時鐘、流水燈什么的基本上我是沒什么問題了,都能在單片機上正常運行!不羅嗦,下面是C程序,附上電路圖:
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit GW=P3^0;
sbit SW=P3^1;
sbit BW=P3^2;
sbit DQ=P3^3;
code uchar NUM[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uint temp_value;
void delay(uchar a)
{
while(a--);
}
void init_DS18B20()
{
uchar b=0;
DQ=1;
delay(8);
DQ=0;
delay(100);
DQ=1;
delay(14);
b=DQ;
delay(20);
}
uchar read(void)
{
uint i, dat=0;
for(i=8;i>0;i--)
{
DQ=1;
_nop_();_nop_();
dat>>=1;
DQ=0;
_nop_();_nop_();_nop_();_nop_();
DQ=1;
_nop_();_nop_();_nop_();_nop_();
if(DQ)
dat|=0x80;
delay(12);
}
DQ=1;
return(dat);
}
void write(uchar dat)
{
uchar d=0;
for(d=8;d>0;d--)
{
DQ=1;
_nop_();_nop_();
DQ=0;
delay(1);
DQ=dat&0x01;
delay(12);
dat=dat/2;
}
DQ=1;
delay(2);
}
void ReadTemp()
{
uint a=0;
uint b=0;
init_DS18B20();
write(0xCC);
write(0x44);
delay(100);

init_DS18B20();
write(0xCC);
write(0xBE);
delay(100);
a=read();
b=read();

temp_value=((b<<8)|a)*0.0625;
}
void display (uchar num0,uchar num1,uchar num2)
{
P1=NUM[num0];
GW=0;
delay(200);
GW=1;
P1=NUM[num1];
SW=0;
delay(200);
SW=1;

P1=NUM[num2];
BW=0;
delay(200);
BW=1;
}
main()
{
uint a ,b,c;
while(1)
{
ReadTemp();
a=temp_value%10;
b=temp_value/10%10;
c=temp_value/100%10;
display(a,b,c);
}
}
完整版本的源代碼下載:http://www.51hei.com/f/ds7865k.rar
下面是硬件原理圖:


本文引用地址:http://m.butianyuan.cn/article/201611/323491.htm


關(guān)鍵詞: AT89C2051電子溫度

評論


技術(shù)專區(qū)

關(guān)閉