#include<reg52.h> //包括头文件。普通情况不须要修改。头文件包括特殊功能寄存器的定义
#define uchar unsigned char
#define uint unsigned int
sbit LED0=P1^0;//定义按键位置
sbit LED1=P1^1;
sbit RELAY = P1^2; //定义继电器位置
code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共阴数码管 0-9
uchar smg[4]; //定义缓冲区
void init_ds18b20(void) ; //DS18B20初始化
void ds18b20write_byte(uchar dat); //DS18B20写字节
uchar ds18b20read_byte(void); //DS18B20读字节
uchar readtemperature(void) ; //DS18B20读取温度
void delay(unsigned int i);
sbit DQ=P3^7; //ds18b20 port
void delayds18b20(uint t)
{
while(t--);
}
void delay(unsigned int cnt)
{
while(--cnt);
}
void display(int b,int a) //位分离
{
smg[0]=tab[a/10];
smg[1]=tab[a%10];
smg[2]=tab[b/10];
smg[3]=tab[b%10];
}
/*------------------------------------------------
键盘扫描程序
------------------------------------------------*/
uchar keyscan(void) //键盘扫描函数,使用行列反转扫描法
{
uchar cord_h,cord_l;//行列值中间变量
P3=0xf0; //行线输出全为0
P1=0xff;
cord_h=P3&0xf0; //读入列线值
if(cord_h!=0x0f) //先检測有无按键按下
{
delay(100); //去抖
if(cord_h!=0x0f)
{
cord_h=P3&0xf0; //读入列线值
P3=cord_h|0x0f; //输出当前列线值
cord_l=P3&0x0f; //读入行线值
return(cord_h+cord_l);//键盘最后组合码值
}
}
}
void main()
{
uint key,i,a=0,b=0;
RELAY=0;
init_ds18b20() 。
key=keyscan(); //调用键盘扫描。
for(i=0;i<4;i++) //显示函数
{
display(a,b);
P0=smg[i];
P2=i;
delay(100);
}
if(key==0xe7)
while(1)
{
b=readtemperature();
delay(100);
key=keyscan();
switch(key)
{
case 0x7e:a=0;break;//0 按下相应的键显示相相应的码值
case 0xbe:a=40;break;
case 0xde:a=45;break;
case 0xee:a=55;break;
case 0x7d:a=65;break;
case 0xbd:a=75;break;
case 0xdd:a=85;break;
case 0xed:a=95;break;
}
display(b,a);
for(i=0;i<4;i++) //显示函数
{
P0=smg[i];
P2=i;
delay(100);
}
if(a>b) //温度推断
{
RELAY=1; //继电器吸和
LED0=0;
}
else
{
RELAY=0; //继电器断开
LED1=0;
}
}
}
void init_ds18b20(void) // 初始化
{
uchar n;
DQ=1; //DQ复位
delayds18b20(8);
DQ=0;
delayds18b20(80); //精确延时 大于 480us
DQ=1;
delayds18b20(10);
n=DQ;
delayds18b20(5);
}
void ds18b20write_byte(uchar dat) // 写一个字节
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01;
delayds18b20(5);
DQ=1;
dat>>=1;
}
delayds18b20(5);
}
uchar ds18b20read_byte(void) //读一个字节
{
uchar i,value;
for(i=0;i<8;i++)
{
DQ=0; // 给脉冲信号
value>>=1;
DQ=1; // 给脉冲信号
if(DQ)
value|=0x80;
delayds18b20(5);
}
return value;
}
uchar readtemperature(void) // 读取温度
{
uchar a,b;
init_ds18b20();
ds18b20write_byte(0xcc); //跳过ROM
ds18b20write_byte(0x44); //启动温度測量
delayds18b20(200);
init_ds18b20();
ds18b20write_byte(0xcc);
ds18b20write_byte(0xbe);
a=ds18b20read_byte(); //低位
b=ds18b20read_byte(); //高位
b<<=4;
b+=(a&0xf0)>>4;
return b;
}