发送端
#include
#define disp_data P0 #define comm P2
#define uchar unsigned char #define uint unsigned int uchar disp[6];
/*******************************************/
/***************DS18B20程序*****************/
/*******************************************/
#include
sbit DQ= P3^7;
bit F;
/*--------------精确延时5us子程序---------*/ void delay5(uchar n)
{
do
{
_nop_();
_nop_();
_nop_();
n--;
}
while(n);
}
/*--------------初始化函数--------------------*/
void init_ds18b20(void) {
// uchar x=0;
DQ =1;
delay5(10);
DQ =0;
delay5(120);
DQ =1;
delay5(16);
delay5(80);
}
/*--------------读取一字节函数----------------*/
uchar readbyte(void) {
uchar i=0;
uchar date=0;
for (i=8;i>0;i--)
{
DQ =0;
delay5(1);
DQ =1; //15微秒内拉释放总线
date>>=1;
if(DQ)
date|=0x80;
delay5(11);
}
return(date); }
/*--------------写一字节函数------------------*/
void writebyte(uchar dat)
{
uchar i=0;
for(i=8;i>0;i--)
{
DQ =0;
DQ =dat&0x01;//写"1" 在15微秒内拉低
delay5(12); //写"0" 拉低60微秒
DQ = 1;
dat>>=1;
delay5(5);
}
}
/*--------------读取温度函数------------------*/
uint readtemp(void) {
uchar a,b;
uint temp;
float tt;
init_ds18b20();
writebyte(0xCC); //跳过读序号列号的操作
writebyte(0x44); //启动温度转换
init_ds18b20();
writebyte(0xCC);
writebyte(0xBE); //读取温度寄存器
a=readbyte();
b=readbyte();
if(b&0xf8)
{
temp=b;
temp<<=8;
temp|=a;
temp=~temp;
temp+=1;
F=1; //温度为负值
}
else
{
temp=b;
temp<<=8;
temp=temp|a;
F=0; //温度为正值
}
tt=temp*0.0625*10+0.5;
return(tt);
}
/*******************************************/
/***************DS18B20程序end**************/
/*******************************************/
//共阳极数码管0-9显示
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x63,0x40,0x00};
//delay :1ms //o, - , 灭
//crystal:12MHz
void delay_1ms(uchar m)
{
uchar a,b,c;
for(a=m;a!=0;a--)
for(b=2;b!=0;b--)
for(c=248;c!=0;c--);
}
void convert(void)
{
uint temp;
temp=readtemp();
if(F)
{
disp[0]=12; //温度为负值
disp[1]=11;
disp[2]=temp/100;
disp[3]=temp/10%10;
}
else
{
disp[0]=12; //温度为正值
disp[1]=temp/1000;
disp[2]=temp/100%10;
disp[3]=temp/10%10;
}
disp[4]=10; //显示"C"
}
void display(void)
{
uchar i,temp;
temp=0x24;
for(i=0;i<5;i++)
{
disp_data=table[disp[i]]; //0x24
comm=temp;
delay_1ms(2);
comm=0x0;
temp>>=1;
}
}
void main()
{ SCON=0X50;
TMOD=0X20;
PCON=0X80;
TH1=0xf3; //根据规定给定时器T1赋初值
TL1=0xf3; //根据规定给定时器T1赋初值
TR1=1; //启动定时器T1
delay_1ms(200);
while(1)
{
convert();
display();
SBUF=disp_data;
while(TI==0)
;
TI=0;
delay_1ms(20);
}
}