ds18b20的proteus仿真问题

2019-07-18 09:28发布

仿真时只显示后面的单位 度(C),数字显示不出来,求大佬看看错在哪了,直接在display函数中输入数的话显示是正常的
#include<reg52.h> // 晶振为 11.0592MHz
#define uint unsigned int
#define uchar unsigned char
sbit DQ=P2^5;// 接温度传感器
sbit dula=P2^6;// 数码管段选
sbit wela=P2^7; // 数码管位选
sbit led=P2^1;

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 delay0(uint z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

void delay(uint z)
{
while(z--);
}
void delay1(unsigned char i)
{
while(--i);
}
void reset_ds18b20(void)
{
uchar reset=1;
while(reset)
  { DQ=1;
   delay1(1);
   DQ=0;      // RESET 拉低ds18b20单总线
   delay1(0);    //  拉低500us
   DQ=1;      // 释放总线,等待DS18B20的存在脉冲
   delay1(20);     // 等待45us
   delay1(20);      //等待45us
   if(DQ==0) {reset=0;led=0;}   //复位成功
   delay1(200);     //452us
   DQ=1;
  }
/*
uchar stat=0;
DQ=1;
delay(8);
DQ=0;
delay(80); //600us/12mhz
DQ=1;
delay(8);
stat=DQ; // 高电平为存在,低电平为不存在( stat 应该为 0)
delay(4);
// while(!DQ);
//return stat;
*/
}

void write_byte(uchar dat)
{
uchar i;
DQ=1; // 先拉高电平,为写作准备
for(i=0;i<8;i++)
{DQ=0;
DQ=dat&0x01;
delay(4);//DS18B20 采样单片机写给 DQ 线上的数据( 45us) ***************
DQ=1;
dat>>=1;
}
delay(4);
}

uchar read_byte()
{
uchar vaul,i;
DQ=1; // 先拉高电平,为读作准备
for(i=0;i<8;i++)
{
DQ=0;
vaul>>=1;
DQ=1;
if(DQ)
vaul|=0x80;
delay(4);
}
return vaul;
}

int read_temper()
{
uchar templ,temph;
int temp;
float tt;
reset_ds18b20();// 复位操作
write_byte(0xcc);// 跳过 ROM
write_byte(0x44);// 温度转换
delay(300);//***************************
reset_ds18b20();// 复位操作
write_byte(0xcc);// 跳过 ROM
write_byte(0xbe);// 读内部 RAM 内容
templ=read_byte();
temph=read_byte();
temp=temph;
temp<<=8;
temp=temp|templ;
tt=temp*0.0625;
temp=tt*10+0.5;
return temp;
}
       
void display(uint temp)   //显示程序
{
uint ge=0,shi=0,bai=0;
bai = temp/100;   
shi = temp%100/10;  
ge = temp%10;   
if(temp<=99)
{
wela=1;
P1=0xfe;
wela=0;
dula=1;
P0=table[0];
dula=0;   
delay(0);
delay(0);
P1=0xff;
P0=0x00;

wela=1;
P1=0xfd;
wela=0;
dula=1;
P0=table1[shi];//显示十位,使用的是有小数点的数组(因为temp值扩大了10倍,虽然是十位,实际为个位)
dula=0;
delay(0);
delay(0);
P1=0xff;
P0=0x00;

wela=1;
P1=0xfb;
wela=0;
dula=1;
P0=table[ge];    //显示个位
dula=0;
delay(0);
delay(0);
P1=0xff;
P0=0x00;

wela=1;
P1=0xf7;
wela=0;
dula=1;
P0=table[12];
dula=0;
delay(0);
delay(0);
P1=0xff;
P0=0x00;
}
else
{
wela=1;
P1=0xfe;
wela=0;
dula=1;
P0=table[bai];    //显示百位
dula=0;
delay(0);
delay(0);
P1=0xff;
P0=0x00;

wela=1;
P1=0xfd;
wela=0;
dula=1;
P0=table1[shi];   //显示十位,使用的是有小数点的数组(因为temp值扩大了10倍,虽然是十位,实际为个位)
dula=0;
delay(0);
delay(0);
P1=0xff;
P0=0x00;

wela=1;
P1=0xfb;
wela=0;
dula=1;
P0=table[ge];    //显示个位
dula=0;
delay(0);
delay(0);
P1=0xff;
P0=0x00;

wela=1;
P1=0xf7;
wela=0;
dula=1;
P0=table[12];
dula=0;
delay(0);
delay(0);
P1=0xff;
P0=0x00;
}
}                                         
/****************** 主函数 ****************/
void main()
{
while(1)
{
display(read_temper());
}
}

截图.png
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。