//*************************************
//头文件
#include <reg52.h>
//*************************************
//LCD 控制位
sbit rs=P1^0;
sbit rw=P1^1;
sbit lcden=P1^2;
sbit psb=P2^7; //串并选择
sbit rst=P2^6; //复位
//*************************************
//DS18B20
sbit DQ=P3^3; //DS18B20
//*********************************
//全局变量
unsigned char i=0;
//*************************************
//DS18B20延时
void delay_m(unsigned char x)
{
while(--x);
}
//*************************************
//延时
void delay(unsigned int m)
{
unsigned int x,y;
for(x = m; x >0;x--)
for(y = 110; y > 0; y--);
}
//**************************************
//LCD 写指令
void write_com(unsigned char com)
{
rs = 0;
rw = 0;
lcden = 0;
P0 = com;
delay(5);
lcden = 1;
delay(5);
lcden = 0;
delay(5);
}
//****************************************
//LCD 写数据
void write_date(unsigned char date)
{
rs = 1;
rw = 0;
lcden = 0;
P0 = date;
lcden = 1;
delay(5);
lcden = 0;
delay(5);
}
//*************************************
//初始化 LCD
void Lcd_Init()
{
rst = 0; //上电复位
delay(10);
rst = 1; //工作
psb = 1; //选择并口
write_com(0x30);//基本指令集
write_com(0x02);//地址归位
write_com(0x0c);//开显示 不显示光标
write_com(0x01);//清屏
write_com(0x06);//写数据地址指针自动+1
}
//***********************************
//向LCD发一个字符串
void Lcd_word(unsigned char *str)
{
while(*str != '\0')
{
write_date(*str++);
}
*str = 0;
}
//************************************
//初始化DS18B20
unsigned char Init_Ds18b20()//初始化
{
DQ=1; //复位
delay_m(8); //延时
DQ=0; //总线拉低
delay_m(90); //延时480~960us之间
DQ=1; //拉高电平
delay_m(8);
i=DQ;
delay_m(100);
DQ=1;
return (i); //返回
}
//************************************
//读数据
unsigned char read_bit()//读数据
{
unsigned char i=0,date=0;
for(i=8;i>0;i--)
{
DQ=0;
date>>=1;
DQ=1;//释放总线
if(DQ)
date|=0x80;
delay_m(4);
}
return (date);
}
//***************************************
// 写数据
void write_bit(unsigned char date)
{
unsigned char i = 0;
for (i = 8; i > 0; i--)
{
DQ = 0;
DQ = date&0x01;
delay_m(5);
DQ = 1;
date>>=1;
}
}
//**************************************************
//读取温度值
unsigned int get_temp(void)//读取温度
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
if(i==1)
{
}
else
{
Init_Ds18b20();
write_bit(0xCC); // 跳过读序号列号的操作
write_bit(0x44); // 启动温度转换
Init_Ds18b20();
write_bit(0xCC); //跳过读序号列号的操作
write_bit(0xBE); //读取温度寄存器
a=read_bit(); //读低8位
b=read_bit(); //读高8位
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t= tt*10; //放大10倍输出并四舍五入
return(t);
}
}
//***********************************************
//LCD 显示温度
void Temp_display(void)
{
unsigned int i=0;
unsigned char a=0, b=0;
write_com(0x90);
i=get_temp();
a=i/100;
write_date(0x30+a);
b=i/10-a*10;
write_date(0x30+b);
}
void main(void)
{
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
EA=1;
ET0=1;
TR0=1;
Lcd_Init();
write_com(0x80);
Lcd_word("用爱呵护这个世界");
delay(2000);
write_com(0x80);
Lcd_word("祝福全世界每个人");
while(1);
}
void time0() interrupt 1
{
unsigned char i=0;
TH0=0x3c;
TL0=0xb0;
if(++i >5)
{
i=0;
Temp_display();
}
}
各位大侠 我是新手 我想把温度值显示在LCD 可是怎么就是弄不出来 哪位朋友帮下我告诉我怎么去实现好吗? 谢谢 弄了很久没弄出来 |