小弟编了一个单个18b20的程序,但是显示不出来,求助!!!谢谢
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar code tab[]={0x3f , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d , 0x7d , 0x07 , 0x7f , 0x6f , 0x77 , 0x7c ,0x39 , 0x5e , 0x79 , 0x71 };
//uchar code temp1[]={0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff};
sbit D1=P1^7;
void delay(uint x)//延时
{
while(x) x--;
}
void init()//初始化18b20
{
uchar ready=0;
D1=1;
delay(100);
D1=0;//拉低总线
delay(80);//延时805um
D1=1;//释放总线
delay(25);//等待210um
ready=D1;
}
uchar readbit()//读一个字节
{
uchar i=0,temp=0;
D1=1;
for(i=0;i<8;i++)//循环8次
{
D1=0; //拉低电平准备产生读时序
temp=temp>>1; //先移位,方便i=7时接到最后移位
D1=1; //拉高电平进入读时序
if(D1) //取18b20传送的数据(先送低位)
{
temp=temp|0x80;
}
D1=1;//拉高电平完成读时序
delay(10);
}
return(temp);
}
void writebit(uchar date)//写一个字节
{
uchar i=0;
D1=1;
for(i=0;i<8;i++)
{
D1=0;//产生下降沿,进入写时序(15us内送上数据)
D1=date&0x01; //从低位开始送数
delay(5); //延时50um保证18b20采样到数据
D1=1;
delay(5); //拉高电平完成送数
date=date>>1; //移位
}
}
uchar readtemp()
{
uchar datal=0,datah=0,dataall=0;
init(); // 初始化
writebit(0xCC); //跳过检测rom(总线上有多个18b20时才检测序列号)
writebit(0x44); //写入温度转换指令
delay(100);
init(); // 重新初始化
writebit(0xCC); //跳过检测rom(总线上有多个18b20时才检测序列号)
writebit(0xBE); //写入读取温度值指令(之后18b20发送两个字节,温度值的低位和高位)
datal=readbit(); //接收温度低位值
datah=readbit();//接受温度高位值(高5位为符号位)
datah=datah<<8;
dataall=datal|datah;
return(dataall);;
}
void play(uchar a)
{
uchar count=0;
P2=0x00;
if(count==0)
{
P2=0xff;
P0=0x39;
}
if(count==1)
{
P2=0xfe;
P0=tab[a];
}
if(count==2)
{
P2=0xfd;
P0=tab[a];
}
if(count==3)
{
P2=0xfc;
P0=tab[a];
}
if(count==4)
{
P2=0xfb;
P0=tab[a];
}
count++;
if(count==5)
{
count=0;
}
}
void main()
{
uint data1=0,data2=0,data3=0,data4=0;//数码管显示变量
float dataform=0;//温度处理变量
while(1)
{
dataform=readtemp();
dataform=dataform*0.0625*100; //精度出厂默认为0.0625,*100为了好分数据
data1 = ((uint)dataform)/1000;
data2 = ((uint)dataform)%1000/100;
data3 = ((uint)dataform)%1000%100/10;
data4 = ((uint)dataform)%1000%100%10;
play(0);
play(data4); //显示部分 0.01度
play(data3); //0.1度
play(data2); //个位
play(data1); //十位
}
} |