C51 DS18B20程序
1、頭文件
- #ifndef _DS18B20_H_
- #define _DS18B20_H_
- #define uchar unsigned char
- #define uint unsigned int
- void DS18B20_Delayus(uint us);
- void DS18B20_reset();
- void DS18B20_write(uchar dat);
- uchar DS18B20_data();
- uint read_temperature();
- #endif
2、C文件
- #include<reg52.h>
- #include<intrins.h>
- #include "DS18B20.h"
- uint TT; //1820溫度變量
- sbit DQ = P2^1;
- uchar table_temp[5];
- uchar temp_comp;
- /*******************************************************************/
- /* */
- /*us級(jí)延時(shí)函數(shù) */
- /* */
- /*******************************************************************/
- void DS18B20_Delayus(uint us)
- {
- while(--us);
- }
- void DS18B20_reset()
- {
- uchar x = 0;
- DQ = 1;
- DS18B20_Delayus(16); //稍做延時(shí)
- DQ = 0; //將DQ拉低
- DS18B20_Delayus(160);//延時(shí)400us~960us
- DQ = 1; //拉高總線
- DS18B20_Delayus(28);//延時(shí)15us~60us
- x = DQ; //如果=0則初始化成功 =1則初始化失敗
- DS18B20_Delayus(40);//延時(shí)60us~240us
- }
- /*******************************************************************/
- /* */
- /* 寫一個(gè)字節(jié) */
- /* */
- /*******************************************************************/
- void DS18B20_write(uchar dat)
- {
- uchar i;
- for(i = 8; i > 0; i--)
- {
- DQ = 0;
- DQ = dat & 0x01;
- DS18B20_Delayus(10);
- DQ = 1;
- dat >>= 1;
- }
- }
- /*******************************************************************/
- /* */
- /* 讀一個(gè)字節(jié) */
- /* */
- /*******************************************************************/
- uchar DS18B20_data()
- {
- uchar i,dat;
- for (i = 8; i > 0; i--)
- {
- DQ = 0; // 給脈沖信號(hào)
- dat >>= 1;
- DQ = 1; // 給脈沖信號(hào)
- if(DQ)
- dat |= 0x80;
- DS18B20_Delayus(8);
- }
- return dat;
- }
- /*******************************************************************/
- /* */
- /* 讀取溫度 */
- /* */
- /*******************************************************************/
- uint read_temperature()
- {
- uchar a,b;
- uint t = 0;
- float tt = 0;
- DS18B20_reset();//DS18B20復(fù)位
- DS18B20_write(0xcc); //跳過(guò)讀序號(hào)列號(hào)的操作
- DS18B20_write(0x44); //啟動(dòng)溫度轉(zhuǎn)換
- DS18B20_reset();//DS18B20復(fù)位
- DS18B20_write(0xcc); //跳過(guò)讀序號(hào)列號(hào)的操作
- DS18B20_write(0xbe); //讀取溫度寄存器
- a = DS18B20_data(); //讀低8位
- b = DS18B20_data(); //讀高8位
- t=b;
- t<<=8;
- t=t|a;
- tt=t*0.0625;
- t= tt*10+0.5; //放大10倍輸出并四舍五入
- return(t);
- }
- void main()
- {
- uchar i_1,tab1,tab2,tab3;
- LCD_init();
- DS18B20_reset();
- LCD_write_com(0x80);
- for(i_1 = 0; i_1 < 5; i_1++)
- LCD_write_data(table[i_1]);
- while(1)
- {
- TT = read_temperature(); //讀溫度
- tab1 = TT / 100;
- table_temp[0] = tab1 + 0x30; // 十位
- tab2= TT / 10 - tab1*10;
- table_temp[1] = tab2 + 0x30; //個(gè)位
- table_temp[2] = '.';
- tab3 = TT - tab1*100 - tab2*10;
- table_temp[3] = tab3 + 0x30; //小數(shù)點(diǎn)一位
- table_temp[4] = 'C'; //顯示溫度符號(hào)℃
- LCD_write_com(0x80+0x06);
- for(i_1 = 0; i_1 < 5; i_1++)
- LCD_write_data(table_temp[i_1]);
- }
- }