这个程序是在学习板上完成的
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DS="P2"^2; //define interface 定义DS18B20接口
sbit dula="P2"^6;
sbit wela="P2"^7;
uint temp; // variable of temperature
uchar flag1; // sign of the result positive or negative
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//不带小数点编码。
unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //带小数点编码。
void delay(uint count) //delay
{
uint i;
while(count)
{
i="200";
while(i>0)
i--;
count--;
}
}
void dsreset(void) //send reset and initialization command
{
uint i; //DS18B20初始化
DS="0";
i="103";
while(i>0)i--;
DS="1";
i="4";
while(i>0)i--;
}
bit tmpreadbit(void) //read a bit 读一位
{
uint i;
bit dat;
DS="0";i++; //i++ for delay 小延时一下
DS="1";i++;i++;
dat="DS";
i="8";while(i>0)i--;
return (dat);
}
uchar tmpread(void) //read a byte date 读一个字节
{
uchar i,j,dat;
dat="0";
for(i=1;i<=8;i++)
{
j="tmpreadbit"();
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好//一个字节在DAT里
}
return(dat); //将一个字节数据返回
}
void tmpwritebyte(uchar dat) //write a byte to ds18b20
{ //写一个字节到DS18B20里
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb="dat"&0x01;
dat="dat">>1;
if(testb) //write 1 写1部分
{
DS="0";
i++;i++;
DS="1";
i="8";while(i>0)i--;
}
else
{
DS="0"; //write 0 写0部分
i="8";while(i>0)i--;
DS="1";
i++;i++;
}
}
}
void tmpchange(void) //DS18B20 begin change 发送温度转换命令
{
dsreset(); //初始化DS18B20
delay(1); //延时
tmpwritebyte(0xcc); // 跳过序列号命令
tmpwritebyte(0x44); //发送温度转换命令
}
uint tmp() //get the temperature 获得温度
{
float tt;
uchar a,b;
dsreset();
delay(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe); //发送读取数据命令
a="tmpread"(); //连续读两个字节数据
b="tmpread"();
temp="b";
temp<<=8; //two byte compose a int variable
temp="temp|a"; //两字节合成一个整型变量。
tt="temp"*0.0625; //得到真实十进制温度值,因为DS18B20
//可以精确到0.0625度,所以读回数据的最低位代表的是
//0.0625度。
temp="tt"*10+0.5; //放大十倍,这样做的目的将小数点后第一位
//也转换为可显示数字,同时进行一个四舍五入操作。
return temp; //返回温度值
}
void display(uint temp) //显示程序
{
uchar A1,A2,A2t,A3,ser;
ser="temp/10"; //分离出三位要显示的数字
SBUF="ser";
A1=temp/100;
A2t=temp%100;
A2=A2t/10;
A3=A2t%10;
dula="0";
P0=table[A1]; //显示百位
dula="1";
dula="0";
wela="0";
P0=0xfb;
wela="1";
wela="0";
delay(1);
dula="0";
P0=table1[A2]; //显示十位 带小数点的
dula="1";
dula="0";
wela="0";
P0=0xfd;
wela="1";
wela="0";
delay(1);
P0=table[A3]; //显示个位
dula="1";
dula="0";
P0=0xfe;
wela="1";
wela="0";
delay(1);
}
void main() //主函数
{
while(1)
{
tmpchange(); //温度转换
display(tmp());
}
}
文章评论(0条评论)
登录后参与讨论