温度报警系统报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;