用ds18b20和12864显示即时温度,结果温度没变化
时间:10-02
整理:3721RD
点击:
程序如下:
#include<reg51.h>
#define uchar unsigned char
#define LCD_data P0 //数据口
sbit RS = P2^0; //寄存器选择输入
sbit RW = P2^1; //液晶读/写控制
sbit E = P1^6; //液晶使能控制
sbit PSB = P2^2;
sbit DQ=P3^2;
uchar a,b,t;
uchar tempbuf[3];
void delay(uchar z)
{
while(z--);
}
void init_ds18b20()
{
uchar x=0;
DQ=1;
delay(10);
DQ=0;
delay(80);
DQ=1;
delay(14);
x=DQ;
delay(20);
}
void write_onechar(uchar dat)
{
uchar i=0;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01;
delay(5);
DQ=1;
dat=dat>>=1;
}
delay(4)
}
uchar read_onechar()
{
uchar i=0;uchar dat=0;
for(i=0;i<8;i++)
{
DQ=0;
dat>>=1;
DQ=1;
if(DQ) dat|=0x80;
delay(4);
}
return(dat);
}
uchar read_temperature()
{
init_ds18b20();
write_onechar(0xcc);
write_onechar(0x44);
delay(100);
init_ds18b20();
write_onechar(0xcc);
write_onechar(0xbe);
delay(100);
a=read_onechar();
b=read_onechar();
a=(a&0xf0)>>4;
b=b<<4;
t=b|a;
return(t);
}
void temperature(void)
{
tempbuf[0]=t/10+0x30;
tempbuf[1]=t%10+0x30;
}
void chk_busy()
{ RS=0;
RW=1;
E=1;
LCD_data=0xff;
while((LCD_data&0x80)==0x80);
E=0;
}
void write_com(uchar cmdcode)
{
chk_busy();
RS=0;
RW=0;
E=1;
LCD_data=cmdcode;
E=0;
}
void write_data(uchar Dispdata)
{
chk_busy();
RS=1;
RW=0;
E=1;
LCD_data=Dispdata;
E=0;
}
/*------------------初始化LCD屏--------------------------*/
void lcdreset()
{
PSB = 1;
write_com(0x30); //选择基本指令集
write_com(0x0c); //开显示(无游标、不反白)
write_com(0x01); //清除显示,并且设定地址指针为00H
write_com(0x06); // 游标右移
}
void hzkdis(uchar *s)
{
while(*s>0)
{
write_data(*s);
s++;
delay(50);
}
}
void main()
{ uchar i=0;
lcdreset();
while(1)
{
read_temperature();
temperature();
write_com(0x80);
hzkdis("温度为: ");
write_com(0x84);
write_data(tempbuf[0]);
write_com(0x85);
write_data(tempbuf[1]);
delay(10);
}
}希望大神能就我写的程序进行修改不要另外写一个,谢谢。
#include<reg51.h>
#define uchar unsigned char
#define LCD_data P0 //数据口
sbit RS = P2^0; //寄存器选择输入
sbit RW = P2^1; //液晶读/写控制
sbit E = P1^6; //液晶使能控制
sbit PSB = P2^2;
sbit DQ=P3^2;
uchar a,b,t;
uchar tempbuf[3];
void delay(uchar z)
{
while(z--);
}
void init_ds18b20()
{
uchar x=0;
DQ=1;
delay(10);
DQ=0;
delay(80);
DQ=1;
delay(14);
x=DQ;
delay(20);
}
void write_onechar(uchar dat)
{
uchar i=0;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01;
delay(5);
DQ=1;
dat=dat>>=1;
}
delay(4)
}
uchar read_onechar()
{
uchar i=0;uchar dat=0;
for(i=0;i<8;i++)
{
DQ=0;
dat>>=1;
DQ=1;
if(DQ) dat|=0x80;
delay(4);
}
return(dat);
}
uchar read_temperature()
{
init_ds18b20();
write_onechar(0xcc);
write_onechar(0x44);
delay(100);
init_ds18b20();
write_onechar(0xcc);
write_onechar(0xbe);
delay(100);
a=read_onechar();
b=read_onechar();
a=(a&0xf0)>>4;
b=b<<4;
t=b|a;
return(t);
}
void temperature(void)
{
tempbuf[0]=t/10+0x30;
tempbuf[1]=t%10+0x30;
}
void chk_busy()
{ RS=0;
RW=1;
E=1;
LCD_data=0xff;
while((LCD_data&0x80)==0x80);
E=0;
}
void write_com(uchar cmdcode)
{
chk_busy();
RS=0;
RW=0;
E=1;
LCD_data=cmdcode;
E=0;
}
void write_data(uchar Dispdata)
{
chk_busy();
RS=1;
RW=0;
E=1;
LCD_data=Dispdata;
E=0;
}
/*------------------初始化LCD屏--------------------------*/
void lcdreset()
{
PSB = 1;
write_com(0x30); //选择基本指令集
write_com(0x0c); //开显示(无游标、不反白)
write_com(0x01); //清除显示,并且设定地址指针为00H
write_com(0x06); // 游标右移
}
void hzkdis(uchar *s)
{
while(*s>0)
{
write_data(*s);
s++;
delay(50);
}
}
void main()
{ uchar i=0;
lcdreset();
while(1)
{
read_temperature();
temperature();
write_com(0x80);
hzkdis("温度为: ");
write_com(0x84);
write_data(tempbuf[0]);
write_com(0x85);
write_data(tempbuf[1]);
delay(10);
}
}希望大神能就我写的程序进行修改不要另外写一个,谢谢。
为了方便调试,可以在读出时钟芯片的时间信息之后将其通过窗口发出去,这样你通过串口调试助手就可以得知有没有顺利读出来。如果读出来了,那就是LCD那边的问题了
有点听不懂,我这只与时间芯片ds1302没关系,12864没问题其他程序能用,还是谢谢了