仿真时只显示后面的单位 度(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());
}
}
-
一周热门 更多>