这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 嵌入式开发» 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 跳转至

回复

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