|
//*********************************************
//包含文件,程序开始
//*********************************************
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit ds =P1^0;//18B20数据线引脚
sbit dula=P2^0;
sbit wela=P3^1;
sbit LED=P1^3;
sbit input=P1^1;
uint temp;
float f_temp;
unsigned char flag;//负数标志
//行扫描数组
unsigned char code table[] ={0x3F,0x06,0x5B,0x4F,0x66,0x6d,0x7d,0x07,0x7f,
0x6f,
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,
0xff,0xef } ;
//小数部分显示查询表
//uchar TCNT;
//*********************************************
//延时函数
//*********************************************
void delay (uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//*********************************************
//DS18B20复位函数
//*********************************************
void dsreset(void)
{
uint i;
ds = 0;
i=103;
while(i>0)i--;
ds=1;
i=4;
while(i>0)i--;
}
//*********************************************
//从DS18B20中读一个字节
//*********************************************
bit tempreadbit(void)
{
uint i;
bit dat;
ds=0;i++;
ds=1;i++;i++;
dat=ds;
i=8;while(i>0)i--;
return(dat);
}
uchar tempread(void)
{
uchar i,j,dat;
dat=0;
for (i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1);
}
return(dat);
}
//*********************************************
//向DS18B20中写一个字节
//*********************************************
void tempwritebyte(uchar dat)
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)
{
ds=0;
i++;i++;
ds=1;
i=8;while(i>0)i--;
}
else
{
ds=0;
i=8;while(i>0)i--;
ds=1;
i++;i++;
}
}
}
//*********************************************
//从DS18B20中读取实时温度值
//*********************************************
void tempchange(void)
{
dsreset();
delay(1);
tempwritebyte(0xcc);
tempwritebyte(0x44);
}
uint get_temp()
{
uchar a,b;
dsreset();
tempwritebyte(0xCC);
a=tempread(); //低位
b=tempread(); //高位
temp=b;
temp<<=8;
temp=temp|a;
f_temp=temp*0.0625;
temp=f_temp*10+0.5;
f_temp=f_temp+0.05;
return temp;
}
void display(uchar num,uchar dat)
{
uchar i;
dula=0;
P2=table[dat];
dula=1;
dula=0;
wela=0;
i=0XFF;
i=i&(~((0X01)<<(num)));
P2=i;wela=1;wela=0;
delay(1);
}
void dis_temp(uint t)
{
uchar i;
i=t/100;
display(0,i);
i=t%100/10;
display(1,i+10);
i=t%100%10;
display(2,i);
}
//*********************************************
//动态扫描显示函数
//*********************************************
//void scandisp()
//{
// unsigned char i,value;
// for(i=0;i<4;i++)
// {
// P3 = 0xff;
// value =table[dispbuf[i]];
// if(i==2)
// value|= 0x80;
// P2 = value;
// P3 = scan[i];
// delay(90);
// }
// }
//*********************************************
//定时中断函数
//*********************************************
//void Timer0(void)interrupt 1 using 1
//{
// TH0=(65536-50000)/256;
// TL0=(65536-50000)%256;
// TCNT++;
// if(TCNT==6)
// {
// TCNT=0;
// LED=~LED;
// }
//}
void init_com(void)
{
TMOD=0x20;
PCON=0x00;
SCON=0x50;
TH1=0xFd;
TL1=0xFd;
TR1=1;
}
void comm(char*parr)
{
do
{
SBUF=*parr++;
while(!TI);
TI=0;
}while(*parr);
}
//*********************************************
//主函数
//*********************************************
void main()
{
uchar buff[4],i;
dula=0;
wela=0;
init_com();
while(1)
{
tempchange();
for(i=10;i>0;i--);
{
dis_temp(get_temp());
}
for(i=10;i>0;i--)
{
dis_temp(get_temp());
}
comm(buff);
for(i=10;i>0;i--)
{dis_temp(get_temp());
}
}
}
|
|