版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
#4.2.3DS18B20读字节子程序总线控制器发起读时序时,DS18B20仅被用来传输数据给控制器。因此,总线控制器在发出读暂存器指令[BEh]或读电源模式指令[B4h]后必须立刻开始读时序,DS18B20可以提供请求信息。除此之外,总线控制器在发出发送温度转换指令[44h]或召回EEPROM指令[B8h]之后读时序,所有读时序必须最少60us,包括两个读周期间至少lus的恢复时间。当总线控制器把数据线从高电平拉到低电平时,读时序开始,数据线必须至少保持lus,然后总线被释放。在总线控制器发出读时序后,DS18B20通过拉高或拉低总线上来传输1或0。当传输逻辑0结束后,总线将被释放,通过上拉电阻回到上升沿状态。从DS18B20输出的数据在读时序的下降沿出现后15us内有效。因此,总线控制器在读时序开始后必须停止把1/O脚驱动为低电平15us,以读取I/O脚状态。DS18B20读字节子程序如图4.4所示。ucharread_zi(void){uchari,u=0;for(i=0;i<8;i++)图4.4DS18B20ucharread_zi(void){uchari,u=0;for(i=0;i<8;i++)/*从DS18B20读出字节子程序*/{DQ=0;u>>=1;DQ=1;if(DQ==1)u|=0x80;delay(4);}return(u);}4.2.4温度显示子程序温度显示子程序主要完成温度的读出和显示的功能。当温度为零下是显示为“—”号;当温度为零上时消隐。当测定温度低于设定温度下限值时,第1、2、4、5、6、7个发光二极管点亮;当测定温度高于设定温度上限值时,第1、3、4、5、6、7个发光二极管亮。起到报警作用。温度显示子程序流程图如图4.5所示。图4.5温度显示子程序
floatWL=-10.0,WH=30.0;voidshowT(void){ucharidatatem[4];floatwd=0;intm;for(;;){floatWL=-10.0,WH=30.0;voidshowT(void){ucharidatatem[4];floatwd=0;intm;for(;;){wd=cewen();if(wd<0){wd=-wd;tem[0]=16;}elsetem[0]=17;tem[1]=wd/10;m=wd*10;tem[2]=m%100/10;tem[3]=m%10;display(tem+3);deng=0x02;if(wd<=WL)deng=0x7B;/*温度显示子程序*//*wd为采集的温度值*//*判断温度是否为正*//*温度为负值,数码管第1位显示负号*//*温度为正值,数码管第1位不显示*//*将温度值各位分离出来*//*显示温度,第1个发光二极管亮*//*低于温度下限,第1、2、4、5、6、7个发光二极管亮*/if(wd>=WH)deng=0x7E;/*高于温度上限,第1、3、4、5、6、7个发光二极管亮*/if(wd>=WH)deng=0x7E;4.2.5温度采集子程序流程图程序在采集温度时,测量两次取平均值,已达到精确的目的。温度采集子程序流程图如图4.6所示。图4.6温度采集子程序流程图
floatcewen(void){/*采集温度子程序*/{ucharam,bm;/*am,bm分别是从DS18B80读取的温度低8位和高8位值*/intwendz=0,i;floatduzhi=0;/*wemdz是单次温度采集值*/for(i=0;i<2;i++)/*采集两次温度值*/{RST18B20();/*DS18B20初始化*/write_zi(0xCC);/*跳过DS18B20片内ROM*/write_zi(0x44);RST18B20();/*进行温度转换*/write_zi(0xCC);write_zi(0xBE);am=read_zi();/*DS18B20暂存器值*/bm=read_zi();wendz=bm;wendz<<=8;wendz|=am;duzhi+=wendz;}duzhi/=2;/*取两次采集温度平均值*/duzhi*=0.0625;/*将采集温度值转换为十进制数*/duzhi+=0.05;/*将采集温度值四舍五入,精确到0.1*/return(duzhi);}4.2.6显示子程序显示子程序是对数码管进行逐位扫描,显示先从显示缓冲区取出要显示的数据,再根据该数据从table表中取出相应的段码完成显示。显示子程序流程图如图4.7所示。图4.7显示子程序voiddisplay0(ucharidata*p)/*不显示数码管左起第4位*/{ucharsel,i;sel=0x01;for(i=0;i<4;i++){sel=~sel;duan=table[*p];if(sel!=0xfe)wei=sel;delay(210);wei=0xff;p--;sel=~sel;sel=sel<<1;}}voiddisplay1(ucharidata*p)/*不显示数码管左起第3位*/{ucharsel,i;sel=0x01;for(i=0;i<4;i++){sel=~sel;duan=table[*p];if(sel!=0xfd)wei=sel;delay(210);wei=0xff;p--;sel=~sel;sel=sel<<1;}}voiddisplay2(ucharidata*p)/*不显示数码管左起第2位*/{ucharsel,i;sel=0x01;for(i=0;i<4;i++){sel=~sel;duan=table[*p];if(sel!=0xfb)wei=sel;delay(210);wei=0xff;p--;sel=~sel;sel=sel<<1;}}voiddisplay3(ucharidata*p)/*不显示数码管第1位*/{ucharsel,i;sel=0x01;for(i=0;i<4;i++){sel=~sel;duan=table[*p];if(sel!=0xf7)wei=sel;delay(210);wei=0xff;p--;sel=~sel;sel=sel<<1;}}voiddisplayQ(ucharidata*p)/*数码管小数点全显示,用于自检子程序*/{ucharsel,i;sel=0x01;for(i=0;i<4;i++){sel=~sel;duan=table1[*p];wei=sel;delay(100);wei=0xff;p--;sel=~sel;sel=sel<<1;}}4.2.6按键子程序流程图程序利用K1,K2,K3三个按键设定温度上、下限值。按键子程序流程图如图4.8所示。图4.8按键子程序流程图floatwl,wh;floatwl,wh;ucharidatadis_buf[4];TR0=1;delay(500);if(INT1==0)for(;;){while(INT1==0);wl=WL;if(wl<0.0){dis_buf[0]=16;wl=-wl;}elsedis_buf[0]=17;a=wl*10;dis_buf[1]=a/100;dis_buf[2]=(a%100)/10;dis_buf[3]=(a%100)%10;display(dis_buf+3);deng=0x03;if(dx==0){if(dx==0){while(dx==0);voidint1_srv(void)interrupt2using0{inttiao=0,n=0,j=0,m=l,k,d;/*n为K2键的按键次数,k,d为温度下限、上限的标志位*/inta,b;/*a,b,wl.wh为下限、上限温度处理的中间变量*//*用于存放上、下限温度分离后的各位数值和标志位*//*开启定时器TO中断*//*K1键第1次按下*//*对下限温度进行分离处理*//*显示下限温度,第1、2个发光二极管亮*//*K2键按下*/wl=WL;if(wl<O.O){dis_buf[O]=16;wl=-wl;k=1;}else{dis_buf[O]=17;k=O;}a=wl*1O;b=WH*1O;dis_buf[1]=a/1OO;dis_buf[2]=(a%1OO)/1O;dis_buf[3]=(a%1OO)%1O;for(;;){if(ds==0)/*K3键按下*/{if(ds==0){while(ds==0);switch(n)/*设置下限温度各位的数值*/{case0:if(dis_buf[3]<9){dis_buf[3]++;break;}else{dis_buf[3]=0;break;}case1:if(dis_buf[2]<9){dis_buf[2]++;break;}else{dis_buf[2]=0;break;}case2:if(dis_buf[1]<5){dis_buf[1]++;break;}else{dis_buf[1]=0;break;}case3:if(m==0){dis_buf[0]=17;m++;k=0;break;}else{dis_buf[0]=16;m=0;k=1;break;}}}}if(TF0)/*每隔100ms显示一次下限温度*/{j++;if(j==2){display(dis_buf+3);j=0;}TH0=-(50000/256);TL0=-(50000%256);TF0=0;}elseswitch(n){case0:display0(dis_buf+3);deng=0x09;break;/*K2键按第1次,第4位数码管不显示*/case1:display1(dis_buf+3);deng=0x11;break;/*K2键按第2次,第3位数码管不显示*/case2:display2(dis_buf+3);deng=0x21;break;/*K2键按第3次,第2位数码管不显示*/case3:display3(dis_buf+3);deng=0x41;break;/*K2键按第4次,第1位数码管不显示*/}if(dx==0){if(dx==0){while(dx==0);if(n<4)n++;}}if(n==4)/*K2键按第5次,将设置的温度值存入上、下温度变量*/{if(k==0)a=dis_buf[3]+dis_buf[2]*10+dis_buf[1]*100;if(k==1)a=-(dis_buf[3]+dis_buf[2]*10+dis_buf[1]*100);n=0;if(b>(a+5))/*如果设置的温度下限值低于上限值0.5°C以上,则存储设置的值*/{WL=a;WL/=10;WH=b;WH/=10;}break;}}}}if(INT1==0)/*K1键第2次按下*/for(;;){while(INT1==0);wh=WH;/*对上限温度进行分离处理*/if(wh<0){dis_buf[0]=16;wh=-wh;}elsedis_buf[0]=17;b=wh*10;dis_buf[1]=b/100;dis_buf[2]=(b%100)/10;dis_buf[3]=(b%100)%10;display(dis_buf+3);/*显示上限温度,第1、3个数码管亮*/deng=0x06;if(dx==0)/*K2键按下*/{if(dx==0){while(dx==0);wh=WH;if(wh<0){dis_buf[0]=16;wh=-wh;d=1;}else{dis_buf[0]=17;d=0;}a=WL*10;b=wh*10;dis_buf[1]=b/100;dis_buf[2]=(b%100)/10;dis_buf[3]=(b%100)%10;for(;;){if(ds==0)/*K3键按下*/{if(ds==0){while(ds==0);switch(n)/*设置上限温度各位数值*/{case0:if(dis_buf[3]<9){dis_buf[3]++;break;}else{dis_buf[3]=0;break;}case1:if(dis_buf[2]<9){dis_buf[2]++;break;}else{dis_buf[2]=0;break;}case2:if(dis_buf[1]<5){dis_buf[1]++;break;}else{dis_buf[1]=0;break;}case3:if(m==0){dis_buf[0]=17;m++;d=0;break;}else{dis_buf[0]=16;m=0;d=1;break;}}}}if(TFO)/*每隔100ms显示一次上限温度*/{j++;if(j==2){display(dis_buf+3);j=0;}TH0=-(50000/256);TL0=-(50000%256);TF0=0;}elseswitch(n){case0:display0(dis_buf+3);deng=0x0C;break;/*K2键按第1次,第4位数码管不显示*/case1:display1(dis_buf+3);deng=0x14;break;/*K2键按第2次,第3位数码管不显示*/case2:display2(dis_buf+3);deng=0x24;break;/*K2键按第3次,第2位数码管不显示*/case3:display3(dis_buf+3);deng=0x44;break;/*K2键按第4次,第1位数码管不显示*/}if(dx==0){if(dx==0){while(dx==0);if(n<4)n++;}}if(n==4)/*K2键按第5次,存储设置的数值*/{if(d==0)b=dis_buf[3]+dis_buf[2]*10+dis_buf[1]*100;if(d==1)b=-(dis_buf[3]+dis_buf[2]*10+dis_buf[1]*100);n=0;if(b>(a+5))/*如果设置的温度上限值高于下限值0.5°C以上,则存储设置的值*/{WL=a;WL/=10;WH=b;WH/=10;}break;}}}}tiao=1;if(INT1==0){if(INT1==0)break;}}while(INT1==0);if(tiao==1)break;}}4.2.7发送脉冲子程序流程图程序设置在K4键按下后每两个小时开启电机0.5s,已达到加热的目的。发送脉冲子程序流程图如图4.9所示。图4.9发送脉冲子程序流程图#include<intrins.h>#include<absacc.h>#include<reg52.h>#definedengXBYTE[0x7FFF]intcoun=0,con=0;/*coun和con分别是定时器T2和T1的中断次数计数变量*/voidT1_zd(void)interrupt3using0/*定时器T1中断子程序*/{con++;if(con==10)/*定时0.5秒到*/{con=0;TR1=0;/*关闭定时器T1*/deng=0x01;}TH1=(65536-50000)/256;TL1=(65536-50000)%256;}voidT2_zd(void)interrupt5using0/*定时器T2中断子程序*/{coun++;TF2=0;if(coun==200000)/*定时2小时到*/{coun=0;deng=0x02;TR1=1;/*启动定时器T1*/}}voidint1_zd(void)interrupt2using0/*外部中断INT1*/{TR2=1;/*启动定时器T2*/ET2=1;ET1=1;}main(){T2CON=0x00;TH2=(65536-36000)/256;TL2=(65536-36000)%256;TMOD=0X10;TH1=(65536-50000)/256;TL1=(65536-50000)%256;IT1=1;/*设INT1为跳变沿触发中断*/EX1=1;EA=1;deng=0x40;while(1){};5智能温度控制系统可靠性和精度分析传统的A/D转换器大多采用积分式或逐次比较式转换技术,其噪声容限低,抑制混叠噪声及量化噪声的能力比较差。课题采用了高性能的工一△式A/D转换器,它能以很高的采样速率和很低的采样分辨力将模拟信号转换成数字信号,再利用过采样、噪声整形和数字滤波技术,来提高有效分辨力。工一△式A/D转换器不仅能滤除量化噪声,而且对外围元件的精度要求低;由于采用了数字反馈方式,因此比较器的失调电压及零点漂移都不会影响温度的转换精度。这种智能温度传感器兼有抑制串模干扰能力强、分辨力高、线性度好、成本低等优点。系统将转换精度控制字R1和R0配置为“1”,将精度达到最高为0.0625°C,在测量时测量两次,再将两次测得值求平均,四舍五入。已达到高精度测量。结论在基于单片机的智能温度控制系统的研究和设计过程中,借鉴已有的一些设计经验和设计理论,使系统主要具有以下特点:采用AT89S52单片机作为系统的核心单元,在开发上省去了很多精力,并且功能强大,方便用户操作,成本上比专用DSP芯片要低得多。利用DS18B20做传感器,测温范围为一55°C〜+125°C,测温度精度可达到0.0625°C。由于传送的是串行放大器和A/D转换器可以统统被省却,因而这种测温方式大大提高了各种温度测控系统的可靠性,降低了成本,缩小了体积。系统显示电路设计采用LED数码管动态驱动显示,使结构简单,单片机CPU开销小,能显著降低显示器的功耗。系统每两小时发送0.5秒的脉冲。温度会随着时间下降,每2个小时启动一次电机,自动修正温度。现今,智能温度控制系统在测温精度、分辨力和测试功能有所提高。测温精度越来越高、分辨力越来越强、测试功能越来越多。比如:美国DALLAS半导体公司新研制的DS1624型高分辨力智能温度传感器,能输出13位二进制数据,其分辨力高达0.03125°C,测温精度为±0.2°C。为了提高多通道智能温度传感器的转换速率,也有的芯片采用高速逐次逼近式A/D转换器。以AD7817型5通道智能温度传感器为例,它对本地传感器、每一路远程传感器的转换时间分别仅为27us、9us。新型智能温度传感器的测试功能也在不断增强。DS1629型单线智能温度传感器增加了实时日历时钟(RTC),使其功能更加完善oDS1624还增加了存储功能,利用芯片内部256字节的EEPROM存储器,可存储用户的短信息。致谢在论文完成之际,回顾大学的成长道路,我在学业和生活上得到了众多老师、同学和朋友们的热心帮助和大力支持。在此,我要向你们表示我最诚挚的谢意!本论文是在刁彦华老师的悉心指导下完成的,在此我首先对刁老师表示诚挚的谢意。在我的整个学习阶段,无论在专业学习,还是在课题研究和论文撰写上,老师都给予了极大的关心、指导和鼓励。刁老师求真务实的治学精神、渊博的知识、丰富的实践经验、勇于开拓的科学精神和平易近人的态度,是我终身难忘,并将深深影响我以后的工作和学习,再次感谢老师对我不倦的栽培。在毕业设计期间,教研组的所有老师都给予我非常大的关心和指导,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人体解剖学题目及解析
- 小学教育语文教学设计试题及答案
- 托福(阅读)试卷及分析
- 肿瘤科肺癌化疗方案试题及分析
- 皮肤科学考试试卷及解析
- 工程制图试卷及详解
- 2025-2026学年安徽太湖中学等校高一下学期4月联考语文试题含答案
- 新生儿黄疸专项考核试卷(附答案)
- 肿瘤与血管介入治疗科针刺伤预防与处理团标考核试题
- 原发性肾病综合征专项试题
- DB43-T 3447-2025 烟花爆竹生产企业对标改造技术指南
- 电子产品制造工厂安全管理方案
- 化工安全设计课件
- 2025中国智慧停车行业研究报告
- 诊所财务室制度规范要求
- 2026云南三支一扶考试(810人)易考易错模拟试题(共500题)试卷后附参考答案
- CRRT治疗时机及剂量
- 智能网联汽车运营监管平台解决方案
- 伊利纯奶品牌介绍
- 设备主管转正述职报告
- (统编版2026新教材)三年级语文上册晨读必背知识
评论
0/150
提交评论