#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char leddata[]={
0xC0, //"0"
0xF9, //"1"
0xA4, //"2"
0xB0, //"3"
0x99, //"4"
0x92, //"5"
0x82, //"6"
0xF8, //"7"
0x80, //"8"
0x90, //"9"
};
sbit DQ = P2^4;
sbit wei0 = P2^0;
sbit wei1 = P2^1;
sbit wei2 = P2^2;
char m;
uchar n;
void delay(uint z) //延時1ms子程序
{
uint x, y;
for(x=z; x>0; x--)
for(y=114; y>0; y--);
}
void delay_us(uchar s) //延時1us子程序
{
--s;
}
void init_ds18b20() //初始化ds18b20溫度傳感器
{
uchar x = 0;
DQ = 1; //dq引腳復位
delay_us(8); //稍做延時
DQ = 0; //將引腳拉低
delay_us(80); //精確延時,大于480us
DQ = 1; //拉高引腳
delay_us(14); //精確延時,16~60us
x = DQ; //將引腳值保存在x中
delay_us(20); //精確延時,60~240us
}
uchar readonechar() //讀取一個字節子程序
{
uchar i = 0;
uchar dat = 0;
for(i=8; i>0; i--)
{
DQ = 0; //拉低信號讀字節
dat >>= 1; //dat右移一位再賦值直到賦值到第八位
DQ = 1; //讀完拉高信號
if(DQ)
dat |= 0x80; //dat中數與0x80按位相或
delay_us(4); //稍做延時
}
return(dat); //將結果返回dat中
}
void writeonechar(uchar dat)
{
uchar i = 0;
for(i=0; i<8; i++)
{
DQ = 0; //拉低信號寫字節
DQ = dat & 0x01; //dat中數與0x01按位相與
delay_us(5); //稍做延時
DQ = 1; //寫完拉高信號
dat >>= 1; //dat右移一位再賦值直到賦值到第八位
}
}
uint readtemp() //讀取溫度子程序
{
uchar a=0, b=0;
uint t = 0;
float tt = 0;
init_ds18b20(); //初始化傳感器
writeonechar(0xcc); //跳過讀序列號的操作
writeonechar(0x44); //啟動溫度轉換
init_ds18b20(); //初始化傳感器
writeonechar(0xcc); //跳過讀序列號的操作
writeonechar(0xbe); //讀取溫度寄存器
a = readonechar(); //讀低八位
b = readonechar(); //讀高八位
t = b; //將高八位的數據轉移到t
t <<= 8; //t中數據左移8位
t = t|a; //將t中數據按位和a中數據相或
tt = t*0.0652-1; //將溫度乘0.0652得到實際值
t = tt*10+0.5; //將實際溫度乘10倍
return(t); //將數值返回到變量t中
}
void checktemp()
{
uint a,b,c;
c=readtemp(); //獲取溫度值
a=c/100; //計算得到十位數字
b=c/10-a*10; //計算得到個位數字
m=c/10; //計算得到整數位
n=c-a*100-b*10;
}
void displaytemp()
{
wei0 = 1;
P0 = leddata[n];
delay(100);
wei0 = 0;
wei1 = 1;
P0 = leddata[m%10];
delay(100);
wei1 = 0;
wei2 = 1;
P0 = leddata[m/10];
delay(100);
wei2 = 0;
}
void main()
{
checktemp();
displaytemp();
}
|