单片机课程设计分析方案赵鑫.docx
- 文档编号:25690145
- 上传时间:2023-06-11
- 格式:DOCX
- 页数:18
- 大小:165.23KB
单片机课程设计分析方案赵鑫.docx
《单片机课程设计分析方案赵鑫.docx》由会员分享,可在线阅读,更多相关《单片机课程设计分析方案赵鑫.docx(18页珍藏版)》请在冰豆网上搜索。
单片机课程设计分析方案赵鑫
单片机课程设计报告
题目:
数字温度计
院<系)工学院<电气工程系)
专业电子信息工程
年级10-2班
姓名赵鑫学号10043225
指导教师舒昌
2018年12月1日
电子信息工程专业10级学生单片机原理课程设计任务书
课程设计题目
三、数字温度计
指导教师
舒昌
职称
讲师
设计任务和要求:
1.基本要求
(1)采用DS18B20作为温度传感器进行温度检测
(2)对采集温度进行显示<显示温度分辨率0.1℃)
(3)采集温度数值应采用数字滤波措施,保证显示数据稳定
(4)显示数据,无数据位必须消隐。
2.设计步骤
(1>使用Proteus按设计要求绘制电路图。
(2>按要求编写相应程序。
(3>使用Proteus仿真程序,对程序进行调试。
(4>撰写课程设计报告
3.撰写课程设计报告
课程设计报告内容包括题目、摘要、目录、正文、结论、致谢、参考文献等。
学生在完成上述全部工作之后,应将全部内容以先后顺序写成设计报告一份,阐述整个设计内容,要求重点突出、特色鲜明、语言简练、文字通畅,字迹工整。
报告书以A4纸打印,装订成册<文字不少于3000字)。
数字温度计
摘要:
随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。
本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,该设计控制器使用单片机STC89S51,测温传感器使用DS18B20,用LCD实现温度显示,能准确达到以上要求。
随着时代的进步和发展,单片机技术已经普及到我们生活,工作,科研,各个领域,已经成为一种比较成熟的技术,本文将介绍一种基于单片机控制的数字温度计,本温度计属于多功能温度计,可以设置上下报警温度,当温度不在设置范围内时,可以报警。
关键词:
单片机,数字控制,温度计
一、设计任务与要求
(1>采用DS18B20作为温度传感器进行温度检测
(2>对采集温度进行显示<显示温度分辨率0.1℃)
(3>采集温度数值应采用数字滤波措施,保证显示数据稳定
(4>显示数据,无数据位必须消隐。
二.方案设计与论证
数字温度计是测温仪器类型的其中之一。
根据所用测温物质的不同和测温范围的不同,有煤油温度计、酒精温度计、水银温度计、气体温度计、电阻温度计、温差电偶温度计、辐射温度计和光测温度计、双金属温度计等。
<1)、温度传感模块
方案一:
采用热敏电阻,热敏电阻精度、重复性、可靠性较差,对于检测1摄氏度的信号是不适用的,也不能满足测量范围。
在温度测量系统中,也常采用单片温度传感器,比如AD590,LM35等。
但这些芯片输出的都是模拟信号,必须经过A/D转换后才能送给计算机,这样就使测温系统的硬件结构较复杂。
另外,这种测温系统难以实现多点测温,也要用到复杂的算法,一定程度上也增加了软件实现的难度。
方案二:
采用单总线数字温度传感器DS18B20测量温度,直接输出数字信号。
便于单片机处理及控制,节省硬件电路。
且该芯片的物理化学性很稳定,此元件线形性能好,在0—100摄氏度时,最大线形偏差小于1摄氏度。
DS18B20的最大特点之一采用了单总线的数据传输,由数字温度计DS18B20和微控制器AT89C51构成的温度装置,它直接输出温度的数字信号到微控制器。
每只DS18B20具有一个独有的不可修改的64位序列号,根据序列号可访问不同的器件。
这样一条总线上可挂接多个DS18B20传感器,实现多点温度测量,轻松的组建传感网络。
综上分析,我们选用第二种方案。
图1.温度传感模块仿真图
(2>、显示模块
方案一:
采用8位段数码管,将单片机得到的数据通过数码管显示出来。
该方案简单易行,但所需的元件较多,且不容易进行操作,可读性差,一旦设定后很难再加入其他的功能,显示格式受限制,且大耗电量大,不宜用电池给系统供电。
方案二:
采用液晶显示器件,液晶显示平稳、省电、美观,更容易实现题目要求,对后续的园艺通兼容性高,只需将软件作修改即可,可操作性强,也易于读数,采用RT1602两行十六个字符的显示,能同时显示其它的信息如日期、时间、星期、温度。
综上分析,我们采用了第二个方案
图2.显示模块仿真图
三、单元电路设计
采用AT89S52单片机作为控制核心对温度传感器DS18B20控制,读取温度信号并进行计算处理,并送到液晶显示器LCD1602显示。
按照系统设计功能的要求,确定系统由3个模块组成:
主控制器、测温电路和显示电路。
四、总原理图
图3.总原理图
DS18B20内部的低温度系数振荡器是一个振荡频率随温度变化很小的振荡器,为计数器1提供一频率稳定的计数脉冲。
高温度系数振荡器是一个振荡频率对温度很敏感的振荡器,为计数器2提供一个频率随温度变化的计数脉冲。
初始时,温度寄存器被预置成-55℃,每当计数器1从预置数开始减计数到0时,温度寄存器中寄存的温度值就增加1℃,这个过程重复进行,直到计数器2计数到0时便停止。
初始时,计数器1预置的是与-55℃相对应的一个预置值。
以后计数器1每一个循环的预置数都由斜率累加器提供。
为了补偿振荡器温度特性的非线性性,斜率累加器提供的预置数也随温度相应变化。
计数器1的预置数也就是在给定温度处使温度寄存器寄存值增加1℃计数器所需要的计数个数。
DS18B20内部的比较器以四舍五入的量化方式确定温度寄存器的最低有效位。
在计数器2停止计数后,比较器将计数器1中的计数剩余值转换为温度值后与0.25℃进行比较,若低于0.25℃,温度寄存器的最低位就置0;若高于0.25℃,最低位就置1;若高于0.75℃时,温度寄存器的最低位就进位然后置0。
这样,经过比较后所得的温度寄存器的值就是最终读取的温度值了,其最后位代表
0.5℃,四舍五入最大量化误差为±1/2LSB,即0.25℃。
温度寄存器中的温度值以9位数据格式表示,最高位为符号位,其余8位以二进制补码形式表示温度值。
测温结束时,这9位数据转存到暂存存储器的前两个字节中,符号位占用第一字节,8位温度数据占据第二字节。
DS18B20测量温度时使用特有的温度测量技术。
DS18B20内部的低温度系数振荡器能产生稳定的频率信号;同样的,高温度系数振荡器则将被测温度转换成频率信号。
当计数门打开时,DS18B20进行计数,计数门开通时间由高温度系数振荡器决定。
芯片内部还有斜率累加器,可对频率的非线性度加以补偿。
测量结果存入温度寄存器中。
一般情况下的温度值应该为9位,但因符号位扩展成高8位,所以最后以16位补码形式读出。
DS18B20工作过程一般遵循以下协议:
初始化——ROM操作命令——存储器操作命令——处理数据
DS18B20的高速暂存存储器由9个字节组成,其分配如图3所示。
当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。
单片机可通过单线接口读到该数据,读取时低位在前,高位在后。
表1.存储器分配表
五、软件部分
系统程序主要包括主程序、读出温度子程序、温度转换子程序、计算温度子程序、显示等等。
1.主程序
主要功能是完成DS18B20的初始化工作,并进行读温度,将温度转化成为压缩BCD码并在显示器上显示传感器所测得的实际温度。
2.读出温度子程序
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需要进行CRC校验,校验有错时不进行温度数据的改写。
3.温度转换命令子程序
温度转换命令子程序主要是发温度转换开始命令,当采用12位分辩率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。
4.计算温度子程序
计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定。
六、调试与分析
数字温度计在测量中除误差外,还有内部固定偏差,视觉,环境温度的变化,选用期间的温漂,器件的精度,电源电压的波动,输入端各种杂散参数以及测量信号写波分量等因素引起的系统误差。
一起精度不高,认为读书存在误差。
测量值达不到理论值,多次测量取平均值误差降到最小。
图4.调试前
图5.调试后
七、总结与心得
通过这次基于DS18B20传感器测量温度的设计,我学到了许多东西。
这次设计加强了我们独立思考的能力。
一个好的设计需要通过我们不断的思维,不断的改善。
经过设计之后,我们不像以前那样,遇到问题都不愿意独立思考,只会一味的向别人求助。
现在,我们会通过自己的思考,解决我们自己遇到的问题和困难。
还有,我们学会不能手高眼低,要踏踏实实,从基础学起、做起。
一开始我们通过讨论,初步有了设计的方案,觉得还是比较简单的。
但是,具体到设计时,我们遇到了很多麻烦,比如如何将传感器得到的温度转换成为对应的电信号,如何将电信号输送到单片机进行控制,如何把测得的温度用数字显示出来等等。
这就要求我们学习要一步一个脚印,掌握扎实的理论基础了。
最重要的一点是,我们在这次设计中培养了自己的学习能力。
就那DS18B20来说,由于我们书本上没有介绍到这种温度传感器,所以我们就通过学习DS18B20的说明书,了解它工作的原理以及特性,并弄清楚在实际应用时要注意的事项,对DS18B20进行初始化、编程的要求和规定等。
培养了自主学习的能力,无论以后我们要做什么样的设计,我们都能够通过查阅资料来实现。
最后,本次设计能够顺利完成,我要特别感谢实验室老师给予的大力支持和热心帮助。
七、参考文献
【1】梁森,欧阳三泰,王侃夫.自动检测技术及应用【M】.北京:
机械工业出版社,2009.
【2】高洪志.MCS-51单片机原理及应用技术教程【M】北京:
人民邮电出版社,2009.
附件
完整程序如下:
#include
#include
typedefunsignedcharuint8。
#defineuintunsignedint
#defineucharunsignedchar
sbitDQ=P3^3。
//定义DQ引脚为P3.3
ucharcodeBw[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}。
//百位编码
ucharcodeXsw[16]={0x30,0x31,0x31,0x32,0x33,0x33,0x34,0x34,0x35,0x36,0x36,0x37,0x38,0x38,0x39,0x39}。
//小数位编码
sbitRS=P2^0。
sbitRW=P2^1。
sbitEN=P2^2。
sbitBUSY=P0^7。
ucharwendu。
uchartemp_g,temp_d。
unsignedcharcodeword1[]={"Temperature:
"}。
voiddelay(uintxms>
{
uinti,j。
for(i=xms。
i>0。
--i>
for(j=110。
j>0。
--j>。
}
voidDelayus(intt>//在11.059MHz的晶振条件下调用本函数需要24μs,然后每次计数需16μs
{
ints。
for(s=0。
s s++>。 } 等待繁忙标志 voidwait(void> { P0=0xFF。 do { RS=0。 RW=1。 EN=0。 EN=1。 }while(BUSY==1>。 EN=0。 } 写数据 voidw_dat(uint8dat> { wait(>。 EN=0。 P0=dat。 RS=1。 RW=0。 EN=1。 EN=0。 } 写命令 voidw_cmd(uint8cmd> { wait(>。 EN=0。 P0=cmd。 RS=0。 RW=0。 EN=1。 EN=0。 } 发送字符串到LCD voidw_string(uint8addr_start,uint8*p> { w_cmd(addr_start>。 while(*p! ='\0'> { w_dat(*p++>。 } } 初始化1602 voidInit_LCD1602(void> { w_cmd(0x38>。 //16*2显示,5*7点阵,8位数据接口 w_cmd(0x0c>。 //显示器开、光标开、光标允许闪烁 w_cmd(0x06>。 //文字不动,光标自动右移 w_cmd(0x01>。 //清屏 } ucharReset(>//完成单总线的复位操作。 { uchard。 DQ=0。 //将DQ线拉低 Delayus(29>。 //保持480μs.复位时间为480μs,因此延时时间为(480-24>/16=28.5,取29μs。 DQ=1。 //DQ返回高电平 Delayus(3>。 //等待存在脉冲.经过70μs之后检测存在脉冲,因此延时时间为(70-24>/16=2.875,取3μs。 d=DQ。 //获得存在信号 Delayus(25>。 //等待时间隙结束 return(d>。 //返回存在信号,0=器件存在,1=无器件 } voidwrite_bit(ucharbitval>//向单总线写入1位值: bitval { DQ=0。 //将DQ拉低开始写时间隙 if(bitval==1> DQ=1。 //如果写1,DQ返回高电平 Delayus(5>。 //在时间隙内保持电平值, DQ=1。 //Delayus函数每次循环延时16μs,因此Delayus(5>=5*16+24=104μs } voidds18write_byte(charval>//向单总线写入一个字节值: val { uchari。 uchartemp。 for(i=0。 i<8。 i++>//写入字节,每次写入一位 { temp=val>>i。 temp&=0x01。 write_bit(temp>。 } Delayus(5>。 } ucharread_bit(>//从单总线上读取一位信号,所需延时时间为15μs,因此无法调用前面定义 {//的Delayus(>函数,而采用一个for(>循环来实现延时。 uchari。 DQ=0。 //将DQ拉低开始读时间隙 DQ=1。 //然后返回高电平 for(i=0。 i<3。 i++>。 //延时15μs return(DQ>。 //返回DQ线上的电平值 } uchards18read_byte(>//从单总线读取一个字节的值 { uchari。 ucharvalue=0。 for(i=0。 i<8。 i++> {//读取字节,每次读取一个字节 if(read_bit(>> value|=0x01< //然后将其左移 Delayus(6>。 } return(value>。 } intReadtemperature(>//如果单总线节点上只有一个器件则可以直接掉用本函数。 如果节点上有多个器 {//件,为了避免数据冲突,应使用MatchROM函数来选中特定器件。 uchartemp_d,temp_g,k,get[2],temp。 Reset(>。 ds18write_byte(0xcc>。 //跳过ROM ds18write_byte(0x44>。 //启动温度转换 Delayus(5>。 Reset(>。 ds18write_byte(0xcc>。 //跳过ROM ds18write_byte(0xbe>。 //读暂存器 for(k=0。 k<2。 k++> { get[k]=ds18read_byte(>。 } temp_d=get[0]。 //低位 temp_g=get[1]。 //高位 if((temp_g&0xf0>==0xf0>//正负号判断 { temp_d=~temp_d。 if(temp_d==0xff>//保证-48<1111110100000000)、-32和-16显示正常 { temp_d=temp_d+0x01。 //00000000 temp_g=~temp_g。 //00000010 temp_g=temp_g+0x01。 //00000011 } else { temp_d=temp_d+0x01。 temp_g=~temp_g。 } w_cmd(0xc5>。 w_dat(Xsw[temp_d&0x0f]>。 //查表得小数位的值 temp=((temp_d&0xf0>>>4>|((temp_g&0x0f><<4>。 w_cmd(0xc1>。 w_dat(0x2d>。 //负号 } else//正数 { w_cmd(0xc5>。 w_dat(Xsw[temp_d&0x0f]>。 //查表得小数位的值 temp=((temp_d&0xf0>>>4>|((temp_g&0x0f><<4>。 w_cmd(0xc1>。 w_dat(Bw[temp/100]>。 } returntemp。 } main(> { Init_LCD1602(>。 w_string(0x80,word1>。 while(1> { wendu=Readtemperature(>。 temp_g=wendu%100/10+'0'。 //这里要特别注意啊少了%100就差很多 temp_d=wendu%10+'0'。 w_cmd(0xc2>。 delay(2>。 w_dat(temp_g>。 delay(2>。 w_dat(temp_d>。 delay(2>。 w_cmd(0xc4>。 delay(2>。 w_dat(0x2e>。 //小数点 delay(2>。 w_cmd(0xc6>。 delay(2>。 w_dat(0xdf>。 //温度符号 delay(2>。 w_dat(0x43>。 电气信息工程系单片机课程设计成绩评定表 专业: 电子信息工程班级: 电子10—2学号: 10043225姓名: 赵鑫 课题名称 设计任务与要求 1.基本要求 <1)采用DS18B20作为温度传感器进行温度检测 <2)对采集温度进行显示<显示温度分辨率0.1℃) <3)采集温度数值应采用数字滤波措施,保证显示数据稳定 <4)显示数据,无数据位必须消隐。 2.设计步骤 (1>使用Proteus按设计要求绘制电路图。 (2>按要求编写相应程序。 (3>使用Proteus仿真程序,对程序进行调试。 (4>撰写课程设计报告 指导教师评语 成绩: 指导教师: 时间: 年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计 分析 方案