#include<reg52.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define PA XBYTE[0XD1FF]
#define PB XBYTE[0XD2FF]
#define CON XBYTE[0XD7FF]
uchar table[]={0xfe,0xfd,0xfb};
uchar table1[]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xb8,0x20,0x28};
uchar b; //返回温度的全局变量
sbit DQ=P1^7; //温度传感器的数据引脚
sbit P33=P3^3;
void write_byte(uchar dat);
uchar read_byte();
void initial_18b20();
void delay(uchar t);
uchar readtemperature(void);
//延时函数
void delay(uchar t)
{
while(t--);
}
/************************
函数名:write_byte()—写字节函数
函数调用:无
函数功能:给温度传感器写数据和指令
************************/
void write_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0; //拉低数据总线,准备写入数据
DQ=dat&0x01; //从最低位开始往单总线上传数据
delay(4); //延时以使温度传感器采样完数据
DQ=1; //释放总线
dat=dat>>1; //从高位往低位移动要传的数据
}
delay(5);
}
/************************
函数名:rea_byte()—字节函数
函数调用:无
函数功能:从温度传感器中读出数据
************************/
uchar read_byte(void)
{
uchar i,value;
for(i=0;i<8;i++)
{
DQ=0; //拉低单总线,开始读时间隙
value>>=1; //将所获得的数据从高往低移动
DQ=1; //拉高总线,开始总线采样从温度传感器中传出的数据
if(DQ)
value=value|0X80; //采样得到“1”的数据
delay(4);
}
return value; //返回采样到的数据
}
/************************
函数名:initial_18b20()—温度传感器初始化函数
函数调用:delay()
函数功能:初始化温度传感器
************************/
void initial_18b20()
{
uchar n;
DQ=1;
delay(8);
DQ=0;
delay(80);
DQ=1;
delay(5);
n=DQ;
while(n);
delay(15);
}
/************************
函数名:displayreadtemperature()—温度传感器初始化函数
函数调用:delay(),write_byte(),read_byte(),initial_18b20()
函数功能:初始化温度传感器
************************/
uchar displayreadtemperature(void)
{
uchar a,b,c;
uchar x,y;
initial_18b20(); //初始化温度传感器
write_byte(0xcc); //跳过搜索rom指令
write_byte(0x44); //开始温度传感器的转换
delay(300); //等待转换
initial_18b20(); //初始化温度传感器
write_byte(0xcc); //跳过搜索rom指令
write_byte(0xbe); //写入读温度传感器的指令
a=read_byte(); //读到第一字节的数据
b=read_byte(); //读到第二字节的数据
c=a&0x0f; //得到a的低四位数据
b<<=4;
b+=(a&0xf0)>>4; //得到温度值的整数值
c=c*0.0625*10; //得到温度值的小数点后第一位的值
x=b/16;
y=b%16;
PB=0xff;
PA=table[0];
PB=table1[x]; //显示温度值的十位
delay(100);
PB=0xff;
PA=table[1];
PB=table1[y]-32; //显示温度值的个位,减32是显示加了小数点后的编码
delay(100);
PB=0xff;
PA=table[2];
PB=table1[c]; //显示温度值的小数位
delay(100);
b=10*x+y; //将显示的值赋给b
return b;
}
main()
{
uchar temp;
CON=0X80; //写入8255的控制字
P33=1;
while(1)
{
temp=displayreadtemperature();
if(temp>=40||temp<0) //判断温度值是否超过报警值
{
P33=~P33; //超过产生驱动蜂鸣器报警的方波
}
else
P33=1;
}
}