锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

C51--DS18B20数字温度计--C语言

时间:2024-04-29 08:37:10



#include

#include

#define uint unsigned int
#define uchar unsigned char

sbit DQ=P2^6;

sbit lcdrs=P1^0;
sbit lcdrw=P1^1;
sbit lcden=P1^2;

void disp(uint a);
void init(void);

void delay(uint i);

uchar ds18b20_init(void);

void write_byte(uchar byte);

uchar read_byte(void);

uint read_ds18b20(void);

void delay50us(void);

void delayms(uint a);

void lcd1602_wr_com(uchar com);

void lcd1602_wr_data(uchar dat);

void lcd_init(void);

uchar code str[]="temperature";

void main(void)
{
init();
while(1)
{
disp(read_ds18b20());
delayms(50);
}
}

void init(void)
{
uchar i;
lcd_init();
lcd1602_wr_com(0x80+0x02); //显示的地址
for(i=0;i<11;i++)
{
lcd1602_wr_data(str[i]);
delayms(2);
}
}

void disp(uint a)
{
uchar bai,ge,shi,dp,symbol;
uint b;
b=a&0x8000;
if(b==0x8000) //负温度
{
a&=0x7fff; //将最高位置0
symbol=0x2d; //符号为“-”
}
else symbol=0x2b; //符号为“+”

bai=a/1000+0x30;
shi=a00/100+0x30;
ge=a0/10+0x30;
dp=a+0x30;
if(bai==0x30)
{
bai=0x20; //如果百位为0,不显示
if(shi==0x30)shi=0x20; //如果百位为零,十位也为0,不显示
}
lcd1602_wr_com(0x80+0x43);
lcd1602_wr_data(symbol);
delayms(2);
lcd1602_wr_data(bai);
delayms(2);
lcd1602_wr_data(shi);
delayms(2);
lcd1602_wr_data(ge);
delayms(2);
lcd1602_wr_data(0x2e);
delayms(2);
lcd1602_wr_data(dp);
delayms(2);
lcd1602_wr_data(0xdf);
delayms(2);
lcd1602_wr_data(0x43);
delayms(2);
}

void delay(uint i)
{
while(i--);
}
uchar ds18b20_init(void)
{
uchar n;
DQ=1; //初始化时序从高到低,因此先置高
delay(4); //延时等待稳定
DQ=0; //拉低
delay(60); //延时大约500us
DQ=1; //主机放开
delay(6); //延时15~60us
n=DQ; //读信号线状态,如为低,则说明线上有设备,否则说明没有或坏了
delay(6);
return n;
}
void write_byte(uchar byte)
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0; //复位信号线
DQ=byte&0x01; //低位开始写入,0继续拉低信号线,1则被拉高
delay(5); //延时大约45us左右,等待设备采样数据
byte>>=1; //右移一位
DQ=1;
}
delay(4);
}
uchar read_byte(void)
{
uchar i,temp;
for(i=0;i<8;i++)
{
DQ=0;
temp>>=1; //右移一位
DQ=1; //主机释放信号线
_nop_();
if(DQ)temp|=0x80; //将读出数据放在最高位,如果是0,信号线会设备继续拉低,1则为高
delay(4);

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章