#include "reg52.h"
#include <intrins.h>
unsigned int temp,temp1,temp2;
unsigned char ge,shi;
unsigned char Disp[]="TEMP=88";
sbit k1=P1^1;
sbit k2=P1^2;
sbit k3=P1^3;
sbit led=P1^0;
#define LCD1602_DB P2
sbit LCD1602_RS = P3^0;
sbit LCD1602_RW = P3^1;
sbit LCD1602_E = P3^2;
sbit DS18B20_DQ=P3^3;
void delay10us(void)
{
nop();
nop();
}
void delay595us(void)
{
unsigned char a,b;
unsigned int i;
for(i=0;i<1;i++)
for(b=20;b>0;b--)
for(a=1;a>0;a--);
}
void delay1ms(unsigned int t)
{
unsigned char a,b;
unsigned int i;
for(i=0;i<t;i++)
for(b=35;b>0;b--)
for(a=1;a>0;a--);
}
void LcdWriteCom(unsigned char com)
{
LCD1602_E = 0;
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_DB= com;
delay1ms(1);
LCD1602_E = 1;
delay1ms(1);
LCD1602_E = 0;
}
void LcdWriteData(unsigned char dat)
{
LCD1602_E = 0;
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DB= dat;
delay1ms(1);
LCD1602_E = 1;
delay1ms(1);
LCD1602_E = 0;
}
void Lcd_Init()
{
LcdWriteCom(0x38); //¿ªÏÔʾ
LcdWriteCom(0x0c); //¿ªÏÔʾ²»ÏÔʾ¹â±ê
LcdWriteCom(0x06); //дһ¸öÖ¸Õë¼Ó1
LcdWriteCom(0x01); //ÇåÆÁ
LcdWriteCom(0x80); //ÉèÖÃÊý¾ÝÖ¸ÕëÆðµã
}
void Ds18b20_Init(void)
{
_nop_();
DS18B20_DQ= 0;
delay595us();
DS18B20_DQ=1;
delay10us();
delay10us();
delay10us();
delay10us();
delay10us();
delay10us();
while(DS18B20_DQ==0);
DS18B20_DQ=1;
}
unsigned char Ds18b20Read(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=0;i<8;i++)
{
DS18B20_DQ= 0;
_nop_();
dat>>=1;
DS18B20_DQ= 1;
nop();
nop();
nop();
nop();
nop();
nop();
nop();
if(DS18B20_DQ)
{
dat |= 0x80;
}
delay10us();
delay10us();
delay10us();
delay10us();
delay10us();
delay10us();
}
return(dat);
}
void Ds18b20Write(unsigned char dat)
{
unsigned char i=0;
for (i=0; i<8; i++)
{
DS18B20_DQ= 0;
_nop_();
_nop_();
DS18B20_DQ= (dat&0x01);
delay10us();
delay10us();
delay10us();
delay10us();
delay10us();
delay10us();
DS18B20_DQ= 1;
dat>>=1;
nop();
nop();
}
}
unsigned int Ds18b20ReadTemp()
{
unsigned int tp ,T;
unsigned char tmh, tml;
float tep;
delay1ms(10);
Ds18b20_Init();
delay1ms(1);
Ds18b20Write(0xcc);
Ds18b20Write(0x44);
Ds18b20_Init();
delay1ms(1);
Ds18b20Write(0xcc);
Ds18b20Write(0xbe);
tml = Ds18b20Read();
tmh = Ds18b20Read();
tp = tmh;
tp <<= 8;
tp =tp|tml;
tep=tp;
T=tep*0.0625;
return T;
}
unsigned char IntToChar(unsigned int x)
{
unsigned char r=(char)x+'0';
return r;
}
void Display()
{
unsigned int i;
Lcd_Init();
ge=IntToChar(temp2 %10);
shi=IntToChar(temp2 /10);
Disp[5]=shi;
Disp[6]=ge;
for(i=0;i<7;i++)
{
LcdWriteData(Disp[i]);
}
delay1ms(100);
}
void key()
{
if(k1==0)
{
delay1ms(10);
if(k1==0)
{
temp=20;
}
while(!k1);
}
if(k2==0)
{
delay1ms(10);
if(k2==0)
{
temp++;
}
while(!k2);
}
if(k3==0)
{
delay1ms(10);
if(k3==0)
{
temp1=temp;
}
while(!k2);
}
}
void main(void)
{
temp=88;
while(1)
{
temp2=Ds18b20ReadTemp();
key();
Display();
if(temp1!= 0){
if(temp1<temp2)
{
led=0;
while(1)
{
delay1ms(10);
led=~led;
}
}
}
}
}
改变DS18B20模拟器件数值,读数随着改变,但读数读不对
延时函数 0us 误差