单片机DS18B20课程设计_第1页
单片机DS18B20课程设计_第2页
单片机DS18B20课程设计_第3页
单片机DS18B20课程设计_第4页
单片机DS18B20课程设计_第5页
已阅读5页,还剩16页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

word文档可自由复制编辑无线单片机及应用课程设计报告设计题目:温度计专业:物联网工程组别:温度计个人组学生姓名:周根弟学号:1121316123起止日期:2014年6月16日~2014年6月20日指导教师:邵鹤帅胡荣林目录1内容摘要 32温度计的概述及设计要求 42.1温度计的概述 42.2设计任务及要求 42.2.1基本任务 42.2.2设计要求 43硬件设计 53.1单片机系统 52.1.1功能控制 53.1.2单片机系统电路原理图 53.2数字温度传感器模块 63.2.1DS18B20性能 63.2.2DS18B20外形及引脚说明 63.2.3DS18B20接线原理图 73.3显示电路 73.4声光报警电路 83.5数据处理 84软件设计 94.1主程序模块 94.2读温度值模块 94.2.1读值模块 104.2.2DS18B20初始化子程序流程图 114.2.3DS18B20写字节和读字节子程序 124.3中断模块 124.4温度设定、报警模块 134.5数码管驱动模块 135源程序 156总结体会 207参考文献 201内容摘要目前,单片机已经在测控领域中获得了广泛的应用,它除了可以测量电信以外,还可以用于温度、湿度等非电信号的测量,能独立工作的单片机温度检测、温度控制系统已经广泛应用很多领域。单片机是一种特殊的计算机,它是在一块半导体的芯片上集成了CPU,存储器,RAM,ROM,及输入与输出接口电路,这种芯片称为:单片机。由于单片机的集成度高,功能强,通用性好,特别是它具有体积小,重量轻,能耗低,价格便宜,可靠性高,抗干扰能力强和使用方便的优点,使它迅速的得到了推广应用,目前已成为测量控制系统中的优选机种和新电子产品中的关键部件。单片机已不仅仅局限于小系统的概念,现已广泛应用于家用电器,机电产品,办公自动化用品,机器人,儿童玩具,航天器等领域。本次课程设计,就是用单片机实现温度控制,传统的温度检测大多以热敏电阻为温度传感器,但热敏电阻的可靠性差,测量温度准确率低,而且必须经过专门的接口电路转换成数字信号才能由单片机进行处理。本次采用DS18B20数字温度传感器来实现基于51单片机的数字温度计的设计。传统的温度计有反应速度慢、读数麻烦、测量精度不高、误差大等缺点而下面利用集成温度传感器AD590设计并制作了一款基于AT89C51的4位数码管显示的数字温度计,其电路简单,软硬件结构模块化,易于实现。

该数字温度计利用AD590集成温度传感器及其接口电路完成温度的测量并转换成模拟电压信号,经由模数转换器ADC0804转换成单片机能够处理的数字信号,然后送到单片机AT89C51中进行处理变换,最后将温度值显示在D2、D1共2位七段码LED显示器上。系统以AT89C51单片机为控制核心,2位温度数据显示电路以及外围电源、时钟电路等组成。本次设计完成一个最小系统的设计,系统电路简单、操作简便,系统具有可靠性高、成本低、功耗小等优点。2温度计的概述及设计要求2.1温度计的概述数字温度计与传统的温度计相比,具有读数方便、测温范围广、测温精确、功能多样话等优点。其主要用于对测温要求准确度比较高的场所,或科研实验室使用,该设计使用STC89C51单片机作控制器,数字温度传感器DS18B20测量温度,单片机接受传感器输出,经处理用LED数码管实现温度值显示。利用集成温度传感器DS18B20设计并制作了一款基于AT89C51的2位数码管显示的数字温度计,其电路简单,软硬件结构模块化,易于实现。2.2设计任务及要求2.2.1基本任务1.数字温度计利用DS18B20集成温度传感器及其接口电路完成温度的测量并转换成模拟电压信号,经由模数AD转换器转换成单片机能够处理的数字信号。2.模拟电压信号送到单片机AT89C51中进行处理变换,最后将温度值显示在D2、D1共2位七段码LED显示器上。3.系统以AT89C51单片机为控制核心,加上AT89C51测温电路、ADC模数转换电路、2位温度数据显示电路以及外围电源、时钟电路等组成。2.2.2设计要求5V供电;温度采集采用DS18B20;4位LED显示;2个按键;设计温度控制器原理图,学习用PROTEL画出该原理图,并用proteus进行仿真;设计和绘制软件流程图,用C语言进行程序编写;焊接硬件电路,进行调试。3硬件设计3.1单片机系统2.1.1功能控制DS18B20数字温度传感器的初始化和读取温度值LED数码管显示驱动与控制按键识别和响应控制温度设置和报警温度值的存储和读取3.1.2单片机系统电路原理图图2单片机系统原理图3.2数字温度传感器模块3.2.1DS18B20性能独特的单线接口仅需一个端口引脚进行通信简单的多点分布应用无需外部器件可通过数据线供电零待机功耗测温范围-55~+125℃,以0.5℃递增负压特性:电源极性接反时,传感器不会因发热而烧毁,但不能正常工作3.2.2DS18B20外形及引脚说明图3DS18B20外形及引脚GND:地DQ:单线运用的数据输入/输出引脚VD:可选的电源引脚3.2.3DS18B20接线原理图单总线通常要求接一个约4.7K左右的上拉电阻,这样,当总线空闲时,其状态为高电平。图4DS18B20接线原理图3.3显示电路 LED数码管显示采用动态扫描方式,能简化电路布线,节约单片机I/O端口。段码和位码由单片机P0送出,分别用74HC673N锁存。图9数码管驱动显示电路

3.4声光报警电路 当温度超过设定温度值时,实现声光报警,蜂鸣器鸣叫、8个发光二极管点亮。蜂鸣器由单片机P2^3口控制,用三极管驱动,发光二极管接单片机P1口,由74HC673N锁存。图10声光报警电路3.5数据处理高速暂存存储器由9个字节组成,其分配如表5所示。当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后。图7字节分配4软件设计4.1主程序模块主程序需要调用3个子程序,分别为:实时温度显示子程序:驱动数码管把实时温度值送出在LED数码管显示温度设定、报警子程序:设定报警温度值,当温度超过该值时产生报警,即驱动蜂鸣器鸣叫、8个发光二极管发光主程序流程图:开始开始定时器初始化、启动定时器初始化、启动显示实时温度显示实时温度温度设定、报警温度设定、报警完成温度的复位完成温度的复位图12主程序流程图4.2读温度值模块读温度值模块需要调用4个子程序,分别为:DS18B20初始化子程序:让单片机知道DS18B20在总线上且已准备好操作DS18B20写字节子程序:对DS18B20发出命令DS18B20读字节子程序:读取DS18B20存储器的数据延时子程序:对DS18B20操作时的时序控制4.2.1读值模块入口入口数据转换处理读取温度值高低位跳过读序列号DS18B20初始化延时启动温度转换跳过读序列号DS18B20初始化数据转换处理读取温度值高低位跳过读序列号DS18B20初始化延时启动温度转换跳过读序列号DS18B20初始化返回 返回 图13读温度值子程序流程图4.2.2DS18B20初始化子程序流程图入口入口DQ为低电平?延时15~60msDQ拉高电平延时>480msDQ复位0稍延时DQ置高电平DQ为低电平?延时15~60msDQ拉高电平延时>480msDQ复位0稍延时DQ置高电平 N返回Y返回 图14DS18B20初始化子程序流程图4.2.3DS18B20写字节和读字节子程序 图15DS18B20写字节子程序流程图 图16DS18B20读字节子程序流程图4.3中断模块中断采用T0方式1,初始值定时为50ms。中断模块需调用两个子程序:读温度值子程序:定时读取温度值,实时更新温度值记录温度值子程序:定时记录温度值,供查询使用把这两个子程序放在中断的原因是,不会因为调整报警温度或查询历史温度值而停止更新温度值和记录温度值。中断模块流程图:1秒?计数值加1定时器重置初值中断入口1秒?计数值加1定时器重置初值中断入口读温度值 Y读温度值中断返回记录温度值N中断返回记录温度值 图17中断模块流程图4.4温度设定、报警模块此模块跟温度查询模块类似,需要接受按键输入,进入模块界面后,按加减键分别上调和下调设定报警温度值,当实时温度值超过设定值时驱动蜂鸣器发声,并点亮8位发光二极管,实现声光报警。4.5数码管驱动模块本设计数码管通过锁存器接单片机P0口,采用动态扫描驱动7段LED数码管进行显示,需调用延时子程序以稳定显示。模块流程图如下:P0清零关位选送位码开位选P0置高关段选入口P0清零关位选送位码开位选P0置高关段选入口 开段选开段选 延时关段选送段码延时关段选送段码 返回返回图20数码管驱动模块流程图5源程序#include<reg52.h>#defineucharunsignedchar#defineuintunsignedint/*************************变量定义************************************/sbitDQ=P2^2;//ds18b20端口sbitbeep=P2^3;//蜂鸣器使能端sbitdula=P2^6;//数码管段选使能sbitwela=P2^7;//数码管位选使能sbitalarm=P3^6;//设定报警功能键ucharcodetabled[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,//0~9的七段数码管段码0x40,0x63,0x39};//-c的段码ucharcodetablew[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//1~8个数码管的位选码uintcountmin;//计数变量ucharalanum=30;//报警温度值,初始值为30摄氏度/**********************函数声明***************************************/voiddelay1(ucharMS);//动态扫描延时子程序voiddelay(uchari);//DS18B20工作延时子程序 voidInit_DS18B20();//DS18B20初始化子程序voidWriteOneChar(unsignedchardat);//向DS18B20写一字节数据ucharReadOneChar(void);//向DS18B20读一字节数据voidGetTemperature();//由DS18B20产生温度值voidDisplay(ucharwei,ucharduan);//数码管驱动子程序voidAlarm();//温度报警voidShowtemperature(uchartt);//温度显示/*********************主函数*******************************************/voidmain(){ TMOD=0x01;//定时器初始化,定时器0方式1 TH0=(65536-50000)/256;//50ms TL0=(65536-50000)%256; EA=1;//开中断 ET0=1; TR0=1;//启动定时器 while(1) { Showtemperature(temperature);//显示实时温度 Alarm();//温度设定、报警 }}/************************动态扫描延时函数********************************/voiddelay1(ucharMS){ inti,j; for(i=80;i>0;i--) for(j=MS;j>0;j--);}/************************DS18B20工作延时函数*****************************/voiddelay(uchari){while(i--);}/*************************DS18B20初始化函数******************************/voidInit_DS18B20(void){ unsignedcharx=0; DQ=1;//DQ复位 delay(8);//稍做延时 DQ=0;//单片机将DQ拉低 delay(80);//精确延时大于480us DQ=1;//拉高总线 delay(10); x=DQ;//稍做延时后如果x=0则初始化成功x=1则初始化失败 delay(5); while(!x) { x=DQ; }}/*************************读一个字节**************************************/ucharReadOneChar(void){unsignedchari=0;unsignedchardat=0;for(i=8;i>0;i--){DQ=0;//给脉冲信号dat>>=1;DQ=1;//给脉冲信号if(DQ)dat|=0x80;delay(5);}return(dat);}/**************************写一个字节*************************************/voidWriteOneChar(unsignedchardat){unsignedchari=0;for(i=8;i>0;i--){DQ=0;DQ=dat&0x01;delay(5);DQ=1;dat>>=1;}delay(5);}/*************************产生温度值***************************************/voidGetTemperature(){ uchartempL,tempH;//分别为数据低位和高位 uinttemp; Init_DS18B20(); WriteOneChar(0xCC);//跳过读序列号的操作 WriteOneChar(0x44);//启动温度转换 delay(200); Init_DS18B20(); WriteOneChar(0xCC);//跳过读序号列号的操作 WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度 tempL=ReadOneChar();//读出温度低位LSB tempH=ReadOneChar();//读出温度高位MSB temp=tempH*16+tempL/16;//tempL右移四位去掉小数位 temperature=temp&0xff;//测量0~50度,只取temp低八位}/**********************数码管驱动函数*************************************/voidDisplay(ucharwei,ucharduan){ dula=0; P0=0xff; wela=1; P0=tablew[wei]; wela=0; P0=0; dula=1; P0=tabled[duan]; dula=0; delay1(1);}/**********************温度显示函数**************************************/voidShowtemperature(uchartt){ Display(2,tt/10);//显示温度数值 Display(3,tt%10); Display(4,11);//显示摄氏度单位 Display(5,12); }/***************************报警函数************************************/voidAlarm(){ bitflag; if(alarm==0) { delay1(80); //延时消抖 if(alarm==0) { flag=1; } } while(flag) { if(add==0) { delay1(z);//延时消抖 if(add==0) { alanum++;//add键按下,上调设定值 if(alanum==51) { alanum=0;//最大值为50摄氏度,显示 } } } } Showtemperature(alanum); Display(0,10);//选中数码管的其他空闲位 Display(1,10);//区别于实时温度显示“----” Display(6,10); Display(7,10); if(temperature>alanum)//此处设置报警可以保证调整设定值时即可及时报警 { beep=0;//温度大于设定值,声光报警 P1=0; } else { beep=1;//温度不大于设定值即不报警 P1=0xff; } } if(temperature>alanum)//此处设置报警即保证即使没有进入设置界面任然可以报警 { beep=0;//温度大于设定值,声报警 P1=0; } else { beep=1;//温度不大于设定值即不报警 P

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论