这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 智能温度测控系统

共6条 1/1 1 跳转至

智能温度测控系统

助工
2013-09-09 21:10:53     打赏

智能温度测控系统

#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; //初始化temp0

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); 

}

//

/*********18B201个字节函数********/

/*从总线上读取一个字节*/

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;

    }

}




关键词: 智能温度测控系统     18b20     stc89c51    

专家
2013-09-10 12:25:23     打赏
2楼
51  18b20。有调价的朋友拿着试试看好用不好。

高工
2013-09-11 15:49:07     打赏
3楼
我赶脚楼主没有把18b20的潜力挖掘出来! 譬如温度阈值可以由传感器去记录并判断。

菜鸟
2013-09-12 15:51:36     打赏
4楼
挺好的应用,支持分享。

助工
2013-09-21 23:11:06     打赏
5楼
18b20还可以写比较

菜鸟
2014-06-10 15:16:00     打赏
6楼
支持!

共6条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]