目录一、选题背景及研究意义二、总体设计2.1控制部分2.2测量部分2.3显示部分2.4报警部分三、硬件设计四、软件设计五、总结与展望一、选题背景及研究意义温度是一种最基本的环境参数,人民的生活与环境的温度息息相关,在工业生产过程中需要实时测量温度,在农业生产中也离不开温度的测量,因此研究温度的测量方法和装置具有重要的意义。
温度是一个十分重要的物理量,对它的测量与控制有十分重要的意义。
随着现代工农业技术的发展及人们对生活环境要求的提高,人们也迫切需要检测与控制温度:如大气及空调房中温度的高低,直接影响着人们的身体健康;粮仓温度的检测,防止粮食发霉,最大限度地保持粮食原有新鲜品质,达到粮食保质保鲜的目的;工业易燃品的存放。
测温技术在生产过程中,在产品质量控制和监测以及节约能源等方面发挥了着重要作用。
本实验设计实现了工业测温基本功能,同时,在设计实验过程中,运用到单片机、模电、数电、传感器和C++程序设计等知识,这既能加强我们的理论知识与实践的结合,也能够提高我们应用交叉学科知识进行综合设计的能力。
二、总体设计总体设计框图:2.1控制部分控制部分是采用单片机STC89C52。
2.1.1 STC89C52简介STC89C52是一种带8K字节闪烁可编程可檫除只读存储器的低电压,高性能COMOS8的微处理器,俗称单片机。
该器件采用ATMEL搞密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
单片机总控制电路如下图4—1:2.1.2 复位操作复位操作有上电自动复位相按键手动复位两种方式。
上电自动复位是通过外部复位电路的电容充电来实现的,其电路如图4-2(a)所示。
这佯,只要电源Vcc的上升时间不超过1ms,就可以实现自动上电复位,即接通电源就成了系统的复位初始化。
按键手动复位有电平方式和脉冲方式两种。
其中,按键电平复位是通过使复位端经电阻与Vcc电源接通而实现的,其电路如图4-2(b)所示;而按键脉冲复位则是利用RC微分电路产生的正脉冲来实现的,其电路如图4-2(c)所示:(a)上电复位(b)按键电平复位(c)按键脉冲复位图4-2复位电路上述电路图中的电阻、电容参数适用于6MHz晶振,能保证复位信号高电平持续时间大于2个机器周期。
本系统的复位电路采用图4-2(b)上电复位方式。
2.1.3 STC89C52具体介绍如下:①主电源引脚(2根)VCC(Pin40):电源输入,接+5V电源GND(Pin20):接地线②外接晶振引脚(2根)XTAL1(Pin19):片内振荡电路的输入端XTAL2(Pin20):片内振荡电路的输出端③控制引脚(4根)RST/VPP(Pin9):复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。
ALE/PROG(Pin30):地址锁存允许信号PSEN(Pin29):外部存储器读选通信号EA/VPP(Pin31):程序存储器的内外部选通,接低电平从外部程序存储器读指令,如果接高电平则从内部程序存储器读指令。
④可编程输入/输出引脚(32根)STC89C52单片机有4组8位的可编程I/O口,分别位P0、P1、P2、P3口,每个口有8位(8根引脚),共32根。
PO口(Pin39~Pin32):8位双向I/O口线,名称为P0.0~P0.7 P1口(Pin1~Pin8):8位准双向I/O口线,名称为P1.0~P1.7 P2口(Pin21~Pin28):8位准双向I/O口线,名称为P2.0~P2.7P3口(Pin10~Pin17):8位准双向I/O口线,名称为P3.0~P3.72.1.4 STC89C52主要功能,如下表所示。
STC89C52主要功能主要功能特性兼容MCS51指令系统8K可反复擦写Flash ROM32个双向I/O口256x8bit内部RAM时钟频率0-24MHz 3个16位可编程定时/计数器中断2个串行中断可编程UART串行通道2个外部中断源共6个中断源2个读写中断口线3级加密位低功耗空闲和掉电模式软件设置睡眠和唤醒功能2.2测量部分测量部分我们采用美国DALLAS公司生产的DS18B20温度传感器。
2.2.1 DS18B20简介DS18B20数字温度传感器,该产品采用美国DALLAS公司生产的DS18B20可组网数字温度传感器芯片封装而成,具有耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。
2.2.2封装及接线说明:DS18B20芯片封装结构:特点:独特的一线接口,只需要一条口线通信多点能力,简化了分布式温度传感应用无需外部元件可用数据总线供电,电压范围为 3.0V至 5.5V无需备用电源测量温度范围为-55 °C至+125 ℃。
华氏相当于是-67 °F到257华氏度 -10 °C至+85 °C范围内精度为±0.5 °C2.2.3 DS18B20控制方法DS18B20有六条控制命令:温度转换 44H:启动DS18B20进行温度转换读暂存器 BEH:读暂存器9个字节内容写暂存器 4EH:将数据写入暂存器的TH、TL字节复制暂存器 48H:把暂存器的TH、TL字节写到E2RAM中读电源供电方式 B4H:启动DS18B20发送电源供电方式的信号给主CPU2.2.4 DS18B20的初始化2.2.5 DS18B20的写操作2.2.6 DS18B20的读操作2.3显示部分显示部分是用LCD1602液晶显示2.3.1 LCD1602引脚说明2.4报警部分见下面报警流程图模块及程序。
三、硬件设计电路原理图如下:DS18B20与单片机之间用单总线传输;DS18B20的数据口与单片机的P1^7相连;液晶LCD1602的RS、R/W和E分别于单片机的P^4、P2^5、P2^6相连;四、软件设计系统软件程序基于Keil uvsion3开发平台,采用C51语言编写。
本程序采用模块化程序方法,主要分为以下三个模块:◆LCD初始化显示模块◆DS18B20数据采集模块◆温度报警上下限设置模块程序流程图:源程序:#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit DQ=P1^7; //ds18b20与单片机连接口sbit RS=P2^4;sbit RW=P2^5;sbit EN=P2^6;sbit K1=P2^0;sbit K2=P2^1;sbit K3=P2^2;sbit LED=P1^0;sbit beep=P1^5;unsigned char code str1[]={"temperature is:"};unsigned char code str2[]={" "};uchar code LCD10[10]={"0123456789"};uchar data disdata[16]={0x00,0x00,0x00,0x2E,0x00,0xDF,0x20, 0x48,0x3D,0x00,0x00,0x20,0x4C,0x3D,0x00,0x00};uint tvalue; //温度值uchar tflag; //温度正负标志uchar flat,upnum,downnum,temp;/**********************LCD显示模块***********************/ void delay1ms(unsigned int ms)//延时1毫秒{unsigned int i,j;for(i=0;i<ms;i++)for(j=0;j<100;j++);}void delay1(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void wr_com(unsigned char com)//写指令//{ delay1ms(1);RS=0;RW=0;EN=0;P0=com; /*-----------LCD数据传送口---------- */delay1ms(1);EN=1;delay1ms(1);EN=0;}void wr_dat(unsigned char dat)//写数据//{ delay1ms(1);;RS=1;RW=0;EN=0;P0=dat; /*-----------LCD数据传送口---------- */delay1ms(1);EN=1;delay1ms(1);EN=0;}void lcd_init()//初始化设置//{delay1ms(15);wr_com(0x38);delay1ms(5);wr_com(0x08);delay1ms(5);wr_com(0x01);delay1ms(5);wr_com(0x06);delay1ms(5);wr_com(0x0c);delay1ms(5);}void display(unsigned char *p)//显示//{while(*p!='\0'){wr_dat(*p);p++;delay1ms(1);}}init_play()//初始化显示{lcd_init();wr_com(0x80);display(str1);wr_com(0xC0);display(str2);}/*******************DS18B20测温模块**********************/ void delay_18B20(unsigned int i)//延时1微秒{while(i--);}void ds1820rst(){ unsigned char x=0;DQ = 1; //DQ复位delay_18B20(4); //延时DQ = 0; //DQ拉低delay_18B20(100); //精确延时大于480us DQ = 1; //拉高delay_18B20(40);}uchar ds1820rd(){ unsigned char i=0;unsigned char 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) {unsigned char i=0;for (i=8; i>0; i--){ DQ = 0;DQ = wdata&0x01;delay_18B20(10);DQ = 1;wdata>>=1;}}read_temp(){uchar a,b;ds1820rst();ds1820wr(0xcc);//ds1820wr(0x44);//ds1820rst();ds1820wr(0xcc);//ds1820wr(0xbe);//a=ds1820rd();b=ds1820rd();tvalue=b;tvalue<<=8;tvalue=tvalue|a;if(tvalue<0x0fff)tflag=0;else{tvalue=~tvalue+1;tflag=1;}tvalue=tvalue*(0.625);//真实温度return(tvalue);}void ds1820disp()//温度值显示{ uchar i;disdata[1]=tvalue%1000/100+0x30;//十位数disdata[2]=tvalue%100/10+0x30;//个位数disdata[4]=tvalue%10+0x30;//小数位disdata[9]=LCD10[upnum/10];disdata[10]=LCD10[upnum%10];disdata[14]=LCD10[downnum/10];disdata[15]=LCD10[downnum%10];if(tflag==0) //+{disdata[0]=tvalue/1000+0x30;//正温度显示百位数}else //-{disdata[0]=0x2d;//负温度显示负号}wr_com(0xC0);for(i=0;i<16;i++){wr_dat(disdata[i]);}temp=tvalue/10; //报警温度还原}/******************上下限设及报警模块*******************/ void key(void){if(K1==0) //模式选择{delay1(5);if(K1==0){flat++;while(!K1);if(flat==1) //上限调节{wr_com(0x80+0x40+9);wr_com(0x0c); //光标显示,闪烁}if(flat==2) //下限{wr_com(0x80+0x40+14);}if(flat==3) //退出模式{flat=0;wr_com(0x0c);}}}if(flat!=0){if(K2==0) ////+++++++++++++++++++++{delay1(5);if(K2==0){while(!K2);if(flat==1){upnum++;if(upnum==65) //最高温度值+upnum=35;wr_com(0x80+0x40+9);}if(flat==2){downnum++;if(downnum==20) //最底温度值-downnum=3;wr_com(0x80+0x40+14);}}}if(K3==0) ////-------------------{delay1(5);if(K3==0){while(!K3);if(flat==1){upnum--;if(upnum==35) //最高温度值upnum=65;wr_com(0x80+0x40+9);}if(flat==2){downnum--;if(downnum==3) //最底温度值-downnum=20;wr_com(0x80+0x40+14);}}}}}void compare(void){if(temp>=upnum||temp<=downnum){beep=0;LED=0;}else{beep=1;LED=1;}}/************************main函数*************************/ void main(){init_play();//初始化显示flat=0;upnum=30;downnum=9;while(1){ read_temp();//读取温度ds1820disp();//显示key();compare();}}五、总结与展望单片机是一门应用性与实践性很强的学科,如何学习单片机?学单片机不仅要学习理论知识,实践操作同样重要。