//程序:ex6_2_1.c
//功能:數(shù)字溫度計
#include "reg51.h"
#include "intrins.h" //包含內(nèi)部函數(shù)頭文件intrins.h
#define uchar unsigned char
#define uint unsigned int
#define out P2
sbit smg1=P3^1; //溫度個位位選端
sbit smg2=P3^0; //溫度十位位選端
sbit DQ=P3^7; //溫度采集
void delay5us(uchar n); //精確延時n*5us子程序
void delayms(uint j);
void init_ds18b20(void); //總線初始化復位
uchar readbyte(void); // 讀取一個字節(jié)
void writebyte(uchar); //寫一個字節(jié)
uchar readtemp(void); //讀取溫度
unsigned char led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//共陽數(shù)碼管顯示"0-9"字型碼
void main(void)
{uchar i;
uchar temp;
temp=readtemp(); //讀取轉換的溫度
delayms(1000);
while(1)
{
temp=readtemp(); //讀取轉換的溫度
for(i=0;i<10;i++) //連續(xù)掃描數(shù)碼管10次
{
out=led[temp/10]; //顯示溫度十位
smg1=0;
smg2=1;
delay5us(200); //延時1ms
out=0xff;
out=led[temp%10]; //顯示溫度個位
smg1=1;
smg2=0;
delay5us(200); //延時1ms
out=0xff;
}
}
}
//函數(shù)名:delay5us
//函數(shù)功能:精確延時5us子程序
//形式參數(shù):延時時間參數(shù)n,unsigned char 類型
//返回值:無
void delay5us(unsigned char n)
{ do
{
_nop_();
_nop_();
_nop_();
n--;
}
while(n);
}
//函數(shù)名:init_ds18b20
//函數(shù)功能: 總線初始化復位
//形式參數(shù):無
//返回值:無
void init_ds18b20(void)
{
uchar x=0;
DQ=1;
delay5us(10);
DQ =0;
delay5us(120); //低電平480-960s
DQ =1;
delay5us(16); //等待50-100s
x=DQ;
delay5us(80);
DQ=1;
}
//函數(shù)名:readbyte
//函數(shù)功能: 讀取一個字節(jié)
//形式參數(shù):無
//返回值:讀取字節(jié)數(shù)據(jù)date, unsigned char 類型
uchar readbyte(void)
{
uchar i=0;
uchar date=0;
for (i=8;i>0;i--)
{
DQ =0;
delay5us(1);
DQ =1; //15微秒內(nèi)拉釋放總線
date>>=1;
if(DQ)
date|=0x80;
delay5us(11); //讀完需要45us的等待
}
return(date);
}
//函數(shù)名:writebyte
//函數(shù)功能: 寫一個字節(jié)
//形式參數(shù):寫字節(jié)數(shù)據(jù)dat, unsigned char 類型
//返回值:無
void writebyte(uchar dat)
{
uchar i=0;
for(i=8;i>0;i--)
{
DQ =0;
DQ =dat&0x01; //寫"1" 在15微秒內(nèi)拉低
delay5us(12); //寫"0" 拉低60微秒等待寫完
DQ = 1; //恢復高電平,至少保持1us
dat>>=1; //下次寫作準備,移位數(shù)據(jù)
delay5us(5); //延時25us
}
}
//函數(shù)名: readtemp
//函數(shù)功能:讀取溫度
//形式參數(shù):無
//返回值:單字節(jié)的溫度值tt, unsigned char 類型
uchar readtemp(void)
{
uchar templ,temph,tt;
uint t;
init_ds18b20();
writebyte(0xCC);
writebyte(0x44); //跳過ROM匹配,跳過讀序列號的操作,可節(jié)省操作時間
init_ds18b20(); //開始操作前需要復位
writebyte(0xCC);
writebyte(0xBE); //讀暫存器中的溫度值
templ=readbyte(); //分別讀取溫度的低、高字節(jié)
temph=readbyte();
t=temph;
t<<=8;
t=t|templ;
tt=t*0.0625; //溫度轉換
return(tt);
}//函數(shù)名:delayms(uint ms)
//函數(shù)功能:延時ms毫秒子函數(shù)
//形式參數(shù):ms
//返回值:無
void delayms(uint ms)//延時ms毫秒子函數(shù)
{
uint i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<110;j++);//延時1毫秒
}
}
|