资源预览内容
第1页 / 共29页
第2页 / 共29页
第3页 / 共29页
第4页 / 共29页
第5页 / 共29页
第6页 / 共29页
第7页 / 共29页
第8页 / 共29页
第9页 / 共29页
第10页 / 共29页
亲,该文档总共29页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
基于单片机的数字温度计设计基于单片机的数字温度计设计信息学院 郭茹侠 刁含楼总体设计硬件设计软件设计调试总结 设计方案总体设计总体设计l功能l系统框图 功能:数字式温度计测温范围在55125,误差在0.5以内。温度测量间隔时间选择12s, 通过键盘扩展(行列式或独立式按键),有温度上下限值及温度报警功能。在数字式温度计的制作中主要以51单片机来控制,用温度传感器检测外界的温度,软件的显示子程序用四位一体数码管显示出来,精确到1位小数点,在超出测温范围时,进行报警功能。在焊接电路时要预留电源线,外接单片机AT89S51调试设计要求 测温DS18B20单片机主控器显示显示驱动按键报警复位电路数字式温度计系统框图数字式温度计硬件说明数字式温度计硬件说明 本电路由单片机,测温电路,复位电路,报警电路,显示驱动与显示电路等组成了数字式温度计。具体连线如原理图所示来进行连接。布线为数字式温度计PCB电路所示。 主控制器单片机AT89S51具有低电压和小体积等特点,两个端口刚好满足系统的设计需要很适合便携手持式产品的设计使用。其中时钟振荡电路使用了石英晶体振荡器,接18、19脚,配置了相应的晶振、电容,提供单片机脉冲信号,使单片机能正常的工作。 31脚的EA引脚则接到正电源端,使用片内程序存储器。单片机电路单片机电路测温电路测温电路 测温电路则主要采用了型号为DS18B20测温传感器(DS18B20温度传感器是智能温度传感器,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现912位的数字值读数方式)。复位电路复位电路 复位电路是采用了按键手动复位电路,外接电容电阻与点动开关,这种方式是采用了外部复位电路的电容充放电来实现的,该电路通过电容充电在RST引脚上加了一个高电平,而高电平的持续时间就是取决于这外接的电容与电阻的参数了,按键的功能就是实现人为的复位操作。报警电路报警电路 报警电路由单片机的P10口与外接的蜂鸣器,放光二极管等组成,用于电路在超限的情况下发出声光报警,也可通过取反来实现电路的闪烁报警。显示驱动与显示电路显示驱动与显示电路 显示驱动与显示电路采用了共阳四位LED数码管,用三极管做驱动。数字式温度计原理图数字式温度计原理图数数字字式式温温度度计计PCB电电路路2112122121212121123456123123123123123212121212121212121212121212121212121121212212122232425262728293031323334353637383940201918171615141312111098765432112345612111098712312软件设计软件设计 软件设计分为主程序、读出温度子程序、温度转换命令子程序、计算温度子程序和显示数据刷新子程序等。 主程序流程图主程序流程图初始化调用显示子程序1S到?读出温度值温度计处理显示数据刷新发温度转换开始命令初次上电?NY 主程序的主要功能是负责温度的实时显示、读出并处理 DS18B20 的测量温度值温度测量每1s进行一次。 读出温度子程序读出温度子程序 读出温度子程序的主要功能是读出 RAM 中的 9 字节。在读出时须进行 CRC 校验,校验有错时不进行温度数据的改写。 发DS18B20复位命令发跳过ROM命令移入温度暂存器读取操作,CRC校验发读取温度命令结束9字节完?CRC校验正确?NNYY温度转换命令子程序流程图温度转换命令子程序流程图 温度转换命令子程序主要是发温度转换开始命令。当采用 12 位分辨率时,转换时间约为 750 ms 。在本程序设计中,采用 1s显示程序延时法等待转换的完成。发DS18B20复位命令发跳过ROM命令发温度转换命令结束计算温度子程序流程计算温度子程序流程 计算温度子程序将 RAM 中读取值进行 BCD 码的转换运算,并进行温度值正负的判定。结束开始温度零下?温度值取补码置“-”标志置“+”标志计算整数位温度BCD值计算小数温度BCD值NY显示数据刷新子程序流程图显示数据刷新子程序流程图 显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高数据显示位为0时,将符号显示位移入下一位。温度数据移入寄存器十位数?结束百位数?十位数显示符号百位数不显示百位数显示数据(不显示符号)NYNY调试调试 先万用表检查硬件连接是否正常,正负极电源是否短路,硬件没问题后。再在程序中测试软件,没问题后再把硬件和软件连接起来一起调试,先测试显示部分,没问题后再全部调试,直至没问题为止进度安排进度安排起迄日期起迄日期工工作作内内容容14.5.17-14.5.23熟悉课题,查找资料,制作PPT14.5.24-14.5.30熟悉原理,确定总体方案,购买材料14.6.1-14.6.13系统硬件设计14.6.14-14.6.20软件设计14.6.21-调制硬件电路与软件,整理,撰写论文附录附录/*程序功能:利用单线制DS18B20温度传感器 LED数码管显示当前的温度值*/#include /DS18B20温度传感器程序 code unsigned char seg7code=0xc0,0xf9,0xa4,0xb0,0x99,0x92, 0x82,0xf8,0x80,0x90,0xff; /不带小数点的共阳数码管段码code unsigned char seg7codeB=0x40,0x79,0x24,0x30,0x19,0x12, 0x02,0x78,0x00,0x10,0xff; /带小数点的共阳数码管段码sbit P2_0 = P20;sbit P2_1 = P21;sbit P2_2 = P22;sbit P2_3 = P23;sbit DQ=P36; /数据传输线接单片机的相应的引脚 unsigned char tempL=0; /设全局变量unsigned char tempH=0; unsigned int sdata;/测量到的温度的整数部分unsigned char xiaoshu1;/小数第一位unsigned char xiaoshu2;/小数第二位unsigned char xiaoshu;/两位小数bit fg=1; /温度正负标志/*延时子程序 */这个延时程序的具体延时时间是time=i*8+10,适用于小于2ms的延时void delay(unsigned char i) for(i;i0;i-);/*/ 延时子程序/*void delay1ms() unsigned char i; for(i=124;i0;i-); /延时124*8+10=1002us/*初始化程序 */Init_DS18B20(void) unsigned char x=0; DQ=1; /DQ先置高 delay(8); /稍延时 DQ=0; /发送复位脉冲 delay(80); /延时(480us) DQ=1; /拉高数据线 delay(5); /等待(1560us) x=DQ; /用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1 delay(20); /*读一个字节*/ReadOneChar(void) /主机数据线先从高拉至低电平1us以上,再使数据线升为高电平,从而产生读信号unsigned char i=0; /每个读周期最短的持续时间为60us,各个读周期之间必须有1us以上的高电平恢复期unsigned char dat=0; for (i=8;i0;i-) /一个字节有8位 DQ=1; delay(1); DQ=0; dat=1; DQ=1; if(DQ) dat|=0x80; delay(4); return(dat);/* *写一个字节*/WriteOneChar(unsigned char dat) unsigned char i=0; /数据线从高电平拉至低电平,产生写起始信号。15us之内将所需写的位送到数据线上, for(i=8;i0;i-) /在1560us之间对数据线进行采样,如果是高电平就写1,低写0发生。 DQ=0; /在开始另一个写周期前必须有1us以上的高电平恢复期。 DQ=dat&0x01; delay(5); DQ=1; dat=1; delay(4); /读温度值(低位放tempL;高位放tempH;)ReadTemperature(void) Init_DS18B20(); /初始化 WriteOneChar(0xcc); /跳过读序列号的操作 WriteOneChar(0x44); /启动温度转换 delay(125); /转换需要一点时间,延时 Init_DS18B20(); /初始化 WriteOneChar(0xcc); /跳过读序列号的操作 WriteOneChar(0xbe); /读温度寄存器(头两个值分别为温度的低位和高位) tempL=ReadOneChar(); /读出温度的低位LSB tempH=ReadOneChar(); /读出温度的高位MSB if(tempH0x7f) /最高位为1时温度是负 tempL=tempL; /补码转换,取反加一 tempH=tempH+1; fg=0; /读取温度为负时fg=0 sdata = tempL/16+tempH*16; /整数部分xiaoshu1 = (tempL&0x0f)*10/16; /小数第一位xiaoshu2 = (tempL&0x0f)*100/16%10;/小数第二位xiaoshu=xiaoshu1*10+xiaoshu2; /小数两位/*显示函数*void Led(unsigned int date) if(fg=1) P2_0 = 1;P2_1 = 0;P2_2 = 0;P2_3 = 0; /P1.0=0,选通第一位 P0=seg7codedate/10; /十位数,查表,输出 delay1ms(); P0=0xff; /消隐 P2_0 = 0;P2_1 = 1;P2_2 = 0;P2_3 = 0; /P1.1=0,选通第二位,个位数 P0=seg7codeBdate%10; delay1ms(); P0=0xff; /消隐 P2_0 = 0;P2_1 = 0;P2_2 = 1;P2_3 = 0; /P1.3=0,选通第三位,小数点第一位 P0=seg7codexiaoshu1; delay1ms(); P0=0xff; /消隐 P2_0 = 0;P2_1 = 0;P2_2 = 0;P2_3 = 1; /P1.3=0,选通第四位,小数点第二位 P0=seg7codexiaoshu2; delay1ms(); P0=0xff; /消隐 if(fg=0) /温度为负时显示的数据 P2_0 = 1;P2_1 = 0;P2_2 = 0;P2_3 = 0; /P1.0=0,选通第一位 P0=seg7code11; /显示负号 delay1ms(); P0=0xff; /消隐 P2_0 = 0;P2_1 = 1;P2_2 = 0;P2_3 = 0; /P1.1=0,选通第二位,十位数 P0=seg7codedate/10; delay1ms(); P0=0xff; /消隐 P2_0 = 0;P2_1 = 0;P2_2 = 1;P2_3 = 0; /P1.3=0,选通第三位,个位数 P0=seg7codeBdate%10; delay1ms(); P2_0 = 0;P2_1 = 0;P2_2 = 0;P2_3 = 1; /P1.3=0,选通第四位,小数点第一位 P0=seg7codexiaoshu1; delay1ms(); P0=0xff; /消隐 /* /主程序 main() while(1) ReadTemperature(); Led(sdata); 序号序号名称名称标号标号封装封装型号型号数量数量1电容C1CAPPR2-5x6.8Cap Pol112电容C2、C3RAD-0.3Cap23发光二极管DS1DS3LED-1LED234电阻R1R18AXIAL-0.4Res2185Header, 2PinP2MHDR1X2MHDR1X216Header, 6PinP3MHDR1X2MHDR1X217三极管Q1Q5BCY-W3PNP58蜂鸣器LS1PIN2BELL19点动开关S1S4SPST-2SW-PB410单片机U1PDIP40AT89S51111晶振Y1BCY-W2/D3.1XTAL112四位LED显示器U2LEDSM410561K113温度传感器U3BCY-W3/E4D S18B201元件清单
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号