求基于51单片机的温度计设计 测温传感器使用DS1631.只要C语言程序

qq 741823268

真好,前些天写的程序复制上来给你看看吧,注释比较少有点乱。功能是读取DS18b20的温度1602显示,顺便显示了几个自定义字符。

#include<reg52.h>

#include<stdio.h>

sbit rs=P2^4;

sbit rw=P2^5;

sbit en=P2^6;

sbit dq=P1^0;

bit mark;

unsigned int temp=0;

unsigned char code dat1[]="wellcome study C";

unsigned char code ERROR[]="ERROR ";

unsigned char mo[]={0x10,0x07,0x0C,0x08,0x08,0x0C,0x07,0x00,

0x00,0x0F,0x09,0x09,0x0F,0x09,0x09,0x0F,

0x00,0x0F,0x09,0x0F,0x09,0x0F,0x11,0x13,

0x1F,0x15,0x15,0x1F,0x1F,0x15,0x15,0x1F,

0x00,0x1F,0x04,0x04,0x04,0x04,0x1F,0x00,

0x00,0x04,0x04,0x04,0x0A,0x11,0x11,0x00,

0x00,0x1F,0x04,0x0F,0x05,0x05,0x1F,0x00,

0x10,0x07,0x0C,0x08,0x08,0x0C,0x07,0x00};

char code tab[16]="0123456789ABCDEF";

/*1ms延时子程序*/

void delay_1ms(unsigned char time)

{

unsigned char a,b;

for(a=time;a>0;a--)

for(b=200;b>0;b--);

}

/*2us延时子程序*/

void delay2us(unsigned char t)

{

while(--t);

}

/*1602命令写入子程序*/

void wcom(unsigned char com)

{

rs=0;

rw=0;

P0=com;

delay_1ms(3);

en=1;

en=0;

}

/*1602数据写入子程序*/

void wdat(unsigned char dat)

{

rs=1;

rw=0;

P0=dat;

delay_1ms(3);

en=1;

en=0;

}

/*1602初始化*/

void start()

{

wcom(0x38);

wcom(0x0c);

wcom(0x06);

wcom(0x01);

}

//1602显示用户自定义字符子程序

void display()

{

unsigned char m=0;

for(m=0;m<64;m++)

{

wcom(0x40+m);  //设定自定义字模数据的存储地址

wdat(mo[m]);

}

wcom(0xc8);//显示自定义字符“C”

for(m=0;m<8;m++)

{

wdat(0x00+m);

delay_1ms(255);

}

}

/*18b20复位子程序*/

bit ds18b20(void)

{

bit flag;

dq=1;

delay2us(10);

dq=0;

delay2us(200);

delay2us(200);

dq=1;

delay2us(50);

flag=dq;

delay2us(25);

return flag;

}

/*向18b20写入一个字节的数据*/

void write_dat(unsigned char dat)

{

unsigned char i;

for(i=0;i<8;i++)

{

dq=0;

delay2us(2);

dq=dat&0x01;

delay2us(22);

dq=1;

dat>>=1;

}

}

/*读取18b20一个字节的数据*/

unsigned char read_dat(void)

{

unsigned char i,dat=0;

for(i=0;i<8;i++)

{

dq=0;

dat>>=1;

dq=1;

if(dq)

dat|=0x80;

delay2us(25);

}

return(dat);

}

/*读取温度*/

void get_temp(void)

{

unsigned int a,b;

ds18b20();

write_dat(0xcc);

write_dat(0x44);

delay_1ms(2);

ds18b20();

write_dat(0xcc);

write_dat(0xbe);

a=read_dat();

b=read_dat();

/*********************温度数据处理程序段*/

if((b&0xf8)==0xf8)

{

mark=1;

b<<=8;

temp=((~(a+b))+1)*0.625;

}

else

{

mark=0;

b<<=8;

temp=(a+b)*0.625;

}

}

void main()

{

unsigned char m;

start();

wcom(0x80);

for(m=0;m<16;m++)

{

wdat(dat1[m]);

  delay_1ms(155);

}

display();

while(1)

{

get_temp();

if(ds18b20())  //若18b20初始化不成功或不存在即显示ERROR

{

unsigned char j;

wcom(0xc2);

for(j=0;j<6;j++)

{

wdat(ERROR[j]);

}

}

else

{

wcom(0xc2);

if(mark)

wdat(0xb0);

else 

wdat(0xa0);

wdat(tab[temp/1000]);

wdat(tab[(temp%1000)/100]);

wdat(tab[((temp%1000)%100)/10]);

wdat(0x2e);

wdat(tab[((temp%1000)%100)%10]);

}

}

}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-11-08
+
相似回答
大家正在搜