|
- #include<reg52.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit DATA = P3^7; //DS18B20接入口
- uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
- char bai,shi,ge; //定義變量
- /*延時子函數(shù)*/
- void delay(uint num)
- {
- while(num--) ;
- }
- /*************DS18b20溫度傳感器函數(shù)*********************/
- Init_DS18B20(void) //傳感器初始化
- {
- uchar x=0;
- DATA = 1; //DQ復(fù)位
- delay(10); //稍做延時
- DATA = 0; //單片機(jī)將DQ拉低
- delay(80); //精確延時 大于 480us //450
- DATA = 1; //拉高總線
- delay(20);
- x=DATA; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
- delay(30);
- }
- //讀一個字節(jié)
- ReadOneChar(void)
- {
- uchar i=0;
- uchar dat = 0;
- for (i=8;i>0;i--)
- {
- DATA = 0; // 給脈沖信號
- dat>>=1;
- DATA = 1; // 給脈沖信號
- if(DATA)
- dat|=0x80;
- delay(8);
- }
- return(dat);
- }
- //寫一個字節(jié)
- WriteOneChar(unsigned char dat)
- {
- uchar i=0;
- for (i=8; i>0; i--)
- {
- DATA = 0;
- DATA = dat&0x01;
- delay(10);
- DATA = 1;
- dat>>=1;
- }
- delay(8);
- }
- //讀取溫度
- int ReadTemperature(void)
- {
- uchar a=0;
- uchar b=0;
- int t=0;
- float tt=0;
- Init_DS18B20();
- WriteOneChar(0xCC); // 跳過讀序號列號的操作
- WriteOneChar(0x44); // 啟動溫度轉(zhuǎn)換
- Init_DS18B20();
- WriteOneChar(0xCC); //跳過讀序號列號的操作
- WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度
- a=ReadOneChar();//低位
- b=ReadOneChar();//高位
- t=b;
- t<<=8;
- t=t|a;
- tt=t*0.0625;
- t= tt*10+0.5;
- return(t);
- }
- /*顯示子函數(shù)*/
- void display(int bai,int shi,int ge)
- {
- P3=0XFB; //顯示小數(shù)點(diǎn)
- P1=0X80; //顯示小數(shù)點(diǎn)
- delay(50);//顯示小數(shù)點(diǎn)
- P3=0xf7;
- P1=table[bai];//顯示千位
- delay(50);//一小段延時動態(tài)顯示
- P1=0x00;//消隱
- P3=0xfb;
- P1=table[shi];//顯示百位
- delay(50);
- P1=0x00;//消隱
- P3=0xfd;
- P1=table[ge];//顯示十位
- delay(50);
- P1=0x00;//消隱
- }
- void main()
- {
- int temp;
- while(1)
- {
- temp=ReadTemperature();//讀溫度
- bai=temp%1000/100;//顯示百位
- shi=temp%100/10;//顯示十位
- ge=temp%10;//顯示個位
- display(bai,shi,ge);//顯示函數(shù)
- }
- }
- /////////////////////////////
復(fù)制代碼 |
|