真好,前些天写的程序复制上来给你看看吧,注释比较少有点乱。功能是读取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]);
}
}
}