|
基于ds18b20的溫度計(jì):
【實(shí)驗(yàn)57】溫度計(jì)DS18B20.zip
(20.04 KB, 下載次數(shù): 12)
2017-4-13 19:06 上傳
點(diǎn)擊文件名下載附件
- /*********************************************************************************
- * 【編寫時(shí)間】: 2014年3月5日
- * 【作 者】: 清翔電子:03
- * 【版 本】: 1.0
- * 【實(shí)驗(yàn)平臺(tái)】: QX-MCS51 單片機(jī)開發(fā)板
- * 【外部晶振】: 11.0592mhz
- * 【主控芯片】: STC89C52
- * 【編譯環(huán)境】: Keil μVisio3
- * 【程序功能】: 實(shí)時(shí)采集當(dāng)前環(huán)境溫度值,并顯示于數(shù)碼管上
- * 【使用說明】:
- * 說明:免費(fèi)開源,不提供源代碼分析.
- **********************************************************************************/
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit DS=P2^2; //define interface
- uint temp; // variable of temperature
- uchar flag1; // sign of the result positive or negative
- sbit dula=P2^6;
- sbit wela=P2^7;
- unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
- 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
- unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
- 0x87,0xff,0xef};
- void delay(uint count) //delay
- {
- uint i;
- while(count)
- {
- i=200;
- while(i>0)
- i--;
- count--;
- }
- }
- void dsreset(void) //send reset and initialization command
- {
- uint i;
- DS=0;
- i=103;
- while(i>0)i--;
- DS=1;
- i=4;
- while(i>0)i--;
- }
- bit tmpreadbit(void) //read a bit
- {
- uint i;
- bit dat;
- DS=0;i++; //i++ for delay
- DS=1;i++;i++;
- dat=DS;
- i=8;while(i>0)i--;
- return (dat);
- }
- uchar tmpread(void) //read a byte date
- {
- uchar i,j,dat;
- dat=0;
- for(i=1;i<=8;i++)
- {
- j=tmpreadbit();
- dat=(j<<7)|(dat>>1); //讀出的數(shù)據(jù)最低位在最前面,這樣剛好一個(gè)字節(jié)在DAT里
- }
- return(dat);
- }
- void tmpwritebyte(uchar dat) //write a byte to ds18b20
- {
- uint i;
- uchar j;
- bit testb;
- for(j=1;j<=8;j++)
- {
- testb=dat&0x01;
- dat=dat>>1;
- if(testb) //write 1
- {
- DS=0;
- i++;i++;
- DS=1;
- i=8;while(i>0)i--;
- }
- else
- {
- DS=0; //write 0
- i=8;while(i>0)i--;
- DS=1;
- i++;i++;
- }
- }
- }
- void tmpchange(void) //DS18B20 begin change
- {
- dsreset();
- delay(1);
- tmpwritebyte(0xcc); // address all drivers on bus
- tmpwritebyte(0x44); // initiates a single temperature conversion
- }
- uint tmp() //get the temperature
- {
- float tt;
- uchar a,b;
- dsreset();
- delay(1);
- tmpwritebyte(0xcc);
- tmpwritebyte(0xbe);
- a=tmpread();
- b=tmpread();
- temp=b;
- temp<<=8; //two byte compose a int variable
- temp=temp|a;
- tt=temp*0.0625;
- temp=tt*10+0.5;
- return temp;
- }
- void display(uint temp) //顯示程序
- {
- uchar A1,A2,A2t,A3;
- A1=temp/100;
- A2t=temp%100;
- A2=A2t/10;
- A3=A2t%10;
- dula=0;
- P0=table[A1]; //顯示百位
- dula=1;
- dula=0;
- wela=0;
- P0=0xfe;
- wela=1;
- wela=0;
- delay(1);
- dula=0;
- P0=table1[A2]; //顯示十位
- dula=1;
- dula=0;
- wela=0;
- P0=0xfd;
- wela=1;
- wela=0;
- delay(1);
- dula=0;
- P0=table[A3]; //顯示個(gè)位
- dula=1;
- dula=0;
- wela=0;
- P0=0xfb;
- wela=1;
- wela=0;
- delay(1);
- }
- void main()
- {
- uchar a;
- do
- {
- tmpchange();
- for(a=10;a>0;a--)
- {
- display(tmp());
- }
- } while(1);
- }
復(fù)制代碼
|
|