#include
#define uchar unsigned char
#define uint unsigned int
***it ds=P3^3;
***it beep=P3^6; //蜂鸣器的警报控制位
***it led0=P1^0; //四盏led灯的警报控制位
***it led1=P1^1;
***it led2=P1^2;
***it led3=P1^3;
uchar code shuma[]=
{0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数码管额编码 ,前十个是带小数点的,后十个不带小数点
uint temp; //临时存放温度数据
float f_temp;
uint warn_l1=200; //温度的上下限设置
uint warn_l2=150;
uint warn_h1=250;
uint warn_h2=300;
void delayms(uint xms) //延时函数 (X 毫秒)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--)
;
}
void init_18B20() //初始化18B200
{
uint i;
ds=0;
i=103;
while(i>0)
i--;
ds=1;
i=4;
while(i>0)
i--;
}
bit read_bit() //读一位数据位
{
uint i;
bit date;
ds=0; //先拉低数据线
i++;
ds=1; //数据线置高
i++;
i++;
date=ds; //读取一位数据
i=8; //计数延时
while(i>0)
i--;
return date;
}
uchar read_byte() //读一个字节数据
{
uchar i,j,date;
date=0;
for(i=1;i<=8;i++)
{
j=read_bit();
date=(j<<7)|(date>>1); //读取的最低字节正好依次存入
}
return date;
}
void write_byte(uchar date) //写入一个字节数据
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=date&0x01;
date=date>>1;
if(testb) //写入数据1
{
ds=0; //先拉低数据线
i++;
i++;
ds=1; //数据线置高,写入1
i=8; //计数延时
while(i>0)
i--;
}
else //写入数据0
{
ds=0; //拉低数据线 ,写入数据0
i=8; //计数延时
while(i>0)
i--;
ds=1; //数据线置高
i++;
i++;
}
}
}
void change() //开始转换
{
init_18B20();
delayms(1);
write_byte(0xcc); //跳过ROM 直接开始温度转换,适用于只有一个从机工作
write_byte(0x44); //开始温度转换 结果存入内部9字节的RAM中
}
uint get_temp() //读取寄存器中的温度数据
{
uchar a,b;
init_18B20();
delayms(1);
write_byte(0xcc); //跳过ROM 直接开始温度转换,适用于只有一个从机工作
write_byte(0xbe); //读取内部RAM中9字节的温度数据
a=read_byte(); //高字节数据
b=read_byte(); //低字节数据
temp=b;
temp<<=8;
temp=temp|a;
f_temp=temp*0.0625; //温度在寄存器中为12位 ,分辨率为0.0625°
temp=f_temp*10+0.5; //乘以10表示小数点后面只取1位,加0.5是四舍五入
f_temp=f_temp+0.05;
return temp;
}
void display(uchar num,uchar date) //显示数据的函数
{
uchar i;
P0=shuma[date];
i=0xff;
i=i&(~((0x01)<<(num)));
P2=i;
delayms(1);
}
void display_temp(uint t) //将温度数据传送并显示
{
uchar i;
i=t/100;
display(0,i+10);
i=t%100/10;
display(1,i);
i=t%10;
display(2,i+10);
}
void warn(uint s,uchar led)
{
uchar i;
i=s;
beep=0;
P1=~(led);
while(i--)
display_temp(get_temp());
beep=1;
P1=0xff;
i=s;
while(i--)
display_temp(get_temp());
}
void deal(uint t)
{
uchar i;
if((t>warn_l2)&&(t<=warn_l1))
warn(40,0x01);
else if(t<=warn_l2)
warn(10,0x03);
else if((t=warn_h1))
warn(40,0x04);
if(t>=warn_h2)
warn(10,0x0c);
else
{
i=40;
while(i--)
{
display_temp(get_temp());
}
}
}
void main()
{
//uchar i;
while(1)
{
change();
deal(get_temp()); //得到温度数据,并进行上下限的比较处理 ,同时显示数据
//for(i=10;i>0;i--)
//display_temp(get_temp()); //如果不需要上下温度的限制,则可直接显示温度
delayms(5);
}
}
|