两个DS18B20读取的温度在12864中串行实时显示
显示跟传感器没有关系啊 。你要看 是哪里显示错误了
这个应该是显示的问题,要显示2个温度,建议12864显示的时候放在2行显示,显示函数中,调用一个2个显示Desplay_Temp(1,temperature),//第一行显示第一个温度
Desplay_Temp(2,temperature),//第二行显示第二个温度,
等类似。
问题说明不清,一,如何无法正常显示,该显示的没显示?显示乱码?部分正常显示,部分不正常?二,显示是否符合设计,你设计如何显示,如显示位置,显示方式等,是否部分按设计显示?三,是显示内容不正常,还是显示内容,显示位置等于显示相关的都不正常。
谢谢,这个问题我解决了,我现在想在一个单片机引脚上接四个温度传感器,分别读取每个传感器的地址来读取给温度,该如何实现?谢谢。我的程序是这样的
温度传感器程序
#include<reg51.h>
#include"ds18b20.h"
#include"12864.h"
#include"delay.h"
uchar high,low;
float f_temp;
uint temp;
extern uchar d2,d1,d0;
void init_temp()
{
uint i;
DQ=0; //拉低总线,产生复位信号
i=80;
while(i>0)
i--; //延时480~960us
DQ=1; //拉高总线
i=4;
while(i>0)
i--; //延时15~60us
while(DQ); //等待产生应答脉冲
i=70;
while(i>0)
i--; //延时至少480us
}
void wr_temp(uchar dat) //写1个字节
{
uint i,j;
bit testb;
for(j=8;j>0;j--)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //写1
{
DQ=0; //拉低总线,产生写时间隙
i++; //延时大于1us
DQ=1; //拉高总线
i=8;
while(i>0)
i--; //延时至少60us,供DS18B20采样
}
else //写0
{
DQ=0; //拉低总线,产生写时间隙
i=8;
while(i>0)
i--; //保持至少60us,供DS18B20采样
DQ=1; //拉高总线
i++;i++;
}
}
}
uchar rd_temp() //读1个字节
{
uint i,j;
bit b; //定义存放接收到的1个字节
uchar i_b;
uchar rdbyte;
for(j=8;j>0;j--)
{
DQ=0; //拉低总线,产生读时隙
i++; //延时大于1us
DQ=1; //释放总线
i++;i++; //给一定时间让总线释放
b=DQ; //读取数据
i=8;while(i>0)i--; //延时至少60us
i_b=b;
rdbyte=(i_b<<7)|(rdbyte>>1); //将读取到得一位值左移7位,存放读取的数据变量rdbyte右移1位
}
return rdbyte;
}
void get_temp()
{
init_temp(); //初始化,复位并获取应答信号
wr_temp(0xcc); //跳过ROM
wr_temp(0x44); //开始温度转换
delay_ms(1000); //等待温度转换完成
init_temp(); //将DS18B20复位
wr_temp(0xcc); //跳过ROM
wr_temp(0xbe); //读暂存器
low=rd_temp(); //读取低8位
high=rd_temp(); //读取高8位
temp=high;
temp<<=8;
temp=temp|low; //将读取的低8位和高8位合并
f_temp=temp*0.0625; //温度在寄存器中为12位 分辨率位0.0625°
temp=f_temp*10+0.5; //精确到十分位,四舍五入
d2=temp/100; //显示数据:十位
d1=temp%100/10; //显示数据:个位
d0=temp%10; //显示数据:十分位
}
12864串行显示
#include<reg51.h>
#include"12864.h"
#include"ds18b20.h"
extern uchar d2,d1,d0;
sbit CS=P2^5; //片选信号
sbit SID=P2^6; //数据信号
sbit SCLK=P2^7; //时钟信号
sbit RST=P2^2; //复位信号
void sendbyte(unsigned char zdata)
{
unsigned int i;
for(i=0; i<8; i++)
{
if((zdata << i) & 0x80)
{
SID = 1;
}
else
{
SID = 0;
}
SCLK = 0;
SCLK = 1;//上升沿
}
}
void write_com(unsigned char cmdcode)
{
CS = 1;
sendbyte(0xf8);//从mcu向LCD发送指令
sendbyte(cmdcode & 0xf0);//发送高四位
sendbyte((cmdcode << 4) & 0xf0);//发送低四位
delay(2);
}
void write_data(unsigned char Dispdata)
{
CS = 1;
sendbyte(0xfa);//从mcu向LCD发送数据
sendbyte(Dispdata & 0xf0);
sendbyte((Dispdata << 4) & 0xf0);
delay(2);
}
void lcdinit()
{
RST = 0;
delay(100);
RST = 1;
delay(1000); //20000 改变大小可以调整显示的快慢
write_com(0x30);//功能设定
delay(50);
write_com(0x0c);//开显示,不显示游标和游标位置
delay(50);
}
void hzkdis(unsigned char code *s)
{
while(*s > 0)
{
write_data(*s);
s++;
delay(50);
}
}
void Test()
{
write_com(0x03);
delay(50);
write_com(0x80);
hzkdis("当前室温:"); //每行不能多于16个空格,不然下一行会闪烁
write_com(0x85);
hzkdis("00.0度");
}
void dat_dis()
{
write_com(0x85); //显示温度
write_data(0x30+d2);
write_data(0x30+d1);
write_data(0x2e); //写入“.”号
write_data(0x30+d0);
}
主程序
#include<reg51.h>
#include"12864.h"
#include"ds18b20.h"
#include"delay.h"
uchar d2,d1,d0;
void main()
{
lcdinit();//初始化
Test();
while(1)
{
get_temp();
dat_dis();
}
}
延时
#include"delay.h"
void delay(unsigned int t)
{
unsigned int i,j;
for(i=0; i<t; i++)
for(j=0; j<10; j++);
}
void delay_ms(uint z) //延时z毫秒
{
uint x,y;
for(x=z;x>0;x--)
for(y=115;y>0;y--);
}
谢谢您,我现在解决了
恩恩,我后面解决了,谢谢
小编在吗,我的LCD1602第一行可以正确显示,但是第二行(即第二个DS18B20)一闪而过,怎么回事?
怎么解决的?哪个时序出问题了?