单片机课程设计报告-基于STC89C52的温度测控系统设计.doc_第1页
单片机课程设计报告-基于STC89C52的温度测控系统设计.doc_第2页
单片机课程设计报告-基于STC89C52的温度测控系统设计.doc_第3页
单片机课程设计报告-基于STC89C52的温度测控系统设计.doc_第4页
单片机课程设计报告-基于STC89C52的温度测控系统设计.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

湖州师范学院课程设计总结报告课程名称 单片机应用系统设计 设计题目 基于stc89c52的温度测控系统设计 专 业 电子与信息工程 班 级 080823班 姓 名 学 号 指导教师 报告成绩 信息与工程学院二一一年六月十二日26单片机应用系统设计课程设计任务书一、课题名称温度测量与报警系统二、设计任务1、利用四位数码管显示当前温度;2、通过键盘修改报警温度上限与下限值;3、具有报警功能,报警温度上限与下限值能修改,利用蜂鸣器实现报警;上限温度值到达时发出“嘀-嘀-嘀-嘀”的报警音。三、设计报告撰写规范单片微机应用系统设计总结报告正文,主要含以下内容(硬件、软件各部分内容也可组合起来进行撰写说明):1、系统总体设计方案(画出系统原理框图、方案的论证与比较等内容);2、硬件系统分析与设计(各模块或单元电路的设计、工作原理阐述、参数计算、元器件选择、完整的系统电路图、系统所需的元器件清单。等内容);3、软件系统分析与设计(各功能模块的程序设计流程图与说明、软件系统设计、软件抗干扰措施、完整的程序等内容);4、系统仿真调试与参数测量(使用仪器仪表、故障排除、电路硬件和软件调试的方法和技巧、指标测试的参数和波形、测量误差分析);5、总结(本课题核心内容及使用价值、电路设计、软件设计的特点和选择方案的优缺点、改进方向和意见等);6、按统一格式列出主要参考文献。温度测量与报警系统一、系统总体设计方案1.1 方案一由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行a/d 转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到a/d 转换电路,其中还涉及到电阻与温度的对应值的计算,感温电路比较麻烦。而且在对采集的信号进行放大时容易受温度的影响出现较大的偏差。1.2 方案二进而考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器ds18b20,此传感器,可以很容易直接读取被测温度值,进行转换,电路简单,精度高,软硬件都以实现,而且使用单片机的接口便于系统的再扩展,满足设计要求。从以上两种方案,很容易看出,采用方案二,电路比较简单,费用较低,可靠性高,软件设计也比较简单,故采用了方案二。方案二系统主要包括单片机模块、温度采集模块、温度显示模块,温度上下限调整模块等四部分。系统总体框架如图1所示。单片机处理模块18b20温度采集模块温度显示模块温度上下限调整模块图1 系统总体框架报警模块二、电路设计2.1 单片机处理模块处理模块是整个设计方案的核心,它控制了温度的采集、处理与显示、温度上下限值的设定。本文采用stc89c52rc作为处理模块。这是stc公司推出的8051系列微处理器。它的特点是价格低、功耗低、高可靠、无法解密,内部flash擦写次数为100,000次以上。图2是该芯片的引脚图。图2 stc89c52引脚图 图3是stc89c52的最小系统。图3是stc89c52的最小系统图32.2 温度采集模块温度由dallas 半导体公司的一线数字化温度传感器ds18b20采集。ds18b20测温范围为-55+125,测温分辨率可达0.0625,被测温度用16位二进制形式串行输出。用户设定的上下限温度储存在eeprom中,掉电后依然保存。cpu只需一根端口线就能与诸多ds18b20通信。占用微处理器的端口少,可节省大量的引线和逻辑电路。图4为ds18b20的引脚图。图4 ds18b20图ds18b20是通过一种片上温度测量技术来测量温度的。图5示出了温度测量电路的方框图。 图4 ds18b20温度测量电路的方框图由图5可知ds18b20用一个高温度系数的振荡器确立一个门周期,内部计数器在这个门周期内对一个低温度系数的振荡器的脉冲进行计数来得到温度值。计数器被预置到对应与-55的一个值。如果计数器在门周期结束前到达0,则温度寄存器(同样被预置到-55)的值增加,表明所测的温度大于-55。同时计数器被复位到一个值,这个值由斜坡式累加器电路确定,斜坡式累加器电路用来补偿感温振荡器的抛物线特性。然后计数器又开始计数直到0,如果门周期仍未结束,将重复这一过程。斜坡式累加器用来补偿感温振荡器的非线性,以及在测温时获得比较高的分辨力。这是通过改变计数器对温度每增加一度所需计数的值来实现的。因此,要想获得所需的分辨力,必须同时知道给定温度下计数器的值和每一度的计数值。ds18b20内部对此计算的结果可提供0.0625的分辨力。温度以16bit带符号位扩展的二进制补码形式读出。表1给出了温度值和输出数据的关系。表1:温度值和输出数据的关系温度数据输出(二进制)数据输出(十六进制)+1250000 0111 1101 000007d0+25.06250000 0001 1001 00010191+0.50000 0000 0000 1000000800000 0000 0000 00000000-0.51111 1111 1111 1000fff8-25.06251111 1110 0110 1111ffce-551111 1100 1001 0000fc90二进制的低四位是小数数据,高五位是符号位。正温度时,读到的16位数据乘以0.0625就可以得到实际温度。若是负温度则要把读到的数据按位取反再加1,之后按正温度转换,前面加符号就行了。另一种转换方法就是分离出低四位,中间七位和高五位。低四位乘以0.0625就可以得到小数部分的值,中间八位直接就是整数部分的值。高四位就是判断符号的。ds18b20内部有一个9字节的高速存储器用于存储温度值。其中前两个字节是测得的温度数据,第一个字节的内容是温度的低八位,第二个字节是温度的高八位,第三和第四字节是温度上限th与温度下限tl的易失性拷贝,第五字节是结构寄存器的易失性拷贝,第6,7,8这三个字节用于内部计算,第九个字节是冗余检验字节crc,可用来保证通信的正取性。当温度转换命令发出后,经转换所得的温度值以二字节补码形式存放在此存储器的第1和第2个字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后。通过单线总线端口访问ds18b20的协议如下:初始化、rom操作命令、存储器操作命令、执行/数据。rom操作命令:read rom 33h 这个命令允许总线控制器读到ds18b20的8位系列编码、唯一的序列号和8位crc码。只有在总线上存在单只ds18b20的时候才能使用这个命令。如果总线上不止一个从机时,当所有从机试图同时传送信号时就会发生数据冲突。match rom 55h 匹配rom命令,后跟64位rom序列,让总线控制器在多点总线上定位一只特定的ds18b20。只有和64为rom序列完全匹配的ds18b20才能响应随后的储存操作命令。skip rom cch 这条命令允许总线控制器不用提供64位rom编码就使用储存器操作命令,在单点总线情况下用以节省时间。如果总线上不止一个从机,在skip rom命令之后跟着发一条读命令,由于多个从机同时传送信号,总线上就会发生数据冲突。search rom f0h 当一个系统初次启动时,总线控制器可能不知道单线总线上有多少器件或它们的64位rom编码。搜索rom命令允许总线控制器用排除法识别总线上的所有从机的64位编码。alarm search ech 这条命令的流程图和search rom相同。然而,只有在最近一次测温后遇到符合报警条件的情况,ds18b20才会响应这条命令。表2:ds18b20的命令和时序图命 令说 明协 议单线总线发出协议后温度转换命令convert t开始温度转换44h存储器命令read scratchpad读取暂存器和crc字节behwriteschratchpad把字节写入暂存器的地址2和3(th和tl温度报警促发)4ehcopy scratchpad把暂存器内容拷贝到非易失性存储器中(仅指地址2和3)48hrecall e2把非易失性存储器中的值召回暂存器(温度报警触发)b8hread power supply标识ds18b20的供电模式b4h图6为ds18b20的电路连接图。图6 18b20电路图ds18b20有两种供电接法,图6采用的是接入外部电源。这样做的好处是i/o线上不需要加强上拉,而且总线控制器用在温度转换期间总保持高电平。这样在转换期间可以允许在单线总线上进行其他数据的往来。另外,在单总线上可以挂任意多片ds18b20,而且如果它们都使用外部电源的话,就可以先发一个skip rom命令,再接一个convert t命令,让它们同时进行温度转换。注意当加上外部电源时,gnd引脚不能悬空。2.3 温度显示模块由于此文重在说明ds18b20的功能及使用,所以显示部分就采用简单的数码管显示。只显示两位整数和一位小数,负温度就不显示了。图7为数码管的连接图。图7 数码管显示电路2.4 温度上下限调整模块图8为温度上下限调整模块。图8 按键电路图所选按键是轻触开关。按一次k1后,会在数码管显示ds18b20内储存的温度上限。按第k2次后就能调节温度的上限,通过k3和k4来调节。按下第3次后恢复到温度的显示。k2是调节温度下限的。操作方法和k1一样。2.5 报警电路该模块只是用蜂鸣器表示。蜂鸣器响就报警。如图9图9 图9 报警电路图总体原理图图10为电路的总体原理图。图10 系统总体原理图图10三、系统算法与程序流程图系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序,按键扫描处理子程序等。3.1 主程序流程图主程序的主要功能是负责温度的实时显示、读出并处理ds18b20 的测量的当前温度值,温度测量每1s 进行一次。这样可以在一秒之内测量一次被测温度,其程序流程如下:图11主程序流程图3.2 读出温度子程序读出温度子程序的主要功能是读出ram 中的9 字节,在读出时需进行crc 校验,校验有错时不进行温度数据的改写。其程序流程图如下:图12 读出温度子程序3.3 温度转换命令子程序温度转换命令子程序主要是发温度转换开始命令,当采用12 位分辨率时转换时间约为750ms,在本程序设计中采用1s 显示程序延时法等待转换的完成。温度转换命令子程序流程如:图13温度转换命令子程序3.4 计算温度子程序计算温度子程序将ram 中读取值进行bcd 码的转换运算,并进行温度值正负的判定,其程序流程图。图14计算温度子程序3.5 显示数据刷新子程序显示数据刷新子程序主要是对分离后的温度显示数据进行刷新操作,当标志位位为1时将符号显示位移入第一位。程序流程图如下:图15显示数据刷新子程序3.6 按键扫描处理子程序按键采用扫描查询方式,设置标志位,当标志位为1 时,显示设置温度,否则显示当前温度。如下:图16按键扫描处理子程序四、程序/*功能说明按k1设定温度上限,然后按k2调整小数位增加,按k4小数位减小按rd1确认,按rd复位按rd1设定温度下限,然后按k2调整整数位增加,按k4整数位减小按k1确认,按rd复位如果实际温度超过上下限,则报警*/#include #include #define uchar unsigned char#define uint unsigned int sbit k1=p20; sbit k2=p21; sbit k3=p34;sbit k4=p23; sbit dq=p22; sbit rd=p24; sbit rd1=p25; sbit beep=p32;uchar buffer0,buffer1,zhi,zhi1; uchar table=0x7f,0xbf,0xdf,0xef,0xff; /设置位选uchar table1=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f; /前两位数码管码表uchar table2=0xc0,0xcf,0xa4,0x86,0x8b,0x92,0x90,0xc7,0x80,0x82,0x7f,0xf0; /后两位数码管码表uchar code table32=00; uchar value,num,num1,num2;uchar temp,temp3,temp1,temph,templ,temp5,flag,flag1;uchar temp55,temp33,tempxiaoh,tempxiaol;uint qq;void delay(uint z) /延时子程序uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);void delay_18b20(unsigned int i) /ds18b20延时子程序,延时1uswhile(i-);void init_ds18b20(void) /ds18b20初始化函数u uchar x=0; dq = 1; /dq复位 delay_18b20(8); /稍做延时 ,稳定数据 dq = 0; /单片机将dq拉低 delay_18b20(100); /精确延时 大于 480us dq = 1; /拉高总线 delay_18b20(14); /(15-60)us x=dq; /稍做延时后 如果x=0则初始化成功 x=1则初始化失败,采样 delay_18b20(20);void write_18b20byte(uchar dat)/向18b20写一个节,dat为入口函数 uchar i; for (i=8; i0; i-)/一字节8位 dq = 0; dq = dat&0x01; delay_18b20(5);/18b20采样 dq = 1;/拉高dq dat=1;/出口函数,dat为入口函数 uchar read_18b20byte(void)uchar i;uchar dat;for (i=8;i0;i-)/判断8次移位7次 dq = 0; / 给脉冲信号,拉低总线 dat=1;/可以起延时作用 dq = 1; / 给脉冲信号,释放总线后才可以采样 if(dq) dat|=0x80; delay_18b20(4); return(dat);void readtemp(void) /读取ds18b20当前温度uchar a,b;init_ds18b20();/18b20初始化write_18b20byte(0xcc); / 跳过读序号列号的操作write_18b20byte(0x44); / 启动温度转换delay_18b20(100); / 转换需要时间,延时init_ds18b20();write_18b20byte(0xcc); /跳过读序号列号的操作write_18b20byte(0xbe); /读取温度寄存器等(共可读9个寄存器) 前两个就是温度delay_18b20(100);a=read_18b20byte(); /读取温度值低位b=read_18b20byte(); /读取温度值高位 temp=b*16+a/16;temp1=(a%16)*10/16;void beepon(void)beep=0;void beepoff(void)beep=1;void display(uchar one,uchar two,uchar three) p1=table0;/选中第一个数码管p0=table1one;/显示10位delay(3);p1=table1;/选中第二个数码管p0=table1two&0x7f;delay(3);p1=table2;p0=table2three;delay(3);p1=table3;p0=table211&0x7f;delay(3);void keywendu()uchar temp2,temp22;temp2=temp;/整数位temp22=temp1;/小数位rd=0;if(k1=0) /功能键delay(20);if(k1=0) while(!k1);/按键消抖程序 flag=1;p1=table1;p0=0xff;delay(10);/个位不显示p1=table2;p0=0xff;delay(10);/小数位不显示while(1)display(temp2/10,temp2%10,temp22);if(k1=0) /k1功能键delay(20);if(k1=0) while(!k1);num1+;if(num1=2)num1=0;/num1=0修改小数位/num1=1修改个位switch(num1)case 0:/小数位if(k2=0) /case0,k2功能键delay(20);if(k2=0) while(!k2);temp22+;if(temp22=10)temp22=0;delay(20); p1=table2;p0=table2temp22;delay(50);/显示小数位if(k4=0) /case0 k4 键delay(20);if(k4=0) while(!k4);temp22-;if(temp22=-1)temp22=9;delay(20);p1=table2;p0=table2temp22;delay(50);break;case 1:if(k2=0) /case1 k2键delay(20);if(k2=0) while(!k2);temp2+;delay(20);p1=table0;p0=table1temp2/10;delay(5);p1=table1;p0=table1temp2%10&0x7f;delay(5);if(k4=0) /case1 k4键delay(20);if(k4=0) while(!k4);temp2-;delay(20);p1=table0;p0=table1temp2/10;delay(5);p1=table1;p0=table1temp2%10&0x7f;delay(5);break;if(k3=0) delay(20);if(k3=0) while(!k3);temph=temp2;tempxiaoh=temp22;break;void keywendu_l()uchar temp2,temp22;temp2=temp;/调节整数位temp22=temp1;/调节小数位rd=0;if(k3=0) /k3键delay(20);if(k3=0) while(!k3);/消抖电路 flag1=1;p1=table1;p0=0xff;delay(10);p1=table2;p0=0xff;delay(10);while(1)display(temp2/10,temp2%10,temp22);if(k3=0) /功能键delay(20);if(k3=0) while(!k3);num1+;if(num1=2)num1=0;switch(num1)case 0:/case0时选择小数位if(k2=0) delay(20);if(k2=0) while(!k2);temp22+;if(temp22=10)temp22=0;delay(20);p1=table2;p0=table2temp22;delay(50);if(k4=0) delay(20);if(k4=0) while(!k4);temp22-;if(temp22=-1)temp22=9;delay(20);p1=table2;p0=table2temp22;delay(50);break;case 1:if(k2=0) /case1 调节k2键delay(20);if(k2=0) while(!k2);temp2+;delay(20);p1=table0;p0=table1temp2/10;delay(5);p1=table1;p0=table1temp2%10&0x7f;delay(5);if(k4=0) /case1调节k4键delay(20);if(k4=0) while(!k4);temp2-;delay(20);p1=table0;p0=table1temp2/10;delay(5);p1=table1;p0=table1temp2%10&0x7f;delay(5);break;if(k1=0) delay(20);if(k1=0) while(!k1);templ=temp2;tempxiaol=temp22;break;void main() uchar shi,ge; /十位和个位定义字符格式 init_ds18b20();/初始化18b20温度传感器while(1)readtemp();/读取18b20传感器温度值shi=temp/10;ge=temp%10;delay(5); display(shi,ge,temp1);/显示温度值 keywendu();/修改温度上限keywendu_l();/修改温度下限if(flag=1&temptemph)/大于最高设定温度报警beepon();delay(500);delay(500);beepoff();if(flag=1&temp=temph&tempxiaohtemp1)/蜂鸣器报警beepon();delay(500);delay(500);beepoff();if(flag1=1&temptemp1)/蜂鸣器报警beepon();delay(500);delay(500);beepoff();五、心得体会作为一名电子信息工程专业的大三学生,我觉得做单片机课程设计是十分有意义的,而且是十分必要的。在已度过的大学时间里,我们大多数接触的是专业课。我们在课堂上掌握的仅仅是专业课的理论知识,如何去锻炼我们的实践能力?如何把我们所学的专业基础课理论知识运用到实践中去呢?我想做类似的课程设计就为我们提供了良好的实践平台。课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在。因此作为二十一世纪的大学来说掌握单片机的开发技术是十分重要的。这次单片机课程设计我们历时两个星期,从理论到实践,学到了很多的东西。同时不仅巩固了以前所学过的知识,而且还学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在这次课程设计后我发现自己在一点一滴的努力中对单片机的兴趣也在逐渐增加。这次的课程设计还让我学会了如

温馨提示

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

评论

0/150

提交评论