智能温度测控系统
#include "stdio.h"
#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^7; //温度输入口
sbit cold=P1^0; //制冷
sbit hot=P1^1; //制热
sbit beep = P1^5; //蜂鸣器
char sss;
bit bbb;
uint temp=0; //初始化temp为0
uchar data temp_data[]={0x00,0x00}; //读出温度暂放
//*************初始化函数******//
void init()
{
SCON=0x50; //设置串口为模式1且允许接收
TMOD=0X21; //设置定时器1为模式2和模式1
TH1=0xfd; //设置波特率为9600
TL1=0xfd;
TH0 = (65535 - 50000) / 256; //设置初值
TL0 = (65535 - 50000) % 256;
PCON&=0x00; //不设置电源控制寄存器
TR1=1; //定时器1开启
TI=1;
ET0 = 1; //定时器0中断允许
EA = 1; //开中断
}
/***********11微秒延时函数**********/
//
void delay(uint t)
{
for(;t>0;t--);
}
/*蜂鸣器延时*/
void sleep(int ms)
{
int i,j;
for(j=ms;j > 0; j--)
for(i = 0; i < 80; i++);
}
/***********18B20复位函数**********/
void ow_reset(void)
{
char presence=1;
while(presence)
{
while(presence)
{
DQ=1;
_nop_();
_nop_();
DQ=0;
delay(50); // 550us
DQ=1;
delay(6); // 66us
presence=DQ; // presence=0继续下一步
}
delay(45); //延时500us
presence = ~DQ;
}
DQ=1;
}
/**********18B20写命令函数*********/
/*向 1-WIRE 总线上写一个字节*/
void write_byte(uchar val)
{
uchar i;
for (i=8; i>0; i--)
{
DQ=1;
_nop_();
_nop_();
DQ = 0;
_nop_(); //5us
_nop_();
_nop_();
_nop_();
_nop_();
DQ = val&0x01; //最低位移出
delay(6); //66us
val=val/2; //右移一位
}
DQ = 1;
delay(1);
}
//
/*********18B20读1个字节函数********/
/*从总线上读取一个字节*/
uchar read_byte(void)
{
uchar i;
uchar value = 0;
for (i=8;i>0;i--)
{
DQ=1;
_nop_();
_nop_();
value>>=1;
DQ = 0;
_nop_(); //延时4us
_nop_();
_nop_();
_nop_();
DQ = 1;
_nop_(); //延时4us
_nop_();
_nop_();
_nop_();
if(DQ)value|=0x80;
delay(6); //66us
}
DQ=1;
return(value);
}
//
/***********读出温度函数**********/
//
void read_temp()
{
ow_reset(); //总线复位
write_byte(0xCC); // 发Skip ROM命令
write_byte(0xBE); // 发读命令
temp_data[0]=read_byte(); //温度低8位
temp_data[1]=read_byte(); //温度高8位
ow_reset();
write_byte(0xCC); // Skip ROM
write_byte(0x44); // 发转换命令
delay(40000);
}
/***********温度数据处理函数**********/
void work_temp()
{
temp=(temp_data[0]>>4)|(temp_data[1]<<4);
/*判断温度上限,下限*/
if(temp>=19)
{
cold=1;
bbb=1;
TR0 = 1;
}
else
cold=0;
if(temp<=14)
{
hot=1;
bbb=1;
TR0 = 1;
}
else
hot=0;
printf("%d\n",temp);
while(!TI);
}
/**************主函数****************/
main()
{
char i;
hot=0;
cold=0;
init();
ow_reset(); // 开机先转换一次
write_byte(0xCC); // Skip ROM
write_byte(0x44); // 发转换命令
delay(10000);
while(1)
{
read_temp(); //读出18B20温度数据
work_temp(); //处理温度数据
if (bbb) //蜂鸣器发出声.
{
bbb = 0;
for (i = 0; i < 80; i++) {
beep = ~beep;
sleep(1);
}
}
}
}
/*中断函数*/
void TIMER0() interrupt 1
{
TH0 = (65535 - 50000) / 256;
TL0 = (65535 - 50000) % 256;
sss++;
if (sss == 10) //蜂鸣器发声的频率
{
sss = 0;
}
}