#include "math.h"
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
/*********************delay********************/
void delay_us(uchar t)
{
while(--t); //t*2+5 us
}
void delay_ms(uchar t)
{
while(t--)
{
delay_us(245);
delay_us(245); //1ms
}
}
void delay_s(uchar t)
{
while(t--)
{
delay_ms(200);
delay_ms(200);
delay_ms(200);
delay_ms(200);
delay_ms(200);
}
}
/***************************lcd*********************/
sbit RS=P2^0; //定义数据命令选择端
sbit RW=P2^1; //定义读写选择端
sbit E=P2^2; //定义使能端
#define lcd_D P0
uchar lcd_readbusy() //判断lcd是否处于忙的状态,即读忙
{
uchar temp;
RS=0;
RW=1;
_nop_();
P0=0xff; //读某IO口数据前,先将该口置为1
_nop_();
E=1;
_nop_();
temp=P0; //读取此时lcd的状态字
_nop_();
E=0;
return (temp&0x80); //如果忙
}
void lcd_wcom(unsigned char a)//写指令,用于功能启动
{
lcd_readbusy();
E = 0;
RS = 0;
RW = 0;
lcd_D = a;
delay_us(50);
E = 1;
delay_ms(5);
E = 0;
}
void lcd_wdata(unsigned char dat) //写数据操作
{
lcd_readbusy();
E = 0;
RS = 1;
RW = 0;
lcd_D = dat;
delay_us(50);
E = 1;
delay_ms(5);
E = 0;
}
void lcd_init()//初始化操作,各种设置
{
delay_ms(15);
lcd_wcom(0x38);
delay_ms(6);
lcd_wcom(0x38);
delay_ms(6);
lcd_wcom(0x38);
lcd_wcom(0x38);
lcd_wcom(0x0c);
lcd_wcom(0x06);
lcd_wcom(0x01);
}
void lcd_setwei(unsigned char x ,unsigned char y)//显示位置
{
unsigned char add;
if(y == 0)
add = 0x00 + x ;
else
add = 0x40 + x ;
lcd_wcom(add | 0x80);
}
void lcd_disp_str(unsigned char x, unsigned char y, unsigned char *datae) //显示操作
{
lcd_setwei(x , y);//设置显示位置
//delay_us(50);
while(*datae != '\0')//字符串终止
{
lcd_wdata(*datae++);
}
}
void lcd_disp_char(unsigned char x, unsigned char y, unsigned char datae) //显示操作
{
lcd_setwei(x , y);//设置显示位置
//delay_us(10);
lcd_wdata(datae);
}
/******************************DS18B20************************************/
sbit DQ = P2^3; //DS18B20 通信引脚
uchar temp,temp1;
uchar ds_init()
{
uchar n;
DQ=1;
delay_us(30);
DQ=0;
delay_us(250);//600us
DQ=1;
delay_us(40);//15us~60us
n=DQ;
delay_us(40);
return 0;
}
void write_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01;
delay_us(40);
DQ=1;
dat=dat>>1;
}
delay_us(40);
}
uchar read_byte(void)
{
uchar i,value;
for(i=0;i<8;i++)
{
DQ=0;
value>>=1;
DQ=1; //
if(DQ)
value|=0x80;
delay_us(40);
}
return value;
}
uchar read_tem(void)
{
uchar a,b,temp0;
ds_init();
write_byte(0xcc);
write_byte(0x44);
delay_ms(3);
ds_init();
write_byte(0xcc);
write_byte(0xbe);
a=read_byte();
b=read_byte();
b<<=4;
temp1=(a&0x0f);
temp1=temp1*0.625+0.5;
a>>=4;
temp0=b|a;
return temp0;
}
void main()
{
uchar n;
lcd_init();
while(1)
{
temp=read_tem(); //温度值的整数部分
n=ds_init();
//lcd_disp_char(10,0,0x30+temp1);
if(n)
delay_ms(5);
lcd_disp_str(0,0,"Temp:");
lcd_disp_char(5,0,0x30+temp/10);
lcd_disp_char(6,0,0x30+temp%10);
lcd_disp_char(7,0,'.');
lcd_disp_char(8,0,0x30+temp1);
lcd_disp_char(9,0,0xdf);
lcd_disp_char(10,0,0x43);
}
}
/*
void main()
{
uchar a;
float temp;
unsigned int b;
float wendu;
uchar disbuf[20];
lcd_init();
lcd_disp_char(0,0,'c');
while(1)
{
tmpchange();
temp = temp_get();
sprintf(disbuf,"temps %.1f",temp);
lcd_disp_str(0,1,disbuf);
}
}
/*
void main()
{
lcd_init();
while(1)
{
lcd_disp_str(8, 0, "error!");
}
}
*/