|
單片機(jī)DS18B20溫度傳感器
- ////////////////////////////////////////////////////////////////////////////
- // 給力者單片機(jī)開(kāi)發(fā)學(xué)習(xí)系統(tǒng),開(kāi)發(fā)學(xué)習(xí)都給力! //
- ////////////////////////////////////////////////////////////////////////////
- // 學(xué)習(xí)51單片機(jī),其實(shí)可以很簡(jiǎn)單 //
- ////////////////////////////////////////////////////////////////////////////
- // 寧波芯動(dòng)電子有限公司 //
- ////////////////////////////////////////////////////////////////////////////
- #include <AT89X52.h> //調(diào)用51單片機(jī)的頭文件
- #include <Intrins.h>
- //---------------------------------------
- //1602液晶相關(guān)I/O設(shè)置
- sbit E=P2^3; //1602液晶的E腳接在P2.3口上
- sbit RW=P2^4; //1602液晶的RW腳接在P2.4口上
- sbit RS=P2^5; //1602液晶的RS腳接在P2.5口上
- //---------------------------------------
- sbit ds18b20=P3^7;
- //---------------------------------------
- //1602液晶寄存器設(shè)置
- unsigned char DISbuf; //設(shè)置8位的unsigend char型寄存器用來(lái)暫存1602要顯示的內(nèi)容
- //---------------------------------------
-
-
- unsigned char temp1;
- unsigned char temp2;
- unsigned char temp1buf1;
- unsigned char temp1buf2;
- bit tc;
- bit no;
- unsigned char code tablexiao[16]={0,0,1,2,2,3,4,4,5,6,6,7,8,8,9,9};
- //---------------------------------------
- //名稱(chēng):延時(shí)函數(shù)
- //適用:給力者GL9單片機(jī)開(kāi)發(fā)學(xué)習(xí)系統(tǒng)
- //公司:寧波芯動(dòng)電子有限公司
- //日期:20120916
- //---------------------------------------
- void Delay(unsigned int nTimeDelay)
- {
- unsigned int i;
- while (nTimeDelay--)
- for (i=0;i<125;i++)
- {}
- }
- //---------------------------------------
- //名稱(chēng):復(fù)位DS18B20函數(shù)
- //適用:給力者GL9單片機(jī)開(kāi)發(fā)學(xué)習(xí)系統(tǒng)
- //公司:寧波芯動(dòng)電子有限公司
- //日期:20120916
- //---------------------------------------
- void Reset()
- {
- unsigned int i;
-
- ds18b20=0; //拉低DQ總線開(kāi)始復(fù)位
- i=206;
- while(i>0)
- i--; //保持DQ低大約900uS
- ds18b20=1; //釋放DQ位
- i=8;
- while(i>0)
- i--;
- }
- //---------------------------------------
- //名稱(chēng):等待芯片應(yīng)答信號(hào)函數(shù)
- //適用:給力者GL9單片機(jī)開(kāi)發(fā)學(xué)習(xí)系統(tǒng)
- //公司:寧波芯動(dòng)電子有限公司
- //日期:20120916
- //---------------------------------------
- bit WaitPresence()
- {
- unsigned char i;
- bit k;
- i=16;
- while(i>0)
- i--;
-
- if(ds18b20==0)
- k=1;
- else
- k=0;
- i=72;
- while(i>0)
- i--;
- return k;
-
- }
- //---------------------------------------
- //名稱(chēng):讀一位數(shù)據(jù)函數(shù)
- //適用:給力者GL9單片機(jī)開(kāi)發(fā)學(xué)習(xí)系統(tǒng)
- //公司:寧波芯動(dòng)電子有限公司
- //日期:20120916
- //---------------------------------------
- bit ReadBit()
- {
- unsigned int i;
- bit dat;
- ds18b20=0;
- i++;
-
- ds18b20=1;
- i+=2;
-
- dat=ds18b20;
- i=16;
- while(i>0)
- i--;
- return dat;
- }
- //---------------------------------------
- //名稱(chēng):讀一字節(jié)函數(shù)
- //適用:給力者GL9單片機(jī)開(kāi)發(fā)學(xué)習(xí)系統(tǒng)
- //公司:寧波芯動(dòng)電子有限公司
- //日期:20120916
- //---------------------------------------
- unsigned char ReadByte()
- {
- unsigned char i,j,dat;
- dat=0;
- for(i=1;i<=8;i++)
- {
- j=ReadBit();
- dat=(j<<7) | (dat>>1);
- }
- return dat;
- }
- //---------------------------------------
- //名稱(chēng):寫(xiě)一字節(jié)函數(shù)
- //適用:給力者GL9單片機(jī)開(kāi)發(fā)學(xué)習(xí)系統(tǒng)
- //公司:寧波芯動(dòng)電子有限公司
- //日期:20120916
- //---------------------------------------
- void WriteByte(unsigned char dat)
- {
- unsigned int i;
- unsigned char j;
- bit testb;
- for(j=1;j<=8;j++)
- {
- testb=dat & 0x01;
- dat=dat>>1;
- if(testb)
- {
- ds18b20=0;
- i+=2;
-
- ds18b20=1;
- i=8;
- while(i>0)
- i--;
- }
- else
- {
- ds18b20=0;
- i=8;
- while(i>0)
- i--;
-
- ds18b20=1;
- i+=2;
- }
- }
- }
- //---------------------------------------
- //名稱(chēng):DS18B20溫度轉(zhuǎn)換函數(shù)
- //適用:給力者GL9單片機(jī)開(kāi)發(fā)學(xué)習(xí)系統(tǒng)
- //公司:寧波芯動(dòng)電子有限公司
- //日期:20120916
- //---------------------------------------
- bit Convert()
- {
- Reset();
- if(WaitPresence()==1)
- {
- Delay(1);
- WriteByte(0xcc);//skip rom
- WriteByte(0x44);//convert
- return 1;
- }
- else
- {
- return 0;
- }
- }
- //---------------------------------------
- //名稱(chēng):轉(zhuǎn)換結(jié)束處理函數(shù)
- //適用:給力者GL9單片機(jī)開(kāi)發(fā)學(xué)習(xí)系統(tǒng)
- //公司:寧波芯動(dòng)電子有限公司
- //日期:20120916
- //---------------------------------------
- bit ReadFlash()
- {
- unsigned char nLsb,nMsb;
- Reset();
- if(WaitPresence()==1)
- {
- Delay(1);
- WriteByte(0xcc);//skip rom
- WriteByte(0xbe);//convert
- nLsb=ReadByte();//LSB
- nMsb=ReadByte();//MSB
- if(no==1) return 1;
- temp2=nLsb&0x0f;
- temp1=(nLsb>>4)|(nMsb<<4);
- return 1;
- }
- else
- {
- return 0;
- }
- }
- //---------------------------------------
- //名稱(chēng):1602液晶忙檢測(cè)函數(shù)
- //適用:給力者GL9單片機(jī)開(kāi)發(fā)學(xué)習(xí)系統(tǒng)
- //公司:寧波芯動(dòng)電子有限公司
- //日期:20120916
- //---------------------------------------
- void LCD1602_busy(void)
- {
- P0_7=1; //將P0.7置1,為讀狀態(tài)做準(zhǔn)備
- RS=0; //RS=0、RW=1、E=1時(shí),忙信號(hào)輸出到DB7,由P0.7讀入
- RW=1; //RS=0、RW=1、E=1時(shí),忙信號(hào)輸出到DB7,由P0.7讀入
- E=1; //RS=0、RW=1、E=1時(shí),忙信號(hào)輸出到DB7,由P0.7讀入
- while(P0_7==1); //由P0.7讀入1,表示1602液晶忙,需要等待
- E=0; //讀完以后,恢復(fù)E的電平
- }
- //---------------------------------------
- //名稱(chēng):1600寫(xiě)命令函數(shù)
- //適用:給力者GL9單片機(jī)開(kāi)發(fā)學(xué)習(xí)系統(tǒng)
- //公司:寧波芯動(dòng)電子有限公司
- //日期:20120916
- //---------------------------------------
- void LCD1602_Write_com(unsigned char combuf)
- {
- RS=0; //選擇指令寄存器
- RW=0; //選擇寫(xiě)狀態(tài)
- P0=combuf; //將命令字通過(guò)P0口送至DB
- E=1; //E高電平將命令字寫(xiě)入1602液晶
- E=0; //寫(xiě)完以后,恢復(fù)E的電平
- }
- //---------------------------------------
- //名稱(chēng):1602寫(xiě)命令函數(shù)(帶忙檢測(cè))
- //適用:給力者GL9單片機(jī)開(kāi)發(fā)學(xué)習(xí)系統(tǒng)
- //公司:寧波芯動(dòng)電子有限公司
- //日期:20120916
- //---------------------------------------
- void LCD1602_Write_com_busy(unsigned char combuf)
- {
- LCD1602_busy(); //調(diào)用忙檢測(cè)函數(shù)
- LCD1602_Write_com(combuf); //調(diào)用忙檢測(cè)函數(shù)
- }
- //---------------------------------------
- //名稱(chēng):1602寫(xiě)數(shù)據(jù)函數(shù)(帶忙檢測(cè))
- //適用:給力者GL9單片機(jī)開(kāi)發(fā)學(xué)習(xí)系統(tǒng)
- //公司:寧波芯動(dòng)電子有限公司
- //日期:20120916
- //---------------------------------------
- void LCD1602_Write_data_busy(unsigned char databuf)
- {
- LCD1602_busy(); //調(diào)用忙檢測(cè)函數(shù)
- RS=1; //選擇數(shù)據(jù)寄存器
- RW=0; //選擇寫(xiě)狀態(tài)
- P0=databuf; //將命令字通過(guò)P0口送至DB
- E=1; //E高電平將命令字寫(xiě)入1602液晶
- E=0; //寫(xiě)完以后,恢復(fù)E的電平
- }
- //---------------------------------------
- //名稱(chēng):1602液晶顯示地址寫(xiě)函數(shù)
- //適用:給力者GL9單片機(jī)開(kāi)發(fā)學(xué)習(xí)系統(tǒng)
- //公司:寧波芯動(dòng)電子有限公司
- //日期:20120916
- //---------------------------------------
- void LCD1602_Write_address(unsigned char x,unsigned char y)
- {
- x&=0x0f; //列地址限制在0-15間
- y&=0x01; //行地址限制在0-1間
- if(y==0) //如果是第一行
- LCD1602_Write_com_busy(x|0x80); //將列地址寫(xiě)入
- else //如果是第二行
- LCD1602_Write_com_busy((x+0x40)|0x80); //將列地址寫(xiě)入
- }
- //---------------------------------------
- //名稱(chēng):1602液晶初始化函數(shù)
- //適用:給力者GL9單片機(jī)開(kāi)發(fā)學(xué)習(xí)系統(tǒng)
- //公司:寧波芯動(dòng)電子有限公司
- //日期:20120916
- //---------------------------------------
- void LCD1602_init(void)
- {
- Delay(150); //調(diào)用延時(shí)函數(shù)
- LCD1602_Write_com(0x38); //8位數(shù)據(jù)總線,兩行顯示模式,5*7點(diǎn)陣顯示
- Delay(50); //調(diào)用延時(shí)函數(shù)
- LCD1602_Write_com(0x38); //8位數(shù)據(jù)總線,兩行顯示模式,5*7點(diǎn)陣顯示
- Delay(50); //調(diào)用延時(shí)函數(shù)
- LCD1602_Write_com(0x38); //8位數(shù)據(jù)總線,兩行顯示模式,5*7點(diǎn)陣顯示
- LCD1602_Write_com_busy(0x38); //8位數(shù)據(jù)總線,兩行顯示模式,5*7點(diǎn)陣顯示
- LCD1602_Write_com_busy(0x08); //顯示功能關(guān),無(wú)光標(biāo)
- LCD1602_Write_com_busy(0x01); //清屏
- LCD1602_Write_com_busy(0x06); //寫(xiě)入新的數(shù)據(jù)后,光標(biāo)右移,顯示屏不移動(dòng)
- LCD1602_Write_com_busy(0x0C); //顯示功能開(kāi),無(wú)光標(biāo)
- }
- //---------------------------------------
- //名稱(chēng):1602液晶指定地址顯示函數(shù)
- //適用:給力者GL9單片機(jī)開(kāi)發(fā)學(xué)習(xí)系統(tǒng)
- //公司:寧波芯動(dòng)電子有限公司
- //日期:20120916
- //---------------------------------------
- void LCD1602_Disp(unsigned char x,unsigned char y,unsigned char buf)
- {
- LCD1602_Write_address(x,y); //先將地址信息寫(xiě)入
- LCD1602_Write_data_busy(buf); //再寫(xiě)入要顯示的數(shù)據(jù)
- }
- //---------------------------------------
- //名稱(chēng): 主函數(shù)
- //適用:給力者GL9單片機(jī)開(kāi)發(fā)學(xué)習(xí)系統(tǒng)
- //公司:寧波芯動(dòng)電子有限公司
- //日期:20120916
- //---------------------------------------
- void main(void) //主函數(shù),單片機(jī)開(kāi)機(jī)后就是從這個(gè)函數(shù)開(kāi)始運(yùn)行
- {
- unsigned char buf;
- LCD1602_init(); //調(diào)用1602液晶初始化函數(shù)
- while(1) //死循環(huán),單片機(jī)初始化后,將一直運(yùn)行這個(gè)死循環(huán)
- {
- tc=Convert(); //啟動(dòng)轉(zhuǎn)換
- if(tc==1) //轉(zhuǎn)換結(jié)束
- {
- ReadFlash(); //讀取溫度
- if(temp1>80) temp1=0;
- if(temp2>15) temp2=0;
- buf=temp1/10;
- buf+=0x30;
- LCD1602_Disp(0,0,buf); //溫度整數(shù)部分十位
- buf=temp1%10;
- buf+=0x30;
- LCD1602_Disp(1,0,buf); //溫度整數(shù)部分個(gè)位
- LCD1602_Disp(2,0,0x2e); //.
- buf=tablexiao[temp2&0x0f];
- buf+=0x30;
- LCD1602_Disp(3,0,buf); //溫度小數(shù)部分
- LCD1602_Disp(4,0,0xdf); //.
- LCD1602_Disp(5,0,0x43); //C
- }
- }
- }
復(fù)制代碼
|
-
-
DS18B20溫度傳感器.rar
2015-11-25 16:14 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
22.59 KB, 下載次數(shù): 13, 下載積分: 黑幣 -5
DS18B20溫度傳感器
評(píng)分
-
查看全部評(píng)分
|