您好,欢迎访问三七文档
当前位置:首页 > 机械/制造/汽车 > 综合/其它 > 基于51单片机的温度测量系统
基于51单片机的温度测量系统系统介绍利用单片机和温度传感器实现温度检测设计思路分析温度传感器的选择-DS18B20接口电路的设计软件设计:1.信息采集2.数据传输3.显示温度传感器DS18B20美国达拉斯(DALLAS)公司的单线数字温度传感器芯片;与传统的热敏电阻不同:1、可直接将被测温度转化成串行数字信号,以供单片机处理;2、它还具有微型化、低功耗、高性能、抗干扰能力强等优点。DS18B20DS18B20参数测量温度范围为-55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C;3V~5.5V的电压范围;可以程序设定9~12位的分辨率;分辨率、报警温度存储在EEPROM中,掉电后依然保存;“一线总线”接口——1-Wire技术美国达拉斯半导体公司推出了一项特有的技术;单根信号线,可传输时钟、数据;数据传输双向;优点:线路简单、硬件开销少、成本低廉、便于扩展。DS18B20的内部结构四部分:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器;引脚:DQ为数字信号输入/输出端;GND为电源地;VDD为外接供电电源输入端;64位光刻ROM光刻ROM中的64位序列号是出厂前被光刻好的,它可以看作是该DS18B20的地址序列码。64位光刻ROM的排列是:开始8位(28H)是产品类型标号,接着的48位是该DS18B20自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+1)。光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。DS18B20的内部温度传感器测量温度用16位符号扩展的二进制补码读数形式提供,以0.0625℃/LSB形式表达,其中S为符号位。如果温度小于0,S位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度DS18B20的内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的E2RAM;E2RAM存放高温度和低温度触发器TH、TL和结构寄存器。高速暂存RAM第九个字节:冗余检验字节TMR1R011111TM是测试模式位,在DS18B20出厂时该位被设置为0,用户不要去改动。R1和R0用来设置分辨率:出厂时被设置为12位;R1R0分辨率温度最大转换时间009位93.75ms0110位187.5ms1011位375ms1112位750msDS18B20的通讯协议每一次读写之前都要对DS18B20进行复位;要求主CPU将数据线下拉500微秒,然后释放,DS18B20收到信号后等待16~60微秒左右,后发出60~240微秒的存在低脉冲,主CPU收到此信号表示复位成功;复位成功后发送一条ROM指令;最后发送RAM指令;硬件电路设计接口电路接口电路由ATMEL公司的8051单片机、ULN2003达林顿芯片、4511BCD译码器、串行EPROM24C16(保存系统参数)、MAX232、数码管及外围电路构成;单片机以并行通信方式从P1.0~P1.7口输出控制信号,通过4511BCD译码器译码,用2个共阴极LED静态显示温度的十位、个位。报警电路报警电路由一个自我震荡型的蜂鸣器(只要在蜂鸣器两端加上超过3V的电压,蜂鸣器就会叫个不停)和一个发光二极管组成。蜂鸣器是通过ULN2003电流放大IC来控制。在温度达到一定的上界或者下界时(例如设置的上界温度是45℃,下界温度是5℃),报警电路开始工作。系统软件设计主函数main(){unsignedchari=0;unsignedintm,n;while(1){i=ReadTemperature();//读温度if(i0&&i=10){P1=designP1[i];}//如果温度在0到10度之间直接给七段数码管赋值else{//如果温度大于10度m=i%10;//先给第一个七段数码管赋值D1=1;D2=0;P1=designP1[m];n=i/10;//再给第二个七段数码管赋值D1=0;D2=1;P1=designP1[n];if(n=4&&m=5)%%(m=5){//判断温度的取值范围,如果大于45或小于5度,则蜂鸣器叫,发光二极管闪inta,b;Q1=1;//蜂鸣器叫for(a=0;a1000;a++)//发光二极管闪烁for(b=0;b1000;b++)Q2=1;for(a=0;a1000;a++)for(b=0;b1000;b++)Q2=0;}}}(1)初始化函数//读一个字节函数ReadOneChar(void){unsignedchari=0;unsignedchardat=0;for(i=8;i0;i--){DQ=0;//给脉冲信号dat=1;DQ=1;//给脉冲信号if(DQ)dat|=0x80;delay(4);}return(dat);}(1)初始化函数//写一个字节函数WriteOneChar(unsignedchardat){unsignedchari=0;for(i=8;i0;i--){DQ=0;DQ=dat&0x01;delay(5);DQ=1;dat=1;}}(2)读取温度并计算函数ReadTemperature(void){unsignedchara=0;unsignedcharb=0;unsignedintt=0;floattt=0;Init_DS18B20();WriteOneChar(0xCC);//跳过读序号列号的操作WriteOneChar(0x44);//启动温度转换Init_DS18B20();WriteOneChar(0xCC);//跳过读序号列号的操作WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度a=ReadOneChar();b=ReadOneChar();t=b;t=8;t=t|a;tt=t*0.0625;t=tt*10+0.5;//放大10倍输出并四舍五入---此行没用return(t);}
本文标题:基于51单片机的温度测量系统
链接地址:https://www.777doc.com/doc-3328643 .html