温度报警系统报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

附录

一、设计题目:温度报警系统

二、基本功能

1.在数码管上显示当前温度

2.超过温度设定值,蜂鸣器自动报警

三、设计方案

进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。

四、总体设计框图

五、设计主流程图

六、系统电路图

七、程序清单

#include

#define uchar unsigned char

#define uint unsigned int

uchar code tab[]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar code tab1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; sbit DQ=P2^3;

sbit seg0=P2^0;//小数位

sbit seg1=P2^1;//个位

sbit seg2=P2^2;

sbit green=P2^4;

sbit red =P2^5;

sbit music=P3^6;

uchar data disdata[4];

uint tvalue;//温度值

uchar tflag;//温度正负标志

uchar max_tem=2;//温度警戒值

void delay_ms(unsigned int ms) //延时1毫秒(不精确的)

{ unsigned int i,j;

for(i=0;i

for(j=0;j<110;j++);

}

void delay_18B20(uint i)//延时1微秒

{ while(i--);

}

void display(uchar a,uchar b,uchar c)

{ P0=0xff;

seg2=1;

P0=tab[a];

delay_ms(1);

seg2=0; //显示个位

P0=0xff;

seg1=1;

P0=tab1[b];

delay_ms(1);

seg1=0; //显示小数位

P0=0xff;

seg0=1;

P0=tab[c];

delay_ms(1);

seg0=0;

}

void ds1820rst()/*ds1820复位*/

{ unsigned char x=0;

DQ = 1; //DQ复位

delay_18B20(4); //延时

DQ = 0; //DQ拉低

delay_18B20(100); //精确延时大于480us

DQ = 1; //拉高

delay_18B20(40);

}

uchar ds1820rd()/*读数据*/

{ uchar i=0;

uchar dat = 0;

for (i=8;i>0;i--)

{ DQ = 0; //给脉冲信号

dat>>=1;

DQ = 1; //给脉冲信号

if(DQ) dat|=0x80;

delay_18B20(10);

}

return(dat);

}

void ds1820wr(uchar wdata)/*写数据*/

{ uchar i=0;

for (i=8; i>0; i--)

{ DQ = 0;

DQ = wdata&0x01;

delay_18B20(10);

DQ = 1;

wdata>>=1;

}

}

void read_temp1()/*读取温度值并转换*/

{ EA=0; //关全局中断,防止DS18B20的时序操作被打乱ds1820rst();

ds1820wr(0xcc);//*跳过读序列号*/

ds1820wr(0x44);//*启动温度转换*/

ds1820rst(); EA=1;

}

unsigned int read_temp2()

{ uchar a,b;

EA=0;

ds1820wr(0xcc);//*跳过读序列号*/

ds1820wr(0xbe);//*读取温度*/

a=ds1820rd();

b=ds1820rd();

EA=1;

tvalue=b;

tvalue<<=8;

tvalue=tvalue|a;

if(tvalue<=0x07ff)

tflag=0;

else

{ tvalue=~tvalue+1;

tflag=1;

} tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数

return(tvalue);

}

void ds1820disp1()//温度值显示

{ disdata[0]=tvalue/1000;//百位数

disdata[1]=tvalue%1000/100;//十位数

disdata[2]=tvalue%100/10;//个位数

disdata[3]=tvalue%10; //小数位

}

void init_t1()

{ green=0;

red=1;

TH1=0XB7;

TL1=0XFF;

TR1=1;

ET1=1;

EA=1;

}

void main()

{ init_t1();

while(1)

{ red=1;

read_temp1();//读取温度

read_temp2();//读取温度

ds1820disp1();//数值提取

display(disdata[1],disdata[2],disdata[3]);

delay_ms(10);

}

}

void check_tem() interrupt 3

{ uchar i=0;

EA=0;

TH1=0XB7;

TL1=0XFF;

if(disdata[1]>max_tem)

{ red=0;

music=~music;

相关文档
最新文档