1、1 设计目的:(1)了解温度检测和控制技术的基本知识以及单片机、传感器等相关技术。(2)熟练使用相关的EDA软件进行硬件电路的设计与仿真 (3)具体掌握DS18B20温度传感器的使用方法。2.基本要求(1)孵化室对温度有一定要求,温度是否合适直接影响孵化效果,为此需要对温度进行严格控制,主要指标如下:孵化室温控制在36.50.5,温度低时启动电热器加热,用红灯报警;温度高时,启动空调冷却,用绿灯报警。(2)要求设计相关的硬件电路,选择合适的传感器、控制系统和显示系统。3 详细设计:3.1 系统设计原理框图:图1 DS18B20温度测温系统框图通过单片机控制温度传感器,读出DS18B20的温度,
2、并用数码管显示,当温度超过37时,启动空调冷却,用绿灯报警,当温度低于36时,启动电热器加热,用红灯报警。所以根据设计要求确定了系统的总体方案,整个系统由控制模块、湿度检测模块、显示模块、报警器等构成。3.2 硬件电路设计图图2 硬件电路设计图3.3程序设计系统程序主要包括主程序、读取温度子程序、数据转换子程序、显示数据子程序等。3.3.1主程序设计流程图图3 主程序流程图3.3.2初始化程序流程图图4 初始化流程图3.3.3 读取温度子程序读取温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。主要包括以下三个命令:(1)写暂存器命令 【4E
3、H】这个命令为由TH寄存器开始向DS18B20暂存器写入数据,4EH命令后的3字节数据将被保存到暂存器的地址2、3、4(TH、TL、CONFIG)三个字节。所有数据必须在复位脉冲前写完。即如果只想写一个字节的数据到地址2,可按如下流程:初始化;写0CCH,跳过ROM检测;写4EH;写1字节数据; 复位,即向DQ输出480960us低电平(2)读暂存命令【BEH】这个命令由字节0读取9个暂存器内容,如果不需要读取所有暂存内容,可随时输出复位脉冲终止读取过程(3)转换温度命令【44H】这个命令启动温度转换过程。转换温度时DS18B20保持空闲状态,此时如果单片机发出读命令, DS18B20将输出0
4、直到转换完成,转换完成后将输出1。图5 读取温度子程序3.3.4写流程图写时隙:写时隙由DQ引脚的下降沿引起。18B20有写1和写0两种写时隙。所有写时隙必须持续至少60s,两个时隙之间至少有1s的恢复时间。DS18B20在DQ下降沿后15s60s间采样DQ引脚,若此时DQ为高电平,则写入一位1,若此时DQ为低电平,则写入一位0,如图9所示。所以,若想写入1,则单片机应先将DQ置低电平,15us后再将DQ置高电平,持续45s;若要写入0,则将DQ置低电平,持续60s。图6 写流程图3.3.5读流程图读时隙:读时隙由DQ下降沿引起,持续至少1s的低电平后释放总线(DQ置1)DS18B20的输出数
5、据将在下降沿15s后输出,此时单片机可读取1位数据。读时隙结束时要将DQ置1。所有读时隙必须持续至少60s,两个时隙之间至少有1s的恢复时间。 图7读流程图3.3.6程序#include intrins.h#define uchar unsigned char#define uint unsigned intsbit DQ = P13; /数据口define interfaceuint temp; /温度值 variable of temperature/不带小数点unsigned char code table = 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x
6、07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;/带小数点unsigned char code table1 = 0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef;/*精确延时函数*/void delay(unsigned char i) while(-i); /*此延时函数针对的是12Mhz的晶振delay(0):延时518us 误差:518-2*256=6delay(1):延时7us (原帖写5us是错的)delay(10):延时25us 误差:25-20=5delay(20):延时45us 误差:45
7、-40=5delay(100):延时205us 误差:205-200=5delay(200):延时405us 误差:405-400=5*/*DS18B20*/void Init_Ds18b20(void) /DS18B20初始化send reset and initialization commandDQ = 1; /DQ复位,不要也可行。delay(1); /稍做延时DQ = 0; /单片机拉低总线delay(250); /精确延时,维持至少480us /释放总线,即拉高了总线delay(100); /此处延时有足够,确保能让DS18B20发出存在脉冲。uchar Read_One_Byte
8、() /读取一个字节的数据read a byte date /读数据时,数据以字节的最低有效位先从总线移出uchar i = 0;uchar dat = 0;for(i=8;i0;i-) DQ = 0; /将总线拉低,要在1us之后释放总线 /单片机要在此下降沿后的15us内读数据才会有效。 _nop_(); /至少维持了1us,表示读时序开始 dat = 1; /让从总线上读到的位数据,依次从高位移动到低位。 DQ = 1; /释放总线,此后DS18B20会控制总线,把数据传输到总线上 delay(1); /延时7us,此处参照推荐的读时序图,尽量把控制器采样时间放到读时序后的15us内的最
9、后部分 if(DQ) /控制器进行采样 dat |= 0x80; /若总线为1,即DQ为1,那就把dat的最高位置1;若为0,则不进行处理,保持为0 delay(10); /此延时不能少,确保读时序的长度60us。return (dat);void Write_One_Byte(uchar dat) /拉低总线 /至少维持了1us,表示写时序(包括写0时序或写1时序)开始 DQ = dat&0x01; /从字节的最低位开始传输 /指令dat的最低位赋予给总线,必须在拉低总线后的15us内, /因为15us后DS18B20会对总线采样。 /必须让写时序持续至少60us /写完后,必须释放总线,u
10、int Get_Tmp() /获取温度get the temperaturefloat tt;uchar a,b;Init_Ds18b20(); /初始化Write_One_Byte(0xcc); /忽略ROM指令Write_One_Byte(0x44); /温度转换指令Write_One_Byte(0xbe); /读暂存器指令a = Read_One_Byte(); /读取到的第一个字节为温度LSBb = Read_One_Byte(); /读取到的第一个字节为温度MSBtemp = b; /先把高八位有效数据赋于temptemp = 8; /把以上8位数据从temp低八位移到高八位temp
11、 = temp|a; /两字节合成一个整型变量tt = temp*0.0625; /得到真实十进制温度值 /因为DS18B20可以精确到0.0625度 /所以读回数据的最低位代表的是0.0625度temp = tt*10+0.5; /放大十倍 /这样做的目的将小数点后第一位也转换为可显示数字 /同时进行一个四舍五入操作。return temp;/*数码码动态显示函数*/void Display(uint temp) /显示程序uchar A1,A2,A3;A1 = temp/100; /十位A2 = temp%100/10; /个位A3 = temp%10; /小数位P0 = tableA1;
12、 /显示十位P2=0;delay(0);P0 = table1A2; /显示个位,使用的是有小数点的数组(因为temp值扩大了10倍,虽然是十位,实际为个位)P2=1;P0 = tableA3; /显示小数P2=2;void main()while(1) Display(Get_Tmp();3.4结果验证与仿真仿真如图:图8仿真图4 总结从这次的设计中,我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,这就是我在这次课程设计中的最大收获。随着电子技术的不断发展,按着此思路设计的温度传感器的性能也一定会越来越好。5参考文献1传感器原理及接口技术梅丽凤,王艳秋,清华大学出版社,2006年。2传感器与检测技术徐科军,电子工业出版社,2011年。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1