|
我寫的程序:
- #include<reg52.h>
- sbit DSPORT=P3^7;
- typedef unsigned char uchar;
- typedef unsigned int uint;
- uchar code Smgxs[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
- uchar Smgwz[4]={0x01,0x02,0x04,0x08};
- uchar buf[4];
- void Delay1ms(uint y)
- {
- uint x;
- for( ; y>0; y--)
- {
- for(x=110; x>0; x--);
- }
- }
- /*******************************************************************************
- * 函 數(shù) 名 : Ds18b20Init
- * 函數(shù)功能 : 初始化
- * 輸 入 : 無
- * 輸 出 : 初始化成功返回1,失敗返回0
- *******************************************************************************/
- uchar Ds18b20Init()
- {
- uchar i;
- DSPORT = 0; //將總線拉低480us~960us
- i = 70;
- while(i--);//延時642us
- DSPORT = 1; //然后拉高總線,如果DS18B20做出反應(yīng)會將在15us~60us后總線拉低
- i = 0;
- while(DSPORT) //等待DS18B20拉低總線
- {
- Delay1ms(1);
- i++;
- if(i>5)//等待>5MS
- {
- return 0;//初始化失敗
- }
-
- }
- return 1;//初始化成功
- }
- /*******************************************************************************
- * 函 數(shù) 名 : Ds18b20WriteByte
- * 函數(shù)功能 : 向18B20寫入一個字節(jié)
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void Ds18b20WriteByte(uchar dat)
- {
- uint i, j;
- for(j=0; j<8; j++)
- {
- DSPORT = 0; //每寫入一位數(shù)據(jù)之前先把總線拉低1us
- i++;
- DSPORT = dat & 0x01; //然后寫入一個數(shù)據(jù),從最低位開始
- i=6;
- while(i--); //延時68us,持續(xù)時間最少60us
- DSPORT = 1; //然后釋放總線,至少1us給總線恢復(fù)時間才能接著寫入第二個數(shù)值
- dat >>= 1;
- }
- }
- /*******************************************************************************
- * 函 數(shù) 名 : Ds18b20ReadByte
- * 函數(shù)功能 : 讀取一個字節(jié)
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- uchar Ds18b20ReadByte()
- {
- uchar byte, bi;
- uint i, j;
- for(j=8; j>0; j--)
- {
- DSPORT = 0;//先將總線拉低1us
- i++;
- DSPORT = 1;//然后釋放總線
- i++;
- i++;//延時6us等待數(shù)據(jù)穩(wěn)定
- bi = DSPORT; //讀取數(shù)據(jù),從最低位開始讀取
- /*將byte左移一位,然后與上右移7位后的bi,注意移動之后移掉那位補0。*/
- byte = (byte >> 1) | (bi << 7);
- i = 4; //讀取完之后等待48us再接著讀取下一個數(shù)
- while(i--);
- }
- return byte;
- }
- /*******************************************************************************
- * 函 數(shù) 名 : Ds18b20ChangTemp
- * 函數(shù)功能 : 讓18b20開始轉(zhuǎn)換溫度
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void Ds18b20ChangTemp()
- {
- Ds18b20Init();
- Delay1ms(1);
- Ds18b20WriteByte(0xcc); //跳過ROM操作命令
- Ds18b20WriteByte(0x44); //溫度轉(zhuǎn)換命令
- //Delay1ms(100); //等待轉(zhuǎn)換成功,而如果你是一直刷著的話,就不用這個延時了
- }
- /*******************************************************************************
- * 函 數(shù) 名 : Ds18b20ReadTempCom
- * 函數(shù)功能 : 發(fā)送讀取溫度命令
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void Ds18b20ReadTempCom()
- {
- Ds18b20Init();
- Delay1ms(1);
- Ds18b20WriteByte(0xcc); //跳過ROM操作命令
- Ds18b20WriteByte(0xbe); //發(fā)送讀取溫度命令
- }
- /*******************************************************************************
- * 函 數(shù) 名 : Ds18b20ReadTemp
- * 函數(shù)功能 : 讀取溫度
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- int Ds18b20ReadTemp()
- {
- int temp = 0;
- uchar tmh, tml;
- Ds18b20ChangTemp(); //先寫入轉(zhuǎn)換命令
- Ds18b20ReadTempCom(); //然后等待轉(zhuǎn)換完后發(fā)送讀取溫度命令
- tml = Ds18b20ReadByte(); //讀取溫度值共16位,先讀低字節(jié)
- tmh = Ds18b20ReadByte(); //再讀高字節(jié)
- temp = tmh;
- temp <<= 8;
- temp |= tml;
- return temp;
- }
- void datapros(int temp) //數(shù)據(jù)處理
- {
- float tp;
- if(temp<0)
- {
- buf[0]=0xdf;
- temp=temp-1;
- temp=~temp;
- tp=temp;
- temp=tp*0.0625*100+0.5;
- }
- else
- {
- buf[0]=0xff;
- tp=temp;
- temp=tp*0.0625*100+0.5;
- }
- buf[1]=temp/1000;
- buf[2]=temp/100%10;
- buf[3]=temp/10%10;
- }
- void display() //數(shù)碼管顯示
- {
- uchar i;
- for(i=0;i<4;i++)
- {
- uchar j=500;
- P2=Smgwz[i];
- if(i==2)
- {
- P0=Smgxs[buf[i]]|0x7f;
- }
- else
- {
- P0=Smgxs[buf[i]];
- }
- while(j--);
- }
- }
- void main()
- {
- while(1)
- {
- datapros(Ds18b20ReadTemp());
- display();
- }
- }
復(fù)制代碼 |
|