ds1820是簡易的溫度傳感器,簡單易用,下面給我大家分享一下,ds18b20的簡易程序
- #include<reg52.H> //單片機(jī)頭文件
- GetTemp(); //聲明引用外部函數(shù)
- externunsigned int idata Temperature; // 聲明引用外部變量
- voiddelay(unsigned int i);
- sbit LS138A=P2^2; //管腳定義
- sbit LS138B=P2^3;
- sbit LS138C=P2^4;
- sbit EN573= P1^3;
- //此表為 LED 的字模, 共陰數(shù)碼管 “01234567899 –”
- unsignedchar code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
- unsignedlong LedOut[5],LedNumVal;
- voidsystem_Ini() //初始化定時器函數(shù),定時一段時間后,重新讀取溫度值
- {
- TMOD= 0x11;
- TH1 = 0xD8; //10
- TL1 = 0xF0;
- IE = 0x8A;
- TR1 = 1;
- }
- main()
- {
- unsigned char i;
- EN573=0;
- system_Ini();
- while(1)
- {
- GetTemp(); //獲取溫度函數(shù),這個函數(shù)再Temp.c 文件中,
- /********以下將讀18b20的數(shù)據(jù)送到LED數(shù)碼管顯示*************/
- LedNumVal=Temperature; //把實際溫度送到LedNumVal變量中
- LedOut[0]=Disp_Tab[LedNumVal%10000/1000];
- LedOut[1]=Disp_Tab[LedNumVal%1000/100];
- LedOut[2]=Disp_Tab[LedNumVal%100/10]; //十位
- LedOut[3]=Disp_Tab[LedNumVal%10]; //個位
-
- for(i=0; i<4; i++)
- {
- P0 = LedOut ;
-
- switch(i)
- { //138譯碼
- case 0:LS138A=0; LS138B=0;LS138C=0; break;
- case 1:LS138A=1; LS138B=0;LS138C=0; break;
- case 2:LS138A=0; LS138B=1;LS138C=0; break;
- case 3:LS138A=1; LS138B=1;LS138C=0; break;
- }
-
- delay(100);
- }
- P0 = 0;
-
- }
- }
- //延時程序
- voiddelay(unsigned int i)
- {
- char j;
- for(i; i > 0; i--)
- for(j = 200; j > 0; j--);
- }
- Temp.c文件
- /*************************此部分為18B20的驅(qū)動程序*********/
- #include <reg52.H>
- #include <intrins.h>
- sbit D18B20=P1^7;
- #define NOP() _nop_() /* 定義空指令 */
- #define _Nop() _nop_() /*定義空指令*/
- void TempDelay (unsigned int idata us);
- void Init18b20 (void); //18B20初始化復(fù)位
- void WriteByte (unsigned char idatawr); //單字節(jié)寫入函數(shù)
- void read_bytes (unsigned char idata j); // 讀出一單字節(jié)函數(shù)
- unsigned char CRC (unsigned char j); // CRC 校驗函數(shù)
- void GemTemp (void);
- void Config18b20 (void); //配置18B20函數(shù)
- void ReadID (void); //讀取器件序列號函數(shù)
- void TemperatuerResult(void); //讀取溫度函數(shù)
- bit flag;
- unsigned int idata Temperature;
- unsigned char idata temp_buff[9]; //存儲讀取的字節(jié),readscratchpad為9字節(jié),readrom ID為8字節(jié)
- unsigned char idata id_buff[8]; //定義器件ID值變量
- unsigned char idata *p,TIM;
- unsigned char idata crc_data;
- unsigned char code CrcTable [256]={
- 0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,
- 157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,
- 35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,
- 190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,
- 70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,
- 219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,
- 101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,
- 248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,
- 140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,
- 17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80, 175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53}; //CRC校驗查詢表
- /************************************************************
- *Function:延時處理
- *parameter:
- *Return:
- *Modify:
- *************************************************************/
- voidTempDelay (unsigned int idata us)
- {
- while(us--);
- }
- /************************************************************
- *Function:18B20初始化
- *parameter:
- *Return:
- *Modify:
- *************************************************************/
- voidInit18b20 (void)
- {
- D18B20=1;
- _nop_();
- D18B20=0;
- TempDelay(530); //delay 530 uS
- _nop_();
- D18B20=1;
- TempDelay(100); //
- _nop_();
- _nop_();
- _nop_();
-
- if(D18B20==0)
- flag = 1; //DS18B20響應(yīng),初始化完成
- else
- flag = 0; //DS18B20初始化失敗
- TempDelay(200);
- _nop_();
- _nop_();
- D18B20= 1;
- }
- /************************************************************
- *Function:向18B20寫入一個字節(jié)
- *parameter:
- *Return:
- *Modify:
- *************************************************************/
- voidWriteByte (unsigned char idata wr) //單字節(jié)寫入
- {
- unsigned char idata i;
- for (i=0;i<8;i++)
- {
- D18B20 = 0;
- _nop_();
- D18B20=wr&0x01;
- TempDelay(3); //delay 45 uS //5
- _nop_();
- _nop_();
- D18B20=1;
- wr >>= 1;
- }
- }
- /************************************************************
- *Function:讀18B20的一個字節(jié)
- *parameter:
- *Return:
- *Modify:
- *************************************************************/
- unsignedchar ReadByte (void) //讀取單字節(jié)
- {
- unsigned char idata i,u=0;
- for(i=0;i<8;i++)
- {
- D18B20 = 0;
- u >>= 1;
- D18B20 = 1;
- if(D18B20==1)
- u |= 0x80;
- TempDelay (2);
- _nop_();
- }
- return(u);
- }
- /************************************************************
- *Function:讀18B20多個字節(jié),讀取j 個字節(jié)
- *parameter: j
- *Return:
- *Modify:
- *************************************************************/
- voidread_bytes (unsigned char idata j)
- {
- unsigned char idata i;
- for(i=0;i<j;i++)
- {
- *p = ReadByte();
- p++;
- }
- }
- /************************************************************
- *Function:CRC校驗
- *parameter:
- *Return:
- *Modify:
- *************************************************************/
- unsignedchar CRC (unsigned char j)
- {
- unsignedchar idata i,crc_data=0;
- for(i=0;i<j;i++) //查表校驗
- crc_data= CrcTable[crc_data^temp_buff];
- return (crc_data);
- }
- /************************************************************
- *Function:讀取溫度
- *parameter:
- *Return:
- *Modify:
- *************************************************************/
- voidGemTemp (void)
- {
- read_bytes (9);
- if (CRC(9)==0) //校驗正確
- {
- Temperature = temp_buff[1]*0x100 + temp_buff[0];
- // Temperature *= 0.625;
- Temperature /= 16;
- TempDelay(1);
- }
- }
- /************************************************************
- *Function:內(nèi)部配置
- *parameter:
- *Return:
- *Modify:
- *************************************************************/
- voidConfig18b20 (void) //重新配置報警限定值和分辨率
- {
- Init18b20(); //復(fù)位18B20
- WriteByte(0xcc); //skiprom 如果總線上只有一個18B20,就可使用此命令,
- WriteByte(0x4e); //0x4e 這個指令時接下來向DS18B20寫三個字節(jié)數(shù)據(jù),分別是:
- //寫暫存器第2、3和4字節(jié)的數(shù)據(jù)(即TH,TL和配置寄存器)
- WriteByte(0x19); //上限
- WriteByte(0x1a); //下限
- WriteByte(0x7f); //set 12bit (0.125) 轉(zhuǎn)換精度
- Init18b20();
- WriteByte(0xcc); //skiprom
- WriteByte(0x48); //保存設(shè)定值,將暫存器中的TH,TL和配置字節(jié)
- //復(fù)制到EPPROM中
- Init18b20();
- WriteByte(0xcc); //skip rom
- WriteByte(0xb8); //回調(diào)設(shè)定值,將TH,TL和配置字節(jié)從EPPROM讀回至?xí)捍嫫髦?br />
- }
- /************************************************************
- *Function:讀18B20ID
- *parameter:
- *Return:
- *Modify:
- *************************************************************/
- voidReadID (void)//讀取器件id
- {
- Init18b20();
- WriteByte(0x33); //read rom 指令
- read_bytes(8); //讀取器件ID指令
- }
- /************************************************************
- *Function:讀取18B20溫度值
- 說明一下:我們再例程里只讀取溫度值,其他功能暫時不演示,其他功能只需要添加就可以
- 現(xiàn)在我們將其他代碼屏蔽掉,如果需要恢復(fù)相應(yīng)功能即可。
- *************************************************************/
- voidTemperatuerResult(void)
- {
- // p = id_buff;
- // ReadID();
- Config18b20();
- Init18b20 ();
- WriteByte(0xcc); //skip rom
- //WriteByte(0x44); //Temperature convert
- TempDelay(7000) ;
- Init18b20 ();
- WriteByte(0xcc); //skip rom
- WriteByte(0xbe); //read Temperature
- p = temp_buff;
- GemTemp();
- }
- voidGetTemp() //
- {
- if(TIM==100) //每隔 1000ms讀取溫度
- { TIM=0;
- TemperatuerResult();
- }
- }
- /*************************************
- [t1 (10ms)中斷]中斷,初始化函數(shù)在TemMain.c文件中
- *************************************/
- voidT1zd(void) interrupt 3
- {
- TH1 = 0xD8; //10
- TL1 = 0xF0;
- TIM++;
- }
復(fù)制代碼
|