基于单片机的数字温度计设计.doc_第1页
基于单片机的数字温度计设计.doc_第2页
基于单片机的数字温度计设计.doc_第3页
基于单片机的数字温度计设计.doc_第4页
基于单片机的数字温度计设计.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

单片机课程设计报告基于单片机的数字温度计设计学 院:_专业班级:_姓 名:_学 号:_指导教师:_2011年12月14日 一、设计要求:基于51单片机的体温计 内容:利用18B20测人体温度,显示在LED数码管3位,含小数点:例如37.1。当温度超过40度会自动报警提示注意。 方法:18B20装在密封金属圆柱外壳内,里面填充导热硅胶。单片机测量温度连续3次不变,才显示温度。在升温过程中,显示走马灯,即第一秒十位显示“一”,第二秒各位显示“一”,第三秒小数点后一位显示“一”,如此周而复始。二、方案设计 1、硬件 1)总体设计 2)主要功能设计采用AT89C51单片机P2.0口控制温度传感器DS18B20的温度测量,以四位数码感形式输出测量温度,如图:温度传感器工作原理DS18B20在出厂时以配置为12位,读取温度时共读取16位,所以把后11位的2进制转化为10进制后在乘以0.0625便为所测的温度,还需要判断正负。前5个数字为符号位,当前5位为1时,读取的温度为负数;当前5位为0时,读取的温度为正数。16位数字摆放是从低位到高位,引脚图:3)主控制器设计AT89C51是一种带4K字节FLASH存储器(FPEROMFlash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。如图:4) 显示电路 数码管如图:温度读取如图:注:图中的三极管,后来由于线路板空间有限改成了上拉电阻。5) 报警电路 如图:注:图中的二极管,后来由于线路板空间有限去掉了。2、 软件编程程序:#includereg52.h#includeds18b20.h#define C_Temp 25 /报警温度定义#define D_Port P0sbit BUZZ = P10;sbit Seg1 = P22; sbit Seg2 = P23;sbit Seg3 = P24;sbit Seg4 = P25;uint T, Tem1, Tem2, temp;/用于计算的温度,前一次温度,当前温度uchar count;/1秒计数标志uchar c1, c2;/扫描计数bit Flag;/1秒标志uchar Sheet3 = 0, 0, 0; /十位个位十分位显示的数字值,未解码uchar code Dcode112 = 0x03, 0x9F, 0x25, 0x0D, 0x99, 0x49, 0x41, 0x1F, 0x01, 0x09, 0x63, 0xFD; /不带DP的段码09,c,-.uchar code Dcode211 = 0x02, 0x9E, 0x24, 0x0C, 0x99, 0x48, 0x40, 0x1E, 0x00,0x08, 0xff; /带DP的段码09void Timer0_Init() /定时器初始化TMOD = 0x01; /选择定时器0方式1TH0 = (256 * 256 - 10000) / 256; /10msTL0 = (256 * 256 - 10000) % 256;EA = 1; /开总中断ET0 = 1; /开定时器中断允许TR0 = 1; /启动定时器0void main()Timer0_Init(); /定时器0初始化Tem1 = Read_Temperature(); /读温度Tem2 = Tem1;while(1)temp = Tem2; Tem2 = Read_Temperature();Tem1 = temp; if (Tem2 / 10) = C_Temp) /大于等于40度报警BUZZ = BUZZ; elseBUZZ = 1;T = Tem2;EA = 0; /关中断,防止重入性发生,这会导致定时有点不准Sheet0 = T / 100; /10位温度T = T % 100; Sheet1 = T / 10; /个位温度Sheet2 = T % 10; /十分位温度EA = 1; /开中断void Timer0() interrupt 1 /如果温度不相等,则以“-”秒移动TH0 = (256 * 256 - 5000) / 256;TL0 = (256 * 256 - 5000) % 256; if (+count = 200)/5ms中断计数,满1秒置标志位,计数清0count = 0;Flag = 1;if (Tem1 != Tem2)&(Flag = 1)/温度不相等且时间到1秒,确定-位Flag = 0;if (+c1 = 4)c1 = 1;else if (Tem1 != Tem2) /温度不相等数码管“-”扫描c2+;switch (c1)case 1: switch (c2) /-在10位扫描 case 1: Seg1 = 1; Seg2 = 0; Seg3 = 0;Seg4 = 0; D_Port = Dcode111; break;case 2: Seg1 = 0; Seg2 = 1; Seg3 = 0;Seg4 = 0; D_Port = Dcode210; break;case 3: Seg1 = 0; Seg2 = 0; Seg3 = 1;Seg4 = 0; D_Port = Dcode210; break;case 4: Seg1 = 0; Seg2 = 0; Seg3 = 0;Seg4 = 1; D_Port = Dcode110; break;break; case 2: switch (c2)/-在个位扫描 case 1: Seg1 = 1; Seg2 = 0; Seg3 = 0;Seg4 = 0; D_Port = Dcode210; break;case 2: Seg1 = 0; Seg2 = 1; Seg3 = 0;Seg4 = 0; D_Port = Dcode111; break;case 3: Seg1 = 0; Seg2 = 0; Seg3 = 1;Seg4 = 0; D_Port = Dcode210; break;case 4: Seg1 = 0; Seg2 = 0; Seg3 = 0;Seg4 = 1; D_Port = Dcode110; break;break;case 3: switch (c2) /-在10分为扫描 case 1: Seg1 = 1; Seg2 = 0; Seg3 = 0;Seg4 = 0; D_Port = Dcode210; break;case 2: Seg1 = 0; Seg2 = 1; Seg3 = 0;Seg4 = 0; D_Port = Dcode210; break;case 3: Seg1 = 0; Seg2 = 0; Seg3 = 1;Seg4 = 0; D_Port = Dcode111; break;case 4: Seg1 = 0; Seg2 = 0; Seg3 = 0;Seg4 = 1; D_Port = Dcode110; break;break;if (c2 = 4)/为下次扫描做准备c2 = 0; else if (Tem1 = Tem2)/温度相等,数码管正常显示温度c2+;switch (c2)case 1: Seg1 = 1; Seg2 = 0; Seg3 = 0;Seg4 = 0; D_Port = Dcode1Sheet0; break; case 2: Seg1 = 0; Seg2 = 1; Seg3 = 0;Seg4 = 0; D_Port = Dcode2Sheet1; break;case 3: Seg1 = 0; Seg2 = 0; Seg3 = 1;Seg4 = 0; D_Port = Dcode1Sheet2; break;case 4: Seg1 = 0; Seg2 = 0; Seg3 = 0;Seg4 = 1; D_Port = Dcode110 ; break;if (c2 = 4)/为下次扫描做准备c2 = 0;#include#include#define uchar unsigned char#define uint unsigned intsbit DQ = P20;void delay(uint z) /延时几微妙uint x,y;for (x = z; x 0; x-)for (y = 110; y 0; y-);void delay1us(uint x) /延时几微妙while (-x);void Reset() /ds18b20复位DQ = 1;delay1us(1);DQ = 0; /单片机拉低总线480950usdelay1us(63); DQ = 1; /释放总线 delay1us(2); while (DQ);while (DQ); /应答时间60240us /delay1us(50); uchar ReadDS18B20() /读18b20数据uchar i = 0;uchar date = 0x00;for (i = 0; i 1;DQ = 0;_nop_(); /读取时拉低1usDQ = 1; /释放总线delay1us(1);if (DQ =1 ) /读取电平date = date | 0x80;delay1us(4); /读取电平后延时4045usreturn(date);void WriteDS18B20(uchar date)/写18B20数据uchar i;uchar dat;dat = date;for (i=0;i= 1;delay1us(1);uint Read_Temperature() /读DS18B20测出的温度uchar Temp1,Temp2;unsigned long int Temp;EA = 0;Reset();WriteDS18B20(0xcc);WriteDS18B20(0x44);EA = 1;delay(800); /延时750900msEA = 0; Reset();WriteDS18B20(0xcc);WriteDS18B20(0xbe);Temp1=ReadDS18B20();Temp2=ReadDS18B20();Reset();Temp = (Temp2 8) | Temp1;Temp = Temp * 625 / 1000;EA = 1;return(Temp);三、调试与总结 1、成果 2、调试与个人总结通过一个学期的单片机理论课程学习和两个星期的单片机课程设计,对单片机这个原来高深莫测的东西渐渐地有点熟悉了。虽然以前做过类似的课程设计,但是这次涉及到了51单片机,其复杂程度是其他单一功能的芯片无法比拟的,其中最重要的就是51单片机需要汇编编程,真是一大重点和难点啊!学了三个月的汇编,真正拿来运用到实物中还是第一次,其中不乏众多因为缺乏实践经验而范的小错误,但是最终都一一改过来了,从错误中领悟到的知识是非常深刻的。传感器DS18B20的引脚弄反了的后果是传感器不工作;上拉电阻可以代替三极管驱动数码管;电路板背部的焊点容易遗漏,焊接是应按一定顺序,检查时应重点检查,此次课程设计漏焊、错焊的地方多达十多处;为防止烫坏数码管,可先将一个引脚座焊接在对应位置,后在将数码管插上即可;焊接之前的布线设计,稍有疏忽就导致接线不顺畅

温馨提示

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

评论

0/150

提交评论