//用来读取DS18B20 内部ROM序列号
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define LCD_Data P0 //P0口做数据口
sbit LCD_RS=P3^5;//并口选择
sbit LCD_E=P3^4;
sfr WDT_CONTR=0XE1;//看门狗寄存器地址
sbit led1=P1^0;
sbit led2=P1^1;
sbit DULA=P2^6;
sbit WELA=P2^7;
sbit s1=P3^0;
sbit s2=P3^1;
sbit s3=P3^2;
sbit lowcs=P3^7; //矩阵键盘分离出独立键盘
sbit beep=P2^3;
//DS18B20 PORT
sbit DS18B20=P2^2;//DS18B20端口选择
uchar fCode[8];
void delay(unsigned int z) //延时函数
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delayb(unsigned int count) //延时函数
{
while(count--);
}
/***********DS18B20************/
unsigned char DS18B20Init() //18B20初始化 晶振22.1184 指令周期大约0.5微秒
{
unsigned char x;
DS18B20=1;
delayb(5);
DS18B20=0;
delayb(200);
DS18B20=1;
delayb(10); //等待18B20响应
x=DS18B20;
delayb(100);
return x;
}
unsigned char TempRead(void)
{
unsigned char i,dat;
DS18B20=1;
delayb(1);
for(i=0;i<8;i++)
{
DS18B20=0;
dat=dat>>1;
DS18B20=1;
if(DS18B20)
dat=dat|0x80;
delayb(4);
}
return dat;
}
void TempWriteByte(unsigned char dat)
{
unsigned int i;
DS18B20=1;
delayb(5);
for(i=0;i<8;i++)
{
DS18B20=0;
DS18B20=dat&0x01;
delayb(8);
DS18B20=1;
dat=dat>>1;
delayb(5);
}
}
/*******12864lcd*******/
/***液晶写数据***/
void WriteDataLCD(unsigned char dat)
{
LCD_RS=1;
LCD_E=0;
delay(2);
LCD_Data=dat;
delay(2);
LCD_E=1;
delay(2);
LCD_E=0;
delay(2);
}
/***液晶写指令***/
void WriteCommandLCD(unsigned char com)
{
LCD_RS=0;
LCD_E=0;
delay(2);
LCD_Data=com;
delay(2);
LCD_E=1;
delay(2);
LCD_E=0;
delay(2);
}
void init_lcd()
{
LCD_E=0;
WriteCommandLCD(0x38);//设置lcd1602为每个字符5×7显示
WriteCommandLCD(0x0f); //开显示,光标显示并闪烁
WriteCommandLCD(0x06);//光标移动设置,每写一个数,光标自动加一
WriteCommandLCD(0x01); //清屏
}
void init_all()
{
beep=0;//蜂鸣器关闭
lowcs=0;//置低一列分离出独立键盘
DULA=WELA=0;//关闭数码管显示
DS18B20Init();
init_lcd();
}
void DispCode()
{
unsigned char i,temp;
DS18B20Init();
TempWriteByte(0x33);
delay(500);
for (i=0;i<8;i++)
{
fCode[i]=TempRead();
}
WriteCommandLCD(0x80);
for (i=0;i<8;i++)
{
temp = fCode[i]/16; //高8位
if (temp<10)
WriteDataLCD(temp + 0x30);
else
WriteDataLCD(temp + 0x37);
temp = fCode[i]%16; //低8位
if (temp<10)
WriteDataLCD(temp+ 0x30);
else
WriteDataLCD(temp + 0x37);
}
}
void main()//主函数
{
init_all();
while(1)
DispCode();
}