电子技术课程设计报告题目:数字温度传感器电路学年:08—09学期:1专业:电子信息工程班级:06学号:0611102027姓名:指导教师及职称:时间:2008年12月22一、设计目的1.熟悉数字温度传感器电路的引脚安排。2.掌握数字温度传感器电路各芯片的逻辑功能及使用方法。3.了解数字温度传感器电路结构及其接线方法。4.了解数字温度传感器电路的组成及工作原理。5.熟悉数字温度传感器电路的设计与制作。二、设计要求1.设计指标(1)基本范围-50℃-110℃。(2)精度误差小于0.5℃。(3)LED数码直读显示。2.设计要求(1)实现数字报数。(2)可以任意设定温度的上下限显示功能。(3)用两只LED数码管来显示当前温度。三、设计原理及其框图1.数字温度传感器的构成图3-1数字温度传感器的组成框图⑴晶体振荡器电路晶体振荡器电路给数字钟提供一个频率稳定准确的32768Hz的方波信号,可保证数字钟的走时准确及稳定。不管是指针式的电子钟还是数字显示的电子钟都使用了晶体振荡器电路。⑵显示电路显示电路采用4位共阳LED数码管,从P3口RXD,TXD串口输出段码。DS18B20的性能特点如下:①独特的单线接口仅需要一个端口引脚进行通信;②多个DS18B20可以并联在惟一的三线上,实现多点组网功能;③无须外部器件;④可通过数据线供电,电压范围为3.0~5.5V;⑤零待机功耗;⑥温度以9或12位数字;四、元器件1.实验中所需的器材主控制器LED显示温度传感器单片机复位时钟振荡电源5V电源。DS18B2O单片机AT89S52。共阳八段数码管2个。电阻若干电容若干电源接头。LED灯2.芯片内部结构图及引脚图五.原理图和PCB图数字温度传感器原理图如下:PCB图如下六.电路程序系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序等。#includereg51.h#includeintrins.h//_nop_();延时函数用#defineDisdataP1//段码输出口#definediscanP2//扫描口#defineucharunsignedchar#defineuintunsignedintsbitDQ=P3^7;//温度输入口sbitDIN=P0^7;//LED小数点控制uinth;uinttemp;//**************温度小数部分用查表法***********//ucharcodeditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09}ucharcodedis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};//共阳LED段码表0123456789不亮-ucharcodescan_con[4]={0x7f,0xbf,0xdf,0xef};//列扫描控制字uchardatatemp_data[2]={0x00,0x00};//读出温度暂放uchardatadisplay[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个数据和一voiddelay(uintt){for(;t0;t--);}scan(){chark;for(k=0;k4;k++)//4位LED扫描控制{Disdata=dis_7[display[k]];//数据显示if(k==1){DIN=0;}//小数点显示discan=scan_con[k];//位选delay(300);}/****************DS18B20复位函数************************/ow_reset(void){charpresence=1;while(presence){while(presence){DQ=1;_nop_();_nop_();//从高拉倒低DQ=0;delay(50);//550usDQ=1;delay(6);//66uspresence=DQ;//presence=0复位成功,继续下一步}delay(45);//延时500uspresence=~DQ;}DQ=1;//拉高电平}/****************DS18B20写命令函数************************///向1-WIRE总线上写1个字节voidwrite_byte(ucharval){uchari;for(i=8;i0;i--){DQ=1;_nop_();_nop_();//从高拉倒低DQ=0;_nop_();_nop_();_nop_();_nop_();//5usDQ=val&0x01;//最低位移出delay(6);//66usval=val/2;//右移1位}DQ=1;delay(1);}//从总线上取1个字节ucharread_byte(void){uchari;ucharvalue=0;for(i=8;i0;i--){DQ=1;_nop_();_nop_();value=1;DQ=0;_nop_();_nop_();_nop_();_nop_();//4usDQ=1;_nop_();_nop_();_nop_();_nop_();//4usif(DQ)value|=0x80;delay(6);//66us}DQ=1;return(value);}read_temp(){ow_reset();//总线复位delay(200);write_byte(0xcc);//发命令write_byte(0x44);//发转换命令ow_reset();delay(1);write_byte(0xcc);//发命令write_byte(0xbe);temp_data[0]=read_byte();//读温度值的第字节temp_data[1]=read_byte();//读温度值的高字节temp=temp_data[1];temp=8;temp=temp|temp_data[0];//两字节合成一个整型变量。returntemp;//返回温度值}/****************温度数据处理函数************************/work_temp(uinttem){ucharn=0;if(tem6348)//温度值正负判断{tem=65536-tem;n=1;}//负温度求补码,标志位置1display[4]=tem&0x0f;//取小数部分的值display[0]=ditab[display[4]];//存入小数部分显示值display[4]=tem4;//取中间八位,即整数部分的值display[3]=display[4]/100;//取百位数据暂存display[1]=display[4]%100;//取后两位数据暂存display[2]=display[1]/10;//取十位数据暂存display[1]=display[1]%10;/******************符号位显示判断**************************/if(!display[3]){display[3]=0x0a;//最高位为0时不显示if(!display[2]){display[2]=0x0a;//次高位为0时不显示}}if(n){display[3]=0x0b;}//负温度时最高位显示-}/****************主函数************************/main(){Disdata=0xff;//初始化端口discan=0xff;for(h=0;h4;h++)//开机显示0000{display[h]=0;}ow_reset();//开机先转换一次write_byte(0xcc);//SkipROMwrite_byte(0x44);//发转换命令for(h=0;h100;h++)//开机显示0000{scan();}while(1){work_temp(read_temp());//处理温度数据scan();//显示温度值}}七.设计总结1.很感谢老师提供一个机会,让我们实践单片机和温度伟传感器。经过近三周时间辛勤努力查找资料和焊接电路。功夫不负有心人,终于按计划完成了我的数字温度计的设计,单片机能实现温度测量和报警。虽然设计得很简单,功能单调,焊接电路粗糙,但从心里来说,还是非常高兴,回想以前遇到的困难,心里更美滋滋的,毕竟这次设计通过自己勤劳所得的结晶。高兴之余不得不深思总结。2.在本次设计过程中,我发现自己有很多不足之处。虽然以前也做过硬件电路设计,但没有软件设计,这次的设计真的让我难以忘记,而且长进很多知识。单片机课程设计最重要就在于软件编程序的设计,需要有很清晰的思路。以前写过一些简单的程序,但没有像这次这么复杂。这次采用了很多指令,例如调表指令,比较指令,跳转指令等等。以前用的都是清零,置1指令,用在流水线。这次更进一步认识单片机和汇编程序。3.从这次的课程设计中,我学习到很多知识,也知道自己的不足之处,在以后的学习中,仔细认真,注重细节,要理论联系实际,把我们所学到的知识运用到实际当中,并把实践中发现的问题弥补理论,学习单片机也是如此,这次最重要认识在于程序,程序只有在经常写和读中才能提高,并从中找到乐趣。